mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-11-09 09:48:53 -05:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17ca9a31f1 | ||
|
|
c851f57e36 | ||
|
|
2b3497e63d | ||
|
|
c014efa9a6 | ||
|
|
f63970163a | ||
|
|
b34adc6b57 |
No files matched your search
@@ -21,8 +21,6 @@ build
|
|||||||
# other
|
# other
|
||||||
eclipse
|
eclipse
|
||||||
run
|
run
|
||||||
runClient
|
|
||||||
runServer
|
|
||||||
|
|
||||||
# Files from Forge MDK
|
# Files from Forge MDK
|
||||||
forge*changelog.txt
|
forge*changelog.txt
|
||||||
@@ -35,7 +33,3 @@ common/src/main/resources/assets/cobblemon/showdown
|
|||||||
# Generated files
|
# Generated files
|
||||||
*/generated/resources/*
|
*/generated/resources/*
|
||||||
/fabric/src/generated/resources/cobblemon-common.accesswidener
|
/fabric/src/generated/resources/cobblemon-common.accesswidener
|
||||||
/.ignored/
|
|
||||||
|
|
||||||
# MacOS
|
|
||||||
.DS_Store
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
<!-- 1. START HERE: (Before filling all this out, please quickly go to the list of all issues: (https://gitlab.com/cable-mc/cobblemon/-/issues/?sort=created_date&state=all) and do a quick search to see if your issue has already been reported. If it has, please add a comment to the existing issue instead of creating a new one.)-->
|
|
||||||
<!-- 2. If the issue was not already reported, please fill out the following template. -->
|
|
||||||
<!-- 3. If you do not know something, don't worry! Just fill out as much as you can to make sure the issue can get fixed asap. -->
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
(Please summarize the bug encountered concisely)
|
|
||||||
|
|
||||||
## Steps to reproduce
|
|
||||||
(How one can reproduce the issue - this is very important)
|
|
||||||
|
|
||||||
## What is the current bug behavior?
|
|
||||||
(What actually happens)
|
|
||||||
|
|
||||||
## What is the expected correct behavior?
|
|
||||||
(What you should see instead)
|
|
||||||
|
|
||||||
## Cobblemon Version and Mod Loader
|
|
||||||
(Are you using Forge or Fabric? And what version of Cobblemon are you using?)
|
|
||||||
|
|
||||||
## Mods used besides Cobblemon
|
|
||||||
(Did you have any other mods installed besides Cobblemon? If so, please list them here)
|
|
||||||
|
|
||||||
## Relevant logs, screenshots and/or videos
|
|
||||||
(Paste any relevant logs - use code blocks (```) at the start and end to format console output, logs, and code, as
|
|
||||||
it's very hard to read otherwise. Or just put a link here)
|
|
||||||
|
|
||||||
## Additional Information
|
|
||||||
(If you can, link to the line of code that might be responsible for the problem, or any other info that might be useful)
|
|
||||||
|
|
||||||
/label ~bug
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<!-- 1. START HERE: (Before filling all this out, please quickly go to the list of all issues: (https://gitlab.com/cable-mc/cobblemon/-/issues/?sort=created_date&state=all) and do a quick search to see if your feature was already requested. If it is, please add a comment to the existing issue instead of creating a new one.)-->
|
|
||||||
<!-- 2. If the feature request was not already reported, please fill out the following template. -->
|
|
||||||
<!-- 3. If you do not know something, don't worry! Just fill out as much as you can. -->
|
|
||||||
<!-- 4. The more info you provide here, the greater the chance of it being considered by the Design team. -->
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
(Please summarize your feature request concisely)
|
|
||||||
|
|
||||||
## What are the projected benefits of this feature?
|
|
||||||
- (List)
|
|
||||||
- (benefits)
|
|
||||||
- (here)
|
|
||||||
|
|
||||||
## What could speak against this feature?
|
|
||||||
- (List)
|
|
||||||
- (possible)
|
|
||||||
- (cons)
|
|
||||||
|
|
||||||
## Why do you think the benefits outweigh the cons?
|
|
||||||
(Explain why you think the benefits outweigh the cons)
|
|
||||||
|
|
||||||
## Mods involved besides Cobblemon
|
|
||||||
(Does your suggestion require any other mods besides Cobblemon? If so, please list them here)
|
|
||||||
|
|
||||||
## Sketches, screenshots and/or videos
|
|
||||||
(Feel free to add any sketches, screenshots or videos that might help the Design team understand your suggestion)
|
|
||||||
|
|
||||||
## Additional Information
|
|
||||||
(Is there anything else you would like to add?)
|
|
||||||
|
|
||||||
/label ~feature ~suggestion ~needs-design
|
|
||||||
+88
-784
File diff suppressed because it is too large.
Load diff
@@ -11,13 +11,8 @@ repositories {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(libs.kotlin)
|
implementation(libs.kotlin)
|
||||||
implementation(libs.indra.common)
|
|
||||||
|
|
||||||
implementation(libs.licenser)
|
implementation(libs.licenser)
|
||||||
implementation(libs.shadow)
|
implementation(libs.shadow)
|
||||||
implementation(libs.loom)
|
implementation(libs.loom)
|
||||||
implementation(libs.architectury)
|
implementation(libs.architecturyPlugin)
|
||||||
|
|
||||||
implementation(libs.blossom)
|
|
||||||
implementation(libs.ideaExt)
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import ca.stellardrift.build.configurate.ConfigFormats
|
||||||
|
import ca.stellardrift.build.configurate.catalog.PolyglotVersionCatalogExtension
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("ca.stellardrift.polyglot-version-catalogs") version "5.0.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
extensions.configure<PolyglotVersionCatalogExtension> {
|
||||||
|
from(ConfigFormats.YAML, file("../gradle/libs.versions.yml"))
|
||||||
|
}
|
||||||
+12
-32
@@ -1,50 +1,29 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* * Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
* *
|
|
||||||
* * This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* * file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
import utilities.ACCESS_WIDENER
|
|
||||||
|
val accessWidenerFile = "src/main/resources/cobblemon-common.accesswidener"
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("java")
|
java
|
||||||
id("java-library")
|
`java-library`
|
||||||
id("net.kyori.indra")
|
|
||||||
id("net.kyori.indra.git")
|
|
||||||
|
|
||||||
id("org.cadixdev.licenser")
|
id("org.cadixdev.licenser")
|
||||||
id("dev.architectury.loom")
|
id("dev.architectury.loom")
|
||||||
id("architectury-plugin")
|
id("architectury-plugin")
|
||||||
kotlin("jvm")
|
kotlin("jvm")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = rootProject.group
|
|
||||||
version = rootProject.version
|
|
||||||
description = rootProject.description
|
|
||||||
|
|
||||||
indra {
|
|
||||||
javaVersions {
|
|
||||||
minimumToolchain(17)
|
|
||||||
target(17)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
//JEI
|
|
||||||
maven("https://maven.blamejared.com/")
|
|
||||||
maven("https://maven.tterrag.com/")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
license {
|
license {
|
||||||
header(rootProject.file("HEADER"))
|
header(rootProject.file("HEADER"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
minecraft = project.property("mc_version").toString()
|
minecraft = project.property("mc_version").toString()
|
||||||
}
|
}
|
||||||
@@ -65,7 +44,8 @@ dependencies {
|
|||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
withType<JavaCompile> {
|
withType<JavaCompile> {
|
||||||
options.compilerArgs.add("-Xlint:-processing,-classfile,-serial")
|
options.encoding = "UTF-8"
|
||||||
|
options.release.set(17)
|
||||||
}
|
}
|
||||||
|
|
||||||
withType<KotlinCompile> {
|
withType<KotlinCompile> {
|
||||||
@@ -75,4 +55,4 @@ tasks {
|
|||||||
withType<Jar> {
|
withType<Jar> {
|
||||||
from(rootProject.file("LICENSE"))
|
from(rootProject.file("LICENSE"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
plugins {
|
||||||
|
id("cobblemon.base-conventions")
|
||||||
|
id("com.github.johnrengelman.shadow")
|
||||||
|
}
|
||||||
|
|
||||||
|
val bundle: Configuration by configurations.creating {
|
||||||
|
isCanBeConsumed = false
|
||||||
|
isCanBeResolved = true
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveBaseName.set("Cobblemon-${project.name}")
|
||||||
|
archiveClassifier.set("dev-slim")
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
archiveClassifier.set("dev-shadow")
|
||||||
|
archiveBaseName.set("Cobblemon-${project.name}")
|
||||||
|
configurations = listOf(bundle)
|
||||||
|
mergeServiceFiles()
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
dependsOn(shadowJar)
|
||||||
|
inputFile.set(shadowJar.flatMap { it.archiveFile })
|
||||||
|
archiveBaseName.set("Cobblemon-${project.name}")
|
||||||
|
archiveVersion.set("${rootProject.version}")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+3
-6
@@ -1,9 +1,6 @@
|
|||||||
import utilities.VersionType
|
|
||||||
import utilities.writeVersion
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("java")
|
java
|
||||||
id("java-library")
|
`java-library`
|
||||||
id("maven-publish")
|
id("maven-publish")
|
||||||
id("dev.architectury.loom")
|
id("dev.architectury.loom")
|
||||||
}
|
}
|
||||||
@@ -34,7 +31,7 @@ publishing {
|
|||||||
|
|
||||||
groupId = "com.cobblemon"
|
groupId = "com.cobblemon"
|
||||||
artifactId = project.findProperty("maven.artifactId")?.toString() ?: project.name
|
artifactId = project.findProperty("maven.artifactId")?.toString() ?: project.name
|
||||||
version = project.writeVersion(VersionType.PUBLISHING)
|
version = rootProject.version.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
plugins {
|
||||||
|
`java-library`
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
val collectJars by registering(Copy::class) {
|
||||||
|
val tasks = subprojects.filter { it.path != ":common" }.map { it.tasks.named("remapJar") }
|
||||||
|
dependsOn(tasks)
|
||||||
|
|
||||||
|
from(tasks)
|
||||||
|
into(buildDir.resolve("libs"))
|
||||||
|
}
|
||||||
|
|
||||||
|
assemble {
|
||||||
|
dependsOn(collectJars)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<Test> {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
-1
@@ -1,3 +1,2 @@
|
|||||||
package utilities
|
|
||||||
|
|
||||||
const val ACCESS_WIDENER = "src/main/resources/cobblemon-common.accesswidener"
|
const val ACCESS_WIDENER = "src/main/resources/cobblemon-common.accesswidener"
|
||||||
+4
-4
@@ -1,12 +1,12 @@
|
|||||||
plugins {
|
plugins {
|
||||||
|
base
|
||||||
id("cobblemon.root-conventions")
|
id("cobblemon.root-conventions")
|
||||||
id ("net.nemerosa.versioning") version "2.8.2"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
group = "com.cobblemon.mod"
|
||||||
version = "${project.property("mod_version")}+${project.property("mc_version")}"
|
version = "${project.property("mod_version")}+${project.property("mc_version")}"
|
||||||
|
|
||||||
val isSnapshot = project.property("snapshot")?.equals("true") ?: false
|
val isSnapshot = project.property("snapshot")?.equals("true") ?: false
|
||||||
if (isSnapshot) {
|
if (isSnapshot) {
|
||||||
val fixedBranchName = versioning.info.branch.substringAfter("/")
|
version = "$version-SNAPSHOT"
|
||||||
version = "$version-${fixedBranchName}-${versioning.info.build}"
|
}
|
||||||
}
|
|
||||||
+13
-66
@@ -1,26 +1,6 @@
|
|||||||
import utilities.isSnapshot
|
|
||||||
import utilities.version
|
|
||||||
import java.time.OffsetDateTime
|
|
||||||
import java.time.ZoneOffset
|
|
||||||
import java.time.format.DateTimeFormatter
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* * Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
* *
|
|
||||||
* * This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* * file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("cobblemon.base-conventions")
|
id("cobblemon.base-conventions")
|
||||||
id("cobblemon.publish-conventions")
|
id("cobblemon.publish-conventions")
|
||||||
|
|
||||||
id("net.kyori.blossom")
|
|
||||||
id("org.jetbrains.gradle.plugin.idea-ext")
|
|
||||||
id("net.nemerosa.versioning") version "2.8.2"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
@@ -29,31 +9,28 @@ architectury {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven(url = "${rootProject.projectDir}/deps")
|
maven(url = "${rootProject.projectDir}/deps")
|
||||||
maven(url = "https://api.modrinth.com/maven")
|
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(libs.bundles.kotlin)
|
implementation(libs.stdlib)
|
||||||
modImplementation(libs.fabric.loader)
|
implementation(libs.reflect)
|
||||||
|
|
||||||
|
modImplementation(libs.fabricLoader)
|
||||||
modApi(libs.molang)
|
modApi(libs.molang)
|
||||||
|
|
||||||
// Integrations
|
// For Showdown
|
||||||
compileOnlyApi(libs.jei.api)
|
|
||||||
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
|
|
||||||
isTransitive = false
|
|
||||||
}
|
|
||||||
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
|
|
||||||
// modCompileOnly(libs.flywheelFabric)
|
|
||||||
|
|
||||||
// Showdown
|
|
||||||
modCompileOnly(libs.graal)
|
modCompileOnly(libs.graal)
|
||||||
|
|
||||||
// Data Storage
|
//shadowCommon group: 'commons-io', name: 'commons-io', version: '2.6'
|
||||||
modCompileOnly(libs.bundles.mongo)
|
|
||||||
|
|
||||||
// Unit Testing
|
|
||||||
testImplementation(libs.bundles.unitTesting)
|
testRuntimeOnly(libs.junitEngine)
|
||||||
|
testImplementation(libs.junitApi)
|
||||||
|
testImplementation(libs.junitParams)
|
||||||
|
testImplementation(libs.mockito)
|
||||||
|
testImplementation(libs.mockk)
|
||||||
|
testImplementation(libs.classgraph)
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<Test> {
|
tasks.withType<Test> {
|
||||||
@@ -63,33 +40,3 @@ tasks.withType<Test> {
|
|||||||
setExceptionFormat("full")
|
setExceptionFormat("full")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
blossom {
|
|
||||||
kotlinSources {
|
|
||||||
fun generateLicenseHeader() : String {
|
|
||||||
val builder = StringBuilder()
|
|
||||||
builder.append("/*\n")
|
|
||||||
rootProject.file("HEADER").forEachLine {
|
|
||||||
if(it.isEmpty()) {
|
|
||||||
builder.append(" *").append("\n")
|
|
||||||
} else {
|
|
||||||
builder.append(" * ").append(it).append("\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.append(" */").append("\n").toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
property("license", generateLicenseHeader())
|
|
||||||
property("modid", "cobblemon")
|
|
||||||
property("version", project.version())
|
|
||||||
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
|
|
||||||
property("gitCommit", versioning.info.commit)
|
|
||||||
property("branch", versioning.info.branch)
|
|
||||||
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+5
-3
@@ -6,8 +6,10 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.client.gui.dialogue
|
package com.cobblemon.mod.common.access;
|
||||||
|
|
||||||
import net.minecraft.text.MutableText
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
|
||||||
class DialogueRenderableSpeaker(val name: MutableText?, val face: RenderableFace?)
|
public interface SoundManagerDuck {
|
||||||
|
void toggleCategories(SoundCategory... categories);
|
||||||
|
}
|
||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.bridges;
|
|
||||||
|
|
||||||
import net.minecraft.structure.processor.StructureProcessor;
|
|
||||||
|
|
||||||
public interface StructureProcessorListBridge {
|
|
||||||
void append(StructureProcessor processor);
|
|
||||||
void clear();
|
|
||||||
}
|
|
||||||
+5
-4
@@ -8,9 +8,10 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.client.render.models.blockbench.pose;
|
package com.cobblemon.mod.common.client.render.models.blockbench.pose;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext;
|
|
||||||
import net.minecraft.client.render.VertexConsumer;
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -37,7 +38,7 @@ public interface Bone {
|
|||||||
/**
|
/**
|
||||||
* Renders a particular bone in relation to a particular entity.
|
* Renders a particular bone in relation to a particular entity.
|
||||||
*
|
*
|
||||||
* @param context The render context this bone is being drawn for.
|
* @param entity The entity this bone is being drawn for. This parameter need not be available and can be null
|
||||||
* @param stack The current [MatrixStack] for the renderer
|
* @param stack The current [MatrixStack] for the renderer
|
||||||
* @param buffer The vertex consumer deployed by the renderer
|
* @param buffer The vertex consumer deployed by the renderer
|
||||||
* @param packedLight The light level to be applied to the bone
|
* @param packedLight The light level to be applied to the bone
|
||||||
@@ -49,8 +50,8 @@ public interface Bone {
|
|||||||
*
|
*
|
||||||
* @since 1.4.0
|
* @since 1.4.0
|
||||||
*/
|
*/
|
||||||
void render(
|
<T extends Entity> void render(
|
||||||
RenderContext context,
|
@Nullable T entity,
|
||||||
MatrixStack stack,
|
MatrixStack stack,
|
||||||
VertexConsumer buffer,
|
VertexConsumer buffer,
|
||||||
int packedLight,
|
int packedLight,
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.compat;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonEntities;
|
|
||||||
import com.cobblemon.mod.common.client.render.layer.PokemonOnShoulderRenderer;
|
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
|
||||||
import com.cobblemon.mod.common.pokemon.FormData;
|
|
||||||
import com.cobblemon.mod.common.pokemon.lighthing.LightingData;
|
|
||||||
import dev.lambdaurora.lambdynlights.api.DynamicLightHandler;
|
|
||||||
import dev.lambdaurora.lambdynlights.api.DynamicLightHandlers;
|
|
||||||
import net.minecraft.entity.EntityType;
|
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
|
||||||
import net.minecraft.util.Pair;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
// Java class due to relying on entrypoint on Fabric side
|
|
||||||
public class LambDynamicLightsCompat {
|
|
||||||
|
|
||||||
// This is all called on client side
|
|
||||||
// These things are checked every tick so try to keep it as free as possible
|
|
||||||
// That being said it's unlikely school Toshiba person is running dynamic lighting and shaders to enjoy this
|
|
||||||
// Make sure not to call anything Fabric specific :)
|
|
||||||
public static void hookCompat() {
|
|
||||||
// Pokémon entities
|
|
||||||
DynamicLightHandlers.registerDynamicLightHandler(
|
|
||||||
CobblemonEntities.POKEMON,
|
|
||||||
DynamicLightHandler.makeHandler(
|
|
||||||
pokemon -> resolvedPokemonLightLevel(pokemon, false),
|
|
||||||
pokemon -> true
|
|
||||||
)
|
|
||||||
);
|
|
||||||
DynamicLightHandlers.registerDynamicLightHandler(
|
|
||||||
CobblemonEntities.POKEMON,
|
|
||||||
DynamicLightHandler.makeHandler(
|
|
||||||
pokemon -> resolvedPokemonLightLevel(pokemon, true),
|
|
||||||
pokemon -> false
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Shouldered Pokémon
|
|
||||||
DynamicLightHandlers.registerDynamicLightHandler(
|
|
||||||
EntityType.PLAYER,
|
|
||||||
DynamicLightHandler.makeHandler(
|
|
||||||
player -> resolvedShoulderLightLevel(player, false),
|
|
||||||
player -> true
|
|
||||||
)
|
|
||||||
);
|
|
||||||
DynamicLightHandlers.registerDynamicLightHandler(
|
|
||||||
EntityType.PLAYER,
|
|
||||||
DynamicLightHandler.makeHandler(
|
|
||||||
player -> resolvedShoulderLightLevel(player, true),
|
|
||||||
player -> false
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int resolvedPokemonLightLevel(PokemonEntity pokemon, boolean underwater) {
|
|
||||||
return extractFormLightLevel(pokemon.getForm(), underwater).orElse(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int resolvedShoulderLightLevel(PlayerEntity player, boolean underwater) {
|
|
||||||
final Pair<PokemonOnShoulderRenderer.ShoulderData, PokemonOnShoulderRenderer.ShoulderData> shoulderDataPair = PokemonOnShoulderRenderer.shoulderDataOf(player);
|
|
||||||
final Optional<Integer> leftLightLevel = extractShoulderLightLevel(shoulderDataPair.getLeft(), underwater);
|
|
||||||
final Optional<Integer> rightLightLevel = extractShoulderLightLevel(shoulderDataPair.getRight(), underwater);
|
|
||||||
return Math.max(leftLightLevel.orElse(0), rightLightLevel.orElse(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<Integer> extractFormLightLevel(@NotNull FormData form, boolean underwater) {
|
|
||||||
if (form.getLightingData() == null || !liquidGlowModeSupport(form.getLightingData().getLiquidGlowMode(), underwater)) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
return Optional.of(form.getLightingData().getLightLevel());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<Integer> extractShoulderLightLevel(@Nullable PokemonOnShoulderRenderer.ShoulderData shoulderData, boolean underwater) {
|
|
||||||
if (shoulderData == null) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
return extractFormLightLevel(shoulderData.getForm(), underwater);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean liquidGlowModeSupport(@NotNull LightingData.LiquidGlowMode liquidGlowMode, boolean underwater) {
|
|
||||||
return underwater ? liquidGlowMode.getGlowsUnderwater() : liquidGlowMode.getGlowsInLand();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.duck;
|
|
||||||
|
|
||||||
import net.minecraft.sound.SoundCategory;
|
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public interface SoundManagerDuck {
|
|
||||||
|
|
||||||
void pauseSounds(@Nullable Identifier id, @Nullable SoundCategory category);
|
|
||||||
|
|
||||||
void resumeSounds(@Nullable Identifier id, @Nullable SoundCategory category);
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.duck;
|
|
||||||
|
|
||||||
import net.minecraft.client.sound.SoundInstance;
|
|
||||||
import net.minecraft.sound.SoundCategory;
|
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
public interface SoundSystemDuck {
|
|
||||||
|
|
||||||
void pauseSounds(@Nullable Identifier id, @Nullable SoundCategory category);
|
|
||||||
|
|
||||||
void resumeSounds(@Nullable Identifier id, @Nullable SoundCategory category);
|
|
||||||
|
|
||||||
Collection<SoundInstance> getSounds(@Nullable SoundCategory category);
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonBuildDetails;
|
|
||||||
import net.minecraft.util.crash.CrashReport;
|
|
||||||
import net.minecraft.util.crash.CrashReportSection;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(CrashReport.class)
|
|
||||||
public final class CrashReportMixin {
|
|
||||||
|
|
||||||
@Inject(method = "addStackTrace", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/SystemDetails;writeTo(Ljava/lang/StringBuilder;)V"))
|
|
||||||
public void cobblemon$printCobblemonDetails(StringBuilder builder, CallbackInfo callback) {
|
|
||||||
CrashReportSection cobblemon = new CrashReportSection("Cobblemon");
|
|
||||||
cobblemon.add("Version", CobblemonBuildDetails.VERSION);
|
|
||||||
cobblemon.add("Is Snapshot", CobblemonBuildDetails.SNAPSHOT);
|
|
||||||
cobblemon.add("Git Commit", CobblemonBuildDetails.INSTANCE.smallCommitHash() + " (" + "https://gitlab.com/cable-mc/cobblemon/-/commit/" + CobblemonBuildDetails.GIT_COMMIT + ")");
|
|
||||||
cobblemon.add("Branch", CobblemonBuildDetails.BRANCH);
|
|
||||||
|
|
||||||
cobblemon.addStackTrace(builder);
|
|
||||||
builder.append("\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.sherds.CobblemonSherds;
|
|
||||||
import net.minecraft.block.DecoratedPotPatterns;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.registry.RegistryKey;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
@Mixin(DecoratedPotPatterns.class)
|
|
||||||
public abstract class DecoratedPotPatternsMixin {
|
|
||||||
@Inject(method = "fromSherd", at=@At("HEAD"), cancellable = true)
|
|
||||||
private static void cobblemon$getCobblemonSherdTexture(Item sherd,
|
|
||||||
CallbackInfoReturnable<RegistryKey<String>> cir) {
|
|
||||||
if (CobblemonSherds.INSTANCE.getSherdToPattern().containsKey(sherd)) {
|
|
||||||
cir.setReturnValue(CobblemonSherds.INSTANCE.getSherdToPattern().get(sherd));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.entity.passive.VillagerEntity;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.village.VillagerProfession;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
import com.cobblemon.mod.common.villager.VillagerGatherableItems;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Mixin(VillagerEntity.class)
|
|
||||||
public abstract class EntityVillagerMixin {
|
|
||||||
|
|
||||||
@Inject(method = "canGather", at = @At(value = "RETURN"), cancellable = true)
|
|
||||||
private void cobblemon$canGather(ItemStack stack, CallbackInfoReturnable<Boolean> ci) {
|
|
||||||
final VillagerEntity villager = (VillagerEntity) (Object) this;
|
|
||||||
if(ci.getReturnValue() == false && Objects.equals(villager.getVillagerData().getProfession(), VillagerProfession.FARMER) && villager.getInventory().canInsert(stack)) {
|
|
||||||
if(VillagerGatherableItems.INSTANCE.getVillagerGatherableItems().contains(stack.getItem()))
|
|
||||||
ci.setReturnValue(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.block.PreEmptsExplosion;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraft.world.explosion.Explosion;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
@Mixin(value = Explosion.class)
|
|
||||||
public class ExplosionMixin {
|
|
||||||
|
|
||||||
@Redirect(
|
|
||||||
method = "affectWorld",
|
|
||||||
at = @At(
|
|
||||||
value = "INVOKE",
|
|
||||||
target = "Lnet/minecraft/world/World;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;",
|
|
||||||
ordinal = 0
|
|
||||||
)
|
|
||||||
)
|
|
||||||
public BlockState cobblemon$whenExploded(World world, BlockPos pos) {
|
|
||||||
BlockState blockState = world.getBlockState(pos);
|
|
||||||
if(blockState.getBlock() instanceof PreEmptsExplosion preExplosionBlock) {
|
|
||||||
preExplosionBlock.whenExploded(world, blockState, pos);
|
|
||||||
}
|
|
||||||
return blockState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.CobblemonBlocks;
|
||||||
|
import com.cobblemon.mod.common.block.PastureBlock;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.FenceBlock;
|
||||||
|
import net.minecraft.block.HorizontalFacingBlock;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
||||||
|
@Mixin(value = FenceBlock.class)
|
||||||
|
public abstract class FenceBlockMixin {
|
||||||
|
|
||||||
|
// This could be done with a modify variable but it just doesn't seem to want to work, very crude unfinished explanation I had on Fabric discord was
|
||||||
|
// "boolean is a primitive, it isnt passed by reference but by value and you have your own object references anyway so assigning a new object to non-primitive references (variables) wont modify it after your mixin returns
|
||||||
|
//(you cant modify a random argument that mixin passes you that way, target the boolean not the FenceBlock)"
|
||||||
|
// However the issue is the only way to get all the params which we need is by passing in the entire method reference which enforces the return type.
|
||||||
|
|
||||||
|
@Redirect(method = "getStateForNeighborUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/FenceBlock;canConnect(Lnet/minecraft/block/BlockState;ZLnet/minecraft/util/math/Direction;)Z"))
|
||||||
|
private boolean cobblemon$getStateForNeighborUpdate(FenceBlock instance, BlockState state, boolean neighborIsFullSquare, Direction dir) {
|
||||||
|
return instance.canConnect(state, neighborIsFullSquare, dir) || this.cobblemon$canConnect(state, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "getPlacementState", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/FenceBlock;canConnect(Lnet/minecraft/block/BlockState;ZLnet/minecraft/util/math/Direction;)Z"))
|
||||||
|
private boolean cobblemon$getPlacementState(FenceBlock instance, BlockState state, boolean neighborIsFullSquare, Direction dir) {
|
||||||
|
return instance.canConnect(state, neighborIsFullSquare, dir) || this.cobblemon$canConnect(state, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean cobblemon$canConnect(BlockState state, Direction dir) {
|
||||||
|
if (state.isOf(CobblemonBlocks.PASTURE) && state.get(PastureBlock.Companion.getPART()) == PastureBlock.PasturePart.BOTTOM) {
|
||||||
|
final Direction pastureFacing = state.get(HorizontalFacingBlock.FACING);
|
||||||
|
return dir == pastureFacing.rotateYClockwise() || dir == pastureFacing.rotateYCounterclockwise();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -8,37 +8,20 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker;
|
import com.cobblemon.mod.common.api.scheduling.ScheduledTaskTracker;
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(GameRenderer.class)
|
@Mixin(GameRenderer.class)
|
||||||
public class GameRendererMixin {
|
public class GameRendererMixin {
|
||||||
@Unique
|
|
||||||
long lastTime = -1;
|
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "render",
|
method = "render",
|
||||||
at = @At(value = "TAIL")
|
at = @At(value = "TAIL")
|
||||||
)
|
)
|
||||||
public void render(float tickDelta, long startTime, boolean tick, CallbackInfo ci) {
|
public void render(float tickDelta, long startTime, boolean tick, CallbackInfo ci) {
|
||||||
MinecraftClient client = MinecraftClient.getInstance();
|
ScheduledTaskTracker.INSTANCE.update();
|
||||||
long newTime = System.currentTimeMillis();
|
|
||||||
// Don't play scheduled animations when the game is paused
|
|
||||||
if (client.isPaused()) {
|
|
||||||
lastTime = newTime;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastTime != -1) {
|
|
||||||
ClientTaskTracker.INSTANCE.update((newTime - lastTime) / 1000F);
|
|
||||||
}
|
|
||||||
lastTime = newTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.CobblemonBakingOverrides;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Map;
|
|
||||||
import net.minecraft.client.color.block.BlockColors;
|
|
||||||
import net.minecraft.client.render.model.ModelLoader;
|
|
||||||
import net.minecraft.client.render.model.UnbakedModel;
|
|
||||||
import net.minecraft.client.render.model.json.JsonUnbakedModel;
|
|
||||||
import net.minecraft.client.util.ModelIdentifier;
|
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.profiler.Profiler;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.InjectionPoint;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.points.BeforeStringInvoke;
|
|
||||||
|
|
||||||
@Mixin(ModelLoader.class)
|
|
||||||
public abstract class ModelLoaderMixin {
|
|
||||||
|
|
||||||
@Shadow protected abstract void addModel(ModelIdentifier modelId);
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private Map<Identifier, UnbakedModel> unbakedModels;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private static Logger LOGGER;
|
|
||||||
|
|
||||||
@Inject(
|
|
||||||
method = "<init>",
|
|
||||||
at = @At("TAIL")
|
|
||||||
)
|
|
||||||
public void init(BlockColors blockColors,
|
|
||||||
Profiler profiler,
|
|
||||||
Map jsonUnbakedModels,
|
|
||||||
Map blockStates,
|
|
||||||
CallbackInfo ci) {
|
|
||||||
CobblemonBakingOverrides.INSTANCE.getModels().forEach(bakingOverride -> {
|
|
||||||
try {
|
|
||||||
this.unbakedModels.put(bakingOverride.getModelIdentifier(), this.loadModelFromJson(bakingOverride.getModelLocation()));
|
|
||||||
this.addModel(bakingOverride.getModelIdentifier());
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOGGER.error("Error loading a Cobblemon BakedModel:", e);
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private JsonUnbakedModel loadModelFromJson(Identifier id) throws IOException {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityModel;
|
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone;
|
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone;
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext;
|
|
||||||
import net.minecraft.client.model.ModelPart;
|
import net.minecraft.client.model.ModelPart;
|
||||||
import net.minecraft.client.render.VertexConsumer;
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
@@ -38,7 +36,7 @@ public abstract class ModelPartMixin implements Bone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(RenderContext context, MatrixStack stack, VertexConsumer buffer, int packedLight, int packedOverlay, float r, float g, float b, float a) {
|
public <T extends Entity> void render(T entity, MatrixStack stack, VertexConsumer buffer, int packedLight, int packedOverlay, float r, float g, float b, float a) {
|
||||||
this.render(stack, buffer, packedLight, packedOverlay, r, g, b, a);
|
this.render(stack, buffer, packedLight, packedOverlay, r, g, b, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.sound.battle.BattleMusicController;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.sound.MusicTracker;
|
|
||||||
import net.minecraft.client.sound.SoundInstance;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(MusicTracker.class)
|
|
||||||
public class MusicTrackerMixin {
|
|
||||||
|
|
||||||
@Shadow @Final
|
|
||||||
private MinecraftClient client;
|
|
||||||
|
|
||||||
@Shadow @Nullable
|
|
||||||
private SoundInstance current;
|
|
||||||
|
|
||||||
/** Freezes the tracker while a BattleMusicInstance is in progress. Current SoundInstance being tracked will be paused by BattleMusicHandler. */
|
|
||||||
@Inject(method = "tick()V", at = @At("HEAD"), cancellable = true)
|
|
||||||
public void tick(CallbackInfo cb) {
|
|
||||||
if (this.client.getSoundManager().isPlaying(BattleMusicController.INSTANCE.getMusic())) cb.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.snowstorm.ParticleMaterials;
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import net.minecraft.client.particle.ParticleManager;
|
|
||||||
import net.minecraft.client.particle.ParticleTextureSheet;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mixin(ParticleManager.class)
|
|
||||||
final class ParticleManagerMixin {
|
|
||||||
@Mutable
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private static List<ParticleTextureSheet> PARTICLE_TEXTURE_SHEETS;
|
|
||||||
|
|
||||||
@Inject(at = @At("RETURN"), method = "<clinit>")
|
|
||||||
private static void lodestone$addTypes(CallbackInfo ci) {
|
|
||||||
PARTICLE_TEXTURE_SHEETS = ImmutableList.<ParticleTextureSheet>builder().addAll(PARTICLE_TEXTURE_SHEETS)
|
|
||||||
.add(ParticleMaterials.INSTANCE.getADD(), ParticleMaterials.INSTANCE.getALPHA(), ParticleMaterials.INSTANCE.getBLEND(), ParticleMaterials.INSTANCE.getOPAQUE()).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonItems;
|
|
||||||
import net.minecraft.entity.mob.PiglinBrain;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
|
|
||||||
@Mixin(PiglinBrain.class)
|
|
||||||
public class PiglinBarterMixin {
|
|
||||||
|
|
||||||
@Inject(method = "acceptsForBarter", at = @At(value = "RETURN"), cancellable = true)
|
|
||||||
private static void cobblemon$acceptsForBarter(ItemStack stack, CallbackInfoReturnable<Boolean> ci) {
|
|
||||||
if(!ci.getReturnValue()) {
|
|
||||||
//TODO: Make a tag?
|
|
||||||
if(stack.isOf(CobblemonItems.RELIC_COIN_POUCH))
|
|
||||||
ci.setReturnValue(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonItems;
|
|
||||||
import net.minecraft.entity.EquipmentSlot;
|
|
||||||
import net.minecraft.entity.mob.PiglinEntity;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(PiglinEntity.class)
|
|
||||||
public abstract class PiglinEntityMixin {
|
|
||||||
@Inject(method = "equipToOffHand", at = @At(value = "HEAD"), cancellable = true)
|
|
||||||
public void cobblemon$isValidBarteringItem(ItemStack stack, CallbackInfo ci) {
|
|
||||||
PiglinEntity entity = (PiglinEntity)(Object) this;
|
|
||||||
if (stack.isOf(CobblemonItems.RELIC_COIN_POUCH)) {
|
|
||||||
entity.equipStack(EquipmentSlot.OFFHAND, stack);
|
|
||||||
entity.updateDropChances(EquipmentSlot.OFFHAND);
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents;
|
|||||||
import com.cobblemon.mod.common.api.events.item.LeftoversCreatedEvent;
|
import com.cobblemon.mod.common.api.events.item.LeftoversCreatedEvent;
|
||||||
import com.cobblemon.mod.common.api.storage.NoPokemonStoreException;
|
import com.cobblemon.mod.common.api.storage.NoPokemonStoreException;
|
||||||
import com.cobblemon.mod.common.api.storage.party.PartyStore;
|
import com.cobblemon.mod.common.api.storage.party.PartyStore;
|
||||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags;
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon;
|
import com.cobblemon.mod.common.pokemon.Pokemon;
|
||||||
import com.cobblemon.mod.common.util.CompoundTagExtensionsKt;
|
import com.cobblemon.mod.common.util.CompoundTagExtensionsKt;
|
||||||
import com.cobblemon.mod.common.util.DataKeys;
|
import com.cobblemon.mod.common.util.DataKeys;
|
||||||
@@ -23,8 +22,11 @@ import net.minecraft.entity.ItemEntity;
|
|||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
import net.minecraft.sound.SoundEvents;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
@@ -38,6 +40,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static com.cobblemon.mod.common.util.LocalizationUtilsKt.lang;
|
||||||
|
|
||||||
@Mixin(PlayerEntity.class)
|
@Mixin(PlayerEntity.class)
|
||||||
public abstract class PlayerMixin extends LivingEntity {
|
public abstract class PlayerMixin extends LivingEntity {
|
||||||
|
|
||||||
@@ -140,7 +144,7 @@ public abstract class PlayerMixin extends LivingEntity {
|
|||||||
)
|
)
|
||||||
public void onEatFood(World world, ItemStack stack, CallbackInfoReturnable<ItemStack> cir) {
|
public void onEatFood(World world, ItemStack stack, CallbackInfoReturnable<ItemStack> cir) {
|
||||||
if (!getWorld().isClient) {
|
if (!getWorld().isClient) {
|
||||||
if (stack.isIn(CobblemonItemTags.LEAVES_LEFTOVERS) && getWorld().random.nextDouble() < Cobblemon.config.getAppleLeftoversChance()) {
|
if (stack.getItem() == Items.APPLE && getWorld().random.nextDouble() < Cobblemon.config.getAppleLeftoversChance()) {
|
||||||
ItemStack leftovers = new ItemStack(CobblemonItems.LEFTOVERS);
|
ItemStack leftovers = new ItemStack(CobblemonItems.LEFTOVERS);
|
||||||
ServerPlayerEntity player = Objects.requireNonNull(getServer()).getPlayerManager().getPlayer(uuid);
|
ServerPlayerEntity player = Objects.requireNonNull(getServer()).getPlayerManager().getPlayer(uuid);
|
||||||
assert player != null;
|
assert player != null;
|
||||||
|
|||||||
+10
-10
@@ -6,9 +6,9 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.fabric.mixin;
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
import com.cobblemon.mod.fabric.brewing.CobblemonFabricBreweryRegistry;
|
import com.cobblemon.mod.common.brewing.BrewingRecipes;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.screen.BrewingStandScreenHandler;
|
import net.minecraft.screen.BrewingStandScreenHandler;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -18,14 +18,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
|
|
||||||
@Mixin(BrewingStandScreenHandler.PotionSlot.class)
|
@Mixin(BrewingStandScreenHandler.PotionSlot.class)
|
||||||
public class PotionSlotMixin {
|
public class PotionSlotMixin {
|
||||||
|
@Inject(
|
||||||
@Inject(method = "matches", at = @At("RETURN"), cancellable = true)
|
method = "matches",
|
||||||
private static void cobblemon$matches(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
at = @At(value = "HEAD"),
|
||||||
if (cir.getReturnValue()) {
|
cancellable = true
|
||||||
return;
|
)
|
||||||
|
private static void matchesBrewable(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
if (BrewingRecipes.brewableItems.contains(stack.getItem())) {
|
||||||
|
cir.setReturnValue(true);
|
||||||
}
|
}
|
||||||
cir.setReturnValue(CobblemonFabricBreweryRegistry.INSTANCE.isValidPotionSlot(stack));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.spawning.mixins.CachedOnlyChunkAccessor;
|
||||||
|
import com.mojang.datafixers.util.Either;
|
||||||
|
import net.minecraft.server.world.ChunkHolder;
|
||||||
|
import net.minecraft.server.world.ServerChunkManager;
|
||||||
|
import net.minecraft.util.math.ChunkPos;
|
||||||
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
import net.minecraft.world.chunk.ChunkManager;
|
||||||
|
import net.minecraft.world.chunk.ChunkStatus;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
@Mixin(ServerChunkManager.class)
|
||||||
|
public abstract class ServerChunkManagerMixin extends ChunkManager implements CachedOnlyChunkAccessor {
|
||||||
|
@Shadow @Nullable protected abstract ChunkHolder getChunkHolder(long pos);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Chunk cobblemon$request(int x, int z, @NotNull ChunkStatus status) {
|
||||||
|
long l = ChunkPos.toLong(x, z);
|
||||||
|
|
||||||
|
ChunkHolder holder = getChunkHolder(l);
|
||||||
|
if (holder != null) {
|
||||||
|
CompletableFuture<Either<Chunk, ChunkHolder.Unloaded>> future = holder.getFutureFor(status);
|
||||||
|
if (future.isDone()) {
|
||||||
|
return future.join().left().orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,77 +8,36 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.sound.battle.BattleMusicController;
|
import com.cobblemon.mod.common.access.SoundManagerDuck;
|
||||||
import com.cobblemon.mod.common.duck.SoundManagerDuck;
|
import net.minecraft.client.sound.SoundInstance;
|
||||||
import com.cobblemon.mod.common.duck.SoundSystemDuck;
|
import net.minecraft.client.sound.SoundManager;
|
||||||
import net.minecraft.client.sound.*;
|
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(SoundManager.class)
|
@Mixin(SoundManager.class)
|
||||||
public abstract class SoundManagerMixin implements SoundManagerDuck {
|
public class SoundManagerMixin implements SoundManagerDuck {
|
||||||
|
|
||||||
@Shadow
|
private boolean[] blockedCategories = new boolean[SoundCategory.values().length];
|
||||||
public abstract boolean isPlaying(SoundInstance sound);
|
|
||||||
|
|
||||||
@Shadow @Final
|
|
||||||
private SoundSystem soundSystem;
|
|
||||||
|
|
||||||
// Never-ending ambient loops are a special exception (they are only initiated once) and should always be paused if filtered.
|
|
||||||
private boolean isAmbientLoop(SoundInstance sound) {
|
|
||||||
return sound instanceof BiomeEffectSoundPlayer.MusicLoop || sound instanceof AmbientSoundLoops.Underwater;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean filterCondition(SoundInstance sound) {
|
|
||||||
return !isAmbientLoop(sound) &&
|
|
||||||
this.isPlaying(BattleMusicController.INSTANCE.getMusic()) &&
|
|
||||||
BattleMusicController.INSTANCE.getFilteredCategories().contains(sound.getCategory());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean ambientLoopCondition(SoundInstance sound) {
|
|
||||||
return isAmbientLoop(sound) &&
|
|
||||||
this.isPlaying(BattleMusicController.INSTANCE.getMusic()) &&
|
|
||||||
BattleMusicController.INSTANCE.getFilteredCategories().contains(sound.getCategory());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Pauses the queried SoundInstance(s). If id is null, will pause all sounds belonging to the SoundCategory. */
|
|
||||||
@Override
|
@Override
|
||||||
public void pauseSounds(@Nullable Identifier id, @Nullable SoundCategory category) {
|
public void toggleCategories(SoundCategory... categories) {
|
||||||
((SoundSystemDuck)soundSystem).pauseSounds(id, category);
|
for (SoundCategory category : categories) {
|
||||||
|
int index = category.ordinal();
|
||||||
|
boolean blocked = blockedCategories[index];
|
||||||
|
blockedCategories[index] = !blocked;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Resumes the queried SoundInstance(s). If id is null, will resume all sounds belonging to the SoundCategory. */
|
|
||||||
@Override
|
|
||||||
public void resumeSounds(@Nullable Identifier id, @Nullable SoundCategory category) {
|
|
||||||
((SoundSystemDuck)soundSystem).resumeSounds(id, category);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Blocks filtered sounds from being played while a BattleMusicInstance is in progress. */
|
|
||||||
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)V", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)V", at = @At("HEAD"), cancellable = true)
|
||||||
public void playStart(SoundInstance sound, CallbackInfo cb) {
|
public void play(SoundInstance sound, CallbackInfo cb) {
|
||||||
if (filterCondition(sound)) cb.cancel();
|
if (blockedCategories[sound.getCategory().ordinal()]) cb.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;I)V", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;I)V", at = @At("HEAD"), cancellable = true)
|
||||||
public void playStart(SoundInstance sound, int delay, CallbackInfo cb) {
|
public void play(SoundInstance sound, int delay, CallbackInfo cb) {
|
||||||
if (filterCondition(sound)) cb.cancel();
|
if (blockedCategories[sound.getCategory().ordinal()]) cb.cancel();
|
||||||
}
|
|
||||||
|
|
||||||
/** Pauses ambient loops while a BattleMusicInstance is in progress. */
|
|
||||||
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)V", at = @At("TAIL"))
|
|
||||||
public void playEnd(SoundInstance sound, CallbackInfo cb) {
|
|
||||||
if (ambientLoopCondition(sound)) this.pauseSounds(sound.getId(), SoundCategory.AMBIENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;I)V", at = @At("TAIL"))
|
|
||||||
public void playEnd(SoundInstance sound, int delay, CallbackInfo cb) {
|
|
||||||
if (ambientLoopCondition(sound)) this.pauseSounds(sound.getId(), SoundCategory.AMBIENT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,102 +8,31 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.sound.battle.BattleMusicController;
|
|
||||||
import com.cobblemon.mod.common.duck.SoundSystemDuck;
|
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import net.minecraft.client.sound.*;
|
import net.minecraft.client.sound.SoundInstance;
|
||||||
|
import net.minecraft.client.sound.SoundSystem;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mixin(SoundSystem.class)
|
@Mixin(SoundSystem.class)
|
||||||
public abstract class SoundSystemMixin implements SoundSystemDuck {
|
public abstract class SoundSystemMixin {
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private boolean started;
|
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
private Multimap<SoundCategory, SoundInstance> sounds;
|
private Multimap<SoundCategory, SoundInstance> sounds;
|
||||||
|
|
||||||
@Shadow @Final
|
|
||||||
private Map<SoundInstance, Channel.SourceManager> sources;
|
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
protected abstract void stop(SoundInstance sound);
|
protected abstract void stop(SoundInstance sound);
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract boolean isPlaying(SoundInstance sound);
|
|
||||||
|
|
||||||
/** Resumes the Source belonging to the queried SoundInstance. */
|
|
||||||
private void resume(SoundInstance sound) {
|
|
||||||
Channel.SourceManager sourceManager = this.sources.get(sound);
|
|
||||||
if (this.started && sourceManager != null) sourceManager.run(Source::resume);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Pauses the Source belonging to the queried SoundInstance. */
|
|
||||||
private void pause(SoundInstance sound) {
|
|
||||||
Channel.SourceManager sourceManager = this.sources.get(sound);
|
|
||||||
if (this.started && sourceManager != null) sourceManager.run(Source::pause);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Resumes the SoundInstance(s) queried by id and/or category. */
|
|
||||||
@Override
|
|
||||||
public void resumeSounds(@Nullable Identifier id, @Nullable SoundCategory category) {
|
|
||||||
if (category != null) {
|
|
||||||
this.sounds.get(category).forEach((sound) -> {
|
|
||||||
if (id == null || sound.getId().equals(id)) resume(sound);
|
|
||||||
});
|
|
||||||
} else if (id == null) {
|
|
||||||
this.sources.keySet().forEach(this::resume);
|
|
||||||
} else {
|
|
||||||
this.sources.keySet().forEach(sound -> {
|
|
||||||
if (sound.getId().equals(id)) resume(sound);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Pauses the SoundInstances queried by id and/or category. */
|
|
||||||
@Override
|
|
||||||
public void pauseSounds(@Nullable Identifier id, @Nullable SoundCategory category) {
|
|
||||||
if (category != null) {
|
|
||||||
this.sounds.get(category).forEach((sound) -> {
|
|
||||||
if (id == null || sound.getId().equals(id)) pause(sound);
|
|
||||||
});
|
|
||||||
} else if (id == null) {
|
|
||||||
this.sources.keySet().forEach(this::pause);
|
|
||||||
} else {
|
|
||||||
this.sources.keySet().forEach(sound -> {
|
|
||||||
if (sound.getId().equals(id)) pause(sound);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Allows stopping all SoundInstances that belong to a queried category. */
|
|
||||||
@Inject(method = "stopSounds(Lnet/minecraft/util/Identifier;Lnet/minecraft/sound/SoundCategory;)V", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "stopSounds(Lnet/minecraft/util/Identifier;Lnet/minecraft/sound/SoundCategory;)V", at = @At("HEAD"), cancellable = true)
|
||||||
public void stopSounds(@Nullable Identifier id, @Nullable SoundCategory category, CallbackInfo cb) {
|
public void stopSounds(@Nullable Identifier id, @Nullable SoundCategory category, CallbackInfo cb) {
|
||||||
if (id == null && category != null) {
|
if (id == null && category != null) {
|
||||||
this.sounds.get(category).forEach(this::stop);
|
sounds.get(category).forEach(this::stop);
|
||||||
cb.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Different behavior for resuming SoundInstances while a BattleMusicInstance is being played. We do not want to resume filtered sounds. */
|
|
||||||
@Inject(method = "resumeAll()V", at = @At("HEAD"), cancellable = true)
|
|
||||||
public void resumeAll(CallbackInfo cb) {
|
|
||||||
if (this.isPlaying(BattleMusicController.INSTANCE.getMusic())) {
|
|
||||||
this.sounds.values().forEach(sound -> {
|
|
||||||
if (sound == BattleMusicController.INSTANCE.getMusic() || !BattleMusicController.INSTANCE.getFilteredCategories().contains(sound.getCategory())) {
|
|
||||||
resume(sound);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
cb.cancel();
|
cb.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.mojang.datafixers.util.Pair;
|
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
|
||||||
import net.minecraft.structure.pool.StructurePool;
|
|
||||||
import net.minecraft.structure.pool.StructurePoolElement;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mixin(StructurePool.class)
|
|
||||||
public interface StructurePoolAccessor {
|
|
||||||
@Accessor("elementCounts")
|
|
||||||
List<Pair<StructurePoolElement, Integer>> getElementCounts();
|
|
||||||
|
|
||||||
@Mutable
|
|
||||||
@Accessor("elementCounts")
|
|
||||||
void setElementCounts(List<Pair<StructurePoolElement, Integer>> elementCounts);
|
|
||||||
|
|
||||||
@Accessor("elements")
|
|
||||||
ObjectArrayList<StructurePoolElement> getElements();
|
|
||||||
}
|
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.world.CobblemonStructureIDs;
|
|
||||||
import net.minecraft.registry.Registry;
|
|
||||||
import net.minecraft.structure.PoolStructurePiece;
|
|
||||||
import net.minecraft.structure.StructureTemplateManager;
|
|
||||||
import net.minecraft.structure.pool.*;
|
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.math.random.Random;
|
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
|
||||||
import net.minecraft.world.HeightLimitView;
|
|
||||||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
|
||||||
import net.minecraft.world.gen.noise.NoiseConfig;
|
|
||||||
import org.apache.commons.lang3.mutable.MutableObject;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
@Mixin(StructurePoolBasedGenerator.StructurePoolGenerator.class)
|
|
||||||
public abstract class StructurePoolGeneratorMixin {
|
|
||||||
@Final
|
|
||||||
@Mutable
|
|
||||||
@Shadow Deque<StructurePoolBasedGenerator.ShapedPoolStructurePiece> structurePieces;
|
|
||||||
|
|
||||||
Map<String, Integer> generatedStructureGroupCounts;
|
|
||||||
|
|
||||||
private static final Map<String, Integer> structureMaxes;
|
|
||||||
private static final Map<Identifier, Set<String>> structureGroups = new HashMap<>();
|
|
||||||
static {
|
|
||||||
String pokecenter = "pokecenter";
|
|
||||||
String berry = "berry_farm";
|
|
||||||
|
|
||||||
structureGroups.put(CobblemonStructureIDs.PLAINS_POKECENTER, Set.of(pokecenter));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.DESERT_POKECENTER, Set.of(pokecenter));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SAVANNA_POKECENTER, Set.of(pokecenter));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SNOWY_POKECENTER, Set.of(pokecenter));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.TAIGA_POKECENTER, Set.of(pokecenter));
|
|
||||||
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SAVANNA_BERRY_SMALL, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SAVANNA_BERRY_LARGE, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.PLAINS_BERRY_SMALL, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.PLAINS_BERRY_LARGE, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SNOWY_BERRY_SMALL, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.SNOWY_BERRY_LARGE, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.DESERT_BERRY_SMALL, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.DESERT_BERRY_LARGE, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.TAIGA_BERRY_SMALL, Set.of(berry));
|
|
||||||
structureGroups.put(CobblemonStructureIDs.TAIGA_BERRY_LARGE, Set.of(berry));
|
|
||||||
|
|
||||||
//Mapped using location string as key
|
|
||||||
Map<String, Integer> aMap = new HashMap<>();
|
|
||||||
aMap.put(pokecenter, 1);
|
|
||||||
aMap.put(berry, 2);
|
|
||||||
|
|
||||||
// aMap.put(CobblemonStructureIDs.PLAINS_LONG_PATH, 3);
|
|
||||||
// aMap.put(CobblemonStructureIDs.DESERT_LONG_PATH, 3);
|
|
||||||
// aMap.put(CobblemonStructureIDs.SAVANNA_LONG_PATH, 3);
|
|
||||||
// aMap.put(CobblemonStructureIDs.SNOWY_LONG_PATH, 3);
|
|
||||||
// aMap.put(CobblemonStructureIDs.TAIGA_LONG_PATH, 3);
|
|
||||||
structureMaxes = Collections.unmodifiableMap(aMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getGroups(Identifier structureIdentifier) {
|
|
||||||
return structureGroups.getOrDefault(structureIdentifier, Set.of());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasReachedMaximum(Identifier structureIdentifier) {
|
|
||||||
Set<String> groups = getGroups(structureIdentifier);
|
|
||||||
for (String group : groups) {
|
|
||||||
int count = generatedStructureGroupCounts.getOrDefault(group, 0);
|
|
||||||
if (count >= structureMaxes.getOrDefault(group, Integer.MAX_VALUE)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void incrementStructureCount(Identifier structureIdentifier) {
|
|
||||||
Set<String> groups = getGroups(structureIdentifier);
|
|
||||||
for (String group : groups) {
|
|
||||||
generatedStructureGroupCounts.put(group, generatedStructureGroupCounts.getOrDefault(group, 0) + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void onStructurePoolGeneratorCreation(Registry<StructurePool> registry, int maxSize, ChunkGenerator chunkGenerator, StructureTemplateManager structureTemplateManager, List<? super PoolStructurePiece> children, Random random, CallbackInfo ci) {
|
|
||||||
generatedStructureGroupCounts = new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ModifyVariable(method = "generatePiece", at = @At("STORE"), ordinal = 1)
|
|
||||||
private Iterator<StructurePoolElement> reduceStructurePoolElementIterator(Iterator<StructurePoolElement> iterator) {
|
|
||||||
List<StructurePoolElement> reducedList = new ArrayList<>();
|
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
StructurePoolElement structure = iterator.next();
|
|
||||||
Identifier structurePieceLocationKey = getCobblemonOnlyLocation(structure);
|
|
||||||
if (structurePieceLocationKey == null) {
|
|
||||||
reducedList.add(structure);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasReachedMaximum(structurePieceLocationKey)) {
|
|
||||||
reducedList.add(structure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return reducedList.iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ModifyVariable(method = "generatePiece", at = @At("STORE"), ordinal = 1)
|
|
||||||
private PoolStructurePiece injected(PoolStructurePiece poolStructurePiece) {
|
|
||||||
Identifier structureLocationKey = getCobblemonOnlyLocation(poolStructurePiece.getPoolElement());
|
|
||||||
if (structureLocationKey != null) {
|
|
||||||
incrementStructureCount(structureLocationKey);
|
|
||||||
}
|
|
||||||
return poolStructurePiece;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This doesn't SEEM necessary? It appears to work without.
|
|
||||||
@Inject(method = "generatePiece", at = @At("HEAD"))
|
|
||||||
private void beforeGeneratePiece(PoolStructurePiece piece, MutableObject<VoxelShape> pieceShape, int minY, boolean modifyBoundingBox, HeightLimitView world, NoiseConfig noiseConfig, CallbackInfo ci) {
|
|
||||||
// Identifier structureLocationKey = getCobblemonOnlyLocation(piece.getPoolElement());
|
|
||||||
//
|
|
||||||
// if (structureLocationKey != null) {
|
|
||||||
// Integer currentlyGenerated = generatedStructureCounts.get(structureLocationKey);
|
|
||||||
// if (currentlyGenerated == null) currentlyGenerated = 0;
|
|
||||||
// generatedStructureCounts.put(structureLocationKey, currentlyGenerated + 1);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// List<StructurePoolBasedGenerator.ShapedPoolStructurePiece> reducedStructurePiecesList = structurePieces.stream().toList();
|
|
||||||
//
|
|
||||||
// for (Identifier maxStructureLocationKey : structureMaxes.keySet()) {
|
|
||||||
// Integer maxAllowed = structureMaxes.get(maxStructureLocationKey);
|
|
||||||
//
|
|
||||||
// Integer currentlyGenerated = generatedStructureCounts.get(maxStructureLocationKey);
|
|
||||||
// if (currentlyGenerated == null) currentlyGenerated = 0;
|
|
||||||
// if (currentlyGenerated < maxAllowed) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //Already have max so need to remove
|
|
||||||
// reducedStructurePiecesList = reducedStructurePiecesList.stream()
|
|
||||||
// .filter(shapedStructurePiece -> {
|
|
||||||
// Identifier locationKey = getCobblemonOnlyLocation(shapedStructurePiece.piece.getPoolElement());
|
|
||||||
// if (locationKey == null) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return !locationKey.equals(maxStructureLocationKey);
|
|
||||||
// })
|
|
||||||
// .collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// structurePieces = new ArrayDeque<>(reducedStructurePiecesList);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Identifier getCobblemonOnlyLocation(StructurePoolElement structurePoolElement) {
|
|
||||||
Identifier location = getLocationIfAvailable(structurePoolElement);
|
|
||||||
if (location == null) return null;
|
|
||||||
|
|
||||||
if (!location.getNamespace().equals("cobblemon")) return null;
|
|
||||||
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Identifier getLocationIfAvailable(StructurePoolElement structurePoolElement) {
|
|
||||||
if (structurePoolElement instanceof LegacySinglePoolElement legacySinglePoolElement) {
|
|
||||||
if (legacySinglePoolElement.location.left().isEmpty()) return null;
|
|
||||||
|
|
||||||
return legacySinglePoolElement.location.left().get();
|
|
||||||
} else if (structurePoolElement instanceof SinglePoolElement singlePoolElement) {
|
|
||||||
if (singlePoolElement.location.left().isEmpty()) return null;
|
|
||||||
|
|
||||||
return singlePoolElement.location.left().get();
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// private List<StructurePoolElement> removeInstanceOfLocationKeyFrom(List<StructurePoolElement> structureList, Integer allowedNumberOfInstances, Identifier locationKey) {
|
|
||||||
// List<StructurePoolElement> reducedList = new ArrayList<>();
|
|
||||||
// int instancesFound = 0;
|
|
||||||
//
|
|
||||||
// for (StructurePoolElement structurePoolElement: structureList) {
|
|
||||||
// Identifier structureKey = getCobblemonOnlyLocation(structurePoolElement);
|
|
||||||
// if (structureKey == null || !structureKey.equals(locationKey)) {
|
|
||||||
// reducedList.add(structurePoolElement);
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (instancesFound >= allowedNumberOfInstances) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// reducedList.add(structurePoolElement);
|
|
||||||
// instancesFound++;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return reducedList;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.bridges.StructureProcessorListBridge;
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import net.minecraft.structure.processor.StructureProcessor;
|
|
||||||
import net.minecraft.structure.processor.StructureProcessorList;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
@Mixin(StructureProcessorList.class)
|
|
||||||
public class StructureProcessorListMixin implements StructureProcessorListBridge {
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Mutable
|
|
||||||
@Shadow
|
|
||||||
private List<StructureProcessor> list;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void append(StructureProcessor processor) {
|
|
||||||
List<StructureProcessor> mutable = new ArrayList<>(this.list);
|
|
||||||
mutable.add(processor);
|
|
||||||
this.list = ImmutableList.copyOf(mutable);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clear() {
|
|
||||||
this.list = ImmutableList.of();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
+7
-8
@@ -8,16 +8,15 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.mixin.accessor;
|
package com.cobblemon.mod.common.mixin.accessor;
|
||||||
|
|
||||||
import net.minecraft.entity.vehicle.BoatEntity;
|
import net.minecraft.client.sound.MusicTracker;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
@Mixin(BoatEntity.class)
|
@Mixin(MusicTracker.class)
|
||||||
public interface BoatEntityAccessor {
|
public interface MusicTrackerAccessor {
|
||||||
|
@Accessor("timeUntilNextSong")
|
||||||
|
int timeUntilNextSong();
|
||||||
|
|
||||||
@Accessor
|
@Accessor("timeUntilNextSong")
|
||||||
void setFallVelocity(double fallVelocity);
|
void setTimeUntilNextSong(int timeUntilNextSong);
|
||||||
|
|
||||||
@Accessor
|
|
||||||
BoatEntity.Location getLocation();
|
|
||||||
}
|
}
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin.invoker;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.integration.adorn.AdornCompatibility;
|
|
||||||
import java.util.List;
|
|
||||||
import juuxel.adorn.block.variant.BlockVariantSet;
|
|
||||||
import juuxel.adorn.block.variant.BlockVariantSets;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
//This is a yucky hack but better than what we were doing before
|
|
||||||
@Mixin(BlockVariantSets.class)
|
|
||||||
public abstract class AdornRegisterInvoker {
|
|
||||||
@Final
|
|
||||||
@Shadow(remap = false)
|
|
||||||
private static List<BlockVariantSet> variantSets;
|
|
||||||
|
|
||||||
@Inject(method = "register()V", at = @At("HEAD"), remap = false)
|
|
||||||
void register(CallbackInfo ci) {
|
|
||||||
variantSets.add(AdornCompatibility.INSTANCE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin.invoker;
|
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import net.minecraft.block.FireBlock;
|
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
|
||||||
|
|
||||||
@Mixin(FireBlock.class)
|
|
||||||
public interface FireBlockInvoker {
|
|
||||||
@Invoker("registerFlammableBlock") void registerNewFlammableBlock(Block block, int burnChance, int spreadChance);
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{{ license }}
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common
|
|
||||||
|
|
||||||
object CobblemonBuildDetails {
|
|
||||||
|
|
||||||
const val MOD_ID = "{{ modid }}"
|
|
||||||
const val VERSION = "{{ version }}"
|
|
||||||
const val SNAPSHOT = {{ isSnapshot }}
|
|
||||||
|
|
||||||
const val GIT_COMMIT = "{{ gitCommit | default("Not Specified") }}"
|
|
||||||
const val BRANCH = "{{ branch | default("Not Specified") }}"
|
|
||||||
|
|
||||||
fun smallCommitHash(): String {
|
|
||||||
return this.GIT_COMMIT.substring(0, 7)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common
|
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient
|
|
||||||
import net.minecraft.client.render.model.BakedModel
|
|
||||||
import net.minecraft.client.util.ModelIdentifier
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains information for forcing a model to be baked
|
|
||||||
*
|
|
||||||
* @param modelLocation The location of the model
|
|
||||||
* @param modelIdentifier The identifier that the BakedModel will be registered to
|
|
||||||
*/
|
|
||||||
data class BakingOverride(
|
|
||||||
val modelLocation: Identifier,
|
|
||||||
val modelIdentifier: ModelIdentifier
|
|
||||||
) {
|
|
||||||
fun getModel(): BakedModel {
|
|
||||||
return MinecraftClient.getInstance().bakedModelManager.getModel(modelIdentifier)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,23 +8,17 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonBuildDetails.smallCommitHash
|
|
||||||
import com.cobblemon.mod.common.advancement.CobblemonCriteria
|
import com.cobblemon.mod.common.advancement.CobblemonCriteria
|
||||||
import com.cobblemon.mod.common.advancement.criterion.EvolvePokemonContext
|
|
||||||
import com.cobblemon.mod.common.api.Priority
|
import com.cobblemon.mod.common.api.Priority
|
||||||
import com.cobblemon.mod.common.api.SeasonResolver
|
import com.cobblemon.mod.common.api.SeasonResolver
|
||||||
import com.cobblemon.mod.common.api.data.DataProvider
|
import com.cobblemon.mod.common.api.data.DataProvider
|
||||||
import com.cobblemon.mod.common.api.drop.CommandDropEntry
|
import com.cobblemon.mod.common.api.drop.CommandDropEntry
|
||||||
import com.cobblemon.mod.common.api.drop.DropEntry
|
import com.cobblemon.mod.common.api.drop.DropEntry
|
||||||
import com.cobblemon.mod.common.api.drop.ItemDropEntry
|
import com.cobblemon.mod.common.api.drop.ItemDropEntry
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.BATTLE_VICTORY
|
import com.cobblemon.mod.common.api.events.CobblemonEvents.BATTLE_VICTORY
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.EVOLUTION_COMPLETE
|
import com.cobblemon.mod.common.api.events.CobblemonEvents.EVOLUTION_COMPLETE
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.LEVEL_UP_EVENT
|
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.POKEMON_CAPTURED
|
import com.cobblemon.mod.common.api.events.CobblemonEvents.POKEMON_CAPTURED
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.TRADE_COMPLETED
|
|
||||||
import com.cobblemon.mod.common.api.net.serializers.IdentifierDataSerializer
|
|
||||||
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
|
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
|
||||||
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
|
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
|
||||||
import com.cobblemon.mod.common.api.net.serializers.Vec3DataSerializer
|
import com.cobblemon.mod.common.api.net.serializers.Vec3DataSerializer
|
||||||
@@ -38,15 +32,13 @@ import com.cobblemon.mod.common.api.pokemon.experience.ExperienceGroups
|
|||||||
import com.cobblemon.mod.common.api.pokemon.experience.StandardExperienceCalculator
|
import com.cobblemon.mod.common.api.pokemon.experience.StandardExperienceCalculator
|
||||||
import com.cobblemon.mod.common.api.pokemon.feature.ChoiceSpeciesFeatureProvider
|
import com.cobblemon.mod.common.api.pokemon.feature.ChoiceSpeciesFeatureProvider
|
||||||
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeatureProvider
|
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeatureProvider
|
||||||
import com.cobblemon.mod.common.api.pokemon.feature.IntSpeciesFeatureProvider
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatures
|
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatures
|
||||||
import com.cobblemon.mod.common.api.pokemon.helditem.HeldItemProvider
|
import com.cobblemon.mod.common.api.pokemon.helditem.HeldItemProvider
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.EvCalculator
|
import com.cobblemon.mod.common.api.pokemon.stats.EvCalculator
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.Generation8EvCalculator
|
import com.cobblemon.mod.common.api.pokemon.stats.Generation8EvCalculator
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.StatProvider
|
import com.cobblemon.mod.common.api.pokemon.stats.StatProvider
|
||||||
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
|
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
|
||||||
import com.cobblemon.mod.common.api.scheduling.ServerRealTimeTaskTracker
|
import com.cobblemon.mod.common.api.scheduling.ScheduledTaskTracker
|
||||||
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
|
|
||||||
import com.cobblemon.mod.common.api.spawning.BestSpawner
|
import com.cobblemon.mod.common.api.spawning.BestSpawner
|
||||||
import com.cobblemon.mod.common.api.spawning.CobblemonSpawningProspector
|
import com.cobblemon.mod.common.api.spawning.CobblemonSpawningProspector
|
||||||
import com.cobblemon.mod.common.api.spawning.context.AreaContextResolver
|
import com.cobblemon.mod.common.api.spawning.context.AreaContextResolver
|
||||||
@@ -54,19 +46,14 @@ import com.cobblemon.mod.common.api.spawning.prospecting.SpawningProspector
|
|||||||
import com.cobblemon.mod.common.api.starter.StarterHandler
|
import com.cobblemon.mod.common.api.starter.StarterHandler
|
||||||
import com.cobblemon.mod.common.api.storage.PokemonStoreManager
|
import com.cobblemon.mod.common.api.storage.PokemonStoreManager
|
||||||
import com.cobblemon.mod.common.api.storage.adapter.conversions.ReforgedConversion
|
import com.cobblemon.mod.common.api.storage.adapter.conversions.ReforgedConversion
|
||||||
import com.cobblemon.mod.common.api.storage.adapter.database.MongoDBStoreAdapter
|
import com.cobblemon.mod.common.api.storage.adapter.flatifle.FileStoreAdapter
|
||||||
import com.cobblemon.mod.common.api.storage.adapter.flatfile.FileStoreAdapter
|
import com.cobblemon.mod.common.api.storage.adapter.flatifle.JSONStoreAdapter
|
||||||
import com.cobblemon.mod.common.api.storage.adapter.flatfile.JSONStoreAdapter
|
import com.cobblemon.mod.common.api.storage.adapter.flatifle.NBTStoreAdapter
|
||||||
import com.cobblemon.mod.common.api.storage.adapter.flatfile.NBTStoreAdapter
|
|
||||||
import com.cobblemon.mod.common.api.storage.factory.FileBackedPokemonStoreFactory
|
import com.cobblemon.mod.common.api.storage.factory.FileBackedPokemonStoreFactory
|
||||||
import com.cobblemon.mod.common.api.storage.molang.NbtMoLangDataStoreFactory
|
|
||||||
import com.cobblemon.mod.common.api.storage.pc.PCStore
|
import com.cobblemon.mod.common.api.storage.pc.PCStore
|
||||||
import com.cobblemon.mod.common.api.storage.pc.link.PCLinkManager
|
import com.cobblemon.mod.common.api.storage.pc.link.PCLinkManager
|
||||||
import com.cobblemon.mod.common.api.storage.player.PlayerDataStoreManager
|
import com.cobblemon.mod.common.api.storage.player.PlayerDataStoreManager
|
||||||
import com.cobblemon.mod.common.api.storage.player.factory.JsonPlayerDataStoreFactory
|
|
||||||
import com.cobblemon.mod.common.api.storage.player.factory.MongoPlayerDataStoreFactory
|
|
||||||
import com.cobblemon.mod.common.api.tags.CobblemonEntityTypeTags
|
import com.cobblemon.mod.common.api.tags.CobblemonEntityTypeTags
|
||||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
|
||||||
import com.cobblemon.mod.common.battles.BagItems
|
import com.cobblemon.mod.common.battles.BagItems
|
||||||
import com.cobblemon.mod.common.battles.BattleFormat
|
import com.cobblemon.mod.common.battles.BattleFormat
|
||||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||||
@@ -74,7 +61,6 @@ import com.cobblemon.mod.common.battles.BattleSide
|
|||||||
import com.cobblemon.mod.common.battles.ShowdownThread
|
import com.cobblemon.mod.common.battles.ShowdownThread
|
||||||
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
|
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
import com.cobblemon.mod.common.command.argument.DialogueArgumentType
|
|
||||||
import com.cobblemon.mod.common.command.argument.MoveArgumentType
|
import com.cobblemon.mod.common.command.argument.MoveArgumentType
|
||||||
import com.cobblemon.mod.common.command.argument.PartySlotArgumentType
|
import com.cobblemon.mod.common.command.argument.PartySlotArgumentType
|
||||||
import com.cobblemon.mod.common.command.argument.PokemonArgumentType
|
import com.cobblemon.mod.common.command.argument.PokemonArgumentType
|
||||||
@@ -100,9 +86,9 @@ import com.cobblemon.mod.common.pokemon.feature.TagSeasonResolver
|
|||||||
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||||
import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
|
import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
|
||||||
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
||||||
|
import com.cobblemon.mod.common.pokemon.properties.UntradeableProperty
|
||||||
import com.cobblemon.mod.common.pokemon.properties.tags.PokemonFlagProperty
|
import com.cobblemon.mod.common.pokemon.properties.tags.PokemonFlagProperty
|
||||||
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
|
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
|
||||||
import com.cobblemon.mod.common.sherds.CobblemonSherds
|
|
||||||
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
|
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
|
||||||
import com.cobblemon.mod.common.trade.TradeManager
|
import com.cobblemon.mod.common.trade.TradeManager
|
||||||
import com.cobblemon.mod.common.util.DataKeys
|
import com.cobblemon.mod.common.util.DataKeys
|
||||||
@@ -115,10 +101,15 @@ import com.cobblemon.mod.common.util.server
|
|||||||
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
||||||
import com.cobblemon.mod.common.world.feature.ore.CobblemonOrePlacedFeatures
|
import com.cobblemon.mod.common.world.feature.ore.CobblemonOrePlacedFeatures
|
||||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
||||||
import com.mongodb.ConnectionString
|
import java.io.File
|
||||||
import com.mongodb.MongoClientSettings
|
import java.io.FileReader
|
||||||
import com.mongodb.client.MongoClient
|
import java.io.FileWriter
|
||||||
import com.mongodb.client.MongoClients
|
import java.io.PrintWriter
|
||||||
|
import java.util.UUID
|
||||||
|
import kotlin.properties.Delegates
|
||||||
|
import kotlin.reflect.full.memberProperties
|
||||||
|
import kotlin.reflect.jvm.isAccessible
|
||||||
|
import kotlin.reflect.jvm.javaField
|
||||||
import net.minecraft.client.MinecraftClient
|
import net.minecraft.client.MinecraftClient
|
||||||
import net.minecraft.command.argument.serialize.ConstantArgumentSerializer
|
import net.minecraft.command.argument.serialize.ConstantArgumentSerializer
|
||||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry
|
||||||
@@ -128,23 +119,12 @@ import net.minecraft.registry.RegistryKey
|
|||||||
import net.minecraft.util.WorldSavePath
|
import net.minecraft.util.WorldSavePath
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
import org.apache.logging.log4j.Logger
|
|
||||||
import java.io.File
|
|
||||||
import java.io.FileReader
|
|
||||||
import java.io.FileWriter
|
|
||||||
import java.io.PrintWriter
|
|
||||||
import java.util.*
|
|
||||||
import kotlin.properties.Delegates
|
|
||||||
import kotlin.reflect.full.memberProperties
|
|
||||||
import kotlin.reflect.jvm.isAccessible
|
|
||||||
import kotlin.reflect.jvm.javaField
|
|
||||||
import kotlin.math.roundToInt
|
|
||||||
|
|
||||||
object Cobblemon {
|
object Cobblemon {
|
||||||
const val MODID = CobblemonBuildDetails.MOD_ID
|
const val MODID = "cobblemon"
|
||||||
const val VERSION = CobblemonBuildDetails.VERSION
|
const val VERSION = "1.4.0"
|
||||||
const val CONFIG_PATH = "config/$MODID/main.json"
|
const val CONFIG_PATH = "config/$MODID/main.json"
|
||||||
val LOGGER: Logger = LogManager.getLogger()
|
val LOGGER = LogManager.getLogger()
|
||||||
|
|
||||||
lateinit var implementation: CobblemonImplementation
|
lateinit var implementation: CobblemonImplementation
|
||||||
@Deprecated("This field is now a config value", ReplaceWith("Cobblemon.config.captureCalculator"))
|
@Deprecated("This field is now a config value", ReplaceWith("Cobblemon.config.captureCalculator"))
|
||||||
@@ -164,7 +144,6 @@ object Cobblemon {
|
|||||||
val bestSpawner = BestSpawner
|
val bestSpawner = BestSpawner
|
||||||
val battleRegistry = BattleRegistry
|
val battleRegistry = BattleRegistry
|
||||||
var storage = PokemonStoreManager()
|
var storage = PokemonStoreManager()
|
||||||
var molangData = NbtMoLangDataStoreFactory
|
|
||||||
lateinit var playerData: PlayerDataStoreManager
|
lateinit var playerData: PlayerDataStoreManager
|
||||||
lateinit var starterConfig: StarterConfig
|
lateinit var starterConfig: StarterConfig
|
||||||
val dataProvider: DataProvider = CobblemonDataProvider
|
val dataProvider: DataProvider = CobblemonDataProvider
|
||||||
@@ -174,13 +153,6 @@ object Cobblemon {
|
|||||||
|
|
||||||
fun preInitialize(implementation: CobblemonImplementation) {
|
fun preInitialize(implementation: CobblemonImplementation) {
|
||||||
this.implementation = implementation
|
this.implementation = implementation
|
||||||
|
|
||||||
this.LOGGER.info("Launching Cobblemon ${CobblemonBuildDetails.VERSION}${if(CobblemonBuildDetails.SNAPSHOT) "-SNAPSHOT" else ""} ")
|
|
||||||
if(CobblemonBuildDetails.SNAPSHOT) {
|
|
||||||
this.LOGGER.info(" - Git Commit: ${smallCommitHash()} (https://gitlab.com/cable-mc/cobblemon/-/commit/${CobblemonBuildDetails.GIT_COMMIT})")
|
|
||||||
this.LOGGER.info(" - Branch: ${CobblemonBuildDetails.BRANCH}")
|
|
||||||
}
|
|
||||||
|
|
||||||
implementation.registerPermissionValidator()
|
implementation.registerPermissionValidator()
|
||||||
implementation.registerSoundEvents()
|
implementation.registerSoundEvents()
|
||||||
implementation.registerBlocks()
|
implementation.registerBlocks()
|
||||||
@@ -243,9 +215,6 @@ object Cobblemon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the grow_tumblestone advancement
|
|
||||||
PlatformEvents.RIGHT_CLICK_BLOCK.subscribe { AdvancementHandler.onTumbleStonePlaced(it) }
|
|
||||||
|
|
||||||
PlatformEvents.CHANGE_DIMENSION.subscribe {
|
PlatformEvents.CHANGE_DIMENSION.subscribe {
|
||||||
it.player.party().forEach { pokemon -> pokemon.entity?.recallWithAnimation() }
|
it.player.party().forEach { pokemon -> pokemon.entity?.recallWithAnimation() }
|
||||||
}
|
}
|
||||||
@@ -253,17 +222,6 @@ object Cobblemon {
|
|||||||
TrackedDataHandlerRegistry.register(Vec3DataSerializer)
|
TrackedDataHandlerRegistry.register(Vec3DataSerializer)
|
||||||
TrackedDataHandlerRegistry.register(StringSetDataSerializer)
|
TrackedDataHandlerRegistry.register(StringSetDataSerializer)
|
||||||
TrackedDataHandlerRegistry.register(PoseTypeDataSerializer)
|
TrackedDataHandlerRegistry.register(PoseTypeDataSerializer)
|
||||||
TrackedDataHandlerRegistry.register(IdentifierDataSerializer)
|
|
||||||
|
|
||||||
// Lowest priority because this applies after luxury ball bonus as of gen 4
|
|
||||||
CobblemonEvents.FRIENDSHIP_UPDATED.subscribe(Priority.LOWEST) { event ->
|
|
||||||
var increment = (event.newFriendship - event.pokemon.friendship).toFloat()
|
|
||||||
// Our Luxury ball spec is diff from official, but we will still assume these stack
|
|
||||||
if (event.pokemon.heldItemNoCopy().isIn(CobblemonItemTags.IS_FRIENDSHIP_BOOSTER)) {
|
|
||||||
increment += increment * 0.5F
|
|
||||||
}
|
|
||||||
event.newFriendship = event.pokemon.friendship + increment.roundToInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
HeldItemProvider.register(CobblemonHeldItemManager, Priority.LOWEST)
|
HeldItemProvider.register(CobblemonHeldItemManager, Priority.LOWEST)
|
||||||
}
|
}
|
||||||
@@ -279,7 +237,6 @@ object Cobblemon {
|
|||||||
|
|
||||||
SpeciesFeatures.types["choice"] = ChoiceSpeciesFeatureProvider::class.java
|
SpeciesFeatures.types["choice"] = ChoiceSpeciesFeatureProvider::class.java
|
||||||
SpeciesFeatures.types["flag"] = FlagSpeciesFeatureProvider::class.java
|
SpeciesFeatures.types["flag"] = FlagSpeciesFeatureProvider::class.java
|
||||||
SpeciesFeatures.types["integer"] = IntSpeciesFeatureProvider::class.java
|
|
||||||
|
|
||||||
SpeciesFeatures.register(
|
SpeciesFeatures.register(
|
||||||
DataKeys.CAN_BE_MILKED,
|
DataKeys.CAN_BE_MILKED,
|
||||||
@@ -288,70 +245,28 @@ object Cobblemon {
|
|||||||
DataKeys.HAS_BEEN_SHEARED,
|
DataKeys.HAS_BEEN_SHEARED,
|
||||||
FlagSpeciesFeatureProvider(keys = listOf(DataKeys.HAS_BEEN_SHEARED), default = false))
|
FlagSpeciesFeatureProvider(keys = listOf(DataKeys.HAS_BEEN_SHEARED), default = false))
|
||||||
|
|
||||||
|
CustomPokemonProperty.register(UntradeableProperty)
|
||||||
CustomPokemonProperty.register(UncatchableProperty)
|
CustomPokemonProperty.register(UncatchableProperty)
|
||||||
CustomPokemonProperty.register(PokemonFlagProperty)
|
CustomPokemonProperty.register(PokemonFlagProperty)
|
||||||
CustomPokemonProperty.register(HiddenAbilityPropertyType)
|
CustomPokemonProperty.register(HiddenAbilityPropertyType)
|
||||||
|
|
||||||
ifDedicatedServer {
|
ifDedicatedServer {
|
||||||
isDedicatedServer = true
|
isDedicatedServer = true
|
||||||
|
PlatformEvents.SERVER_TICK_POST.subscribe { ScheduledTaskTracker.update() }
|
||||||
}
|
}
|
||||||
|
|
||||||
PlatformEvents.SERVER_TICK_POST.subscribe {
|
|
||||||
ServerTaskTracker.update(1/20F)
|
|
||||||
ServerRealTimeTaskTracker.update()
|
|
||||||
}
|
|
||||||
PlatformEvents.SERVER_TICK_PRE.subscribe {
|
|
||||||
ServerRealTimeTaskTracker.update()
|
|
||||||
}
|
|
||||||
PlatformEvents.SERVER_STARTING.subscribe { event ->
|
PlatformEvents.SERVER_STARTING.subscribe { event ->
|
||||||
val server = event.server
|
val server = event.server
|
||||||
playerData = PlayerDataStoreManager().also { it.setup(server) }
|
playerData = PlayerDataStoreManager().also { it.setup(server) }
|
||||||
|
|
||||||
val mongoClient: MongoClient?
|
|
||||||
|
|
||||||
val pokemonStoreRoot = server.getSavePath(WorldSavePath.ROOT).resolve("pokemon").toFile()
|
val pokemonStoreRoot = server.getSavePath(WorldSavePath.ROOT).resolve("pokemon").toFile()
|
||||||
val storeAdapter = when (config.storageFormat) {
|
|
||||||
"nbt", "json" -> {
|
|
||||||
val jsonFactory = JsonPlayerDataStoreFactory()
|
|
||||||
jsonFactory.setup(server)
|
|
||||||
playerData.setFactory(jsonFactory)
|
|
||||||
|
|
||||||
if (config.storageFormat == "nbt") {
|
|
||||||
NBTStoreAdapter(pokemonStoreRoot.absolutePath, useNestedFolders = true, folderPerClass = true)
|
|
||||||
} else {
|
|
||||||
JSONStoreAdapter(
|
|
||||||
pokemonStoreRoot.absolutePath,
|
|
||||||
useNestedFolders = true,
|
|
||||||
folderPerClass = true
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"mongodb" -> {
|
|
||||||
try {
|
|
||||||
Class.forName("com.mongodb.client.MongoClient")
|
|
||||||
|
|
||||||
val mongoClientSettings = MongoClientSettings.builder()
|
|
||||||
.applyConnectionString(ConnectionString(config.mongoDBConnectionString))
|
|
||||||
.build()
|
|
||||||
mongoClient = MongoClients.create(mongoClientSettings)
|
|
||||||
val mongoFactory = MongoPlayerDataStoreFactory(mongoClient, config.mongoDBDatabaseName)
|
|
||||||
playerData.setFactory(mongoFactory)
|
|
||||||
MongoDBStoreAdapter(mongoClient, config.mongoDBDatabaseName)
|
|
||||||
} catch (e: ClassNotFoundException) {
|
|
||||||
LOGGER.error("MongoDB driver not found.")
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> throw IllegalArgumentException("Unsupported storageFormat: ${config.storageFormat}")
|
|
||||||
}
|
|
||||||
.with(ReforgedConversion(server.getSavePath(WorldSavePath.ROOT))) as FileStoreAdapter<*>
|
|
||||||
|
|
||||||
storage.registerFactory(
|
storage.registerFactory(
|
||||||
priority = Priority.LOWEST,
|
priority = Priority.LOWEST,
|
||||||
factory = FileBackedPokemonStoreFactory(
|
factory = FileBackedPokemonStoreFactory(
|
||||||
adapter = storeAdapter,
|
adapter = if (config.storageFormat == "nbt") {
|
||||||
|
NBTStoreAdapter(pokemonStoreRoot.absolutePath, useNestedFolders = true, folderPerClass = true)
|
||||||
|
} else {
|
||||||
|
JSONStoreAdapter(pokemonStoreRoot.absolutePath, useNestedFolders = true, folderPerClass = true)
|
||||||
|
}.with(ReforgedConversion(server.getSavePath(WorldSavePath.ROOT))) as FileStoreAdapter<*>,
|
||||||
createIfMissing = true,
|
createIfMissing = true,
|
||||||
pcConstructor = { uuid -> PCStore(uuid).also { it.resize(config.defaultBoxCount) } }
|
pcConstructor = { uuid -> PCStore(uuid).also { it.resize(config.defaultBoxCount) } }
|
||||||
)
|
)
|
||||||
@@ -377,7 +292,7 @@ object Cobblemon {
|
|||||||
// Ensure the config option is enabled and that the result was a ninjask and that shedinja exists
|
// Ensure the config option is enabled and that the result was a ninjask and that shedinja exists
|
||||||
if (this.config.ninjaskCreatesShedinja && pokemon.species.resourceIdentifier == ninjaskIdentifier && PokemonSpecies.getByIdentifier(Pokemon.SHEDINJA) != null) {
|
if (this.config.ninjaskCreatesShedinja && pokemon.species.resourceIdentifier == ninjaskIdentifier && PokemonSpecies.getByIdentifier(Pokemon.SHEDINJA) != null) {
|
||||||
val player = pokemon.getOwnerPlayer() ?: return@subscribe
|
val player = pokemon.getOwnerPlayer() ?: return@subscribe
|
||||||
if (player.isCreative || player.inventory.containsAny { it.item is PokeBallItem }) {
|
if (player.inventory.containsAny { it.item is PokeBallItem }) {
|
||||||
var pokeball = Items.AIR
|
var pokeball = Items.AIR
|
||||||
player.inventory.combinedInventory.forEach {
|
player.inventory.combinedInventory.forEach {
|
||||||
it.forEach {
|
it.forEach {
|
||||||
@@ -386,12 +301,7 @@ object Cobblemon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!player.isCreative) {
|
player.inventory.removeAmountIf(1) { it.item is PokeBallItem }
|
||||||
player.inventory.removeAmountIf(1) { it.item is PokeBallItem }
|
|
||||||
}
|
|
||||||
if (pokeball == Items.AIR) {
|
|
||||||
pokeball = CobblemonItems.POKE_BALL
|
|
||||||
}
|
|
||||||
val properties = event.evolution.result.copy()
|
val properties = event.evolution.result.copy()
|
||||||
properties.species = Pokemon.SHEDINJA.toString()
|
properties.species = Pokemon.SHEDINJA.toString()
|
||||||
val product = pokemon.clone()
|
val product = pokemon.clone()
|
||||||
@@ -399,24 +309,18 @@ object Cobblemon {
|
|||||||
properties.apply(product)
|
properties.apply(product)
|
||||||
product.caughtBall = (pokeball as PokeBallItem).pokeBall
|
product.caughtBall = (pokeball as PokeBallItem).pokeBall
|
||||||
pokemon.storeCoordinates.get()?.store?.add(product)
|
pokemon.storeCoordinates.get()?.store?.add(product)
|
||||||
CobblemonCriteria.EVOLVE_POKEMON.trigger(player, EvolvePokemonContext(event.pokemon.preEvolution!!.species.resourceIdentifier, product.species.resourceIdentifier, playerData.get(player).advancementData.totalEvolvedCount))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LEVEL_UP_EVENT.subscribe { AdvancementHandler.onLevelUp(it) }
|
|
||||||
TRADE_COMPLETED.subscribe { AdvancementHandler.onTradeCompleted(it) }
|
|
||||||
|
|
||||||
BagItems.observable.subscribe {
|
BagItems.observable.subscribe {
|
||||||
LOGGER.info("Starting dummy Showdown battle to force it to pre-load data.")
|
LOGGER.info("Starting dummy Showdown battle to force it to pre-load data.")
|
||||||
battleRegistry.startBattle(
|
battleRegistry.startBattle(
|
||||||
BattleFormat.GEN_9_SINGLES,
|
BattleFormat.GEN_9_SINGLES,
|
||||||
BattleSide(PokemonBattleActor(UUID.randomUUID(), BattlePokemon(Pokemon().initialize()), -1F)),
|
BattleSide(PokemonBattleActor(UUID.randomUUID(), BattlePokemon(Pokemon().initialize()), -1F)),
|
||||||
BattleSide(PokemonBattleActor(UUID.randomUUID(), BattlePokemon(Pokemon().initialize()), -1F)),
|
BattleSide(PokemonBattleActor(UUID.randomUUID(), BattlePokemon(Pokemon().initialize()), -1F))
|
||||||
true
|
).apply { mute = true }
|
||||||
).ifSuccessful { it.mute = true }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CobblemonSherds.registerSherds()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getLevel(dimension: RegistryKey<World>): World? {
|
fun getLevel(dimension: RegistryKey<World>): World? {
|
||||||
@@ -520,7 +424,6 @@ object Cobblemon {
|
|||||||
this.implementation.registerCommandArgument(cobblemonResource("move"), MoveArgumentType::class, ConstantArgumentSerializer.of(MoveArgumentType::move))
|
this.implementation.registerCommandArgument(cobblemonResource("move"), MoveArgumentType::class, ConstantArgumentSerializer.of(MoveArgumentType::move))
|
||||||
this.implementation.registerCommandArgument(cobblemonResource("party_slot"), PartySlotArgumentType::class, ConstantArgumentSerializer.of(PartySlotArgumentType::partySlot))
|
this.implementation.registerCommandArgument(cobblemonResource("party_slot"), PartySlotArgumentType::class, ConstantArgumentSerializer.of(PartySlotArgumentType::partySlot))
|
||||||
this.implementation.registerCommandArgument(cobblemonResource("pokemon_store"), PokemonStoreArgumentType::class, ConstantArgumentSerializer.of(PokemonStoreArgumentType::pokemonStore))
|
this.implementation.registerCommandArgument(cobblemonResource("pokemon_store"), PokemonStoreArgumentType::class, ConstantArgumentSerializer.of(PokemonStoreArgumentType::pokemonStore))
|
||||||
this.implementation.registerCommandArgument(cobblemonResource("dialogue"), DialogueArgumentType::class, ConstantArgumentSerializer.of(DialogueArgumentType::dialogue))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common
|
|
||||||
|
|
||||||
import net.minecraft.entity.ai.brain.Activity
|
|
||||||
|
|
||||||
object CobblemonActivities {
|
|
||||||
val activities = mutableListOf<Activity>()
|
|
||||||
val BATTLING_ACTIVITY = Activity("pokemon_battling")
|
|
||||||
|
|
||||||
fun register(activity: Activity): Activity {
|
|
||||||
activities.add(activity)
|
|
||||||
return activity
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,16 +8,9 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.block.entity.BerryBlockEntity
|
|
||||||
import com.cobblemon.mod.common.block.entity.HealingMachineBlockEntity
|
import com.cobblemon.mod.common.block.entity.HealingMachineBlockEntity
|
||||||
import com.cobblemon.mod.common.block.entity.PCBlockEntity
|
import com.cobblemon.mod.common.block.entity.PCBlockEntity
|
||||||
import com.cobblemon.mod.common.block.entity.PokemonPastureBlockEntity
|
import com.cobblemon.mod.common.block.entity.PokemonPastureBlockEntity
|
||||||
import com.cobblemon.mod.common.block.entity.FossilAnalyzerBlockEntity
|
|
||||||
import com.cobblemon.mod.common.block.entity.FossilMultiblockEntity
|
|
||||||
import com.cobblemon.mod.common.block.entity.RestorationTankBlockEntity
|
|
||||||
import com.cobblemon.mod.common.block.multiblock.FossilMultiblockBuilder
|
|
||||||
import com.cobblemon.mod.common.block.entity.*
|
|
||||||
import com.cobblemon.mod.common.block.entity.DisplayCaseBlockEntity
|
|
||||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||||
import net.minecraft.block.entity.BlockEntityType
|
import net.minecraft.block.entity.BlockEntityType
|
||||||
import net.minecraft.registry.Registries
|
import net.minecraft.registry.Registries
|
||||||
@@ -32,55 +25,9 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
|
|||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEALING_MACHINE: BlockEntityType<HealingMachineBlockEntity> = this.create("healing_machine", BlockEntityType.Builder.create(::HealingMachineBlockEntity, CobblemonBlocks.HEALING_MACHINE).build(null))
|
val HEALING_MACHINE: BlockEntityType<HealingMachineBlockEntity> = this.create("healing_machine", BlockEntityType.Builder.create(::HealingMachineBlockEntity, CobblemonBlocks.HEALING_MACHINE).build(null))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val PC: BlockEntityType<PCBlockEntity> = this.create("pc", BlockEntityType.Builder.create(::PCBlockEntity, CobblemonBlocks.PC).build(null))
|
val PC: BlockEntityType<PCBlockEntity> = this.create("pc", BlockEntityType.Builder.create(::PCBlockEntity, CobblemonBlocks.PC).build(null))
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BERRY = this.create("berry", BlockEntityType.Builder.create(::BerryBlockEntity, *CobblemonBlocks.berries().values.toTypedArray()).build(null))
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val PASTURE: BlockEntityType<PokemonPastureBlockEntity> = this.create("pasture", BlockEntityType.Builder.create(::PokemonPastureBlockEntity, CobblemonBlocks.PASTURE).build(null))
|
val PASTURE: BlockEntityType<PokemonPastureBlockEntity> = this.create("pasture", BlockEntityType.Builder.create(::PokemonPastureBlockEntity, CobblemonBlocks.PASTURE).build(null))
|
||||||
@JvmField
|
|
||||||
val SIGN: BlockEntityType<CobblemonSignBlockEntity> = this.create("sign", BlockEntityType.Builder.create(::CobblemonSignBlockEntity, CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN).build(null))
|
|
||||||
@JvmField
|
|
||||||
val HANGING_SIGN: BlockEntityType<CobblemonHangingSignBlockEntity> = this.create("hanging_sign", BlockEntityType.Builder.create(::CobblemonHangingSignBlockEntity, CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN).build(null))
|
|
||||||
|
|
||||||
@JvmField
|
}
|
||||||
val GILDED_CHEST: BlockEntityType<GildedChestBlockEntity> = this.create("chest", BlockEntityType.Builder.create(::GildedChestBlockEntity,
|
|
||||||
CobblemonBlocks.GILDED_CHEST,
|
|
||||||
CobblemonBlocks.BLUE_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.YELLOW_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.PINK_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.BLACK_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.WHITE_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.GREEN_GILDED_CHEST,
|
|
||||||
CobblemonBlocks.GIMMIGHOUL_CHEST
|
|
||||||
).build(null))
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MULTIBLOCK: BlockEntityType<FossilMultiblockEntity> = this.create("fossil_multiblock",
|
|
||||||
BlockEntityType.Builder.create({ pos, state -> FossilMultiblockEntity(pos, state, FossilMultiblockBuilder(pos)) },
|
|
||||||
CobblemonBlocks.MONITOR
|
|
||||||
).build(null)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val RESTORATION_TANK: BlockEntityType<RestorationTankBlockEntity> = this.create("restoration_tank",
|
|
||||||
BlockEntityType.Builder.create({ pos, state -> RestorationTankBlockEntity(pos, state, FossilMultiblockBuilder(pos)) },
|
|
||||||
CobblemonBlocks.RESTORATION_TANK
|
|
||||||
).build(null)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_ANALYZER: BlockEntityType<FossilAnalyzerBlockEntity> = this.create("fossil_analyzer",
|
|
||||||
BlockEntityType.Builder.create({ pos, state -> FossilAnalyzerBlockEntity(pos, state, FossilMultiblockBuilder(pos)) },
|
|
||||||
CobblemonBlocks.FOSSIL_ANALYZER
|
|
||||||
).build(null)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE: BlockEntityType<DisplayCaseBlockEntity> = this.create("display_case",
|
|
||||||
BlockEntityType.Builder.create(::DisplayCaseBlockEntity, CobblemonBlocks.DISPLAY_CASE).build(null)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -11,24 +11,13 @@ package com.cobblemon.mod.common
|
|||||||
import com.cobblemon.mod.common.api.apricorn.Apricorn
|
import com.cobblemon.mod.common.api.apricorn.Apricorn
|
||||||
import com.cobblemon.mod.common.block.*
|
import com.cobblemon.mod.common.block.*
|
||||||
import com.cobblemon.mod.common.block.MintBlock.MintType
|
import com.cobblemon.mod.common.block.MintBlock.MintType
|
||||||
import com.cobblemon.mod.common.block.FossilAnalyzerBlock
|
|
||||||
import com.cobblemon.mod.common.block.MonitorBlock
|
|
||||||
import com.cobblemon.mod.common.block.RestorationTankBlock
|
|
||||||
import com.cobblemon.mod.common.mixin.invoker.DoorBlockInvoker
|
import com.cobblemon.mod.common.mixin.invoker.DoorBlockInvoker
|
||||||
import com.cobblemon.mod.common.mixin.invoker.PressurePlateBlockInvoker
|
import com.cobblemon.mod.common.mixin.invoker.PressurePlateBlockInvoker
|
||||||
import com.cobblemon.mod.common.mixin.invoker.StairsBlockInvoker
|
import com.cobblemon.mod.common.mixin.invoker.StairsBlockInvoker
|
||||||
import com.cobblemon.mod.common.mixin.invoker.TrapdoorBlockInvoker
|
import com.cobblemon.mod.common.mixin.invoker.TrapdoorBlockInvoker
|
||||||
import com.cobblemon.mod.common.mixin.invoker.*
|
import com.cobblemon.mod.common.mixin.invoker.*
|
||||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import com.cobblemon.mod.common.block.BerryBlock
|
|
||||||
import com.cobblemon.mod.common.block.chest.GildedChestBlock
|
|
||||||
import com.cobblemon.mod.common.block.sign.CobblemonHangingSignBlock
|
|
||||||
import com.cobblemon.mod.common.block.sign.CobblemonSignBlock
|
|
||||||
import com.cobblemon.mod.common.block.sign.CobblemonWallHangingSignBlock
|
|
||||||
import com.cobblemon.mod.common.block.sign.CobblemonWallSignBlock
|
|
||||||
import net.minecraft.block.*
|
import net.minecraft.block.*
|
||||||
import net.minecraft.block.enums.Instrument
|
|
||||||
import net.minecraft.block.piston.PistonBehavior
|
import net.minecraft.block.piston.PistonBehavior
|
||||||
import net.minecraft.entity.effect.StatusEffects
|
import net.minecraft.entity.effect.StatusEffects
|
||||||
import net.minecraft.registry.Registries
|
import net.minecraft.registry.Registries
|
||||||
@@ -36,14 +25,11 @@ import net.minecraft.registry.Registry
|
|||||||
import net.minecraft.registry.RegistryKey
|
import net.minecraft.registry.RegistryKey
|
||||||
import net.minecraft.registry.RegistryKeys
|
import net.minecraft.registry.RegistryKeys
|
||||||
import net.minecraft.sound.BlockSoundGroup
|
import net.minecraft.sound.BlockSoundGroup
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import net.minecraft.util.math.intprovider.UniformIntProvider
|
import net.minecraft.util.math.intprovider.UniformIntProvider
|
||||||
|
|
||||||
@Suppress("SameParameterValue", "HasPlatformType", "MemberVisibilityCanBePrivate", "unused")
|
@Suppress("SameParameterValue", "HasPlatformType", "MemberVisibilityCanBePrivate", "unused")
|
||||||
object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<Block>>, Block>() {
|
object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<Block>>, Block>() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override val registry: Registry<Block> = Registries.BLOCK
|
override val registry: Registry<Block> = Registries.BLOCK
|
||||||
override val registryKey: RegistryKey<Registry<Block>> = RegistryKeys.BLOCK
|
override val registryKey: RegistryKey<Registry<Block>> = RegistryKeys.BLOCK
|
||||||
|
|
||||||
@@ -58,8 +44,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
@JvmField
|
@JvmField
|
||||||
val FIRE_STONE_ORE = evolutionStoneOre("fire_stone_ore")
|
val FIRE_STONE_ORE = evolutionStoneOre("fire_stone_ore")
|
||||||
@JvmField
|
@JvmField
|
||||||
val NETHER_FIRE_STONE_ORE = evolutionStoneOre("nether_fire_stone_ore")
|
|
||||||
@JvmField
|
|
||||||
val ICE_STONE_ORE = evolutionStoneOre("ice_stone_ore")
|
val ICE_STONE_ORE = evolutionStoneOre("ice_stone_ore")
|
||||||
@JvmField
|
@JvmField
|
||||||
val LEAF_STONE_ORE = evolutionStoneOre("leaf_stone_ore")
|
val LEAF_STONE_ORE = evolutionStoneOre("leaf_stone_ore")
|
||||||
@@ -72,8 +56,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
@JvmField
|
@JvmField
|
||||||
val SUN_STONE_ORE = evolutionStoneOre("sun_stone_ore")
|
val SUN_STONE_ORE = evolutionStoneOre("sun_stone_ore")
|
||||||
@JvmField
|
@JvmField
|
||||||
val TERRACOTTA_SUN_STONE_ORE = evolutionStoneOre("terracotta_sun_stone_ore")
|
|
||||||
@JvmField
|
|
||||||
val THUNDER_STONE_ORE = evolutionStoneOre("thunder_stone_ore")
|
val THUNDER_STONE_ORE = evolutionStoneOre("thunder_stone_ore")
|
||||||
@JvmField
|
@JvmField
|
||||||
val WATER_STONE_ORE = evolutionStoneOre("water_stone_ore")
|
val WATER_STONE_ORE = evolutionStoneOre("water_stone_ore")
|
||||||
@@ -109,33 +91,28 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
@JvmField
|
@JvmField
|
||||||
val STRIPPED_APRICORN_WOOD = log("stripped_apricorn_wood")
|
val STRIPPED_APRICORN_WOOD = log("stripped_apricorn_wood")
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_PLANKS = this.create("apricorn_planks", Block(AbstractBlock.Settings.create().mapColor(MapColor.DIRT_BROWN).instrument(Instrument.BASS).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
val APRICORN_PLANKS = this.create("apricorn_planks", Block(AbstractBlock.Settings.create().mapColor(MapColor.DIRT_BROWN).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_LEAVES = leaves("apricorn_leaves")
|
val APRICORN_LEAVES = leaves("apricorn_leaves")
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_FENCE = this.create("apricorn_fence", FenceBlock(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).instrument(Instrument.BASS).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
val APRICORN_FENCE = this.create("apricorn_fence", FenceBlock(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_FENCE_GATE = this.create("apricorn_fence_gate", FenceGateBlock(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).instrument(Instrument.BASS).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD), APRICORN_WOOD_TYPE))
|
val APRICORN_FENCE_GATE = this.create("apricorn_fence_gate", FenceGateBlock(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD), APRICORN_WOOD_TYPE))
|
||||||
@JvmField // Note At the time of 1.20.0 we don't need our own BlockSetType for Apricorn wood
|
@JvmField // Note At the time of 1.20.0 we don't need our own BlockSetType for Apricorn wood
|
||||||
val APRICORN_BUTTON = this.create("apricorn_button", BlocksInvoker.createWoodenButtonBlock(BlockSetType.OAK))
|
val APRICORN_BUTTON = this.create("apricorn_button", BlocksInvoker.createWoodenButtonBlock(BlockSetType.OAK))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_PRESSURE_PLATE = this.create("apricorn_pressure_plate", PressurePlateBlockInvoker.`cobblemon$create`(PressurePlateBlock.ActivationRule.EVERYTHING, AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).instrument(Instrument.BASS).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD), APRICORN_BLOCK_SET_TYPE))
|
val APRICORN_PRESSURE_PLATE = this.create("apricorn_pressure_plate", PressurePlateBlockInvoker.`cobblemon$create`(PressurePlateBlock.ActivationRule.EVERYTHING, AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD), APRICORN_BLOCK_SET_TYPE))
|
||||||
|
// Tag was removed be sure to add it back when implemented
|
||||||
|
//val APRICORN_SIGN = queue("apricorn_sign") { StandingSignBlock(AbstractBlock.Settings.of(Material.WOOD).noCollission().strength(1.0f).sounds(BlockSoundGroup.WOOD), APRICORN_WOOD_TYPE) }
|
||||||
|
//val APRICORN_WALL_SIGN = queue("apricorn_wall_sign") { WallSignBlock(AbstractBlock.Settings.of(Material.WOOD).noCollission().strength(1.0f).sounds(BlockSoundGroup.WOOD).dropsLike(APRICORN_SIGN), APRICORN_WOOD_TYPE) }
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_SIGN = this.create("apricorn_sign", CobblemonSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_SIGN), APRICORN_WOOD_TYPE))
|
val APRICORN_SLAB = this.create("apricorn_slab", SlabBlock(AbstractBlock.Settings.create().mapColor(MapColor.OAK_TAN).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
||||||
@JvmField
|
|
||||||
val APRICORN_WALL_SIGN = this.create("apricorn_wall_sign", CobblemonWallSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_WALL_SIGN), APRICORN_WOOD_TYPE))
|
|
||||||
@JvmField
|
|
||||||
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", CobblemonHangingSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_WALL_HANGING_SIGN), APRICORN_WOOD_TYPE))
|
|
||||||
@JvmField
|
|
||||||
val APRICORN_WALL_HANGING_SIGN = this.create("apricorn_wall_hanging_sign", CobblemonWallHangingSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_HANGING_SIGN), APRICORN_WOOD_TYPE))
|
|
||||||
@JvmField
|
|
||||||
val APRICORN_SLAB = this.create("apricorn_slab", SlabBlock(AbstractBlock.Settings.create().mapColor(MapColor.OAK_TAN).instrument(Instrument.BASS).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_STAIRS = this.create("apricorn_stairs", StairsBlockInvoker.`cobblemon$create`(APRICORN_PLANKS.defaultState, AbstractBlock.Settings.copy(APRICORN_PLANKS)))
|
val APRICORN_STAIRS = this.create("apricorn_stairs", StairsBlockInvoker.`cobblemon$create`(APRICORN_PLANKS.defaultState, AbstractBlock.Settings.copy(APRICORN_PLANKS)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_DOOR = this.create("apricorn_door", DoorBlockInvoker.`cobblemon$create`(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).instrument(Instrument.BASS).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque(), APRICORN_BLOCK_SET_TYPE))
|
val APRICORN_DOOR = this.create("apricorn_door", DoorBlockInvoker.`cobblemon$create`(AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque(), APRICORN_BLOCK_SET_TYPE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_TRAPDOOR = this.create("apricorn_trapdoor", TrapdoorBlockInvoker.`cobblemon$create`(AbstractBlock.Settings.create().mapColor(MapColor.OAK_TAN).instrument(Instrument.BASS).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque().allowsSpawning { _, _, _, _ -> false }, APRICORN_BLOCK_SET_TYPE))
|
val APRICORN_TRAPDOOR = this.create("apricorn_trapdoor", TrapdoorBlockInvoker.`cobblemon$create`(AbstractBlock.Settings.create().mapColor(MapColor.OAK_TAN).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque().allowsSpawning { _, _, _, _ -> false }, APRICORN_BLOCK_SET_TYPE))
|
||||||
|
|
||||||
private val PLANT_PROPERTIES = AbstractBlock.Settings.create().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.GRASS).pistonBehavior(PistonBehavior.DESTROY)
|
private val PLANT_PROPERTIES = AbstractBlock.Settings.create().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.GRASS).pistonBehavior(PistonBehavior.DESTROY)
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -154,65 +131,13 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
val YELLOW_APRICORN_SAPLING = this.create("yellow_apricorn_sapling", ApricornSaplingBlock(PLANT_PROPERTIES, Apricorn.YELLOW))
|
val YELLOW_APRICORN_SAPLING = this.create("yellow_apricorn_sapling", ApricornSaplingBlock(PLANT_PROPERTIES, Apricorn.YELLOW))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val MEDICINAL_LEEK = this.create("medicinal_leek", MedicinalLeekBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DULL_RED).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MEDICINAL_LEEK_SOUNDS)))
|
val MEDICINAL_LEEK = this.create("medicinal_leek", MedicinalLeekBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DULL_RED).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ENERGY_ROOT = this.create("energy_root", EnergyRootBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DIRT_BROWN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.ENERGY_ROOT_SOUNDS)))
|
val ENERGY_ROOT = this.create("energy_root", EnergyRootBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DIRT_BROWN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.ROOTS)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BIG_ROOT = this.create("big_root", BigRootBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.BIG_ROOT_SOUNDS)))
|
val BIG_ROOT = this.create("big_root", BigRootBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.ROOTS)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val REVIVAL_HERB = this.create("revival_herb", RevivalHerbBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).mapColor(MapColor.DARK_GREEN).burnable().noCollision().breakInstantly().sounds(CobblemonSounds.REVIVAL_HERB_SOUNDS)))
|
val REVIVAL_HERB = this.create("revival_herb", RevivalHerbBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).mapColor(MapColor.DARK_GREEN).burnable().noCollision().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_CLUSTER = tumblestoneBlock("tumblestone_cluster", GrowableStoneBlock.STAGE_3, 7, 3, null)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_TUMBLESTONE = tumblestoneBlock("large_budding_tumblestone", GrowableStoneBlock.STAGE_2, 5, 3, TUMBLESTONE_CLUSTER)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_TUMBLESTONE = tumblestoneBlock("medium_budding_tumblestone", GrowableStoneBlock.STAGE_1, 4, 3, LARGE_BUDDING_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_TUMBLESTONE = tumblestoneBlock("small_budding_tumblestone", GrowableStoneBlock.STAGE_0, 3, 4, MEDIUM_BUDDING_TUMBLESTONE)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val SKY_TUMBLESTONE_CLUSTER = tumblestoneBlock("sky_tumblestone_cluster", GrowableStoneBlock.STAGE_3, 7, 3, null)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_SKY_TUMBLESTONE = tumblestoneBlock("large_budding_sky_tumblestone", GrowableStoneBlock.STAGE_2, 5, 3, SKY_TUMBLESTONE_CLUSTER)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_SKY_TUMBLESTONE = tumblestoneBlock("medium_budding_sky_tumblestone", GrowableStoneBlock.STAGE_1, 4, 3, LARGE_BUDDING_SKY_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_SKY_TUMBLESTONE = tumblestoneBlock("small_budding_sky_tumblestone", GrowableStoneBlock.STAGE_0, 3, 4, MEDIUM_BUDDING_SKY_TUMBLESTONE)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BLACK_TUMBLESTONE_CLUSTER = tumblestoneBlock("black_tumblestone_cluster", GrowableStoneBlock.STAGE_3, 7, 3, null)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_BLACK_TUMBLESTONE = tumblestoneBlock("large_budding_black_tumblestone", GrowableStoneBlock.STAGE_2, 5, 3, BLACK_TUMBLESTONE_CLUSTER)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_BLACK_TUMBLESTONE = tumblestoneBlock("medium_budding_black_tumblestone", GrowableStoneBlock.STAGE_1, 4, 3, LARGE_BUDDING_BLACK_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_BLACK_TUMBLESTONE = tumblestoneBlock("small_budding_black_tumblestone", GrowableStoneBlock.STAGE_0, 3, 4, MEDIUM_BUDDING_BLACK_TUMBLESTONE)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_BLOCK = this.create("tumblestone_block", Block(AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.TERRACOTTA_ORANGE)
|
|
||||||
.strength(1.0F)
|
|
||||||
.sounds(CobblemonSounds.TUMBLESTONE_BLOCK_SOUNDS)
|
|
||||||
.requiresTool()
|
|
||||||
.instrument(Instrument.BASEDRUM)
|
|
||||||
))
|
|
||||||
@JvmField
|
|
||||||
val SKY_TUMBLESTONE_BLOCK = this.create("sky_tumblestone_block", Block(AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.LIGHT_BLUE)
|
|
||||||
.strength(1.0F)
|
|
||||||
.sounds(CobblemonSounds.TUMBLESTONE_BLOCK_SOUNDS)
|
|
||||||
.requiresTool()
|
|
||||||
.instrument(Instrument.BASEDRUM)
|
|
||||||
))
|
|
||||||
@JvmField
|
|
||||||
val BLACK_TUMBLESTONE_BLOCK = this.create("black_tumblestone_block", Block(AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.TERRACOTTA_BLACK)
|
|
||||||
.strength(1.0F)
|
|
||||||
.sounds(CobblemonSounds.TUMBLESTONE_BLOCK_SOUNDS)
|
|
||||||
.requiresTool()
|
|
||||||
.instrument(Instrument.BASEDRUM)
|
|
||||||
))
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLACK_APRICORN = apricornBlock("black_apricorn", Apricorn.BLACK)
|
val BLACK_APRICORN = apricornBlock("black_apricorn", Apricorn.BLACK)
|
||||||
@@ -229,138 +154,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
@JvmField
|
@JvmField
|
||||||
val YELLOW_APRICORN = apricornBlock("yellow_apricorn", Apricorn.YELLOW)
|
val YELLOW_APRICORN = apricornBlock("yellow_apricorn", Apricorn.YELLOW)
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val RELIC_COIN_POUCH = create(
|
|
||||||
"relic_coin_pouch",
|
|
||||||
CoinPouchBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
|
|
||||||
.pistonBehavior(PistonBehavior.DESTROY)
|
|
||||||
.strength(0.4f)
|
|
||||||
.nonOpaque(), true
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@JvmField
|
|
||||||
val RELIC_COIN_SACK = create(
|
|
||||||
"relic_coin_sack",
|
|
||||||
CoinPouchBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
|
|
||||||
.pistonBehavior(PistonBehavior.DESTROY)
|
|
||||||
.strength(0.4f), false
|
|
||||||
))
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST = create(
|
|
||||||
"gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.RED
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BLUE_GILDED_CHEST = create(
|
|
||||||
"blue_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.BLUE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BLACK_GILDED_CHEST = create(
|
|
||||||
"black_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.BLACK
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val YELLOW_GILDED_CHEST = create(
|
|
||||||
"yellow_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.YELLOW
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val WHITE_GILDED_CHEST = create(
|
|
||||||
"white_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.WHITE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GREEN_GILDED_CHEST = create(
|
|
||||||
"green_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.GREEN
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val PINK_GILDED_CHEST = create(
|
|
||||||
"pink_gilded_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.PINK
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GIMMIGHOUL_CHEST = create(
|
|
||||||
"gimmighoul_chest",
|
|
||||||
GildedChestBlock(
|
|
||||||
AbstractBlock.Settings.copy(Blocks.CHEST).nonOpaque().sounds(CobblemonSounds.GILDED_CHEST_SOUNDS),
|
|
||||||
GildedChestBlock.Type.FAKE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MONITOR = create(
|
|
||||||
"monitor",
|
|
||||||
MonitorBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.IRON_GRAY)
|
|
||||||
.sounds(BlockSoundGroup.METAL)
|
|
||||||
.pistonBehavior(PistonBehavior.BLOCK)
|
|
||||||
.requiresTool()
|
|
||||||
.strength(5.0F, 6.0F)
|
|
||||||
.luminance { if (it.get(MonitorBlock.SCREEN) != MonitorBlock.MonitorScreen.OFF) 15 else 0 }
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_ANALYZER = create(
|
|
||||||
"fossil_analyzer",
|
|
||||||
FossilAnalyzerBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.IRON_GRAY)
|
|
||||||
.sounds(BlockSoundGroup.METAL)
|
|
||||||
.pistonBehavior(PistonBehavior.BLOCK)
|
|
||||||
.requiresTool()
|
|
||||||
.strength(5.0F, 6.0F)
|
|
||||||
.nonOpaque()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@JvmField
|
|
||||||
val RESTORATION_TANK = create(
|
|
||||||
"restoration_tank",
|
|
||||||
RestorationTankBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.mapColor(MapColor.IRON_GRAY)
|
|
||||||
.sounds(BlockSoundGroup.GLASS)
|
|
||||||
.pistonBehavior(PistonBehavior.BLOCK)
|
|
||||||
.requiresTool()
|
|
||||||
.strength(5.0F, 6.0F)
|
|
||||||
.nonOpaque()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEALING_MACHINE = create(
|
val HEALING_MACHINE = create(
|
||||||
"healing_machine",
|
"healing_machine",
|
||||||
@@ -389,29 +182,17 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
)
|
)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val DISPLAY_CASE = create(
|
val RED_MINT = create("red_mint", MintBlock(MintType.RED, AbstractBlock.Settings.create().mapColor(MapColor.RED).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
"display_case",
|
|
||||||
DisplayCaseBlock(
|
|
||||||
AbstractBlock.Settings.create()
|
|
||||||
.sounds(CobblemonSounds.DISPLAY_CASE_SOUNDS)
|
|
||||||
.nonOpaque()
|
|
||||||
.pistonBehavior(PistonBehavior.BLOCK)
|
|
||||||
.mapColor(MapColor.STONE_GRAY)
|
|
||||||
.strength(0.3f)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val RED_MINT = create("red_mint", MintBlock(MintType.RED, AbstractBlock.Settings.create().mapColor(MapColor.RED).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUE_MINT = create("blue_mint", MintBlock(MintType.BLUE, AbstractBlock.Settings.create().mapColor(MapColor.BLUE).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
val BLUE_MINT = create("blue_mint", MintBlock(MintType.BLUE, AbstractBlock.Settings.create().mapColor(MapColor.BLUE).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CYAN_MINT = create("cyan_mint", MintBlock(MintType.CYAN, AbstractBlock.Settings.create().mapColor(MapColor.CYAN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
val CYAN_MINT = create("cyan_mint", MintBlock(MintType.CYAN, AbstractBlock.Settings.create().mapColor(MapColor.CYAN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PINK_MINT = create("pink_mint", MintBlock(MintType.PINK, AbstractBlock.Settings.create().mapColor(MapColor.PINK).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
val PINK_MINT = create("pink_mint", MintBlock(MintType.PINK, AbstractBlock.Settings.create().mapColor(MapColor.PINK).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GREEN_MINT = create("green_mint", MintBlock(MintType.GREEN, AbstractBlock.Settings.create().mapColor(MapColor.GREEN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
val GREEN_MINT = create("green_mint", MintBlock(MintType.GREEN, AbstractBlock.Settings.create().mapColor(MapColor.GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_MINT = create("white_mint", MintBlock(MintType.WHITE, AbstractBlock.Settings.create().mapColor(MapColor.WHITE).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.MINT_SOUNDS)))
|
val WHITE_MINT = create("white_mint", MintBlock(MintType.WHITE, AbstractBlock.Settings.create().mapColor(MapColor.WHITE).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val PASTURE = create(
|
val PASTURE = create(
|
||||||
@@ -428,7 +209,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
)
|
)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val VIVICHOKE_SEEDS = this.create("vivichoke_seeds", VivichokeBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.VIVICHOKE_SOUNDS)))
|
val VIVICHOKE_SEEDS = this.create("vivichoke_seeds", VivichokeBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(StatusEffects.LEVITATION, 10, AbstractBlock.Settings.create().mapColor(MapColor.DARK_GREEN).noCollision().breakInstantly().sounds(BlockSoundGroup.GRASS).offset(AbstractBlock.OffsetType.XZ).pistonBehavior(PistonBehavior.DESTROY)))
|
val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(StatusEffects.LEVITATION, 10, AbstractBlock.Settings.create().mapColor(MapColor.DARK_GREEN).noCollision().breakInstantly().sounds(BlockSoundGroup.GRASS).offset(AbstractBlock.OffsetType.XZ).pistonBehavior(PistonBehavior.DESTROY)))
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -444,142 +225,17 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
APRICORN_LOG to STRIPPED_APRICORN_LOG
|
APRICORN_LOG to STRIPPED_APRICORN_LOG
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun apricornBlock(name: String, apricorn: Apricorn): ApricornBlock = this.create(name, ApricornBlock(AbstractBlock.Settings.create().mapColor(apricorn.mapColor()).ticksRandomly().strength(Blocks.OAK_LOG.hardness, Blocks.OAK_LOG.blastResistance).sounds(BlockSoundGroup.WOOD).nonOpaque(), apricorn))
|
private fun apricornBlock(name: String, apricorn: Apricorn): ApricornBlock = this.create(name, ApricornBlock(AbstractBlock.Settings.create().mapColor(apricorn.mapColor()).ticksRandomly().strength(Blocks.OAK_LOG.hardness, Blocks.OAK_LOG.blastResistance).sounds(BlockSoundGroup.WOOD).nonOpaque(), apricorn))
|
||||||
|
|
||||||
private fun tumblestoneBlock(name: String, stage: Int, height: Int, xzOffset: Int, nextStage: Block?) : Block {
|
|
||||||
return this.create(name, TumblestoneBlock(AbstractBlock.Settings.create()
|
|
||||||
.pistonBehavior(PistonBehavior.DESTROY)
|
|
||||||
.nonOpaque()
|
|
||||||
.strength(1.5F)
|
|
||||||
.sounds(CobblemonSounds.TUMBLESTONE_SOUNDS),
|
|
||||||
stage, height, xzOffset, nextStage))
|
|
||||||
}
|
|
||||||
|
|
||||||
private val berries = mutableMapOf<Identifier, BerryBlock>()
|
|
||||||
|
|
||||||
val AGUAV_BERRY = this.berryBlock("aguav")
|
|
||||||
val APICOT_BERRY = this.berryBlock("apicot")
|
|
||||||
val ASPEAR_BERRY = this.berryBlock("aspear")
|
|
||||||
val BABIRI_BERRY = this.berryBlock("babiri")
|
|
||||||
val BELUE_BERRY = this.berryBlock("belue")
|
|
||||||
val BLUK_BERRY = this.berryBlock("bluk")
|
|
||||||
val CHARTI_BERRY = this.berryBlock("charti")
|
|
||||||
val CHERI_BERRY = this.berryBlock("cheri")
|
|
||||||
val CHESTO_BERRY = this.berryBlock("chesto")
|
|
||||||
val CHILAN_BERRY = this.berryBlock("chilan")
|
|
||||||
val CHOPLE_BERRY = this.berryBlock("chople")
|
|
||||||
val COBA_BERRY = this.berryBlock("coba")
|
|
||||||
val COLBUR_BERRY = this.berryBlock("colbur")
|
|
||||||
val CORNN_BERRY = this.berryBlock("cornn")
|
|
||||||
val CUSTAP_BERRY = this.berryBlock("custap")
|
|
||||||
val DURIN_BERRY = this.berryBlock("durin")
|
|
||||||
val ENIGMA_BERRY = this.berryBlock("enigma")
|
|
||||||
val FIGY_BERRY = this.berryBlock("figy")
|
|
||||||
val GANLON_BERRY = this.berryBlock("ganlon")
|
|
||||||
val GREPA_BERRY = this.berryBlock("grepa")
|
|
||||||
val HABAN_BERRY = this.berryBlock("haban")
|
|
||||||
val HONDEW_BERRY = this.berryBlock("hondew")
|
|
||||||
val HOPO_BERRY = this.berryBlock("hopo")
|
|
||||||
val IAPAPA_BERRY = this.berryBlock("iapapa")
|
|
||||||
val JABOCA_BERRY = this.berryBlock("jaboca")
|
|
||||||
val KASIB_BERRY = this.berryBlock("kasib")
|
|
||||||
val KEBIA_BERRY = this.berryBlock("kebia")
|
|
||||||
val KEE_BERRY = this.berryBlock("kee")
|
|
||||||
val KELPSY_BERRY = this.berryBlock("kelpsy")
|
|
||||||
val LANSAT_BERRY = this.berryBlock("lansat")
|
|
||||||
val LEPPA_BERRY = this.berryBlock("leppa")
|
|
||||||
val LIECHI_BERRY = this.berryBlock("liechi")
|
|
||||||
val LUM_BERRY = this.berryBlock("lum")
|
|
||||||
val MAGO_BERRY = this.berryBlock("mago")
|
|
||||||
val MAGOST_BERRY = this.berryBlock("magost")
|
|
||||||
val MARANGA_BERRY = this.berryBlock("maranga")
|
|
||||||
val MICLE_BERRY = this.berryBlock("micle")
|
|
||||||
val NANAB_BERRY = this.berryBlock("nanab")
|
|
||||||
val NOMEL_BERRY = this.berryBlock("nomel")
|
|
||||||
val OCCA_BERRY = this.berryBlock("occa")
|
|
||||||
val ORAN_BERRY = this.berryBlock("oran")
|
|
||||||
val PAMTRE_BERRY = this.berryBlock("pamtre")
|
|
||||||
val PASSHO_BERRY = this.berryBlock("passho")
|
|
||||||
val PAYAPA_BERRY = this.berryBlock("payapa")
|
|
||||||
val PECHA_BERRY = this.berryBlock("pecha")
|
|
||||||
val PERSIM_BERRY = this.berryBlock("persim")
|
|
||||||
val PETAYA_BERRY = this.berryBlock("petaya")
|
|
||||||
val PINAP_BERRY = this.berryBlock("pinap")
|
|
||||||
val POMEG_BERRY = this.berryBlock("pomeg")
|
|
||||||
val QUALOT_BERRY = this.berryBlock("qualot")
|
|
||||||
val RABUTA_BERRY = this.berryBlock("rabuta")
|
|
||||||
val RAWST_BERRY = this.berryBlock("rawst")
|
|
||||||
val RAZZ_BERRY = this.berryBlock("razz")
|
|
||||||
val RINDO_BERRY = this.berryBlock("rindo")
|
|
||||||
val ROSELI_BERRY = this.berryBlock("roseli")
|
|
||||||
val ROWAP_BERRY = this.berryBlock("rowap")
|
|
||||||
val SALAC_BERRY = this.berryBlock("salac")
|
|
||||||
val SHUCA_BERRY = this.berryBlock("shuca")
|
|
||||||
val SITRUS_BERRY = this.berryBlock("sitrus")
|
|
||||||
val SPELON_BERRY = this.berryBlock("spelon")
|
|
||||||
val STARF_BERRY = this.berryBlock("starf")
|
|
||||||
val TAMATO_BERRY = this.berryBlock("tamato")
|
|
||||||
val TANGA_BERRY = this.berryBlock("tanga")
|
|
||||||
val TOUGA_BERRY = this.berryBlock("touga")
|
|
||||||
val WACAN_BERRY = this.berryBlock("wacan")
|
|
||||||
val WATMEL_BERRY = this.berryBlock("watmel")
|
|
||||||
val WEPEAR_BERRY = this.berryBlock("wepear")
|
|
||||||
val WIKI_BERRY = this.berryBlock("wiki")
|
|
||||||
val YACHE_BERRY = this.berryBlock("yache")
|
|
||||||
|
|
||||||
init {
|
|
||||||
/**
|
|
||||||
* Makes all blocks in array flammable by adding them to FireBlock's flammableRegistry.
|
|
||||||
* second value is burn chance and third value is spread chance
|
|
||||||
*/
|
|
||||||
arrayOf(
|
|
||||||
Triple(APRICORN_LOG, 5, 5),
|
|
||||||
Triple(STRIPPED_APRICORN_LOG, 5, 5),
|
|
||||||
Triple(APRICORN_WOOD, 5, 5),
|
|
||||||
Triple(STRIPPED_APRICORN_WOOD, 5, 5),
|
|
||||||
Triple(APRICORN_PLANKS, 5, 20),
|
|
||||||
Triple(APRICORN_LEAVES, 30, 60),
|
|
||||||
Triple(APRICORN_FENCE, 5, 20),
|
|
||||||
Triple(APRICORN_FENCE_GATE, 5, 20),
|
|
||||||
Triple(APRICORN_SLAB, 5, 20),
|
|
||||||
Triple(APRICORN_STAIRS, 5, 20)
|
|
||||||
).onEach{ data -> setFlammable(data.first, data.second, data.third) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun berries() = this.berries.toMap()
|
|
||||||
|
|
||||||
private fun berryBlock(name: String): BerryBlock {
|
|
||||||
val identifier = cobblemonResource("${name}_berry")
|
|
||||||
val block = this.create(identifier.path, BerryBlock(identifier, AbstractBlock.Settings.copy(Blocks.WHEAT).dynamicBounds().sounds(CobblemonSounds.BERRY_BUSH_SOUNDS).strength(0.2F)))
|
|
||||||
this.berries[identifier] = block
|
|
||||||
return block
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls helper method from Vanilla
|
* Helper method for creating logs
|
||||||
|
* copied over from Vanilla
|
||||||
*/
|
*/
|
||||||
private fun log(name: String, arg: MapColor = MapColor.DIRT_BROWN, arg2: MapColor = MapColor.DIRT_BROWN): PillarBlock {
|
private fun log(name: String, arg: MapColor = MapColor.DIRT_BROWN, arg2: MapColor = MapColor.DIRT_BROWN): PillarBlock {
|
||||||
val block = BlocksInvoker.createLogBlock(arg, arg2)
|
val block = BlocksInvoker.createLogBlock(arg, arg2)
|
||||||
return this.create(name, block)
|
return this.create(name, block)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Method uses generic E in order to keep the block as the same return type.
|
|
||||||
* If E is not a block then it will not be set as flammable.
|
|
||||||
* Calls Vanilla implementation of registering a flammable block.
|
|
||||||
* Mixins looks cursed but it is java's fault.
|
|
||||||
*/
|
|
||||||
private fun <E> setFlammable(block: E, burnChance: Int, spreadChance: Int): E {
|
|
||||||
if(block !is Block) return block
|
|
||||||
|
|
||||||
var fireBlock: FireBlock = Blocks.FIRE as FireBlock
|
|
||||||
//Cursed Mixin stuff
|
|
||||||
(fireBlock as FireBlockInvoker).registerNewFlammableBlock(block as Block, burnChance, spreadChance)
|
|
||||||
return block
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun evolutionStoneOre(name: String) = this.create(name, ExperienceDroppingBlock(AbstractBlock.Settings.copy(Blocks.IRON_ORE), UniformIntProvider.create(1, 2)))
|
private fun evolutionStoneOre(name: String) = this.create(name, ExperienceDroppingBlock(AbstractBlock.Settings.copy(Blocks.IRON_ORE), UniformIntProvider.create(1, 2)))
|
||||||
|
|
||||||
private fun deepslateEvolutionStoneOre(name: String) = this.create(name, ExperienceDroppingBlock(AbstractBlock.Settings.copy(Blocks.DEEPSLATE_IRON_ORE), UniformIntProvider.create(1, 2)))
|
private fun deepslateEvolutionStoneOre(name: String) = this.create(name, ExperienceDroppingBlock(AbstractBlock.Settings.copy(Blocks.DEEPSLATE_IRON_ORE), UniformIntProvider.create(1, 2)))
|
||||||
@@ -592,4 +248,4 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
|||||||
val block = BlocksInvoker.createLeavesBlock(BlockSoundGroup.GRASS)
|
val block = BlocksInvoker.createLeavesBlock(BlockSoundGroup.GRASS)
|
||||||
return this.create(name, block)
|
return this.create(name, block)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
|
import java.util.function.Supplier
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.block.entity.BlockEntity
|
import net.minecraft.block.entity.BlockEntity
|
||||||
import net.minecraft.block.entity.BlockEntityType
|
import net.minecraft.block.entity.BlockEntityType
|
||||||
@@ -18,14 +19,11 @@ import net.minecraft.client.particle.ParticleFactory
|
|||||||
import net.minecraft.client.particle.SpriteProvider
|
import net.minecraft.client.particle.SpriteProvider
|
||||||
import net.minecraft.client.render.RenderLayer
|
import net.minecraft.client.render.RenderLayer
|
||||||
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
|
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
|
||||||
import net.minecraft.client.render.entity.EntityRendererFactory
|
|
||||||
import net.minecraft.client.render.entity.model.EntityModelLayer
|
import net.minecraft.client.render.entity.model.EntityModelLayer
|
||||||
import net.minecraft.entity.Entity
|
|
||||||
import net.minecraft.entity.EntityType
|
|
||||||
import net.minecraft.item.Item
|
import net.minecraft.item.Item
|
||||||
import net.minecraft.particle.ParticleEffect
|
import net.minecraft.particle.ParticleEffect
|
||||||
import net.minecraft.particle.ParticleType
|
import net.minecraft.particle.ParticleType
|
||||||
import java.util.function.Supplier
|
import net.minecraft.resource.SynchronousResourceReloader
|
||||||
|
|
||||||
interface CobblemonClientImplementation {
|
interface CobblemonClientImplementation {
|
||||||
fun registerLayer(modelLayer: EntityModelLayer, supplier: Supplier<TexturedModelData>)
|
fun registerLayer(modelLayer: EntityModelLayer, supplier: Supplier<TexturedModelData>)
|
||||||
@@ -40,7 +38,5 @@ interface CobblemonClientImplementation {
|
|||||||
|
|
||||||
fun registerBlockColors(provider: BlockColorProvider, vararg blocks: Block)
|
fun registerBlockColors(provider: BlockColorProvider, vararg blocks: Block)
|
||||||
|
|
||||||
fun <T : BlockEntity> registerBlockEntityRenderer(type: BlockEntityType<out T>, factory: BlockEntityRendererFactory<T>)
|
fun <T : BlockEntity> registerBlockEntityRenderer(type: BlockEntityType<T>, factory: BlockEntityRendererFactory<T>)
|
||||||
|
|
||||||
fun <T : Entity> registerEntityRenderer(type: EntityType<out T>, factory: EntityRendererFactory<T>)
|
|
||||||
}
|
}
|
||||||
@@ -44,13 +44,6 @@ object CobblemonCommands {
|
|||||||
TestPcSlotCommand.register(dispatcher)
|
TestPcSlotCommand.register(dispatcher)
|
||||||
TestPartySlotCommand.register(dispatcher)
|
TestPartySlotCommand.register(dispatcher)
|
||||||
ClearPartyCommand.register(dispatcher)
|
ClearPartyCommand.register(dispatcher)
|
||||||
ClearPCCommand.register(dispatcher)
|
|
||||||
PokemonRestartCommand.register(dispatcher)
|
PokemonRestartCommand.register(dispatcher)
|
||||||
BedrockParticleCommand.register(dispatcher)
|
|
||||||
OpenDialogueCommand.register(dispatcher)
|
|
||||||
|
|
||||||
// Possibly lock down registration if and only if under dev environment or running in an environment
|
|
||||||
// with a certain system environment variable set
|
|
||||||
CobblemonInfoCommand.register(dispatcher)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,9 +9,6 @@
|
|||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatEntity
|
|
||||||
import com.cobblemon.mod.common.entity.boat.CobblemonChestBoatEntity
|
|
||||||
import com.cobblemon.mod.common.entity.generic.GenericBedrockEntity
|
|
||||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||||
@@ -48,33 +45,6 @@ object CobblemonEntities : PlatformRegistry<Registry<EntityType<*>>, RegistryKey
|
|||||||
.build(EMPTY_POKEBALL_KEY.toString())
|
.build(EMPTY_POKEBALL_KEY.toString())
|
||||||
)
|
)
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BOAT_KEY = cobblemonResource("boat")
|
|
||||||
@JvmField
|
|
||||||
val BOAT: EntityType<CobblemonBoatEntity> = this.create(
|
|
||||||
BOAT_KEY.path,
|
|
||||||
EntityType.Builder.create(::CobblemonBoatEntity, SpawnGroup.MISC).setDimensions(1.375F, 0.5625F).maxTrackingRange(10)
|
|
||||||
.build(BOAT_KEY.toString())
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val CHEST_BOAT_KEY = cobblemonResource("chest_boat")
|
|
||||||
@JvmField
|
|
||||||
val CHEST_BOAT: EntityType<CobblemonChestBoatEntity> = this.create(
|
|
||||||
CHEST_BOAT_KEY.path,
|
|
||||||
EntityType.Builder.create(::CobblemonChestBoatEntity, SpawnGroup.MISC).setDimensions(1.375F, 0.5625F).maxTrackingRange(10)
|
|
||||||
.build(CHEST_BOAT_KEY.toString())
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GENERIC_BEDROCK_ENTITY_KEY = cobblemonResource("generic_bedrock")
|
|
||||||
@JvmField
|
|
||||||
val GENERIC_BEDROCK_ENTITY: EntityType<GenericBedrockEntity> = this.create(
|
|
||||||
GENERIC_BEDROCK_ENTITY_KEY.path,
|
|
||||||
EntityType.Builder.create({ _, world -> GenericBedrockEntity(world) }, SpawnGroup.MISC)
|
|
||||||
.build(GENERIC_BEDROCK_ENTITY_KEY.toString())
|
|
||||||
)
|
|
||||||
|
|
||||||
fun registerAttributes(consumer: (EntityType<out LivingEntity>, DefaultAttributeContainer.Builder) -> Unit) {
|
fun registerAttributes(consumer: (EntityType<out LivingEntity>, DefaultAttributeContainer.Builder) -> Unit) {
|
||||||
consumer(POKEMON, PokemonEntity.createAttributes())
|
consumer(POKEMON, PokemonEntity.createAttributes())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,27 +8,22 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
|
||||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||||
import com.mojang.brigadier.arguments.ArgumentType
|
import com.mojang.brigadier.arguments.ArgumentType
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import net.minecraft.advancement.criterion.Criterion
|
import net.minecraft.advancement.criterion.Criterion
|
||||||
import net.minecraft.block.ComposterBlock
|
|
||||||
import net.minecraft.command.argument.serialize.ArgumentSerializer
|
import net.minecraft.command.argument.serialize.ArgumentSerializer
|
||||||
import net.minecraft.item.ItemConvertible
|
|
||||||
import net.minecraft.network.PacketByteBuf
|
import net.minecraft.network.PacketByteBuf
|
||||||
import net.minecraft.network.listener.ClientPlayPacketListener
|
import net.minecraft.network.listener.ClientPlayPacketListener
|
||||||
import net.minecraft.network.packet.Packet
|
import net.minecraft.network.packet.Packet
|
||||||
import net.minecraft.registry.RegistryKey
|
import net.minecraft.registry.RegistryKey
|
||||||
import net.minecraft.registry.tag.TagKey
|
import net.minecraft.registry.tag.TagKey
|
||||||
import net.minecraft.resource.ResourceManager
|
|
||||||
import net.minecraft.resource.ResourceReloader
|
import net.minecraft.resource.ResourceReloader
|
||||||
import net.minecraft.resource.ResourceType
|
import net.minecraft.resource.ResourceType
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
import net.minecraft.server.network.ServerPlayerEntity
|
||||||
import net.minecraft.text.Text
|
|
||||||
import net.minecraft.util.Identifier
|
import net.minecraft.util.Identifier
|
||||||
import net.minecraft.world.GameRules
|
import net.minecraft.world.GameRules
|
||||||
import net.minecraft.world.biome.Biome
|
import net.minecraft.world.biome.Biome
|
||||||
@@ -165,51 +160,6 @@ interface CobblemonImplementation {
|
|||||||
*/
|
*/
|
||||||
fun server(): MinecraftServer?
|
fun server(): MinecraftServer?
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles platform independent reloading of a [JsonDataRegistry].
|
|
||||||
*
|
|
||||||
* @param registry The [JsonDataRegistry] to reload.
|
|
||||||
* @param manager The [ResourceManager] to reload from.
|
|
||||||
*/
|
|
||||||
fun <T> reloadJsonRegistry(registry: JsonDataRegistry<T>, manager: ResourceManager): HashMap<Identifier, T>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers an item to the [ComposterBlock].
|
|
||||||
*
|
|
||||||
* @param item The [ItemConvertible] being registered.
|
|
||||||
* @param chance The chance % of increasing the composter level, 0 to 1 expected.
|
|
||||||
*/
|
|
||||||
fun registerCompostable(item: ItemConvertible, chance: Float)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a builtin resource pack.
|
|
||||||
*
|
|
||||||
* @param id The unique [Identifier] of this pack.
|
|
||||||
* @param title The title displayed in the resource pack GUI, the description is still a part of the pack metadata.
|
|
||||||
* @param activationBehaviour The [ResourcePackActivationBehaviour] for this pack.
|
|
||||||
*/
|
|
||||||
fun registerBuiltinResourcePack(id: Identifier, title: Text, activationBehaviour: ResourcePackActivationBehaviour)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class ResourcePackActivationBehaviour {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The resource pack will start disabled.
|
|
||||||
*/
|
|
||||||
NORMAL,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The resource pack will start enabled.
|
|
||||||
*/
|
|
||||||
DEFAULT_ENABLED,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The resource pack will always be enabled.
|
|
||||||
* The user can reorder it but cannot remove it.
|
|
||||||
*/
|
|
||||||
ALWAYS_ENABLED;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class ModAPI {
|
enum class ModAPI {
|
||||||
|
|||||||
@@ -8,36 +8,23 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.item.ability.AbilityChanger
|
|
||||||
import com.cobblemon.mod.common.api.mulch.MulchVariant
|
import com.cobblemon.mod.common.api.mulch.MulchVariant
|
||||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||||
import com.cobblemon.mod.common.api.pokemon.Natures
|
import com.cobblemon.mod.common.api.pokemon.Natures
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||||
import com.cobblemon.mod.common.block.BerryBlock
|
|
||||||
import com.cobblemon.mod.common.block.MintBlock
|
|
||||||
import com.cobblemon.mod.common.block.MintBlock.MintType
|
import com.cobblemon.mod.common.block.MintBlock.MintType
|
||||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
|
|
||||||
import com.cobblemon.mod.common.item.*
|
import com.cobblemon.mod.common.item.*
|
||||||
import com.cobblemon.mod.common.item.armor.CobblemonArmorTrims
|
|
||||||
import com.cobblemon.mod.common.item.battle.DireHitItem
|
import com.cobblemon.mod.common.item.battle.DireHitItem
|
||||||
import com.cobblemon.mod.common.item.battle.GuardSpecItem
|
import com.cobblemon.mod.common.item.battle.GuardSpecItem
|
||||||
import com.cobblemon.mod.common.item.battle.XStatItem
|
import com.cobblemon.mod.common.item.battle.XStatItem
|
||||||
import com.cobblemon.mod.common.item.berry.FriendshipRaisingBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.berry.HealingBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.berry.PPRestoringBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.berry.PortionHealingBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.berry.StatusCuringBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.berry.VolatileCuringBerryItem
|
|
||||||
import com.cobblemon.mod.common.item.interactive.*
|
import com.cobblemon.mod.common.item.interactive.*
|
||||||
import com.cobblemon.mod.common.item.interactive.PotionItem
|
import com.cobblemon.mod.common.item.interactive.PotionItem
|
||||||
import com.cobblemon.mod.common.item.interactive.ability.AbilityChangeItem
|
|
||||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||||
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.entity.LivingEntity
|
import net.minecraft.block.ComposterBlock
|
||||||
import net.minecraft.entity.effect.StatusEffectInstance
|
import net.minecraft.entity.effect.StatusEffectInstance
|
||||||
import net.minecraft.entity.effect.StatusEffects
|
import net.minecraft.entity.effect.StatusEffects
|
||||||
import net.minecraft.item.*
|
import net.minecraft.item.*
|
||||||
@@ -45,8 +32,6 @@ import net.minecraft.registry.Registries
|
|||||||
import net.minecraft.registry.Registry
|
import net.minecraft.registry.Registry
|
||||||
import net.minecraft.registry.RegistryKey
|
import net.minecraft.registry.RegistryKey
|
||||||
import net.minecraft.registry.RegistryKeys
|
import net.minecraft.registry.RegistryKeys
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import net.minecraft.world.World
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<Item>>, Item>() {
|
object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<Item>>, Item>() {
|
||||||
@@ -119,74 +104,42 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
val MASTER_BALL = pokeBallItem(PokeBalls.MASTER_BALL)
|
val MASTER_BALL = pokeBallItem(PokeBalls.MASTER_BALL)
|
||||||
@JvmField
|
@JvmField
|
||||||
val CHERISH_BALL = pokeBallItem(PokeBalls.CHERISH_BALL)
|
val CHERISH_BALL = pokeBallItem(PokeBalls.CHERISH_BALL)
|
||||||
@JvmField
|
|
||||||
val ANCIENT_POKE_BALL = pokeBallItem(PokeBalls.ANCIENT_POKE_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_CITRINE_BALL = pokeBallItem(PokeBalls.ANCIENT_CITRINE_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_VERDANT_BALL = pokeBallItem(PokeBalls.ANCIENT_VERDANT_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_AZURE_BALL = pokeBallItem(PokeBalls.ANCIENT_AZURE_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_ROSEATE_BALL = pokeBallItem(PokeBalls.ANCIENT_ROSEATE_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_SLATE_BALL = pokeBallItem(PokeBalls.ANCIENT_SLATE_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_IVORY_BALL = pokeBallItem(PokeBalls.ANCIENT_IVORY_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_GREAT_BALL = pokeBallItem(PokeBalls.ANCIENT_GREAT_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_ULTRA_BALL = pokeBallItem(PokeBalls.ANCIENT_ULTRA_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_FEATHER_BALL = pokeBallItem(PokeBalls.ANCIENT_FEATHER_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_WING_BALL = pokeBallItem(PokeBalls.ANCIENT_WING_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_JET_BALL = pokeBallItem(PokeBalls.ANCIENT_JET_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_HEAVY_BALL = pokeBallItem(PokeBalls.ANCIENT_HEAVY_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_LEADEN_BALL = pokeBallItem(PokeBalls.ANCIENT_LEADEN_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_GIGATON_BALL = pokeBallItem(PokeBalls.ANCIENT_GIGATON_BALL)
|
|
||||||
@JvmField
|
|
||||||
val ANCIENT_ORIGIN_BALL = pokeBallItem(PokeBalls.ANCIENT_ORIGIN_BALL)
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val VIVICHOKE = compostableItem("vivichoke")
|
val VIVICHOKE = create("vivichoke", Item(Item.Settings()))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val VIVICHOKE_SEEDS = compostableItem("vivichoke_seeds", VivichokeItem(CobblemonBlocks.VIVICHOKE_SEEDS))
|
val VIVICHOKE_SEEDS = create("vivichoke_seeds", VivichokeItem(CobblemonBlocks.VIVICHOKE_SEEDS))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val RED_APRICORN = apricornItem("red", ApricornItem(CobblemonBlocks.RED_APRICORN))
|
val RED_APRICORN = create("red_apricorn", ApricornItem(CobblemonBlocks.RED_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val YELLOW_APRICORN = apricornItem("yellow", ApricornItem(CobblemonBlocks.YELLOW_APRICORN))
|
val YELLOW_APRICORN = create("yellow_apricorn", ApricornItem(CobblemonBlocks.YELLOW_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GREEN_APRICORN = apricornItem("green", ApricornItem(CobblemonBlocks.GREEN_APRICORN))
|
val GREEN_APRICORN = create("green_apricorn", ApricornItem(CobblemonBlocks.GREEN_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUE_APRICORN = apricornItem("blue", ApricornItem(CobblemonBlocks.BLUE_APRICORN))
|
val BLUE_APRICORN = create("blue_apricorn", ApricornItem(CobblemonBlocks.BLUE_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PINK_APRICORN = apricornItem("pink", ApricornItem(CobblemonBlocks.PINK_APRICORN))
|
val PINK_APRICORN = create("pink_apricorn", ApricornItem(CobblemonBlocks.PINK_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLACK_APRICORN = apricornItem("black", ApricornItem(CobblemonBlocks.BLACK_APRICORN))
|
val BLACK_APRICORN = create("black_apricorn", ApricornItem(CobblemonBlocks.BLACK_APRICORN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_APRICORN = apricornItem("white", ApricornItem(CobblemonBlocks.WHITE_APRICORN))
|
val WHITE_APRICORN = create("white_apricorn", ApricornItem(CobblemonBlocks.WHITE_APRICORN))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val RED_APRICORN_SEED = apricornSeedItem("red", ApricornSeedItem(CobblemonBlocks.RED_APRICORN_SAPLING, CobblemonBlocks.RED_APRICORN))
|
val RED_APRICORN_SEED = create("red_apricorn_seed", ApricornSeedItem(CobblemonBlocks.RED_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val YELLOW_APRICORN_SEED = apricornSeedItem("yellow", ApricornSeedItem(CobblemonBlocks.YELLOW_APRICORN_SAPLING, CobblemonBlocks.YELLOW_APRICORN))
|
val YELLOW_APRICORN_SEED = create("yellow_apricorn_seed", ApricornSeedItem(CobblemonBlocks.YELLOW_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GREEN_APRICORN_SEED = apricornSeedItem("green", ApricornSeedItem(CobblemonBlocks.GREEN_APRICORN_SAPLING, CobblemonBlocks.GREEN_APRICORN))
|
val GREEN_APRICORN_SEED = create("green_apricorn_seed", ApricornSeedItem(CobblemonBlocks.GREEN_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUE_APRICORN_SEED = apricornSeedItem("blue", ApricornSeedItem(CobblemonBlocks.BLUE_APRICORN_SAPLING, CobblemonBlocks.BLUE_APRICORN))
|
val BLUE_APRICORN_SEED = create("blue_apricorn_seed", ApricornSeedItem(CobblemonBlocks.BLUE_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PINK_APRICORN_SEED = apricornSeedItem("pink", ApricornSeedItem(CobblemonBlocks.PINK_APRICORN_SAPLING, CobblemonBlocks.PINK_APRICORN))
|
val PINK_APRICORN_SEED = create("pink_apricorn_seed", ApricornSeedItem(CobblemonBlocks.PINK_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLACK_APRICORN_SEED = apricornSeedItem("black", ApricornSeedItem(CobblemonBlocks.BLACK_APRICORN_SAPLING, CobblemonBlocks.BLACK_APRICORN))
|
val BLACK_APRICORN_SEED = create("black_apricorn_seed", ApricornSeedItem(CobblemonBlocks.BLACK_APRICORN_SAPLING))
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_APRICORN_SEED = apricornSeedItem("white", ApricornSeedItem(CobblemonBlocks.WHITE_APRICORN_SAPLING, CobblemonBlocks.WHITE_APRICORN))
|
val WHITE_APRICORN_SEED = create("white_apricorn_seed", ApricornSeedItem(CobblemonBlocks.WHITE_APRICORN_SAPLING))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_LOG = blockItem("apricorn_log", CobblemonBlocks.APRICORN_LOG)
|
val APRICORN_LOG = blockItem("apricorn_log", CobblemonBlocks.APRICORN_LOG)
|
||||||
@@ -199,11 +152,13 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_PLANKS = blockItem("apricorn_planks", CobblemonBlocks.APRICORN_PLANKS)
|
val APRICORN_PLANKS = blockItem("apricorn_planks", CobblemonBlocks.APRICORN_PLANKS)
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_LEAVES = compostableBlockItem("apricorn_leaves", CobblemonBlocks.APRICORN_LEAVES)
|
val APRICORN_LEAVES = blockItem("apricorn_leaves", CobblemonBlocks.APRICORN_LEAVES).also {
|
||||||
@JvmField
|
val compostChance = ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.getFloat(Items.OAK_LEAVES)
|
||||||
val APRICORN_BOAT = create("apricorn_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, false, Item.Settings().maxCount(1)))
|
// Should always pass unless Mojang reworks leaves to no longer work in the Composter, in that case we already updated w.o doing anything
|
||||||
@JvmField
|
if (compostChance != ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.defaultReturnValue()) {
|
||||||
val APRICORN_CHEST_BOAT = create("apricorn_chest_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, true, Item.Settings().maxCount(1)))
|
ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE[it] = compostChance
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_DOOR = blockItem("apricorn_door", CobblemonBlocks.APRICORN_DOOR)
|
val APRICORN_DOOR = blockItem("apricorn_door", CobblemonBlocks.APRICORN_DOOR)
|
||||||
@@ -217,45 +172,19 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
val APRICORN_BUTTON = blockItem("apricorn_button", CobblemonBlocks.APRICORN_BUTTON)
|
val APRICORN_BUTTON = blockItem("apricorn_button", CobblemonBlocks.APRICORN_BUTTON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_PRESSURE_PLATE = blockItem("apricorn_pressure_plate", CobblemonBlocks.APRICORN_PRESSURE_PLATE)
|
val APRICORN_PRESSURE_PLATE = blockItem("apricorn_pressure_plate", CobblemonBlocks.APRICORN_PRESSURE_PLATE)
|
||||||
|
//@JvmField
|
||||||
|
// val APRICORN_SIGN = create("apricorn_sign", SignItem(Item.Properties().stacksTo(16).tab(CreativeModeTab.TAB_DECORATIONS), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_SLAB = blockItem("apricorn_slab", CobblemonBlocks.APRICORN_SLAB)
|
val APRICORN_SLAB = blockItem("apricorn_slab", CobblemonBlocks.APRICORN_SLAB)
|
||||||
@JvmField
|
@JvmField
|
||||||
val APRICORN_STAIRS = blockItem("apricorn_stairs", CobblemonBlocks.APRICORN_STAIRS)
|
val APRICORN_STAIRS = blockItem("apricorn_stairs", CobblemonBlocks.APRICORN_STAIRS)
|
||||||
@JvmField
|
|
||||||
val APRICORN_SIGN = this.create("apricorn_sign", SignItem(Item.Settings().maxCount(16), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
|
|
||||||
@JvmField
|
|
||||||
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", HangingSignItem(CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN, Item.Settings().maxCount(16)))
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST = this.create("gilded_chest", BlockItem(CobblemonBlocks.GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val BLUE_GILDED_CHEST = this.create("blue_gilded_chest", BlockItem(CobblemonBlocks.BLUE_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val YELLOW_GILDED_CHEST = this.create("yellow_gilded_chest", BlockItem(CobblemonBlocks.YELLOW_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val PINK_GILDED_CHEST = this.create("pink_gilded_chest", BlockItem(CobblemonBlocks.PINK_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val BLACK_GILDED_CHEST = this.create("black_gilded_chest", BlockItem(CobblemonBlocks.BLACK_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val WHITE_GILDED_CHEST = this.create("white_gilded_chest", BlockItem(CobblemonBlocks.WHITE_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val GREEN_GILDED_CHEST = this.create("green_gilded_chest", BlockItem(CobblemonBlocks.GREEN_GILDED_CHEST, Item.Settings()))
|
|
||||||
@JvmField
|
|
||||||
val GIMMIGHOUL_CHEST = this.create("gimmighoul_chest", BlockItem(CobblemonBlocks.GIMMIGHOUL_CHEST, Item.Settings()))
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val RESTORATION_TANK = blockItem("restoration_tank", CobblemonBlocks.RESTORATION_TANK)
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_ANALYZER = blockItem("fossil_analyzer", CobblemonBlocks.FOSSIL_ANALYZER)
|
|
||||||
@JvmField
|
|
||||||
val MONITOR = blockItem("monitor", CobblemonBlocks.MONITOR)
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE)
|
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE)
|
||||||
@JvmField
|
@JvmField
|
||||||
val PC = blockItem("pc", CobblemonBlocks.PC)
|
val PC = blockItem("pc", CobblemonBlocks.PC)
|
||||||
@JvmField
|
@JvmField
|
||||||
val PASTURE = blockItem("pasture", CobblemonBlocks.PASTURE)
|
val PASTURE = blockItem("pasture", CobblemonBlocks.PASTURE)
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE = blockItem("display_case", CobblemonBlocks.DISPLAY_CASE)
|
|
||||||
|
|
||||||
// Evolution items
|
// Evolution items
|
||||||
@JvmField val LINK_CABLE = create("link_cable", LinkCableItem())
|
@JvmField val LINK_CABLE = create("link_cable", LinkCableItem())
|
||||||
@@ -283,8 +212,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField val RIBBON_SWEET = noSettingsItem("ribbon_sweet")
|
@JvmField val RIBBON_SWEET = noSettingsItem("ribbon_sweet")
|
||||||
@JvmField val CHIPPED_POT = noSettingsItem("chipped_pot")
|
@JvmField val CHIPPED_POT = noSettingsItem("chipped_pot")
|
||||||
@JvmField val CRACKED_POT = noSettingsItem("cracked_pot")
|
@JvmField val CRACKED_POT = noSettingsItem("cracked_pot")
|
||||||
@JvmField val MASTERPIECE_TEACUP = noSettingsItem("masterpiece_teacup")
|
|
||||||
@JvmField val UNREMARKABLE_TEACUP = noSettingsItem("unremarkable_teacup")
|
|
||||||
@JvmField val SWEET_APPLE = noSettingsItem("sweet_apple")
|
@JvmField val SWEET_APPLE = noSettingsItem("sweet_apple")
|
||||||
@JvmField val TART_APPLE = noSettingsItem("tart_apple")
|
@JvmField val TART_APPLE = noSettingsItem("tart_apple")
|
||||||
@JvmField val GALARICA_CUFF = noSettingsItem("galarica_cuff")
|
@JvmField val GALARICA_CUFF = noSettingsItem("galarica_cuff")
|
||||||
@@ -293,82 +220,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField val PEAT_BLOCK = noSettingsItem("peat_block")
|
@JvmField val PEAT_BLOCK = noSettingsItem("peat_block")
|
||||||
@JvmField val RAZOR_CLAW = noSettingsItem("razor_claw")
|
@JvmField val RAZOR_CLAW = noSettingsItem("razor_claw")
|
||||||
@JvmField val RAZOR_FANG = noSettingsItem("razor_fang")
|
@JvmField val RAZOR_FANG = noSettingsItem("razor_fang")
|
||||||
@JvmField val AUSPICIOUS_ARMOR = heldItem("auspicious_armor")
|
// ToDo enable me when malicious armor goes in the game
|
||||||
@JvmField val MALICIOUS_ARMOR = heldItem("malicious_armor")
|
//@JvmField val AUSPICIOUS_ARMOR = heldItem("auspicious_armor")
|
||||||
|
|
||||||
private val berries = mutableMapOf<Identifier, BerryItem>()
|
|
||||||
// Plants
|
|
||||||
@JvmField val ORAN_BERRY = berryItem("oran", HealingBerryItem(CobblemonBlocks.ORAN_BERRY) { CobblemonMechanics.berries.oranRestoreAmount })
|
|
||||||
@JvmField val CHERI_BERRY = berryItem("cheri", StatusCuringBerryItem(CobblemonBlocks.CHERI_BERRY, Statuses.PARALYSIS))
|
|
||||||
@JvmField val CHESTO_BERRY = berryItem("chesto", StatusCuringBerryItem(CobblemonBlocks.CHESTO_BERRY, Statuses.SLEEP))
|
|
||||||
@JvmField val PECHA_BERRY = berryItem("pecha", StatusCuringBerryItem(CobblemonBlocks.PECHA_BERRY, Statuses.POISON, Statuses.POISON_BADLY))
|
|
||||||
@JvmField val RAWST_BERRY = berryItem("rawst", StatusCuringBerryItem(CobblemonBlocks.RAWST_BERRY, Statuses.BURN))
|
|
||||||
@JvmField val ASPEAR_BERRY = berryItem("aspear", StatusCuringBerryItem(CobblemonBlocks.ASPEAR_BERRY, Statuses.FROZEN))
|
|
||||||
@JvmField val PERSIM_BERRY = berryItem("persim", VolatileCuringBerryItem(CobblemonBlocks.PERSIM_BERRY, "confusion"))
|
|
||||||
@JvmField val RAZZ_BERRY = berryItem("razz", CobblemonBlocks.RAZZ_BERRY)
|
|
||||||
@JvmField val BLUK_BERRY = berryItem("bluk", CobblemonBlocks.BLUK_BERRY)
|
|
||||||
@JvmField val NANAB_BERRY = berryItem("nanab", CobblemonBlocks.NANAB_BERRY)
|
|
||||||
@JvmField val WEPEAR_BERRY = berryItem("wepear", CobblemonBlocks.WEPEAR_BERRY)
|
|
||||||
@JvmField val PINAP_BERRY = berryItem("pinap", CobblemonBlocks.PINAP_BERRY)
|
|
||||||
@JvmField val OCCA_BERRY = berryItem("occa", CobblemonBlocks.OCCA_BERRY)
|
|
||||||
@JvmField val PASSHO_BERRY = berryItem("passho", CobblemonBlocks.PASSHO_BERRY)
|
|
||||||
@JvmField val WACAN_BERRY = berryItem("wacan", CobblemonBlocks.WACAN_BERRY)
|
|
||||||
@JvmField val RINDO_BERRY = berryItem("rindo", CobblemonBlocks.RINDO_BERRY)
|
|
||||||
@JvmField val YACHE_BERRY = berryItem("yache", CobblemonBlocks.YACHE_BERRY)
|
|
||||||
@JvmField val CHOPLE_BERRY = berryItem("chople", CobblemonBlocks.CHOPLE_BERRY)
|
|
||||||
@JvmField val KEBIA_BERRY = berryItem("kebia", CobblemonBlocks.KEBIA_BERRY)
|
|
||||||
@JvmField val SHUCA_BERRY = berryItem("shuca", CobblemonBlocks.SHUCA_BERRY)
|
|
||||||
@JvmField val COBA_BERRY = berryItem("coba", CobblemonBlocks.COBA_BERRY)
|
|
||||||
@JvmField val PAYAPA_BERRY = berryItem("payapa", CobblemonBlocks.PAYAPA_BERRY)
|
|
||||||
@JvmField val TANGA_BERRY = berryItem("tanga", CobblemonBlocks.TANGA_BERRY)
|
|
||||||
@JvmField val CHARTI_BERRY = berryItem("charti", CobblemonBlocks.CHARTI_BERRY)
|
|
||||||
@JvmField val KASIB_BERRY = berryItem("kasib", CobblemonBlocks.KASIB_BERRY)
|
|
||||||
@JvmField val HABAN_BERRY = berryItem("haban", CobblemonBlocks.HABAN_BERRY)
|
|
||||||
@JvmField val COLBUR_BERRY = berryItem("colbur", CobblemonBlocks.COLBUR_BERRY)
|
|
||||||
@JvmField val BABIRI_BERRY = berryItem("babiri", CobblemonBlocks.BABIRI_BERRY)
|
|
||||||
@JvmField val CHILAN_BERRY = berryItem("chilan", CobblemonBlocks.CHILAN_BERRY)
|
|
||||||
@JvmField val ROSELI_BERRY = berryItem("roseli", CobblemonBlocks.ROSELI_BERRY)
|
|
||||||
@JvmField val LEPPA_BERRY = berryItem("leppa", PPRestoringBerryItem(CobblemonBlocks.LEPPA_BERRY) { CobblemonMechanics.berries.ppRestoreAmount })
|
|
||||||
@JvmField val LUM_BERRY = berryItem("lum", StatusCuringBerryItem(CobblemonBlocks.LUM_BERRY))
|
|
||||||
@JvmField val FIGY_BERRY = berryItem("figy", PortionHealingBerryItem(CobblemonBlocks.FIGY_BERRY, true) { CobblemonMechanics.berries.portionHealRatio })
|
|
||||||
@JvmField val WIKI_BERRY = berryItem("wiki", PortionHealingBerryItem(CobblemonBlocks.WIKI_BERRY, true) { CobblemonMechanics.berries.portionHealRatio })
|
|
||||||
@JvmField val MAGO_BERRY = berryItem("mago", PortionHealingBerryItem(CobblemonBlocks.MAGO_BERRY, true) { CobblemonMechanics.berries.portionHealRatio })
|
|
||||||
@JvmField val AGUAV_BERRY = berryItem("aguav", PortionHealingBerryItem(CobblemonBlocks.AGUAV_BERRY, true) { CobblemonMechanics.berries.portionHealRatio })
|
|
||||||
@JvmField val IAPAPA_BERRY = berryItem("iapapa", PortionHealingBerryItem(CobblemonBlocks.IAPAPA_BERRY, true) { CobblemonMechanics.berries.portionHealRatio })
|
|
||||||
@JvmField val SITRUS_BERRY = berryItem("sitrus", HealingBerryItem(CobblemonBlocks.SITRUS_BERRY) { CobblemonMechanics.berries.sitrusHealAmount })
|
|
||||||
@JvmField val TOUGA_BERRY = berryItem("touga", CobblemonBlocks.TOUGA_BERRY)
|
|
||||||
@JvmField val CORNN_BERRY = berryItem("cornn", CobblemonBlocks.CORNN_BERRY)
|
|
||||||
@JvmField val MAGOST_BERRY = berryItem("magost", CobblemonBlocks.MAGOST_BERRY)
|
|
||||||
@JvmField val RABUTA_BERRY = berryItem("rabuta", CobblemonBlocks.RABUTA_BERRY)
|
|
||||||
@JvmField val NOMEL_BERRY = berryItem("nomel", CobblemonBlocks.NOMEL_BERRY)
|
|
||||||
@JvmField val ENIGMA_BERRY = berryItem("enigma", CobblemonBlocks.ENIGMA_BERRY)
|
|
||||||
@JvmField val POMEG_BERRY = berryItem("pomeg", FriendshipRaisingBerryItem(CobblemonBlocks.POMEG_BERRY, Stats.HP))
|
|
||||||
@JvmField val KELPSY_BERRY = berryItem("kelpsy", FriendshipRaisingBerryItem(CobblemonBlocks.KELPSY_BERRY, Stats.ATTACK))
|
|
||||||
@JvmField val QUALOT_BERRY = berryItem("qualot", FriendshipRaisingBerryItem(CobblemonBlocks.QUALOT_BERRY, Stats.DEFENCE))
|
|
||||||
@JvmField val HONDEW_BERRY = berryItem("hondew", FriendshipRaisingBerryItem(CobblemonBlocks.HONDEW_BERRY, Stats.SPECIAL_ATTACK))
|
|
||||||
@JvmField val GREPA_BERRY = berryItem("grepa", FriendshipRaisingBerryItem(CobblemonBlocks.GREPA_BERRY, Stats.SPECIAL_DEFENCE))
|
|
||||||
@JvmField val TAMATO_BERRY = berryItem("tamato", FriendshipRaisingBerryItem(CobblemonBlocks.TAMATO_BERRY, Stats.SPEED))
|
|
||||||
@JvmField val SPELON_BERRY = berryItem("spelon", CobblemonBlocks.SPELON_BERRY)
|
|
||||||
@JvmField val PAMTRE_BERRY = berryItem("pamtre", CobblemonBlocks.PAMTRE_BERRY)
|
|
||||||
@JvmField val WATMEL_BERRY = berryItem("watmel", CobblemonBlocks.WATMEL_BERRY)
|
|
||||||
@JvmField val DURIN_BERRY = berryItem("durin", CobblemonBlocks.DURIN_BERRY)
|
|
||||||
@JvmField val BELUE_BERRY = berryItem("belue", CobblemonBlocks.BELUE_BERRY)
|
|
||||||
@JvmField val KEE_BERRY = berryItem("kee", CobblemonBlocks.KEE_BERRY)
|
|
||||||
@JvmField val MARANGA_BERRY = berryItem("maranga", CobblemonBlocks.MARANGA_BERRY)
|
|
||||||
@JvmField val HOPO_BERRY = berryItem("hopo", PPRestoringBerryItem(CobblemonBlocks.HOPO_BERRY) { CobblemonMechanics.berries.ppRestoreAmount })
|
|
||||||
@JvmField val LIECHI_BERRY = berryItem("liechi", CobblemonBlocks.LIECHI_BERRY)
|
|
||||||
@JvmField val GANLON_BERRY = berryItem("ganlon", CobblemonBlocks.GANLON_BERRY)
|
|
||||||
@JvmField val SALAC_BERRY = berryItem("salac", CobblemonBlocks.SALAC_BERRY)
|
|
||||||
@JvmField val PETAYA_BERRY = berryItem("petaya", CobblemonBlocks.PETAYA_BERRY)
|
|
||||||
@JvmField val APICOT_BERRY = berryItem("apicot", CobblemonBlocks.APICOT_BERRY)
|
|
||||||
@JvmField val LANSAT_BERRY = berryItem("lansat", CobblemonBlocks.LANSAT_BERRY)
|
|
||||||
@JvmField val STARF_BERRY = berryItem("starf", CobblemonBlocks.STARF_BERRY)
|
|
||||||
@JvmField val MICLE_BERRY = berryItem("micle", CobblemonBlocks.MICLE_BERRY)
|
|
||||||
@JvmField val CUSTAP_BERRY = berryItem("custap", CobblemonBlocks.CUSTAP_BERRY)
|
|
||||||
@JvmField val JABOCA_BERRY = berryItem("jaboca", CobblemonBlocks.JABOCA_BERRY)
|
|
||||||
@JvmField val ROWAP_BERRY = berryItem("rowap", CobblemonBlocks.ROWAP_BERRY)
|
|
||||||
|
|
||||||
@JvmField val BERRY_JUICE = this.create("berry_juice", BerryJuiceItem())
|
|
||||||
|
|
||||||
// Medicine
|
// Medicine
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -396,42 +249,26 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val ZINC = create("zinc", VitaminItem(Stats.SPECIAL_DEFENCE))
|
val ZINC = create("zinc", VitaminItem(Stats.SPECIAL_DEFENCE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GENIUS_FEATHER = create("genius_feather", FeatherItem(Stats.SPECIAL_ATTACK))
|
val MEDICINAL_LEEK = create("medicinal_leek", MedicinalLeekItem(CobblemonBlocks.MEDICINAL_LEEK, Item.Settings().food(FoodComponent.Builder().snack().hunger(1).saturationModifier(0.2f).build())))
|
||||||
@JvmField
|
|
||||||
val SWIFT_FEATHER = create("swift_feather", FeatherItem(Stats.SPEED))
|
|
||||||
@JvmField
|
|
||||||
val HEALTH_FEATHER = create("health_feather", FeatherItem(Stats.HP))
|
|
||||||
@JvmField
|
|
||||||
val RESIST_FEATHER = create("resist_feather", FeatherItem(Stats.DEFENCE))
|
|
||||||
@JvmField
|
|
||||||
val MUSCLE_FEATHER = create("muscle_feather", FeatherItem(Stats.ATTACK))
|
|
||||||
@JvmField
|
|
||||||
val CLEVER_FEATHER = create("clever_feather", FeatherItem(Stats.SPECIAL_DEFENCE))
|
|
||||||
@JvmField
|
|
||||||
val MEDICINAL_LEEK = heldItem("medicinal_leek", MedicinalLeekItem(CobblemonBlocks.MEDICINAL_LEEK, Item.Settings().food(FoodComponent.Builder().snack().hunger(1).saturationModifier(0.2f).build())), "leek")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val ROASTED_LEEK = create("roasted_leek", Item(Item.Settings().food(FoodComponent.Builder().snack().hunger(3).saturationModifier(0.3f).build())))
|
val ROASTED_LEEK = create("roasted_leek", Item(Item.Settings().food(FoodComponent.Builder().snack().hunger(3).saturationModifier(0.3f).build())))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BRAISED_VIVICHOKE = create("braised_vivichoke", Item(Item.Settings().food(FoodComponent.Builder().hunger(6).saturationModifier(0.6f).build())))
|
val BRAISED_VIVICHOKE = create("braised_vivichoke", Item(Item.Settings().maxCount(1).food(FoodComponent.Builder().hunger(6).saturationModifier(0.6f).build())))
|
||||||
@JvmField
|
@JvmField
|
||||||
val VIVICHOKE_DIP = create("vivichoke_dip", object : StewItem(Settings().maxCount(1)
|
val VIVICHOKE_DIP = create("vivichoke_dip", StewItem(Item.Settings().maxCount(1)
|
||||||
.food(FoodComponent.Builder()
|
.food(FoodComponent.Builder()
|
||||||
.hunger(10)
|
.hunger(10)
|
||||||
.saturationModifier(1.2F)
|
.saturationModifier(1.2F)
|
||||||
.statusEffect(StatusEffectInstance(StatusEffects.ABSORPTION, 900, 0), 1F)
|
.statusEffect(StatusEffectInstance(StatusEffects.ABSORPTION, 600, 0), 1F)
|
||||||
.alwaysEdible()
|
.build()
|
||||||
.build())) {
|
)
|
||||||
override fun finishUsing(stack: ItemStack?, world: World?, user: LivingEntity?): ItemStack {
|
))
|
||||||
user?.clearStatusEffects()
|
|
||||||
return super.finishUsing(stack, world, user)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val ENERGY_ROOT = compostableItem("energy_root", EnergyRootItem(CobblemonBlocks.ENERGY_ROOT, Item.Settings().food(FoodComponent.Builder().hunger(1).snack().saturationModifier(0.2f).build())))
|
val ENERGY_ROOT = create("energy_root", EnergyRootItem(CobblemonBlocks.ENERGY_ROOT, Item.Settings().food(FoodComponent.Builder().hunger(1).snack().saturationModifier(0.2f).build())))
|
||||||
@JvmField
|
@JvmField
|
||||||
val REVIVAL_HERB = compostableItem("revival_herb", RevivalHerbItem(CobblemonBlocks.REVIVAL_HERB))
|
val REVIVAL_HERB = create("revival_herb", RevivalHerbItem(CobblemonBlocks.REVIVAL_HERB))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PEP_UP_FLOWER = compostableBlockItem("pep_up_flower", CobblemonBlocks.PEP_UP_FLOWER)
|
val PEP_UP_FLOWER = blockItem("pep_up_flower", CobblemonBlocks.PEP_UP_FLOWER)
|
||||||
@JvmField
|
@JvmField
|
||||||
val MEDICINAL_BREW = create("medicinal_brew", Item(Item.Settings()))
|
val MEDICINAL_BREW = create("medicinal_brew", Item(Item.Settings()))
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -466,74 +303,72 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
val PP_MAX = create("pp_max", PPUpItem(3))
|
val PP_MAX = create("pp_max", PPUpItem(3))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val RED_MINT_SEEDS = mintSeed("red", MintType.RED.getCropBlock())
|
val RED_MINT_SEEDS = blockItem("red_mint_seeds", MintType.RED.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val RED_MINT_LEAF = mintLeaf("red", MintLeafItem(MintType.RED))
|
val RED_MINT_LEAF = create("red_mint_leaf", MintLeafItem(MintType.RED))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUE_MINT_SEEDS = mintSeed("blue", MintType.BLUE.getCropBlock())
|
val BLUE_MINT_SEEDS = blockItem("blue_mint_seeds", MintType.BLUE.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUE_MINT_LEAF = mintLeaf("blue", MintLeafItem(MintType.BLUE))
|
val BLUE_MINT_LEAF = create("blue_mint_leaf", MintLeafItem(MintType.BLUE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CYAN_MINT_SEEDS = mintSeed("cyan", MintType.CYAN.getCropBlock())
|
val CYAN_MINT_SEEDS = blockItem("cyan_mint_seeds", MintType.CYAN.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val CYAN_MINT_LEAF = mintLeaf("cyan", MintLeafItem(MintType.CYAN))
|
val CYAN_MINT_LEAF = create("cyan_mint_leaf", MintLeafItem(MintType.CYAN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PINK_MINT_SEEDS = mintSeed("pink", MintType.PINK.getCropBlock())
|
val PINK_MINT_SEEDS = blockItem("pink_mint_seeds", MintType.PINK.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val PINK_MINT_LEAF = mintLeaf("pink", MintLeafItem(MintType.PINK))
|
val PINK_MINT_LEAF = create("pink_mint_leaf", MintLeafItem(MintType.PINK))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GREEN_MINT_SEEDS = mintSeed("green", MintType.GREEN.getCropBlock())
|
val GREEN_MINT_SEEDS = blockItem("green_mint_seeds", MintType.GREEN.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val GREEN_MINT_LEAF = mintLeaf("green", MintLeafItem(MintType.GREEN))
|
val GREEN_MINT_LEAF = create("green_mint_leaf", MintLeafItem(MintType.GREEN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_MINT_SEEDS = mintSeed("white", MintType.WHITE.getCropBlock())
|
val WHITE_MINT_SEEDS = blockItem("white_mint_seeds", MintType.WHITE.getCropBlock())
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_MINT_LEAF = mintLeaf("white", MintLeafItem(MintType.WHITE))
|
val WHITE_MINT_LEAF = create("white_mint_leaf", MintLeafItem(MintType.WHITE))
|
||||||
|
|
||||||
val mints = mutableMapOf<String, MintItem>()
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val LONELY_MINT = mintItem("lonely_mint", MintItem(Natures.LONELY))
|
val LONELY_MINT = create("lonely_mint", MintItem(Natures.LONELY))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ADAMANT_MINT = mintItem("adamant_mint", MintItem(Natures.ADAMANT))
|
val ADAMANT_MINT = create("adamant_mint", MintItem(Natures.ADAMANT))
|
||||||
@JvmField
|
@JvmField
|
||||||
val NAUGHTY_MINT = mintItem("naughty_mint", MintItem(Natures.NAUGHTY))
|
val NAUGHTY_MINT = create("naughty_mint", MintItem(Natures.NAUGHTY))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BRAVE_MINT = mintItem("brave_mint", MintItem(Natures.BRAVE))
|
val BRAVE_MINT = create("brave_mint", MintItem(Natures.BRAVE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BOLD_MINT = mintItem("bold_mint", MintItem(Natures.BOLD))
|
val BOLD_MINT = create("bold_mint", MintItem(Natures.BOLD))
|
||||||
@JvmField
|
@JvmField
|
||||||
val IMPISH_MINT = mintItem("impish_mint", MintItem(Natures.IMPISH))
|
val IMPISH_MINT = create("impish_mint", MintItem(Natures.IMPISH))
|
||||||
@JvmField
|
@JvmField
|
||||||
val LAX_MINT = mintItem("lax_mint", MintItem(Natures.LAX))
|
val LAX_MINT = create("lax_mint", MintItem(Natures.LAX))
|
||||||
@JvmField
|
@JvmField
|
||||||
val RELAXED_MINT = mintItem("relaxed_mint", MintItem(Natures.RELAXED))
|
val RELAXED_MINT = create("relaxed_mint", MintItem(Natures.RELAXED))
|
||||||
@JvmField
|
@JvmField
|
||||||
val MODEST_MINT = mintItem("modest_mint", MintItem(Natures.MODEST))
|
val MODEST_MINT = create("modest_mint", MintItem(Natures.MODEST))
|
||||||
@JvmField
|
@JvmField
|
||||||
val MILD_MINT = mintItem("mild_mint", MintItem(Natures.MILD))
|
val MILD_MINT = create("mild_mint", MintItem(Natures.MILD))
|
||||||
@JvmField
|
@JvmField
|
||||||
val RASH_MINT = mintItem("rash_mint", MintItem(Natures.RASH))
|
val RASH_MINT = create("rash_mint", MintItem(Natures.RASH))
|
||||||
@JvmField
|
@JvmField
|
||||||
val QUIET_MINT = mintItem("quiet_mint", MintItem(Natures.QUIET))
|
val QUIET_MINT = create("quiet_mint", MintItem(Natures.QUIET))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CALM_MINT = mintItem("calm_mint", MintItem(Natures.CALM))
|
val CALM_MINT = create("calm_mint", MintItem(Natures.CALM))
|
||||||
@JvmField
|
@JvmField
|
||||||
val GENTLE_MINT = mintItem("gentle_mint", MintItem(Natures.GENTLE))
|
val GENTLE_MINT = create("gentle_mint", MintItem(Natures.GENTLE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CAREFUL_MINT = mintItem("careful_mint", MintItem(Natures.CAREFUL))
|
val CAREFUL_MINT = create("careful_mint", MintItem(Natures.CAREFUL))
|
||||||
@JvmField
|
@JvmField
|
||||||
val SASSY_MINT = mintItem("sassy_mint", MintItem(Natures.SASSY))
|
val SASSY_MINT = create("sassy_mint", MintItem(Natures.SASSY))
|
||||||
@JvmField
|
@JvmField
|
||||||
val TIMID_MINT = mintItem("timid_mint", MintItem(Natures.TIMID))
|
val TIMID_MINT = create("timid_mint", MintItem(Natures.TIMID))
|
||||||
@JvmField
|
@JvmField
|
||||||
val HASTY_MINT = mintItem("hasty_mint", MintItem(Natures.HASTY))
|
val HASTY_MINT = create("hasty_mint", MintItem(Natures.HASTY))
|
||||||
@JvmField
|
@JvmField
|
||||||
val JOLLY_MINT = mintItem("jolly_mint", MintItem(Natures.JOLLY))
|
val JOLLY_MINT = create("jolly_mint", MintItem(Natures.JOLLY))
|
||||||
@JvmField
|
@JvmField
|
||||||
val NAIVE_MINT = mintItem("naive_mint", MintItem(Natures.NAIVE))
|
val NAIVE_MINT = create("naive_mint", MintItem(Natures.NAIVE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val SERIOUS_MINT = mintItem("serious_mint", MintItem(Natures.SERIOUS))
|
val SERIOUS_MINT = create("serious_mint", MintItem(Natures.SERIOUS))
|
||||||
|
|
||||||
@JvmField val X_ACCURACY = create("x_${Stats.ACCURACY.identifier.path}", XStatItem(Stats.ACCURACY))
|
@JvmField val X_ACCURACY = create("x_${Stats.ACCURACY.identifier.path}", XStatItem(Stats.ACCURACY))
|
||||||
@JvmField val X_ATTACK = create("x_${Stats.ATTACK.identifier.path}", XStatItem(Stats.ATTACK))
|
@JvmField val X_ATTACK = create("x_${Stats.ATTACK.identifier.path}", XStatItem(Stats.ATTACK))
|
||||||
@@ -558,11 +393,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField val ELIXIR = create("elixir", ElixirItem(max = false))
|
@JvmField val ELIXIR = create("elixir", ElixirItem(max = false))
|
||||||
@JvmField val MAX_ELIXIR = create("max_elixir", ElixirItem(max = true))
|
@JvmField val MAX_ELIXIR = create("max_elixir", ElixirItem(max = true))
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val ABILITY_CAPSULE = this.create("ability_capsule", AbilityChangeItem(AbilityChanger.COMMON_ABILITY))
|
|
||||||
@JvmField
|
|
||||||
val ABILITY_PATCH = this.create("ability_patch", AbilityChangeItem(AbilityChanger.HIDDEN_ABILITY))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evolution Ores and Stones
|
* Evolution Ores and Stones
|
||||||
*/
|
*/
|
||||||
@@ -583,8 +413,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val SUN_STONE_ORE = blockItem("sun_stone_ore", CobblemonBlocks.SUN_STONE_ORE)
|
val SUN_STONE_ORE = blockItem("sun_stone_ore", CobblemonBlocks.SUN_STONE_ORE)
|
||||||
@JvmField
|
@JvmField
|
||||||
val TERRACOTTA_SUN_STONE_ORE = blockItem("terracotta_sun_stone_ore", CobblemonBlocks.TERRACOTTA_SUN_STONE_ORE)
|
|
||||||
@JvmField
|
|
||||||
val THUNDER_STONE_ORE = blockItem("thunder_stone_ore", CobblemonBlocks.THUNDER_STONE_ORE)
|
val THUNDER_STONE_ORE = blockItem("thunder_stone_ore", CobblemonBlocks.THUNDER_STONE_ORE)
|
||||||
@JvmField
|
@JvmField
|
||||||
val WATER_STONE_ORE = blockItem("water_stone_ore", CobblemonBlocks.WATER_STONE_ORE)
|
val WATER_STONE_ORE = blockItem("water_stone_ore", CobblemonBlocks.WATER_STONE_ORE)
|
||||||
@@ -610,9 +438,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
val DEEPSLATE_WATER_STONE_ORE = blockItem("deepslate_water_stone_ore", CobblemonBlocks.DEEPSLATE_WATER_STONE_ORE)
|
val DEEPSLATE_WATER_STONE_ORE = blockItem("deepslate_water_stone_ore", CobblemonBlocks.DEEPSLATE_WATER_STONE_ORE)
|
||||||
@JvmField
|
@JvmField
|
||||||
val DRIPSTONE_MOON_STONE_ORE = blockItem("dripstone_moon_stone_ore", CobblemonBlocks.DRIPSTONE_MOON_STONE_ORE)
|
val DRIPSTONE_MOON_STONE_ORE = blockItem("dripstone_moon_stone_ore", CobblemonBlocks.DRIPSTONE_MOON_STONE_ORE)
|
||||||
@JvmField
|
|
||||||
val NETHER_FIRE_STONE_ORE = blockItem("nether_fire_stone_ore", CobblemonBlocks.NETHER_FIRE_STONE_ORE)
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val DAWN_STONE = noSettingsItem("dawn_stone")
|
val DAWN_STONE = noSettingsItem("dawn_stone")
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -636,28 +461,16 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
|
|
||||||
// Held Items
|
// Held Items
|
||||||
@JvmField
|
@JvmField
|
||||||
val ABILITY_SHIELD = heldItem("ability_shield")
|
|
||||||
@JvmField
|
|
||||||
val ABSORB_BULB = heldItem("absorb_bulb")
|
|
||||||
@JvmField
|
|
||||||
val AIR_BALLOON = heldItem("air_balloon")
|
|
||||||
@JvmField
|
|
||||||
val ASSAULT_VEST = heldItem("assault_vest")
|
val ASSAULT_VEST = heldItem("assault_vest")
|
||||||
@JvmField
|
@JvmField
|
||||||
val BIG_ROOT = blockItem("big_root", CobblemonBlocks.BIG_ROOT)
|
val BIG_ROOT = blockItem("big_root", CobblemonBlocks.BIG_ROOT)
|
||||||
@JvmField
|
@JvmField
|
||||||
val BINDING_BAND = heldItem("binding_band")
|
|
||||||
@JvmField
|
|
||||||
val BLACK_BELT = heldItem("black_belt")
|
val BLACK_BELT = heldItem("black_belt")
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLACK_GLASSES = heldItem("black_glasses")
|
val BLACK_GLASSES = heldItem("black_glasses")
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLACK_SLUDGE = heldItem("black_sludge")
|
val BLACK_SLUDGE = heldItem("black_sludge")
|
||||||
@JvmField
|
@JvmField
|
||||||
val BLUNDER_POLICY = heldItem("blunder_policy")
|
|
||||||
@JvmField
|
|
||||||
val CELL_BATTERY = heldItem("cell_battery")
|
|
||||||
@JvmField
|
|
||||||
val CHARCOAL = heldItem("charcoal_stick", remappedName = "charcoal")
|
val CHARCOAL = heldItem("charcoal_stick", remappedName = "charcoal")
|
||||||
@JvmField
|
@JvmField
|
||||||
val CHOICE_BAND = heldItem("choice_band")
|
val CHOICE_BAND = heldItem("choice_band")
|
||||||
@@ -666,65 +479,23 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val CHOICE_SPECS = heldItem("choice_specs")
|
val CHOICE_SPECS = heldItem("choice_specs")
|
||||||
@JvmField
|
@JvmField
|
||||||
val CLEANSE_TAG = heldItem("cleanse_tag")
|
|
||||||
// @JvmField
|
|
||||||
// val CLEAR_AMULET = heldItem("clear_amulet")
|
|
||||||
@JvmField
|
|
||||||
val COVERT_CLOAK = heldItem("covert_cloak")
|
|
||||||
@JvmField
|
|
||||||
val DESTINY_KNOT = heldItem("destiny_knot")
|
|
||||||
@JvmField
|
|
||||||
val DRAGON_FANG = heldItem("dragon_fang")
|
val DRAGON_FANG = heldItem("dragon_fang")
|
||||||
@JvmField
|
@JvmField
|
||||||
val EJECT_BUTTON = heldItem("eject_button")
|
|
||||||
@JvmField
|
|
||||||
val EJECT_PACK = heldItem("eject_pack")
|
|
||||||
@JvmField
|
|
||||||
val EVERSTONE = heldItem("everstone")
|
|
||||||
@JvmField
|
|
||||||
val EVIOLITE = heldItem("eviolite")
|
|
||||||
@JvmField
|
|
||||||
val EXP_SHARE = heldItem("exp_share")
|
val EXP_SHARE = heldItem("exp_share")
|
||||||
@JvmField
|
@JvmField
|
||||||
val EXPERT_BELT = heldItem("expert_belt")
|
|
||||||
@JvmField
|
|
||||||
val FAIRY_FEATHER = heldItem("fairy_feather")
|
|
||||||
@JvmField
|
|
||||||
val FLAME_ORB = heldItem("flame_orb")
|
|
||||||
@JvmField
|
|
||||||
val FLOAT_STONE = heldItem("float_stone")
|
|
||||||
@JvmField
|
|
||||||
val FOCUS_BAND = heldItem("focus_band")
|
val FOCUS_BAND = heldItem("focus_band")
|
||||||
@JvmField
|
|
||||||
val FOCUS_SASH = heldItem("focus_sash")
|
|
||||||
// @JvmField
|
|
||||||
// val GRIP_CLAW = heldItem("grip_claw")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val HARD_STONE = heldItem("hard_stone")
|
val HARD_STONE = heldItem("hard_stone")
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEAVY_DUTY_BOOTS = heldItem("heavy_duty_boots")
|
val HEAVY_DUTY_BOOTS = heldItem("heavy_duty_boots")
|
||||||
@JvmField
|
|
||||||
val IRON_BALL = heldItem("iron_ball")
|
|
||||||
// @JvmField
|
|
||||||
// val LAGGING_TAIL = heldItem("lagging_tail")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val LEFTOVERS = heldItem("leftovers")
|
val LEFTOVERS = heldItem("leftovers")
|
||||||
@JvmField
|
@JvmField
|
||||||
val LIFE_ORB = heldItem("life_orb")
|
|
||||||
@JvmField
|
|
||||||
val LIGHT_BALL = heldItem("light_ball")
|
|
||||||
@JvmField
|
|
||||||
val LIGHT_CLAY = heldItem("light_clay")
|
val LIGHT_CLAY = heldItem("light_clay")
|
||||||
@JvmField
|
@JvmField
|
||||||
val LOADED_DICE = heldItem("loaded_dice")
|
|
||||||
@JvmField
|
|
||||||
val LUCKY_EGG = heldItem("lucky_egg")
|
val LUCKY_EGG = heldItem("lucky_egg")
|
||||||
// @JvmField
|
|
||||||
// val LUMINOUS_MOSS = heldItem("luminous_moss")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val MAGNET = heldItem("magnet")
|
val MAGNET = heldItem("magnet")
|
||||||
// @JvmField
|
|
||||||
// val METRONOME = heldItem("metronome")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val MIRACLE_SEED = heldItem("miracle_seed")
|
val MIRACLE_SEED = heldItem("miracle_seed")
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -735,42 +506,14 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
val NEVER_MELT_ICE = heldItem("never_melt_ice")
|
val NEVER_MELT_ICE = heldItem("never_melt_ice")
|
||||||
@JvmField
|
@JvmField
|
||||||
val POISON_BARB = heldItem("poison_barb")
|
val POISON_BARB = heldItem("poison_barb")
|
||||||
@JvmField
|
|
||||||
val POWER_ANKLET = heldItem("power_anklet")
|
|
||||||
@JvmField
|
|
||||||
val POWER_BAND = heldItem("power_band")
|
|
||||||
@JvmField
|
|
||||||
val POWER_BELT = heldItem("power_belt")
|
|
||||||
@JvmField
|
|
||||||
val POWER_BRACER = heldItem("power_bracer")
|
|
||||||
@JvmField
|
|
||||||
val POWER_LENS = heldItem("power_lens")
|
|
||||||
@JvmField
|
|
||||||
val POWER_WEIGHT = heldItem("power_weight")
|
|
||||||
// @JvmField
|
|
||||||
// val PROTECTIVE_PADS = heldItem("protective_pads")
|
|
||||||
// @JvmField
|
|
||||||
// val PUNCHING_GLOVE = heldItem("punching_glove")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val QUICK_CLAW = heldItem("quick_claw")
|
val QUICK_CLAW = heldItem("quick_claw")
|
||||||
@JvmField
|
@JvmField
|
||||||
val RED_CARD = heldItem("red_card")
|
|
||||||
@JvmField
|
|
||||||
val RING_TARGET = heldItem("ring_target")
|
|
||||||
@JvmField
|
|
||||||
val ROCKY_HELMET = heldItem("rocky_helmet")
|
val ROCKY_HELMET = heldItem("rocky_helmet")
|
||||||
// @JvmField
|
|
||||||
// val ROOM_SERVICE = heldItem("room_service")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val SAFETY_GOGGLES = heldItem("safety_goggles")
|
val SAFETY_GOGGLES = heldItem("safety_goggles")
|
||||||
// @JvmField
|
|
||||||
// val SCOPE_LENS = heldItem("scope_lens")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val SHARP_BEAK = heldItem("sharp_beak")
|
val SHARP_BEAK = heldItem("sharp_beak")
|
||||||
// @JvmField
|
|
||||||
// val SHED_SHELL = heldItem("shed_shell")
|
|
||||||
@JvmField
|
|
||||||
val SHELL_BELL = heldItem("shell_bell")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val SILK_SCARF = heldItem("silk_scarf")
|
val SILK_SCARF = heldItem("silk_scarf")
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -780,37 +523,17 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val SPELL_TAG = heldItem("spell_tag")
|
val SPELL_TAG = heldItem("spell_tag")
|
||||||
@JvmField
|
@JvmField
|
||||||
val SMOKE_BALL = heldItem("smoke_ball")
|
|
||||||
@JvmField
|
|
||||||
val SOOTHE_BELL = heldItem("soothe_bell")
|
|
||||||
@JvmField
|
|
||||||
val STICKY_BARB = heldItem("sticky_barb")
|
|
||||||
// @JvmField
|
|
||||||
// val TERRAIN_EXTENDER = heldItem("terrain_extender")
|
|
||||||
// @JvmField
|
|
||||||
// val THROAT_SPRAY = heldItem("throat_spray")
|
|
||||||
@JvmField
|
|
||||||
val TOXIC_ORB = heldItem("toxic_orb")
|
|
||||||
@JvmField
|
|
||||||
val TWISTED_SPOON = heldItem("twisted_spoon")
|
val TWISTED_SPOON = heldItem("twisted_spoon")
|
||||||
// @JvmField
|
|
||||||
// val UTILITY_UMBRELLA = heldItem("utility_umbrella")
|
|
||||||
@JvmField
|
|
||||||
val WEAKNESS_POLICY = heldItem("weakness_policy")
|
|
||||||
// @JvmField
|
|
||||||
// val WIDE_LENS = heldItem("wide_lens")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val WISE_GLASSES = heldItem("wise_glasses")
|
val WISE_GLASSES = heldItem("wise_glasses")
|
||||||
// @JvmField
|
|
||||||
// val ZOOM_LENS = heldItem("zoom_lens")
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val MENTAL_HERB = compostableHeldItem("mental_herb", null, 1F)
|
val MENTAL_HERB = heldItem("mental_herb")
|
||||||
@JvmField
|
@JvmField
|
||||||
val MIRROR_HERB = compostableHeldItem("mirror_herb", null, 1F)
|
val MIRROR_HERB = heldItem("mirror_herb")
|
||||||
@JvmField
|
@JvmField
|
||||||
val POWER_HERB = compostableHeldItem("power_herb", null, 1F)
|
val POWER_HERB = heldItem("power_herb")
|
||||||
@JvmField
|
@JvmField
|
||||||
val WHITE_HERB = compostableHeldItem("white_herb", null, 1F)
|
val WHITE_HERB = heldItem("white_herb")
|
||||||
@JvmField
|
@JvmField
|
||||||
val BRIGHT_POWDER = heldItem("bright_powder")
|
val BRIGHT_POWDER = heldItem("bright_powder")
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -818,13 +541,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val QUICK_POWDER = heldItem("quick_powder")
|
val QUICK_POWDER = heldItem("quick_powder")
|
||||||
@JvmField
|
@JvmField
|
||||||
val DAMP_ROCK = heldItem("damp_rock")
|
val DESTINY_KNOT = heldItem("destiny_knot")
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEAT_ROCK = heldItem("heat_rock")
|
val EVERSTONE = heldItem("everstone")
|
||||||
@JvmField
|
|
||||||
val SMOOTH_ROCK = heldItem("smooth_rock")
|
|
||||||
@JvmField
|
|
||||||
val ICY_ROCK = heldItem("icy_rock")
|
|
||||||
|
|
||||||
// Mulch
|
// Mulch
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -846,152 +565,14 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val SURPRISE_MULCH = mulchItem("surprise_mulch", MulchVariant.SURPRISE)
|
val SURPRISE_MULCH = mulchItem("surprise_mulch", MulchVariant.SURPRISE)
|
||||||
|
|
||||||
// Archaeology
|
|
||||||
@JvmField
|
|
||||||
val ARMOR_FOSSIL = noSettingsItem("armor_fossil")
|
|
||||||
@JvmField
|
|
||||||
val FOSSILIZED_BIRD = noSettingsItem("fossilized_bird")
|
|
||||||
@JvmField
|
|
||||||
val CLAW_FOSSIL = noSettingsItem("claw_fossil")
|
|
||||||
@JvmField
|
|
||||||
val COVER_FOSSIL = noSettingsItem("cover_fossil")
|
|
||||||
@JvmField
|
|
||||||
val FOSSILIZED_DINO = noSettingsItem("fossilized_dino")
|
|
||||||
@JvmField
|
|
||||||
val DOME_FOSSIL = noSettingsItem("dome_fossil")
|
|
||||||
@JvmField
|
|
||||||
val FOSSILIZED_DRAKE = noSettingsItem("fossilized_drake")
|
|
||||||
@JvmField
|
|
||||||
val FOSSILIZED_FISH = noSettingsItem("fossilized_fish")
|
|
||||||
@JvmField
|
|
||||||
val HELIX_FOSSIL = noSettingsItem("helix_fossil")
|
|
||||||
@JvmField
|
|
||||||
val JAW_FOSSIL = noSettingsItem("jaw_fossil")
|
|
||||||
@JvmField
|
|
||||||
val OLD_AMBER_FOSSIL = noSettingsItem("old_amber_fossil")
|
|
||||||
@JvmField
|
|
||||||
val PLUME_FOSSIL = noSettingsItem("plume_fossil")
|
|
||||||
@JvmField
|
|
||||||
val ROOT_FOSSIL = noSettingsItem("root_fossil")
|
|
||||||
@JvmField
|
|
||||||
val SAIL_FOSSIL = noSettingsItem("sail_fossil")
|
|
||||||
@JvmField
|
|
||||||
val SKULL_FOSSIL = noSettingsItem("skull_fossil")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BYGONE_SHERD = noSettingsItem("bygone_sherd")
|
|
||||||
@JvmField
|
|
||||||
val CAPTURE_SHERD = noSettingsItem("capture_sherd")
|
|
||||||
@JvmField
|
|
||||||
val DOME_SHERD = noSettingsItem("dome_sherd")
|
|
||||||
@JvmField
|
|
||||||
val HELIX_SHERD = noSettingsItem("helix_sherd")
|
|
||||||
@JvmField
|
|
||||||
val NOSTALGIC_SHERD = noSettingsItem("nostalgic_sherd")
|
|
||||||
@JvmField
|
|
||||||
val SUSPICIOUS_SHERD = noSettingsItem("suspicious_sherd")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE = this.create("tumblestone", TumblestoneItem(Item.Settings(), CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE))
|
|
||||||
@JvmField
|
|
||||||
val BLACK_TUMBLESTONE = this.create("black_tumblestone", TumblestoneItem(Item.Settings(), CobblemonBlocks.SMALL_BUDDING_BLACK_TUMBLESTONE))
|
|
||||||
@JvmField
|
|
||||||
val SKY_TUMBLESTONE = this.create("sky_tumblestone", TumblestoneItem(Item.Settings(), CobblemonBlocks.SMALL_BUDDING_SKY_TUMBLESTONE))
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_TUMBLESTONE = blockItem("small_budding_tumblestone", CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_TUMBLESTONE = blockItem("medium_budding_tumblestone", CobblemonBlocks.MEDIUM_BUDDING_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_TUMBLESTONE = blockItem("large_budding_tumblestone", CobblemonBlocks.LARGE_BUDDING_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_CLUSTER = blockItem("tumblestone_cluster", CobblemonBlocks.TUMBLESTONE_CLUSTER)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_SKY_TUMBLESTONE = blockItem("small_budding_sky_tumblestone", CobblemonBlocks.SMALL_BUDDING_SKY_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_SKY_TUMBLESTONE = blockItem("medium_budding_sky_tumblestone", CobblemonBlocks.MEDIUM_BUDDING_SKY_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_SKY_TUMBLESTONE = blockItem("large_budding_sky_tumblestone", CobblemonBlocks.LARGE_BUDDING_SKY_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val SKY_TUMBLESTONE_CLUSTER = blockItem("sky_tumblestone_cluster", CobblemonBlocks.SKY_TUMBLESTONE_CLUSTER)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val SMALL_BUDDING_BLACK_TUMBLESTONE = blockItem("small_budding_black_tumblestone", CobblemonBlocks.SMALL_BUDDING_BLACK_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val MEDIUM_BUDDING_BLACK_TUMBLESTONE = blockItem("medium_budding_black_tumblestone", CobblemonBlocks.MEDIUM_BUDDING_BLACK_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val LARGE_BUDDING_BLACK_TUMBLESTONE = blockItem("large_budding_black_tumblestone", CobblemonBlocks.LARGE_BUDDING_BLACK_TUMBLESTONE)
|
|
||||||
@JvmField
|
|
||||||
val BLACK_TUMBLESTONE_CLUSTER = blockItem("black_tumblestone_cluster", CobblemonBlocks.BLACK_TUMBLESTONE_CLUSTER)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_BLOCK = blockItem("tumblestone_block", CobblemonBlocks.TUMBLESTONE_BLOCK)
|
|
||||||
@JvmField
|
|
||||||
val SKY_TUMBLESTONE_BLOCK = blockItem("sky_tumblestone_block", CobblemonBlocks.SKY_TUMBLESTONE_BLOCK)
|
|
||||||
@JvmField
|
|
||||||
val BLACK_TUMBLESTONE_BLOCK = blockItem("black_tumblestone_block", CobblemonBlocks.BLACK_TUMBLESTONE_BLOCK)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val AUTOMATON_ARMOR_TRIM_SMITHING_TEMPLATE: SmithingTemplateItem = this.create(
|
|
||||||
"automaton_armor_trim_smithing_template",
|
|
||||||
SmithingTemplateItem.of(CobblemonArmorTrims.AUTOMATON)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKEMON_MODEL = this.create("pokemon_model", PokemonItem())
|
val POKEMON_MODEL = this.create("pokemon_model", PokemonItem())
|
||||||
@JvmField
|
|
||||||
val RELIC_COIN = noSettingsItem("relic_coin")
|
|
||||||
@JvmField
|
|
||||||
val RELIC_COIN_POUCH = blockItem("relic_coin_pouch", CobblemonBlocks.RELIC_COIN_POUCH)
|
|
||||||
@JvmField
|
|
||||||
val RELIC_COIN_SACK = blockItem("relic_coin_sack", CobblemonBlocks.RELIC_COIN_SACK)
|
|
||||||
|
|
||||||
// Type Gems
|
|
||||||
@JvmField
|
|
||||||
val NORMAL_GEM = noSettingsItem("normal_gem")
|
|
||||||
@JvmField
|
|
||||||
val FIRE_GEM = noSettingsItem("fire_gem")
|
|
||||||
@JvmField
|
|
||||||
val WATER_GEM = noSettingsItem("water_gem")
|
|
||||||
@JvmField
|
|
||||||
val GRASS_GEM = noSettingsItem("grass_gem")
|
|
||||||
@JvmField
|
|
||||||
val ELECTRIC_GEM = noSettingsItem("electric_gem")
|
|
||||||
@JvmField
|
|
||||||
val ICE_GEM = noSettingsItem("ice_gem")
|
|
||||||
@JvmField
|
|
||||||
val FIGHTING_GEM = noSettingsItem("fighting_gem")
|
|
||||||
@JvmField
|
|
||||||
val POISON_GEM = noSettingsItem("poison_gem")
|
|
||||||
@JvmField
|
|
||||||
val GROUND_GEM = noSettingsItem("ground_gem")
|
|
||||||
@JvmField
|
|
||||||
val FLYING_GEM = noSettingsItem("flying_gem")
|
|
||||||
@JvmField
|
|
||||||
val PSYCHIC_GEM = noSettingsItem("psychic_gem")
|
|
||||||
@JvmField
|
|
||||||
val BUG_GEM = noSettingsItem("bug_gem")
|
|
||||||
@JvmField
|
|
||||||
val ROCK_GEM = noSettingsItem("rock_gem")
|
|
||||||
@JvmField
|
|
||||||
val GHOST_GEM = noSettingsItem("ghost_gem")
|
|
||||||
@JvmField
|
|
||||||
val DRAGON_GEM = noSettingsItem("dragon_gem")
|
|
||||||
@JvmField
|
|
||||||
val DARK_GEM = noSettingsItem("dark_gem")
|
|
||||||
@JvmField
|
|
||||||
val STEEL_GEM = noSettingsItem("steel_gem")
|
|
||||||
@JvmField
|
|
||||||
val FAIRY_GEM = noSettingsItem("fairy_gem")
|
|
||||||
|
|
||||||
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Settings()))
|
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Settings()))
|
||||||
|
|
||||||
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Settings()))
|
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Settings()))
|
||||||
|
|
||||||
fun berries() = this.berries.toMap()
|
|
||||||
|
|
||||||
private fun mulchItem(name: String, mulchVariant: MulchVariant): MulchItem = this.create(name, MulchItem(mulchVariant))
|
private fun mulchItem(name: String, mulchVariant: MulchVariant): MulchItem = this.create(name, MulchItem(mulchVariant))
|
||||||
|
|
||||||
private fun pokeBallItem(pokeBall: PokeBall): PokeBallItem {
|
private fun pokeBallItem(pokeBall: PokeBall): PokeBallItem {
|
||||||
@@ -1011,86 +592,5 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
private fun heldItem(name: String, item: Item, remappedName: String? = null) = create(
|
|
||||||
name = name,
|
|
||||||
entry = item.also {
|
|
||||||
if (remappedName != null) {
|
|
||||||
CobblemonHeldItemManager.registerRemap(it, remappedName)
|
|
||||||
CobblemonHeldItemManager.registerRemap(Items.BONE, "thickclub")
|
|
||||||
CobblemonHeldItemManager.registerRemap(Items.SNOWBALL, "snowball")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun compostable(item: Item, increaseLevelChance: Float) = Cobblemon.implementation.registerCompostable(item, increaseLevelChance)
|
}
|
||||||
|
|
||||||
private fun berryItem(name: String, berryBlock: BerryBlock): BerryItem {
|
|
||||||
val finalName = "${name}_berry"
|
|
||||||
val item = this.create(finalName, BerryItem(berryBlock))
|
|
||||||
compostable(item, .65f)
|
|
||||||
this.berries[cobblemonResource(finalName)] = item
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun berryItem(name: String, berryItem: BerryItem): BerryItem {
|
|
||||||
val finalName = "${name}_berry"
|
|
||||||
val item = this.create(finalName, berryItem)
|
|
||||||
compostable(item, .65f)
|
|
||||||
this.berries[cobblemonResource(finalName)] = item
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun mintItem(name: String, mintItem: MintItem): MintItem {
|
|
||||||
val item = this.create(name, mintItem)
|
|
||||||
mints[item.nature.displayName] = item
|
|
||||||
compostable(item, .65f)
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun apricornItem(name: String, apricornItem: ApricornItem): ApricornItem {
|
|
||||||
val finalName = "${name}_apricorn"
|
|
||||||
val item = this.create(finalName, apricornItem)
|
|
||||||
compostable(item, .65f)
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun apricornSeedItem(name: String, apricornSeedItem: ApricornSeedItem): ApricornSeedItem {
|
|
||||||
val finalName = "${name}_apricorn_seed"
|
|
||||||
val item = this.create(finalName, apricornSeedItem)
|
|
||||||
compostable(item, .65f)
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun mintSeed(name: String, mintBlock: MintBlock): Item {
|
|
||||||
val finalName = "${name}_mint_seeds"
|
|
||||||
val item = this.blockItem(finalName, mintBlock)
|
|
||||||
compostable(item, .65f)
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun mintLeaf(name: String, mintLeafItem: MintLeafItem): MintLeafItem {
|
|
||||||
val finalName = "${name}_mint_leaf"
|
|
||||||
val item = this.create(finalName, mintLeafItem)
|
|
||||||
compostable(item, .65f)
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun compostableItem(name: String, item: Item? = null, increaseLevelChance: Float = .65f): Item {
|
|
||||||
val createdItem = this.create(name, item ?: Item(Item.Settings()))
|
|
||||||
compostable(createdItem, increaseLevelChance)
|
|
||||||
return createdItem
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun compostableHeldItem(name: String, remappedName: String? = null, increaseLevelChance: Float = .65f): CobblemonItem {
|
|
||||||
val createdItem = heldItem(name, remappedName)
|
|
||||||
compostable(createdItem, increaseLevelChance)
|
|
||||||
return createdItem
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun compostableBlockItem(name: String, block: Block, increaseLevelChance: Float = .65f): Item {
|
|
||||||
val createdItem = this.blockItem(name, block)
|
|
||||||
compostable(createdItem, increaseLevelChance)
|
|
||||||
return createdItem
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -11,8 +11,6 @@ package com.cobblemon.mod.common
|
|||||||
import com.bedrockk.molang.Expression
|
import com.bedrockk.molang.Expression
|
||||||
import com.cobblemon.mod.common.api.data.DataRegistry
|
import com.cobblemon.mod.common.api.data.DataRegistry
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.mechanics.BerriesMechanic
|
|
||||||
import com.cobblemon.mod.common.mechanics.PotionsMechanic
|
|
||||||
import com.cobblemon.mod.common.mechanics.RemediesMechanic
|
import com.cobblemon.mod.common.mechanics.RemediesMechanic
|
||||||
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
@@ -32,19 +30,11 @@ object CobblemonMechanics : DataRegistry {
|
|||||||
.create()
|
.create()
|
||||||
|
|
||||||
var remedies = RemediesMechanic()
|
var remedies = RemediesMechanic()
|
||||||
var berries = BerriesMechanic()
|
|
||||||
var potions = PotionsMechanic()
|
|
||||||
|
|
||||||
override fun sync(player: ServerPlayerEntity) {}
|
override fun sync(player: ServerPlayerEntity) {}
|
||||||
override fun reload(manager: ResourceManager) {
|
override fun reload(manager: ResourceManager) {
|
||||||
remedies = loadMechanic(manager, "remedies", RemediesMechanic::class.java)
|
manager.getResourceOrThrow(cobblemonResource("mechanics/remedies.json")).inputStream.use {
|
||||||
berries = loadMechanic(manager, "berries", BerriesMechanic::class.java)
|
remedies = gson.fromJson(it.reader(), RemediesMechanic::class.java)
|
||||||
potions = loadMechanic(manager, "potions", PotionsMechanic::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun <T> loadMechanic(manager: ResourceManager, name: String, clazz: Class<T>): T {
|
|
||||||
manager.getResourceOrThrow(cobblemonResource("mechanics/$name.json")).inputStream.use {
|
|
||||||
return gson.fromJson(it.reader(), clazz)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,28 +11,23 @@ package com.cobblemon.mod.common
|
|||||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.PlayerInteractOptionsHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
|
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
|
||||||
import com.cobblemon.mod.common.client.net.animation.PlayPoseableAnimationHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.battle.*
|
import com.cobblemon.mod.common.client.net.battle.*
|
||||||
import com.cobblemon.mod.common.client.net.callback.move.OpenMoveCallbackHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.callback.party.OpenPartyCallbackHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallbackHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.data.DataRegistrySyncPacketHandler
|
import com.cobblemon.mod.common.client.net.data.DataRegistrySyncPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.data.UnlockReloadPacketHandler
|
import com.cobblemon.mod.common.client.net.data.UnlockReloadPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.effect.RunPosableMoLangHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.dialogue.DialogueClosedHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.dialogue.DialogueOpenedHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormEntityParticleHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormParticleHandler
|
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormParticleHandler
|
||||||
import com.cobblemon.mod.common.client.net.gui.InteractPokemonUIPacketHandler
|
import com.cobblemon.mod.common.client.net.gui.InteractPokemonUIPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
|
import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.callback.move.OpenMoveCallbackHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.callback.party.OpenPartyCallbackHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallbackHandler
|
||||||
import com.cobblemon.mod.common.client.net.pasture.ClosePastureHandler
|
import com.cobblemon.mod.common.client.net.pasture.ClosePastureHandler
|
||||||
import com.cobblemon.mod.common.client.net.pasture.OpenPastureHandler
|
import com.cobblemon.mod.common.client.net.pasture.OpenPastureHandler
|
||||||
import com.cobblemon.mod.common.client.net.pasture.PokemonPasturedHandler
|
import com.cobblemon.mod.common.client.net.pasture.PokemonPasturedHandler
|
||||||
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
|
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
|
||||||
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
|
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
|
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.sound.PokemonCryHandler
|
||||||
import com.cobblemon.mod.common.client.net.sound.UnvalidatedPlaySoundS2CPacketHandler
|
import com.cobblemon.mod.common.client.net.sound.UnvalidatedPlaySoundS2CPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.spawn.SpawnExtraDataEntityHandler
|
import com.cobblemon.mod.common.client.net.spawn.SpawnExtraDataEntityHandler
|
||||||
import com.cobblemon.mod.common.client.net.starter.StarterUIPacketHandler
|
import com.cobblemon.mod.common.client.net.starter.StarterUIPacketHandler
|
||||||
@@ -56,28 +51,16 @@ import com.cobblemon.mod.common.client.net.trade.TradeOfferExpiredHandler
|
|||||||
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
|
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
|
||||||
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
|
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
|
||||||
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
|
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
|
||||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.animation.PlayPoseableAnimationPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.*
|
import com.cobblemon.mod.common.net.messages.client.battle.*
|
||||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenMoveCallbackPacket
|
import com.cobblemon.mod.common.net.messages.client.callback.OpenMoveCallbackPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
|
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyMoveCallbackPacket
|
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyMoveCallbackPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.AbilityRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.AbilityRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.BerryRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.GlobalSpeciesFeatureSyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.MovesRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.MovesRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.PropertiesCompletionRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.PropertiesCompletionRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.SpeciesFeatureAssignmentSyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.SpeciesRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.SpeciesRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.StandardSpeciesFeatureSyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.UnlockReloadPacket
|
import com.cobblemon.mod.common.net.messages.client.data.UnlockReloadPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueClosedPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.FossilRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.NaturalMaterialRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
|
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pasture.OpenPasturePacket
|
import com.cobblemon.mod.common.net.messages.client.pasture.OpenPasturePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonPasturedPacket
|
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonPasturedPacket
|
||||||
@@ -87,8 +70,8 @@ import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.Add
|
|||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.sound.PokemonCryPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
|
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnGenericBedrockPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokeballPacket
|
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokeballPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokemonPacket
|
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.starter.OpenStarterUIPacket
|
import com.cobblemon.mod.common.net.messages.client.starter.OpenStarterUIPacket
|
||||||
@@ -115,18 +98,18 @@ import com.cobblemon.mod.common.net.messages.client.trade.TradeStartedPacket
|
|||||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.*
|
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.SelectStarterPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
|
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectCancelledPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectCancelledPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectedPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectedPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.party.PartyPokemonSelectedPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.party.PartyPokemonSelectedPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.party.PartySelectCancelledPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.party.PartySelectCancelledPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.partymove.PartyMoveSelectCancelledPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.partymove.PartyMoveSelectCancelledPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.partymove.PartyPokemonMoveSelectedPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.partymove.PartyPokemonMoveSelectedPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.dialogue.EscapeDialoguePacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.dialogue.InputToDialoguePacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.PasturePokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.PasturePokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.UnpastureAllPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.UnpastureAllPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPacket
|
||||||
@@ -150,18 +133,13 @@ import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptanceP
|
|||||||
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
||||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.RemoveSpectatorHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectCancelledHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectCancelledHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectedHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectedHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.party.PartyPokemonSelectedHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.party.PartyPokemonSelectedHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.party.PartySelectCancelledHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.party.PartySelectCancelledHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.partymove.PartyMoveSelectCancelledHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.partymove.PartyMoveSelectCancelledHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.partymove.PartyPokemonMoveSelectedHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.partymove.PartyPokemonMoveSelectedHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.dialogue.EscapeDialogueHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.dialogue.InputToDialogueHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.evolution.AcceptEvolutionHandler
|
import com.cobblemon.mod.common.net.serverhandling.evolution.AcceptEvolutionHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pasture.PasturePokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pasture.PasturePokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpastureAllPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpastureAllPokemonHandler
|
||||||
@@ -189,12 +167,12 @@ import com.cobblemon.mod.common.net.serverhandling.trade.ChangeTradeAcceptanceHa
|
|||||||
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
|
||||||
import com.cobblemon.mod.common.util.server
|
import com.cobblemon.mod.common.util.server
|
||||||
|
import kotlin.reflect.KClass
|
||||||
import net.minecraft.network.PacketByteBuf
|
import net.minecraft.network.PacketByteBuf
|
||||||
import net.minecraft.network.listener.ClientPlayPacketListener
|
import net.minecraft.network.listener.ClientPlayPacketListener
|
||||||
import net.minecraft.network.packet.Packet
|
import net.minecraft.network.packet.Packet
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
import net.minecraft.server.network.ServerPlayerEntity
|
||||||
import net.minecraft.util.Identifier
|
import net.minecraft.util.Identifier
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers Cobblemon network packets.
|
* Registers Cobblemon network packets.
|
||||||
@@ -232,9 +210,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
this.createClientBound(HeldItemUpdatePacket.ID, HeldItemUpdatePacket::decode, PokemonUpdatePacketHandler())
|
this.createClientBound(HeldItemUpdatePacket.ID, HeldItemUpdatePacket::decode, PokemonUpdatePacketHandler())
|
||||||
this.createClientBound(PokemonStateUpdatePacket.ID, PokemonStateUpdatePacket::decode, PokemonUpdatePacketHandler())
|
this.createClientBound(PokemonStateUpdatePacket.ID, PokemonStateUpdatePacket::decode, PokemonUpdatePacketHandler())
|
||||||
this.createClientBound(TetheringUpdatePacket.ID, TetheringUpdatePacket::decode, PokemonUpdatePacketHandler())
|
this.createClientBound(TetheringUpdatePacket.ID, TetheringUpdatePacket::decode, PokemonUpdatePacketHandler())
|
||||||
this.createClientBound(TradeableUpdatePacket.ID, TradeableUpdatePacket::decode, PokemonUpdatePacketHandler())
|
|
||||||
this.createClientBound(SpeciesFeatureUpdatePacket.ID, SpeciesFeatureUpdatePacket::decode, PokemonUpdatePacketHandler())
|
|
||||||
this.createClientBound(OriginalTrainerUpdatePacket.ID, OriginalTrainerUpdatePacket::decode, PokemonUpdatePacketHandler())
|
|
||||||
|
|
||||||
// Evolution start
|
// Evolution start
|
||||||
this.createClientBound(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler())
|
this.createClientBound(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler())
|
||||||
@@ -261,7 +236,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
// UI Packets
|
// UI Packets
|
||||||
this.createClientBound(SummaryUIPacket.ID, SummaryUIPacket::decode, SummaryUIPacketHandler)
|
this.createClientBound(SummaryUIPacket.ID, SummaryUIPacket::decode, SummaryUIPacketHandler)
|
||||||
this.createClientBound(InteractPokemonUIPacket.ID, InteractPokemonUIPacket::decode, InteractPokemonUIPacketHandler)
|
this.createClientBound(InteractPokemonUIPacket.ID, InteractPokemonUIPacket::decode, InteractPokemonUIPacketHandler)
|
||||||
this.createClientBound(PlayerInteractOptionsPacket.ID, PlayerInteractOptionsPacket::decode, PlayerInteractOptionsHandler)
|
|
||||||
|
|
||||||
// Starter packets
|
// Starter packets
|
||||||
this.createClientBound(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler)
|
this.createClientBound(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler)
|
||||||
@@ -287,8 +261,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
this.createClientBound(BattleMadeInvalidChoicePacket.ID, BattleMadeInvalidChoicePacket::decode, BattleMadeInvalidChoiceHandler)
|
this.createClientBound(BattleMadeInvalidChoicePacket.ID, BattleMadeInvalidChoicePacket::decode, BattleMadeInvalidChoiceHandler)
|
||||||
this.createClientBound(BattleMusicPacket.ID, BattleMusicPacket::decode, BattleMusicHandler)
|
this.createClientBound(BattleMusicPacket.ID, BattleMusicPacket::decode, BattleMusicHandler)
|
||||||
this.createClientBound(BattleChallengeExpiredPacket.ID, BattleChallengeExpiredPacket::decode, BattleChallengeExpiredHandler)
|
this.createClientBound(BattleChallengeExpiredPacket.ID, BattleChallengeExpiredPacket::decode, BattleChallengeExpiredHandler)
|
||||||
this.createClientBound(BattleReplacePokemonPacket.ID, BattleReplacePokemonPacket::decode, BattleReplacePokemonHandler)
|
|
||||||
this.createClientBound(BattleTransformPokemonPacket.ID, BattleTransformPokemonPacket::decode, BattleTransformPokemonHandler)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -301,24 +273,15 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
this.createClientBound(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
this.createClientBound(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
||||||
this.createClientBound(PropertiesCompletionRegistrySyncPacket.ID, PropertiesCompletionRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
this.createClientBound(PropertiesCompletionRegistrySyncPacket.ID, PropertiesCompletionRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
||||||
this.createClientBound(UnlockReloadPacket.ID, UnlockReloadPacket::decode, UnlockReloadPacketHandler)
|
this.createClientBound(UnlockReloadPacket.ID, UnlockReloadPacket::decode, UnlockReloadPacketHandler)
|
||||||
this.createClientBound(BerryRegistrySyncPacket.ID, BerryRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
this.createClientBound(StandardSpeciesFeatureSyncPacket.ID, StandardSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
this.createClientBound(GlobalSpeciesFeatureSyncPacket.ID, GlobalSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
this.createClientBound(SpeciesFeatureAssignmentSyncPacket.ID, SpeciesFeatureAssignmentSyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
this.createClientBound(NaturalMaterialRegistrySyncPacket.ID, NaturalMaterialRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
this.createClientBound(FossilRegistrySyncPacket.ID, FossilRegistrySyncPacket::decode, DataRegistrySyncPacketHandler())
|
|
||||||
|
|
||||||
// Effects
|
// Effects
|
||||||
this.createClientBound(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler)
|
this.createClientBound(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler)
|
||||||
this.createClientBound(SpawnSnowstormEntityParticlePacket.ID, SpawnSnowstormEntityParticlePacket::decode, SpawnSnowstormEntityParticleHandler)
|
|
||||||
this.createClientBound(RunPosableMoLangPacket.ID, RunPosableMoLangPacket::decode, RunPosableMoLangHandler)
|
|
||||||
|
|
||||||
// Hax
|
// Hax
|
||||||
this.createClientBound(UnvalidatedPlaySoundS2CPacket.ID, UnvalidatedPlaySoundS2CPacket::decode, UnvalidatedPlaySoundS2CPacketHandler)
|
this.createClientBound(UnvalidatedPlaySoundS2CPacket.ID, UnvalidatedPlaySoundS2CPacket::decode, UnvalidatedPlaySoundS2CPacketHandler)
|
||||||
this.createClientBound(SpawnPokemonPacket.ID, SpawnPokemonPacket::decode, SpawnExtraDataEntityHandler())
|
this.createClientBound(SpawnPokemonPacket.ID, SpawnPokemonPacket::decode, SpawnExtraDataEntityHandler())
|
||||||
this.createClientBound(SpawnPokeballPacket.ID, SpawnPokeballPacket::decode, SpawnExtraDataEntityHandler())
|
this.createClientBound(SpawnPokeballPacket.ID, SpawnPokeballPacket::decode, SpawnExtraDataEntityHandler())
|
||||||
this.createClientBound(ToastPacket.ID, ToastPacket::decode, ToastPacketHandler)
|
this.createClientBound(ToastPacket.ID, ToastPacket::decode, ToastPacketHandler)
|
||||||
this.createClientBound(SpawnGenericBedrockPacket.ID, SpawnGenericBedrockPacket::decode, SpawnExtraDataEntityHandler())
|
|
||||||
|
|
||||||
// Trade packets
|
// Trade packets
|
||||||
this.createClientBound(TradeAcceptanceChangedPacket.ID, TradeAcceptanceChangedPacket::decode, TradeAcceptanceChangedHandler)
|
this.createClientBound(TradeAcceptanceChangedPacket.ID, TradeAcceptanceChangedPacket::decode, TradeAcceptanceChangedHandler)
|
||||||
@@ -336,7 +299,7 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
this.createClientBound(PokemonUnpasturedPacket.ID, PokemonUnpasturedPacket::decode, PokemonUnpasturedHandler)
|
this.createClientBound(PokemonUnpasturedPacket.ID, PokemonUnpasturedPacket::decode, PokemonUnpasturedHandler)
|
||||||
|
|
||||||
// Behaviours
|
// Behaviours
|
||||||
this.createClientBound(PlayPoseableAnimationPacket.ID, PlayPoseableAnimationPacket::decode, PlayPoseableAnimationHandler)
|
this.createClientBound(PokemonCryPacket.ID, PokemonCryPacket::decode, PokemonCryHandler)
|
||||||
|
|
||||||
// Move select packets
|
// Move select packets
|
||||||
this.createClientBound(OpenMoveCallbackPacket.ID, OpenMoveCallbackPacket::decode, OpenMoveCallbackHandler)
|
this.createClientBound(OpenMoveCallbackPacket.ID, OpenMoveCallbackPacket::decode, OpenMoveCallbackHandler)
|
||||||
@@ -346,10 +309,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
|
|
||||||
// Party move select packets
|
// Party move select packets
|
||||||
this.createClientBound(OpenPartyMoveCallbackPacket.ID, OpenPartyMoveCallbackPacket::decode, OpenPartyMoveCallbackHandler)
|
this.createClientBound(OpenPartyMoveCallbackPacket.ID, OpenPartyMoveCallbackPacket::decode, OpenPartyMoveCallbackHandler)
|
||||||
|
|
||||||
// Dialogue packets
|
|
||||||
this.createClientBound(DialogueClosedPacket.ID, DialogueClosedPacket::decode, DialogueClosedHandler)
|
|
||||||
this.createClientBound(DialogueOpenedPacket.ID, DialogueOpenedPacket::decode, DialogueOpenedHandler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun registerServerBound() {
|
override fun registerServerBound() {
|
||||||
@@ -361,7 +320,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
|
|
||||||
// Interaction Packets
|
// Interaction Packets
|
||||||
this.createServerBound(InteractPokemonPacket.ID, InteractPokemonPacket::decode, InteractPokemonHandler)
|
this.createServerBound(InteractPokemonPacket.ID, InteractPokemonPacket::decode, InteractPokemonHandler)
|
||||||
this.createServerBound(RequestPlayerInteractionsPacket.ID, RequestPlayerInteractionsPacket::decode, RequestInteractionsHandler)
|
|
||||||
|
|
||||||
// Storage Packets
|
// Storage Packets
|
||||||
this.createServerBound(SendOutPokemonPacket.ID, SendOutPokemonPacket::decode, SendOutPokemonHandler)
|
this.createServerBound(SendOutPokemonPacket.ID, SendOutPokemonPacket::decode, SendOutPokemonHandler)
|
||||||
@@ -389,8 +347,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
|
|
||||||
// Battle packets
|
// Battle packets
|
||||||
this.createServerBound(BattleSelectActionsPacket.ID, BattleSelectActionsPacket::decode, BattleSelectActionsHandler)
|
this.createServerBound(BattleSelectActionsPacket.ID, BattleSelectActionsPacket::decode, BattleSelectActionsHandler)
|
||||||
this.createServerBound(SpectateBattlePacket.ID, SpectateBattlePacket::decode, SpectateBattleHandler)
|
|
||||||
this.createServerBound(RemoveSpectatorPacket.ID, RemoveSpectatorPacket::decode, RemoveSpectatorHandler)
|
|
||||||
|
|
||||||
// Trade
|
// Trade
|
||||||
this.createServerBound(AcceptTradeRequestPacket.ID, AcceptTradeRequestPacket::decode, AcceptTradeRequestHandler)
|
this.createServerBound(AcceptTradeRequestPacket.ID, AcceptTradeRequestPacket::decode, AcceptTradeRequestHandler)
|
||||||
@@ -415,10 +371,6 @@ object CobblemonNetwork : NetworkManager {
|
|||||||
// Party move select packets
|
// Party move select packets
|
||||||
this.createServerBound(PartyPokemonMoveSelectedPacket.ID, PartyPokemonMoveSelectedPacket::decode, PartyPokemonMoveSelectedHandler)
|
this.createServerBound(PartyPokemonMoveSelectedPacket.ID, PartyPokemonMoveSelectedPacket::decode, PartyPokemonMoveSelectedHandler)
|
||||||
this.createServerBound(PartyMoveSelectCancelledPacket.ID, PartyMoveSelectCancelledPacket::decode, PartyMoveSelectCancelledHandler)
|
this.createServerBound(PartyMoveSelectCancelledPacket.ID, PartyMoveSelectCancelledPacket::decode, PartyMoveSelectCancelledHandler)
|
||||||
|
|
||||||
// Dialogue packets
|
|
||||||
this.createServerBound(EscapeDialoguePacket.ID, EscapeDialoguePacket::decode, EscapeDialogueHandler)
|
|
||||||
this.createServerBound(InputToDialoguePacket.ID, InputToDialoguePacket::decode, InputToDialogueHandler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <reified T : NetworkPacket<T>> createClientBound(identifier: Identifier, noinline decoder: (PacketByteBuf) -> T, handler: ClientNetworkPacketHandler<T>) {
|
private inline fun <reified T : NetworkPacket<T>> createClientBound(identifier: Identifier, noinline decoder: (PacketByteBuf) -> T, handler: ClientNetworkPacketHandler<T>) {
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ import net.minecraft.registry.Registries
|
|||||||
import net.minecraft.registry.Registry
|
import net.minecraft.registry.Registry
|
||||||
import net.minecraft.registry.RegistryKey
|
import net.minecraft.registry.RegistryKey
|
||||||
import net.minecraft.registry.RegistryKeys
|
import net.minecraft.registry.RegistryKeys
|
||||||
import net.minecraft.sound.BlockSoundGroup
|
|
||||||
import net.minecraft.sound.SoundEvent
|
import net.minecraft.sound.SoundEvent
|
||||||
import net.minecraft.sound.SoundEvents
|
|
||||||
|
|
||||||
object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Registry<SoundEvent>>, SoundEvent>() {
|
object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Registry<SoundEvent>>, SoundEvent>() {
|
||||||
|
|
||||||
@@ -56,10 +54,6 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
|
|||||||
val POKE_BALL_SEND_OUT = this.create("poke_ball.send_out")
|
val POKE_BALL_SEND_OUT = this.create("poke_ball.send_out")
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKE_BALL_RECALL = this.create("poke_ball.recall")
|
val POKE_BALL_RECALL = this.create("poke_ball.recall")
|
||||||
@JvmField
|
|
||||||
val POKE_BALL_THROW = this.create("poke_ball.throw")
|
|
||||||
@JvmField
|
|
||||||
val POKE_BALL_TRAIL = this.create("poke_ball.trail")
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val ITEM_USE = this.create("item.use")
|
val ITEM_USE = this.create("item.use")
|
||||||
@@ -67,8 +61,6 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
|
|||||||
val CAN_EVOLVE = this.create("pokemon.can_evolve")
|
val CAN_EVOLVE = this.create("pokemon.can_evolve")
|
||||||
@JvmField
|
@JvmField
|
||||||
val EVOLVING = this.create("pokemon.evolving")
|
val EVOLVING = this.create("pokemon.evolving")
|
||||||
@JvmField
|
|
||||||
val EVOLVE = this.create("evolution.evolve")
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val PVN_BATTLE = this.create("battle.pvn.default")
|
val PVN_BATTLE = this.create("battle.pvn.default")
|
||||||
@@ -85,265 +77,7 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
|
|||||||
val MEDICINE_PILLS_USE = this.create("medicine_pills.use")
|
val MEDICINE_PILLS_USE = this.create("medicine_pills.use")
|
||||||
@JvmField
|
@JvmField
|
||||||
val MEDICINE_SPRAY_USE = this.create("medicine_spray.use")
|
val MEDICINE_SPRAY_USE = this.create("medicine_spray.use")
|
||||||
@JvmField
|
|
||||||
val MEDICINE_FEATHER_USE = this.create("medicine_feather.use")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BERRY_HARVEST = this.create("berry.harvest")
|
|
||||||
@JvmField
|
|
||||||
val BERRY_EAT = this.create("berry.eat")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MULCH_PLACE = this.create("mulch.place")
|
|
||||||
@JvmField
|
|
||||||
val MULCH_REMOVE = this.create("mulch.remove")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_ACTIVATE = this.create("fossil_machine.activate")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_ACTIVE_LOOP = this.create("fossil_machine.active_loop")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_ASSEMBLE = this.create("fossil_machine.assemble")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_DNA_FULL = this.create("fossil_machine.dna_full")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_FINISHED = this.create("fossil_machine.finished")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_INSERT_DNA = this.create("fossil_machine.insert_dna")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_INSERT_DNA_SMALL = this.create("fossil_machine.insert_dna_small")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_INSERT_FOSSIL = this.create("fossil_machine.insert_fossil")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_RETRIEVE_FOSSIL = this.create("fossil_machine.retrieve_fossil")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_RETRIEVE_POKEMON = this.create("fossil_machine.retrieve_pokemon")
|
|
||||||
@JvmField
|
|
||||||
val FOSSIL_MACHINE_UNPROTECTED = this.create("fossil_machine.unprotected")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val COIN_POUCH_BREAK = this.create("coin_pouch.break")
|
|
||||||
@JvmField
|
|
||||||
val COIN_POUCH_HIT = this.create("coin_pouch.hit")
|
|
||||||
@JvmField
|
|
||||||
val COIN_POUCH_STEP = this.create("coin_pouch.step")
|
|
||||||
@JvmField
|
|
||||||
val COIN_POUCH_PLACE = this.create("coin_pouch.place")
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_BREAK = this.create("tumblestone.break")
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_BLOCK_BREAK = this.create("tumblestone.block_break")
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_HIT = this.create("tumblestone.hit")
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_PLACE = this.create("tumblestone.place")
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_STEP = this.create("tumblestone.step")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GIMMIGHOUL_GIVE_ITEM_SMALL = this.create("gimmighoul.give_item_small")
|
|
||||||
@JvmField
|
|
||||||
val GIMMIGHOUL_REVEAL = this.create("gimmighoul.reveal")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BERRY_BUSH_BREAK = this.create("berry_bush.break")
|
|
||||||
@JvmField
|
|
||||||
val BERRY_BUSH_PLACE = this.create("berry_bush.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BIG_ROOT_BREAK = this.create("big_root.break")
|
|
||||||
@JvmField
|
|
||||||
val ENERGY_ROOT_PLACE = this.create("energy_root.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val VIVICHOKE_BREAK = this.create("vivichoke.break")
|
|
||||||
@JvmField
|
|
||||||
val VIVICHOKE_PLACE = this.create("vivichoke.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MINT_BREAK = this.create("mint.break")
|
|
||||||
@JvmField
|
|
||||||
val MINT_PLACE = this.create("mint.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val REVIVAL_HERB_BREAK = this.create("revival_herb.break")
|
|
||||||
@JvmField
|
|
||||||
val REVIVAL_HERB_PLACE = this.create("revival_herb.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MEDICINAL_LEEK_BREAK = this.create("medicinal_leek.break")
|
|
||||||
@JvmField
|
|
||||||
val MEDICINAL_LEEK_PLACE = this.create("medicinal_leek.plant")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_OPEN = this.create("gilded_chest.open")
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_CLOSE = this.create("gilded_chest.close")
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_STEP = this.create("gilded_chest.step")
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_HIT = this.create("gilded_chest.hit")
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_BREAK = this.create("gilded_chest.break")
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_PLACE = this.create("gilded_chest.place")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val COIN_POUCH_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
COIN_POUCH_BREAK,
|
|
||||||
COIN_POUCH_STEP,
|
|
||||||
COIN_POUCH_PLACE,
|
|
||||||
COIN_POUCH_HIT,
|
|
||||||
COIN_POUCH_STEP
|
|
||||||
)
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_NORMAL = this.create("impact.normal")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_BUG = this.create("impact.bug")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_DARK = this.create("impact.dark")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_DRAGON = this.create("impact.dragon")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_ELECTRIC = this.create("impact.electric")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_FAIRY = this.create("impact.fairy")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_FIGHTING = this.create("impact.fighting")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_FIRE = this.create("impact.fire")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_FLYING = this.create("impact.flying")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_GHOST = this.create("impact.ghost")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_GRASS = this.create("impact.grass")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_GROUND = this.create("impact.ground")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_ICE = this.create("impact.ice")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_POISON = this.create("impact.poison")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_PSYCHIC = this.create("impact.psychic")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_ROCK = this.create("impact.rock")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_STEEL = this.create("impact.steel")
|
|
||||||
@JvmField
|
|
||||||
val IMPACT_WATER = this.create("impact.water")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
TUMBLESTONE_BREAK,
|
|
||||||
TUMBLESTONE_STEP,
|
|
||||||
TUMBLESTONE_PLACE,
|
|
||||||
TUMBLESTONE_HIT,
|
|
||||||
TUMBLESTONE_STEP
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val TUMBLESTONE_BLOCK_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
TUMBLESTONE_BLOCK_BREAK,
|
|
||||||
TUMBLESTONE_STEP,
|
|
||||||
TUMBLESTONE_PLACE,
|
|
||||||
TUMBLESTONE_HIT,
|
|
||||||
TUMBLESTONE_STEP
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BERRY_BUSH_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
BERRY_BUSH_BREAK,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP,
|
|
||||||
BERRY_BUSH_PLACE,
|
|
||||||
SoundEvents.BLOCK_GRASS_HIT,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val BIG_ROOT_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
BIG_ROOT_BREAK,
|
|
||||||
SoundEvents.BLOCK_ROOTS_STEP,
|
|
||||||
SoundEvents.BLOCK_ROOTS_PLACE,
|
|
||||||
SoundEvents.BLOCK_ROOTS_HIT,
|
|
||||||
SoundEvents.BLOCK_ROOTS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val ENERGY_ROOT_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
SoundEvents.BLOCK_ROOTS_BREAK,
|
|
||||||
SoundEvents.BLOCK_ROOTS_STEP,
|
|
||||||
ENERGY_ROOT_PLACE,
|
|
||||||
SoundEvents.BLOCK_ROOTS_HIT,
|
|
||||||
SoundEvents.BLOCK_ROOTS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MEDICINAL_LEEK_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
MEDICINAL_LEEK_BREAK,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP,
|
|
||||||
MEDICINAL_LEEK_PLACE,
|
|
||||||
SoundEvents.BLOCK_GRASS_HIT,
|
|
||||||
SoundEvents.BLOCK_GRASS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val VIVICHOKE_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
VIVICHOKE_BREAK,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP,
|
|
||||||
VIVICHOKE_PLACE,
|
|
||||||
SoundEvents.BLOCK_GRASS_HIT,
|
|
||||||
SoundEvents.BLOCK_GRASS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val MINT_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
MINT_BREAK,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP,
|
|
||||||
MINT_PLACE,
|
|
||||||
SoundEvents.BLOCK_GRASS_HIT,
|
|
||||||
SoundEvents.BLOCK_GRASS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val REVIVAL_HERB_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
REVIVAL_HERB_BREAK,
|
|
||||||
SoundEvents.BLOCK_GRASS_STEP,
|
|
||||||
REVIVAL_HERB_PLACE,
|
|
||||||
SoundEvents.BLOCK_GRASS_HIT,
|
|
||||||
SoundEvents.BLOCK_GRASS_FALL
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val GILDED_CHEST_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
GILDED_CHEST_BREAK,
|
|
||||||
GILDED_CHEST_STEP,
|
|
||||||
GILDED_CHEST_PLACE,
|
|
||||||
GILDED_CHEST_HIT,
|
|
||||||
GILDED_CHEST_STEP
|
|
||||||
)
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_ADD_ITEM = this.create("display_case.add_item")
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_REMOVE_ITEM = this.create("display_case.remove_item")
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_BREAK = this.create("display_case.break")
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_HIT = this.create("display_case.hit")
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_PLACE = this.create("display_case.place")
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_STEP = this.create("display_case.step")
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val DISPLAY_CASE_SOUNDS = BlockSoundGroup(1f, 1f,
|
|
||||||
DISPLAY_CASE_BREAK,
|
|
||||||
DISPLAY_CASE_STEP,
|
|
||||||
DISPLAY_CASE_PLACE,
|
|
||||||
DISPLAY_CASE_HIT,
|
|
||||||
DISPLAY_CASE_STEP
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun create(name: String): SoundEvent = this.create(name, SoundEvent.of(cobblemonResource(name)))
|
private fun create(name: String): SoundEvent = this.create(name, SoundEvent.of(cobblemonResource(name)))
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ object CobblemonTradeOffers {
|
|||||||
* @return The resulting list.
|
* @return The resulting list.
|
||||||
*/
|
*/
|
||||||
fun tradeOffersFor(profession: VillagerProfession): List<VillagerTradeOffer> = when (profession) {
|
fun tradeOffersFor(profession: VillagerProfession): List<VillagerTradeOffer> = when (profession) {
|
||||||
VillagerProfession.FARMER -> listOf(VillagerTradeOffer(VillagerProfession.FARMER, 3, listOf(TradeOffers.SellItemFactory(CobblemonItems.VIVICHOKE_SEEDS, 24, 1, 1, 6))))
|
VillagerProfession.FARMER -> listOf(VillagerTradeOffer(VillagerProfession.FARMER, 3, listOf(TradeOffers.SellItemFactory(CobblemonItems.VIVICHOKE_SEEDS, 32, 1, 1, 6))))
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ object CobblemonTradeOffers {
|
|||||||
* @return The resulting list.
|
* @return The resulting list.
|
||||||
*/
|
*/
|
||||||
fun resolveWanderingTradeOffers(): List<WandererTradeOffer> = listOf(
|
fun resolveWanderingTradeOffers(): List<WandererTradeOffer> = listOf(
|
||||||
WandererTradeOffer(false, listOf(TradeOffers.SellItemFactory(CobblemonItems.VIVICHOKE_SEEDS, 24, 1, 1, 6)))
|
WandererTradeOffer(false, listOf(TradeOffers.SellItemFactory(CobblemonItems.VIVICHOKE_SEEDS, 32, 1, 1, 6)))
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -47,13 +47,13 @@ object CobblemonCriteria {
|
|||||||
val EVOLVE_POKEMON = this.create(
|
val EVOLVE_POKEMON = this.create(
|
||||||
SimpleCriterionTrigger(
|
SimpleCriterionTrigger(
|
||||||
cobblemonResource("pokemon_evolved"),
|
cobblemonResource("pokemon_evolved"),
|
||||||
EvolvePokemonCriterionCondition::class.java
|
SimpleCountableCriterionCondition::class.java
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
val WIN_BATTLE = this.create(
|
val WIN_BATTLE = this.create(
|
||||||
BattleCountableCriterionTrigger(
|
SimpleCriterionTrigger(
|
||||||
cobblemonResource("battles_won"),
|
cobblemonResource("battles_won"),
|
||||||
BattleCountableCriterionCondition::class.java
|
SimpleCountableCriterionCondition::class.java
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -71,56 +71,6 @@ object CobblemonCriteria {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val POKEMON_INTERACT = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("pokemon_interact"),
|
|
||||||
PokemonInteractCriterion::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val PARTY_CHECK = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("party"),
|
|
||||||
PartyCheckCriterion::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val LEVEL_UP = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("level_up"),
|
|
||||||
LevelUpCriterionCondition::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val PASTURE_USE = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("pasture_use"),
|
|
||||||
PickStarterCriterionCondition::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val RESURRECT_POKEMON = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("resurrect_pokemon"),
|
|
||||||
PickStarterCriterionCondition::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val TRADE_POKEMON = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("trade_pokemon"),
|
|
||||||
TradePokemonCriterionCondition::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Advancement criteria for [grow_tumblestone.json]
|
|
||||||
val PLANT_TUMBLESTONE = this.create(
|
|
||||||
SimpleCriterionTrigger(
|
|
||||||
cobblemonResource("plant_tumblestone"),
|
|
||||||
PlantTumblestoneCriterionCondition::class.java
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun <T : Criterion<*>> create(criteria: T): T = Cobblemon.implementation.registerCriteria(criteria)
|
private fun <T : Criterion<*>> create(criteria: T): T = Cobblemon.implementation.registerCriteria(criteria)
|
||||||
|
|
||||||
}
|
}
|
||||||
-67
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
|
||||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
|
||||||
import com.cobblemon.mod.common.util.toJsonArray
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
open class BattleCountableCriterionTrigger(identifier: Identifier, criterionClass: Class<BattleCountableCriterionCondition>) : SimpleCriterionTrigger<BattleCountableContext, BattleCountableCriterionCondition>(identifier, criterionClass) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class BattleCountableCriterionCondition(id: Identifier, predicate: LootContextPredicate) : CountableCriterionCondition<BattleCountableContext>(id, predicate) {
|
|
||||||
|
|
||||||
private var battleTypes = mutableListOf("any")
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
super.fromJson(json)
|
|
||||||
if(!json.get("battle_types").isJsonNull) {
|
|
||||||
battleTypes.clear()
|
|
||||||
json.get("battle_types").asJsonArray.asList().forEach() {
|
|
||||||
battleTypes.add(it.asString)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
super.toJson(json)
|
|
||||||
json.add("battle_types", battleTypes.toJsonArray())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: BattleCountableContext): Boolean {
|
|
||||||
var typeCheck = false
|
|
||||||
val advancementData = Cobblemon.playerData.get(player).advancementData
|
|
||||||
if (battleTypes.isEmpty() || battleTypes.contains("any")) {
|
|
||||||
typeCheck = true
|
|
||||||
}
|
|
||||||
if (battleTypes.contains("pvp")) {
|
|
||||||
typeCheck = context.battle.isPvP
|
|
||||||
context.times = advancementData.totalPvPBattleVictoryCount
|
|
||||||
}
|
|
||||||
if (battleTypes.contains("pvw")) {
|
|
||||||
typeCheck = context.battle.isPvW
|
|
||||||
context.times = advancementData.totalPvWBattleVictoryCount
|
|
||||||
}
|
|
||||||
if (battleTypes.contains("pvn")) {
|
|
||||||
typeCheck = context.battle.isPvN
|
|
||||||
context.times = advancementData.totalPvWBattleVictoryCount
|
|
||||||
}
|
|
||||||
if (battleTypes.size > 1) {
|
|
||||||
context.times = advancementData.totalBattleVictoryCount
|
|
||||||
}
|
|
||||||
return context.times >= count && typeCheck
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class BattleCountableContext(times : Int, var battle : PokemonBattle) : CountableContext(times)
|
|
||||||
+1
-1
@@ -34,6 +34,6 @@ class CaughtPokemonCriterionCondition(id: Identifier, predicate: LootContextPred
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: CountablePokemonTypeContext): Boolean {
|
override fun matches(player: ServerPlayerEntity, context: CountablePokemonTypeContext): Boolean {
|
||||||
return super.matches(player, context) && (context.type == type || type == "any")
|
return super.matches(player, context) && context.type == type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
-38
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
class EvolvePokemonCriterionCondition(id: Identifier, entity: LootContextPredicate) : CountableCriterionCondition<EvolvePokemonContext>(id, entity) {
|
|
||||||
var species = "any"
|
|
||||||
var evolution = "any"
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
super.toJson(json)
|
|
||||||
json.addProperty("species", species)
|
|
||||||
json.addProperty("evolution", evolution)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
super.fromJson(json)
|
|
||||||
species = json.get("species")?.asString ?: "any"
|
|
||||||
evolution = json.get("evolution")?.asString ?: "any"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: EvolvePokemonContext): Boolean {
|
|
||||||
return context.times >= count && (context.species == species.asIdentifierDefaultingNamespace() || species == "any") &&
|
|
||||||
(context.evolution == evolution.asIdentifierDefaultingNamespace() || evolution == "any")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class EvolvePokemonContext(val species : Identifier, val evolution : Identifier, times: Int) : CountableContext(times)
|
|
||||||
-41
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
class LevelUpCriterionCondition(id: Identifier, entity: LootContextPredicate) : SimpleCriterionCondition<LevelUpContext>(id, entity) {
|
|
||||||
var level = 0
|
|
||||||
var evolved = true
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
json.addProperty("level", level)
|
|
||||||
json.addProperty("has_evolved", evolved)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
level = json.get("level")?.asInt ?: 0
|
|
||||||
evolved = json.get("has_evolved")?.asBoolean ?: true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: LevelUpContext): Boolean {
|
|
||||||
val preEvo = context.pokemon.preEvolution == null
|
|
||||||
val hasEvolution = !context.pokemon.evolutions.none()
|
|
||||||
var evolutionCheck = true
|
|
||||||
if (preEvo || hasEvolution) {
|
|
||||||
evolutionCheck = !(preEvo == hasEvolution)
|
|
||||||
}
|
|
||||||
return level == context.level && evolutionCheck == evolved
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class LevelUpContext(var level : Int, var pokemon : Pokemon)
|
|
||||||
-54
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore
|
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
|
||||||
import com.cobblemon.mod.common.util.party
|
|
||||||
import com.google.gson.JsonArray
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
class PartyCheckCriterion(id: Identifier, entity: LootContextPredicate) : SimpleCriterionCondition<PartyCheckContext>(id, entity){
|
|
||||||
val party = mutableListOf<Identifier>()
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
json.add("party", JsonArray(party.size).also {
|
|
||||||
party.forEach { pokemon -> it.add(pokemon.toString()) }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
party.clear()
|
|
||||||
json.getAsJsonArray("party").forEach { element ->
|
|
||||||
party.add(element.asString.asIdentifierDefaultingNamespace())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: PartyCheckContext): Boolean {
|
|
||||||
val playerParty = player.party()
|
|
||||||
val matches = mutableListOf<Identifier>()
|
|
||||||
party.forEach {
|
|
||||||
if (it == "any".asIdentifierDefaultingNamespace()) {
|
|
||||||
matches.add(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val partyCount = playerParty.count()
|
|
||||||
if (matches.containsAll(party) && party.size == partyCount && matches.size == partyCount) return true
|
|
||||||
playerParty.iterator().forEach {
|
|
||||||
if (party.contains(it.species.resourceIdentifier)) {
|
|
||||||
matches.add(it.species.resourceIdentifier)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return matches.containsAll(party) && matches.size == partyCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class PartyCheckContext(val party : PlayerPartyStore)
|
|
||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.block.TumblestoneBlock
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import net.minecraft.util.math.BlockPos
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A criterion condition for when a tumblestone block is planted
|
|
||||||
* @param id The identifier of the criterion
|
|
||||||
* @param predicate The predicate for the criterion
|
|
||||||
*
|
|
||||||
* @author Aethen
|
|
||||||
* @since 02/28/2024
|
|
||||||
*/
|
|
||||||
class PlantTumblestoneCriterionCondition(id: Identifier, predicate: LootContextPredicate) :
|
|
||||||
SimpleCriterionCondition<PlantTumblestoneContext>(id, predicate) {
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
// Add properties to json if needed. None needed for this criterion
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
// Parse properties from json if needed. None needed for this criterion
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the tumblestone block can grow at the given position
|
|
||||||
* @param player The player that planted the tumblestone block
|
|
||||||
* @param context The context of the criterion
|
|
||||||
* @return True if the tumblestone block can grow at the given position, false otherwise
|
|
||||||
*/
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: PlantTumblestoneContext): Boolean {
|
|
||||||
return context.tumbleStoneBlock.canGrow(context.pos, player.world)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The context of the [PlantTumblestoneCriterionCondition]
|
|
||||||
* @param pos The position of the tumblestone block
|
|
||||||
* @param tumbleStoneBlock The tumblestone block
|
|
||||||
*/
|
|
||||||
open class PlantTumblestoneContext(var pos: BlockPos, var tumbleStoneBlock: TumblestoneBlock)
|
|
||||||
-34
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
open class PokemonInteractContext(var type: Identifier, var item : Identifier)
|
|
||||||
class PokemonInteractCriterion(id: Identifier, entity: LootContextPredicate) : SimpleCriterionCondition<PokemonInteractContext>(id, entity) {
|
|
||||||
var type = "any"
|
|
||||||
var item = "any"
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
json.addProperty("type", type)
|
|
||||||
json.addProperty("item", item)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
type = json.get("type")?.asString ?: "any"
|
|
||||||
item = json.get("item")?.asString ?: "any"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: PokemonInteractContext): Boolean {
|
|
||||||
return (context.type == type.asIdentifierDefaultingNamespace() || type == "any") && (context.item == item.asIdentifierDefaultingNamespace() || item == "any")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-47
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.advancement.criterion
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import net.minecraft.predicate.entity.LootContextPredicate
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
class TradePokemonCriterionCondition(id: Identifier, entity: LootContextPredicate) : SimpleCriterionCondition<TradePokemonContext>(id, entity) {
|
|
||||||
var traded = "any"
|
|
||||||
var received = "any"
|
|
||||||
var tradedHeldItem = "any"
|
|
||||||
var receivedHeldItem = "any"
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
json.addProperty("traded", traded)
|
|
||||||
json.addProperty("received", received)
|
|
||||||
json.addProperty("traded_held_item", tradedHeldItem)
|
|
||||||
json.addProperty("received_held_item", receivedHeldItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
traded = json.get("traded")?.asString ?: "any"
|
|
||||||
received = json.get("received")?.asString ?: "any"
|
|
||||||
tradedHeldItem = json.get("traded_held_item")?.asString ?: "minecraft:air"
|
|
||||||
receivedHeldItem = json.get("received_held_item")?.asString ?: "minecraft:air"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayerEntity, context: TradePokemonContext): Boolean {
|
|
||||||
val heldItem1 = context.traded.heldItem().item.registryEntry.registryKey().value
|
|
||||||
val heldItem2 = context.received.heldItem().item.registryEntry.registryKey().value
|
|
||||||
return (context.traded.species.resourceIdentifier == traded.asIdentifierDefaultingNamespace() || traded == "any") &&
|
|
||||||
(context.received.species.resourceIdentifier == received.asIdentifierDefaultingNamespace() || received == "any") &&
|
|
||||||
(heldItem1 == tradedHeldItem.asIdentifierDefaultingNamespace() || heldItem1 == "minecraft:air".asIdentifierDefaultingNamespace()) &&
|
|
||||||
(heldItem2 == receivedHeldItem.asIdentifierDefaultingNamespace() || heldItem2 == "minecraft:air".asIdentifierDefaultingNamespace())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class TradePokemonContext(val traded: Pokemon, val received: Pokemon)
|
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
package com.cobblemon.mod.common.api.abilities
|
package com.cobblemon.mod.common.api.abilities
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.Priority
|
import com.cobblemon.mod.common.api.Priority
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.util.DataKeys
|
import com.cobblemon.mod.common.util.DataKeys
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import net.minecraft.nbt.NbtCompound
|
import net.minecraft.nbt.NbtCompound
|
||||||
@@ -22,7 +21,7 @@ import net.minecraft.nbt.NbtCompound
|
|||||||
* @author Qu
|
* @author Qu
|
||||||
* @since January 9th, 2022
|
* @since January 9th, 2022
|
||||||
*/
|
*/
|
||||||
open class Ability internal constructor(var template: AbilityTemplate, forced: Boolean) {
|
open class Ability internal constructor(var template: AbilityTemplate, var forced: Boolean) {
|
||||||
|
|
||||||
val name: String
|
val name: String
|
||||||
get() = template.name
|
get() = template.name
|
||||||
@@ -35,26 +34,16 @@ open class Ability internal constructor(var template: AbilityTemplate, forced: B
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This represents the last known index of this backing ability in the species data.
|
* This represents the last known index of this backing ability in the species data.
|
||||||
* @see [Pokemon.updateAbility].
|
* If -1 the ability will attempt to find the correct index or reroll itself, this is done in order to be compatible with existing data
|
||||||
*/
|
* The value can be mutated however this is not recommended by API users.
|
||||||
var forced: Boolean = forced
|
|
||||||
internal set
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This represents the last known index of this backing ability in the species data.
|
|
||||||
*
|
|
||||||
* @see [Pokemon.updateAbility].
|
|
||||||
*/
|
*/
|
||||||
var index: Int = -1
|
var index: Int = -1
|
||||||
internal set
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The last known priority of this ability in the species data.
|
* The last known priority of this ability in the species data.
|
||||||
*
|
* The value can be mutated however this is not recommended by API users.
|
||||||
* @see [Pokemon.updateAbility].
|
|
||||||
*/
|
*/
|
||||||
var priority = Priority.LOWEST
|
var priority = Priority.LOWEST
|
||||||
internal set
|
|
||||||
|
|
||||||
open fun saveToNBT(nbt: NbtCompound): NbtCompound {
|
open fun saveToNBT(nbt: NbtCompound): NbtCompound {
|
||||||
nbt.putString(DataKeys.POKEMON_ABILITY_NAME, name)
|
nbt.putString(DataKeys.POKEMON_ABILITY_NAME, name)
|
||||||
@@ -73,23 +62,19 @@ open class Ability internal constructor(var template: AbilityTemplate, forced: B
|
|||||||
}
|
}
|
||||||
|
|
||||||
open fun loadFromNBT(nbt: NbtCompound): Ability {
|
open fun loadFromNBT(nbt: NbtCompound): Ability {
|
||||||
this.template = Abilities.getOrException(nbt.getString(DataKeys.POKEMON_ABILITY_NAME))
|
forced = nbt.getBoolean(DataKeys.POKEMON_ABILITY_FORCED)
|
||||||
this.forced = nbt.getBoolean(DataKeys.POKEMON_ABILITY_FORCED)
|
|
||||||
if (nbt.contains(DataKeys.POKEMON_ABILITY_INDEX) && nbt.contains(DataKeys.POKEMON_ABILITY_PRIORITY)) {
|
if (nbt.contains(DataKeys.POKEMON_ABILITY_INDEX) && nbt.contains(DataKeys.POKEMON_ABILITY_PRIORITY)) {
|
||||||
this.index = nbt.getInt(DataKeys.POKEMON_ABILITY_INDEX)
|
this.index = nbt.getInt(DataKeys.POKEMON_ABILITY_INDEX)
|
||||||
this.priority = Priority.valueOf(nbt.getString(DataKeys.POKEMON_ABILITY_PRIORITY))
|
this.priority = Priority.valueOf(nbt.getString(DataKeys.POKEMON_ABILITY_PRIORITY))
|
||||||
}
|
}
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun loadFromJSON(json: JsonObject): Ability {
|
open fun loadFromJSON(json: JsonObject): Ability {
|
||||||
this.template = Abilities.getOrException(json.get(DataKeys.POKEMON_ABILITY_NAME).asString)
|
forced = json.get(DataKeys.POKEMON_ABILITY_FORCED)?.asBoolean ?: false
|
||||||
this.forced = json.get(DataKeys.POKEMON_ABILITY_FORCED)?.asBoolean ?: false
|
|
||||||
if (json.has(DataKeys.POKEMON_ABILITY_INDEX) && json.has(DataKeys.POKEMON_ABILITY_PRIORITY)) {
|
if (json.has(DataKeys.POKEMON_ABILITY_INDEX) && json.has(DataKeys.POKEMON_ABILITY_PRIORITY)) {
|
||||||
this.index = json.get(DataKeys.POKEMON_ABILITY_INDEX).asInt
|
this.index = json.get(DataKeys.POKEMON_ABILITY_INDEX).asInt
|
||||||
this.priority = Priority.valueOf(json.get(DataKeys.POKEMON_ABILITY_PRIORITY).asString)
|
this.priority = Priority.valueOf(json.get(DataKeys.POKEMON_ABILITY_PRIORITY).asString)
|
||||||
}
|
}
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,6 +28,7 @@ class AbilityTemplate(
|
|||||||
*/
|
*/
|
||||||
fun create(forced: Boolean = false) = builder(this, forced)
|
fun create(forced: Boolean = false) = builder(this, forced)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Ability and loads the given NBT Tag into it.
|
* Returns the Ability and loads the given NBT Tag into it.
|
||||||
*
|
*
|
||||||
@@ -41,5 +42,4 @@ class AbilityTemplate(
|
|||||||
* Ability extensions need to write and read their needed data from here.
|
* Ability extensions need to write and read their needed data from here.
|
||||||
*/
|
*/
|
||||||
fun create(json: JsonObject) = create().loadFromJSON(json)
|
fun create(json: JsonObject) = create().loadFromJSON(json)
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -35,7 +35,7 @@ interface SleepDepth {
|
|||||||
|
|
||||||
override fun shouldWake(pokemonEntity: PokemonEntity): Boolean {
|
override fun shouldWake(pokemonEntity: PokemonEntity): Boolean {
|
||||||
val nearbyPlayers = pokemonEntity.world.getPlayers(TargetPredicate.createNonAttackable(), pokemonEntity, Box.of(pokemonEntity.pos, 16.0, 16.0, 16.0))
|
val nearbyPlayers = pokemonEntity.world.getPlayers(TargetPredicate.createNonAttackable(), pokemonEntity, Box.of(pokemonEntity.pos, 16.0, 16.0, 16.0))
|
||||||
return nearbyPlayers.any { !it.isSneaking }
|
return nearbyPlayers.none { !it.isSneaking }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+21
-31
@@ -10,8 +10,6 @@ package com.cobblemon.mod.common.api.battles.interpreter
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
|
||||||
import com.cobblemon.mod.common.api.moves.Moves
|
|
||||||
import com.cobblemon.mod.common.battles.ActiveBattlePokemon
|
import com.cobblemon.mod.common.battles.ActiveBattlePokemon
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
@@ -135,31 +133,28 @@ class BattleMessage(rawMessage: String) {
|
|||||||
return this.actorAndActivePokemon(pnx, battle)
|
return this.actorAndActivePokemon(pnx, battle)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Queries an argument at the given [index] for a 'pnx' and uuid that will be parsed into a [BattlePokemon].
|
Example:
|
||||||
*
|
|-curestatus|p1: a8e5710e-6835-4387-99d3-331b45f848e6|slp|[msg]
|
||||||
* @param index The index of the argument referencing the [BattlePokemon].
|
|-curestatus|p1: 0686b20d-3019-4167-92e2-786834245743|slp|[msg]
|
||||||
* @param battle The [PokemonBattle] being queried.
|
// Function used to grab BattlePokemon (As we need to be able to grab non active pokemon to cure their status)
|
||||||
* @return The [BattlePokemon] if the argument exists and is successfully parsed; otherwise null.
|
// by using playerNumber(actorID) and pokemon uuid(pokemonID)
|
||||||
*/
|
*/
|
||||||
fun battlePokemon(index: Int, battle: PokemonBattle): BattlePokemon? {
|
fun getBattlePokemon(index: Int, battle: PokemonBattle): BattlePokemon? {
|
||||||
val (actorID, pokemonID) = this.pnxAndUuid(index) ?: return null
|
val actorAndPokemonID = this.argumentAt(index)?.takeIf { it.length >= 2 }?.split(": ") ?: return null
|
||||||
return this.battlePokemon(actorID, pokemonID, battle)
|
if (actorAndPokemonID.count() < 2) return null
|
||||||
|
val actorID = actorAndPokemonID[0]
|
||||||
|
val pokemonID = actorAndPokemonID[1]
|
||||||
|
return this.getBattlePokemon(actorID, pokemonID, battle)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
fun getSourceBattlePokemon(battle: PokemonBattle): BattlePokemon? {
|
||||||
* Queries an optional argument identified by [optionalArg] for a 'pnx' and uuid that will be parsed into a [BattlePokemon].
|
val sourcePokemonArgument = this.optionalArguments.get("of") ?: return null
|
||||||
*
|
val actorAndPokemonID = sourcePokemonArgument.takeIf { it.length >= 2 }?.split(": ") ?: return null
|
||||||
* @param optionalArg The id of the optional argument referencing the [BattlePokemon].
|
if (actorAndPokemonID.count() < 2) return null
|
||||||
* @param battle The [PokemonBattle] being queried.
|
val actorID = actorAndPokemonID[0]
|
||||||
* @return The [BattlePokemon] if the argument exists and is successfully parsed; otherwise null.
|
val pokemonID = actorAndPokemonID[1]
|
||||||
*/
|
return this.getBattlePokemon(actorID, pokemonID, battle)
|
||||||
fun battlePokemonFromOptional(battle: PokemonBattle, optionalArg: String = "of"): BattlePokemon? {
|
|
||||||
val optional = this.optionalArguments.get(optionalArg) ?: return null
|
|
||||||
val pokemonID = optional.takeIf { it.length >= 2 }?.split(":")?.takeIf { it.size == 2 } ?: return null
|
|
||||||
val pnx = pokemonID[0].takeIf { it.matches(PNX_MATCHER) || it.matches(PN_MATCHER) } ?: return null
|
|
||||||
val uuid = pokemonID[1].trim()
|
|
||||||
return this.battlePokemon(pnx, uuid, battle)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -170,7 +165,7 @@ class BattleMessage(rawMessage: String) {
|
|||||||
*/
|
*/
|
||||||
fun pnxAndUuid(index: Int): Pair<String, String>? {
|
fun pnxAndUuid(index: Int): Pair<String, String>? {
|
||||||
val argument = this.argumentAt(index)?.takeIf { it.length >= 2 }?.split(":")?.takeIf { it.size == 2 } ?: return null
|
val argument = this.argumentAt(index)?.takeIf { it.length >= 2 }?.split(":")?.takeIf { it.size == 2 } ?: return null
|
||||||
val pnx = argument[0].takeIf { it.matches(PNX_MATCHER) || it.matches(PN_MATCHER) } ?: return null
|
val pnx = argument[0].takeIf { it.matches(PNX_MATCHER) } ?: return null
|
||||||
val uuid = argument[1].trim()
|
val uuid = argument[1].trim()
|
||||||
return pnx to uuid
|
return pnx to uuid
|
||||||
}
|
}
|
||||||
@@ -199,11 +194,6 @@ class BattleMessage(rawMessage: String) {
|
|||||||
return Effect.parse(data)
|
return Effect.parse(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun moveAt(index: Int): MoveTemplate? {
|
|
||||||
val argument = argumentAt(index)?.lowercase()?.replace("[^a-z0-9]".toRegex(), "") ?: return null
|
|
||||||
return Moves.getByName(argument)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries an optional argument with given [argumentName] for a 'pnx' that will be parsed into a [BattleActor] and [ActiveBattlePokemon].
|
* Queries an optional argument with given [argumentName] for a 'pnx' that will be parsed into a [BattleActor] and [ActiveBattlePokemon].
|
||||||
*
|
*
|
||||||
@@ -237,7 +227,7 @@ class BattleMessage(rawMessage: String) {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun battlePokemon(pnx: String, pokemonID: String, battle: PokemonBattle): BattlePokemon? = try {
|
private fun getBattlePokemon(pnx: String, pokemonID: String, battle: PokemonBattle): BattlePokemon? = try {
|
||||||
battle.getBattlePokemon(pnx, pokemonID)
|
battle.getBattlePokemon(pnx, pokemonID)
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
null
|
null
|
||||||
|
|||||||
+26
-74
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.battles.model
|
package com.cobblemon.mod.common.api.battles.model
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
import com.cobblemon.mod.common.Cobblemon.LOGGER
|
import com.cobblemon.mod.common.Cobblemon.LOGGER
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork
|
import com.cobblemon.mod.common.CobblemonNetwork
|
||||||
@@ -36,21 +34,22 @@ import com.cobblemon.mod.common.battles.dispatch.GO
|
|||||||
import com.cobblemon.mod.common.battles.dispatch.WaitDispatch
|
import com.cobblemon.mod.common.battles.dispatch.WaitDispatch
|
||||||
import com.cobblemon.mod.common.battles.interpreter.ContextManager
|
import com.cobblemon.mod.common.battles.interpreter.ContextManager
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
import com.cobblemon.mod.common.battles.runner.ShowdownService
|
|
||||||
import com.cobblemon.mod.common.battles.ForfeitActionResponse
|
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import com.cobblemon.mod.common.battles.runner.ShowdownService
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMusicPacket
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.progress.DefeatEvolutionProgress
|
import com.cobblemon.mod.common.pokemon.evolution.progress.DefeatEvolutionProgress
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHitsEvolutionProgress
|
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.requirements.DefeatRequirement
|
|
||||||
import com.cobblemon.mod.common.util.battleLang
|
import com.cobblemon.mod.common.util.battleLang
|
||||||
import com.cobblemon.mod.common.util.getPlayer
|
import com.cobblemon.mod.common.util.getPlayer
|
||||||
import java.io.File
|
import net.minecraft.entity.Entity
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
import java.util.concurrent.ConcurrentLinkedQueue
|
||||||
import net.minecraft.text.Text
|
import net.minecraft.text.Text
|
||||||
import java.util.concurrent.ConcurrentLinkedDeque
|
import java.io.File
|
||||||
|
import kotlin.io.path.Path
|
||||||
|
import kotlin.io.path.writeLines
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Individual battle instance
|
* Individual battle instance
|
||||||
@@ -58,24 +57,20 @@ import java.util.concurrent.ConcurrentLinkedDeque
|
|||||||
* @since January 16th, 2022
|
* @since January 16th, 2022
|
||||||
* @author Deltric, Hiroku
|
* @author Deltric, Hiroku
|
||||||
*/
|
*/
|
||||||
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
|
||||||
open class PokemonBattle(
|
open class PokemonBattle(
|
||||||
val format: BattleFormat,
|
val format: BattleFormat,
|
||||||
val side1: BattleSide,
|
val side1: BattleSide,
|
||||||
val side2: BattleSide
|
val side2: BattleSide
|
||||||
) {
|
) {
|
||||||
/** Whether logging will be silenced for this battle. */
|
/** Whether or not logging will be silenced for this battle. */
|
||||||
var mute = true
|
var mute = true
|
||||||
|
|
||||||
init {
|
init {
|
||||||
side1.battle = this
|
side1.battle = this
|
||||||
side2.battle = this
|
side2.battle = this
|
||||||
this.actors.forEach { actor ->
|
this.actors.forEach { actor ->
|
||||||
actor.battle = this
|
|
||||||
actor.pokemonList.forEach { battlePokemon ->
|
actor.pokemonList.forEach { battlePokemon ->
|
||||||
battlePokemon.effectedPokemon.evolutionProxy.current().progress()
|
battlePokemon.criticalHits = 0
|
||||||
.filterIsInstance<LastBattleCriticalHitsEvolutionProgress>()
|
|
||||||
.forEach { it.reset() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,13 +84,12 @@ open class PokemonBattle(
|
|||||||
val playerUUIDs: Iterable<UUID>
|
val playerUUIDs: Iterable<UUID>
|
||||||
get() = actors.flatMap { it.getPlayerUUIDs() }
|
get() = actors.flatMap { it.getPlayerUUIDs() }
|
||||||
val players = playerUUIDs.mapNotNull { it.getPlayer() }
|
val players = playerUUIDs.mapNotNull { it.getPlayer() }
|
||||||
val spectators = mutableSetOf<UUID>()
|
val spectators = mutableListOf<UUID>()
|
||||||
|
|
||||||
val battleId = UUID.randomUUID()
|
val battleId = UUID.randomUUID()
|
||||||
|
|
||||||
val showdownMessages = mutableListOf<String>()
|
val showdownMessages = mutableListOf<String>()
|
||||||
val battleLog = mutableListOf<String>()
|
val battleLog = mutableListOf<String>()
|
||||||
val chatLog = mutableListOf<Text>()
|
|
||||||
var started = false
|
var started = false
|
||||||
var ended = false
|
var ended = false
|
||||||
// TEMP battle showcase stuff
|
// TEMP battle showcase stuff
|
||||||
@@ -103,14 +97,9 @@ open class PokemonBattle(
|
|||||||
var turn: Int = 1
|
var turn: Int = 1
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private var ticks: Int = 0
|
|
||||||
set(value) { field = value.coerceAtMost(Int.MAX_VALUE) } // go outside
|
|
||||||
|
|
||||||
/** The current duration of the battle in seconds. */
|
|
||||||
val time: Int get() = ticks % 20
|
|
||||||
|
|
||||||
var dispatchResult = GO
|
var dispatchResult = GO
|
||||||
val dispatches = ConcurrentLinkedDeque<BattleDispatch>()
|
val dispatches = ConcurrentLinkedQueue<BattleDispatch>()
|
||||||
val afterDispatches = mutableListOf<() -> Unit>()
|
val afterDispatches = mutableListOf<() -> Unit>()
|
||||||
|
|
||||||
val captureActions = mutableListOf<BattleCaptureAction>()
|
val captureActions = mutableListOf<BattleCaptureAction>()
|
||||||
@@ -167,7 +156,7 @@ open class PokemonBattle(
|
|||||||
fun getActor(player: ServerPlayerEntity) = actors.firstOrNull { it.isForPlayer(player) }
|
fun getActor(player: ServerPlayerEntity) = actors.firstOrNull { it.isForPlayer(player) }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a [BattleActor] and an [ActiveBattlePokemon] from a pnx key, e.g. p2a
|
* Gets a BattleActor and an [ActiveBattlePokemon] from a pnx key, e.g. p2a
|
||||||
*
|
*
|
||||||
* Returns null if either the pn or x is invalid.
|
* Returns null if either the pn or x is invalid.
|
||||||
*/
|
*/
|
||||||
@@ -180,11 +169,6 @@ open class PokemonBattle(
|
|||||||
return actor to pokemon
|
return actor to pokemon
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a [BattlePokemon] from a pnx key and uuid.
|
|
||||||
*
|
|
||||||
* Returns null if the pnx key is invalid or the uuid does not exist.
|
|
||||||
*/
|
|
||||||
fun getBattlePokemon(pnx: String, pokemonID: String): BattlePokemon {
|
fun getBattlePokemon(pnx: String, pokemonID: String): BattlePokemon {
|
||||||
val actor = actors.find { it.showdownId == pnx.substring(0, 2) }
|
val actor = actors.find { it.showdownId == pnx.substring(0, 2) }
|
||||||
?: throw IllegalStateException("Invalid pnx: $pnx - unknown actor")
|
?: throw IllegalStateException("Invalid pnx: $pnx - unknown actor")
|
||||||
@@ -193,8 +177,11 @@ open class PokemonBattle(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun broadcastChatMessage(component: Text) {
|
fun broadcastChatMessage(component: Text) {
|
||||||
chatLog.add(component)
|
spectators.forEach { spectatorId ->
|
||||||
sendSpectatorUpdate(BattleMessagePacket(component))
|
spectatorId.getPlayer()?.let {
|
||||||
|
CobblemonNetwork.sendPacketToPlayer(it, BattleMessagePacket(component))
|
||||||
|
}
|
||||||
|
}
|
||||||
return actors.forEach { it.sendMessage(component) }
|
return actors.forEach { it.sendMessage(component) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,16 +211,11 @@ open class PokemonBattle(
|
|||||||
faintedPokemons.forEach { faintedPokemon ->
|
faintedPokemons.forEach { faintedPokemon ->
|
||||||
for (opponentPokemon in opponentNonFaintedPokemons) {
|
for (opponentPokemon in opponentNonFaintedPokemons) {
|
||||||
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
|
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
|
||||||
|
val defeatProgress = DefeatEvolutionProgress()
|
||||||
val pokemon = opponentPokemon.effectedPokemon
|
val pokemon = opponentPokemon.effectedPokemon
|
||||||
if (facedFainted) {
|
if (facedFainted && defeatProgress.shouldKeep(pokemon)) {
|
||||||
pokemon.evolutions.forEach { evolution ->
|
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is DefeatEvolutionProgress && it.currentProgress().target.matches(faintedPokemon.effectedPokemon) }) { defeatProgress }
|
||||||
evolution.requirements.filterIsInstance<DefeatRequirement>().forEach { defeatRequirement ->
|
progress.updateProgress(DefeatEvolutionProgress.Progress(progress.currentProgress().target, progress.currentProgress().amount + 1))
|
||||||
if (defeatRequirement.target.matches(faintedPokemon.effectedPokemon)) {
|
|
||||||
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is DefeatEvolutionProgress && it.currentProgress().target == defeatRequirement.target }) { DefeatEvolutionProgress() }
|
|
||||||
progress.updateProgress(DefeatEvolutionProgress.Progress(defeatRequirement.target, progress.currentProgress().amount + 1))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
val multiplier = when {
|
val multiplier = when {
|
||||||
// ToDo when Exp. All is implement if enabled && !facedFainted return 2.0, probably should be a configurable value too, this will have priority over the Exp. Share
|
// ToDo when Exp. All is implement if enabled && !facedFainted return 2.0, probably should be a configurable value too, this will have priority over the Exp. Share
|
||||||
@@ -265,6 +247,7 @@ open class PokemonBattle(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sendUpdate(BattleEndPacket())
|
sendUpdate(BattleEndPacket())
|
||||||
|
sendUpdate(BattleMusicPacket(null))
|
||||||
BattleRegistry.closeBattle(this)
|
BattleRegistry.closeBattle(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,12 +314,6 @@ open class PokemonBattle(
|
|||||||
|
|
||||||
fun dispatch(dispatcher: () -> DispatchResult) {
|
fun dispatch(dispatcher: () -> DispatchResult) {
|
||||||
dispatches.add(BattleDispatch { dispatcher() })
|
dispatches.add(BattleDispatch { dispatcher() })
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fun dispatchToFront(dispatcher: () -> DispatchResult) {
|
|
||||||
dispatches.addFirst(BattleDispatch { dispatcher() })
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun dispatchGo(dispatcher: () -> Unit) {
|
fun dispatchGo(dispatcher: () -> Unit) {
|
||||||
@@ -368,10 +345,6 @@ open class PokemonBattle(
|
|||||||
dispatches.add(dispatcher)
|
dispatches.add(dispatcher)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun dispatchToFront(dispatcher: BattleDispatch) {
|
|
||||||
dispatches.addFirst(dispatcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun doWhenClear(action: () -> Unit) {
|
fun doWhenClear(action: () -> Unit) {
|
||||||
afterDispatches.add(action)
|
afterDispatches.add(action)
|
||||||
}
|
}
|
||||||
@@ -396,9 +369,8 @@ open class PokemonBattle(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (started) {
|
if (started && isPvW && !ended && dispatches.isEmpty()) {
|
||||||
ticks++
|
checkFlee()
|
||||||
if (isPvW && !ended && dispatches.isEmpty()) checkFlee()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,24 +412,13 @@ open class PokemonBattle(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun checkForInputDispatch() {
|
fun checkForInputDispatch() {
|
||||||
if (checkForfeit()) return // ignore actors that are still choosing, their choices don't matter anymore
|
val readyToInput = actors.any { !it.mustChoose && it.responses.isNotEmpty() } && actors.none { it.mustChoose }
|
||||||
val readyToInput = (actors.any { !it.mustChoose && it.responses.isNotEmpty() } && actors.none { it.mustChoose })
|
|
||||||
if (readyToInput && captureActions.isEmpty()) {
|
if (readyToInput && captureActions.isEmpty()) {
|
||||||
actors.filter { it.responses.isNotEmpty() }.forEach { it.writeShowdownResponse() }
|
actors.filter { it.responses.isNotEmpty() }.forEach { it.writeShowdownResponse() }
|
||||||
actors.forEach { it.responses.clear() ; it.request = null }
|
actors.forEach { it.responses.clear() ; it.request = null }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Forces Showdown to end the battle when a [BattleActor] chooses to forfeit. */
|
|
||||||
private fun checkForfeit(): Boolean {
|
|
||||||
val forfeit = actors.find { it.responses.any { it is ForfeitActionResponse } }
|
|
||||||
return forfeit?.let {
|
|
||||||
this.dispatchWaiting { this.broadcastChatMessage(battleLang("forfeit", it.getName()).red()) }
|
|
||||||
writeShowdownAction(">forcelose ${it.showdownId}")
|
|
||||||
true
|
|
||||||
} ?: false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a [Text] representation of an error to interpret a battle message.
|
* Creates a [Text] representation of an error to interpret a battle message.
|
||||||
* This also logs the error, the goal of this function is to make sure users see missing interpretations and report them to us.
|
* This also logs the error, the goal of this function is to make sure users see missing interpretations and report them to us.
|
||||||
@@ -488,13 +449,4 @@ open class PokemonBattle(
|
|||||||
LOGGER.error("Missing interpretation on '{}' action: \nPublic » {}\nPrivate » {}", publicMessage.id, publicMessage.rawMessage, privateMessage.rawMessage)
|
LOGGER.error("Missing interpretation on '{}' action: \nPublic » {}\nPrivate » {}", publicMessage.id, publicMessage.rawMessage, privateMessage.rawMessage)
|
||||||
return Text.literal("Missing interpretation on '${publicMessage.id}' action please report to the developers").red()
|
return Text.literal("Missing interpretation on '${publicMessage.id}' action please report to the developers").red()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addQueryFunctions(queryStruct: QueryStruct): QueryStruct {
|
|
||||||
queryStruct.addFunction("pvp") { DoubleValue(isPvP) }
|
|
||||||
queryStruct.addFunction("pvn") { DoubleValue(isPvN) }
|
|
||||||
queryStruct.addFunction("pvw") { DoubleValue(isPvW) }
|
|
||||||
queryStruct.addFunction("has_rule") { params -> DoubleValue(params.getString(0) in format.ruleSet) }
|
|
||||||
|
|
||||||
return queryStruct
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+7
-14
@@ -26,20 +26,13 @@ abstract class AIBattleActor(
|
|||||||
super.sendUpdate(packet)
|
super.sendUpdate(packet)
|
||||||
|
|
||||||
if (packet is BattleMakeChoicePacket) {
|
if (packet is BattleMakeChoicePacket) {
|
||||||
this.onChoiceRequested()
|
try {
|
||||||
}
|
setActionResponses(request!!.iterate(this.activePokemon, battleAI::choose))
|
||||||
}
|
} catch (exception: IllegalActionChoiceException) {
|
||||||
|
LOGGER.error("AI was unable to choose a move, we're going to need to pass!")
|
||||||
/**
|
exception.printStackTrace()
|
||||||
* Called when the AI is requested to make a choice.
|
setActionResponses(request!!.iterate(this.activePokemon) { _, _, _ -> PassActionResponse })
|
||||||
*/
|
}
|
||||||
open fun onChoiceRequested() {
|
|
||||||
try {
|
|
||||||
setActionResponses(request!!.iterate(this.activePokemon, battleAI::choose))
|
|
||||||
} catch (exception: IllegalActionChoiceException) {
|
|
||||||
LOGGER.error("AI was unable to choose a move, we're going to need to pass!")
|
|
||||||
exception.printStackTrace()
|
|
||||||
setActionResponses(request!!.iterate(this.activePokemon) { _, _, _ -> PassActionResponse })
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
|
||||||
import com.cobblemon.mod.common.api.berry.spawncondition.BerrySpawnCondition
|
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
|
||||||
import com.cobblemon.mod.common.api.mulch.MulchVariant
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.status.Status
|
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.BerryRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.pokemon.adapters.CobblemonStatTypeAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.*
|
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import com.google.gson.GsonBuilder
|
|
||||||
import com.google.gson.reflect.TypeToken
|
|
||||||
import java.awt.Color
|
|
||||||
import net.minecraft.predicate.NumberRange
|
|
||||||
import net.minecraft.registry.RegistryKeys
|
|
||||||
import net.minecraft.registry.tag.TagKey
|
|
||||||
import net.minecraft.resource.ResourceType
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import net.minecraft.util.math.Box
|
|
||||||
import net.minecraft.util.math.Vec3d
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The data registry for [Berry].
|
|
||||||
*
|
|
||||||
* @author Licious
|
|
||||||
* @since November 28th, 2022
|
|
||||||
*/
|
|
||||||
object Berries : JsonDataRegistry<Berry> {
|
|
||||||
|
|
||||||
override val id: Identifier = cobblemonResource("berries")
|
|
||||||
override val type: ResourceType = ResourceType.SERVER_DATA
|
|
||||||
override val observable = SimpleObservable<Berries>()
|
|
||||||
|
|
||||||
override val gson = GsonBuilder()
|
|
||||||
.disableHtmlEscaping()
|
|
||||||
.setPrettyPrinting()
|
|
||||||
.registerTypeAdapter(MulchVariant::class.java, MulchVariantAdapter)
|
|
||||||
.registerTypeAdapter(NumberRange.FloatRange::class.java, FloatNumberRangeAdapter)
|
|
||||||
.registerTypeAdapter(Status::class.java, StatusAdapter)
|
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(Collection::class.java, Box::class.java).type, BoxCollectionAdapter)
|
|
||||||
.registerTypeAdapter(Box::class.java, BoxAdapter)
|
|
||||||
.registerTypeAdapter(Vec3d::class.java, VerboseVec3dAdapter)
|
|
||||||
.registerTypeAdapter(Identifier::class.java, IdentifierAdapter)
|
|
||||||
.registerTypeAdapter(GrowthFactor::class.java, CobblemonGrowthFactorAdapter)
|
|
||||||
.registerTypeAdapter(IntRange::class.java, VerboseIntRangeAdapter)
|
|
||||||
.registerTypeAdapter(Color::class.java, LiteralHexColorAdapter)
|
|
||||||
.registerTypeAdapter(Stat::class.java, CobblemonStatTypeAdapter)
|
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(TagKey::class.java, Biome::class.java).type, TagKeyAdapter(RegistryKeys.BIOME))
|
|
||||||
.registerTypeAdapter(BerrySpawnCondition::class.java, CobblemonBerrySpawnConditionAdapter)
|
|
||||||
.create()
|
|
||||||
override val typeToken: TypeToken<Berry> = TypeToken.get(Berry::class.java)
|
|
||||||
override val resourcePath = "berries"
|
|
||||||
|
|
||||||
private val berries = hashMapOf<Identifier, Berry>()
|
|
||||||
|
|
||||||
override fun reload(data: Map<Identifier, Berry>) {
|
|
||||||
this.berries.clear()
|
|
||||||
data.forEach { (identifier, berry) ->
|
|
||||||
try {
|
|
||||||
berry.identifier = identifier
|
|
||||||
berry.validate()
|
|
||||||
this.berries[identifier] = berry
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Cobblemon.LOGGER.error("Skipped loading the {} berry", identifier, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Cobblemon.LOGGER.info("Loaded {} berries", this.berries.size)
|
|
||||||
this.observable.emit(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun sync(player: ServerPlayerEntity) {
|
|
||||||
BerryRegistrySyncPacket(this.all()).sendToPlayer(player)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun all() = this.berries.values.toList()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a berry if loaded.
|
|
||||||
*
|
|
||||||
* @param identifier The identifier of the berry.
|
|
||||||
* @return The [Berry] if loaded otherwise null.
|
|
||||||
*/
|
|
||||||
fun getByIdentifier(identifier: Identifier): Berry? = this.berries[identifier]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a berry if loaded.
|
|
||||||
*
|
|
||||||
* @param name The path of the identifier of the berry under the [Cobblemon.MODID] namespace.
|
|
||||||
* @return The [Berry] if loaded otherwise null.
|
|
||||||
*/
|
|
||||||
fun getByName(name: String): Berry? = this.getByIdentifier(cobblemonResource(name))
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,347 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonBlocks
|
|
||||||
import com.cobblemon.mod.common.CobblemonItems
|
|
||||||
import com.cobblemon.mod.common.api.berry.spawncondition.BerrySpawnCondition
|
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
|
||||||
import com.cobblemon.mod.common.api.events.berry.BerryYieldCalculationEvent
|
|
||||||
import com.cobblemon.mod.common.api.mulch.MulchVariant
|
|
||||||
import com.cobblemon.mod.common.block.BerryBlock
|
|
||||||
import com.cobblemon.mod.common.block.entity.BerryBlockEntity
|
|
||||||
import com.cobblemon.mod.common.item.BerryItem
|
|
||||||
import com.cobblemon.mod.common.pokemon.Nature
|
|
||||||
import com.cobblemon.mod.common.util.readBox
|
|
||||||
import com.cobblemon.mod.common.util.writeBox
|
|
||||||
import com.google.gson.annotations.SerializedName
|
|
||||||
import java.awt.Color
|
|
||||||
import java.util.EnumSet
|
|
||||||
import kotlin.math.min
|
|
||||||
import net.minecraft.block.Block
|
|
||||||
import net.minecraft.block.BlockState
|
|
||||||
import net.minecraft.client.model.ModelPart
|
|
||||||
import net.minecraft.entity.LivingEntity
|
|
||||||
import net.minecraft.network.PacketByteBuf
|
|
||||||
import net.minecraft.registry.tag.TagKey
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import net.minecraft.util.math.BlockPos
|
|
||||||
import net.minecraft.util.math.Box
|
|
||||||
import net.minecraft.util.math.Vec3d
|
|
||||||
import net.minecraft.util.shape.VoxelShape
|
|
||||||
import net.minecraft.util.shape.VoxelShapes
|
|
||||||
import net.minecraft.world.World
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the data behind a berry.
|
|
||||||
*
|
|
||||||
* @property identifier The [Identifier] of this berry.
|
|
||||||
* @property baseYield The [IntRange] possible for the berry tree before [bonusYield] is calculated.
|
|
||||||
* @property preferredBiomeTags The [TagKey]s of the berries preffered biomes. Determines spawning and yield
|
|
||||||
* @property growthTime The [IntRange] possible in minutes for how long the berry tree takes to grow.
|
|
||||||
* @property refreshRate The [IntRange] possible in minutes for how long the berry tree takes to regrow its berries once it has been harvested.
|
|
||||||
* @depreciated @property lifeCycles The [IntRange] possible for the berry to live for between harvests.
|
|
||||||
* @property favoriteMulches The types of mulches that benefit this berries yield
|
|
||||||
* @property growthFactors An array of [GrowthFactor]s that will affect this berry. The client is not aware of these.
|
|
||||||
* @property mutations A map of the partner berry as the key and the value as the resulting mutation with this berry.
|
|
||||||
* @property growthPoints A collection of [GrowthPoint]s for the berry flowers and fruit.
|
|
||||||
* @property sproutShapeBoxes A collection of [Box]es that make up the tree [VoxelShape] during the sprouting stages.
|
|
||||||
* @property matureShapeBoxes A collection of [Box]es that make up the tree [VoxelShape] during the mature stages.
|
|
||||||
* @property flavors The [Flavor] values.
|
|
||||||
* @property tintIndexes Determines tints at specific indexes if any.
|
|
||||||
* @property flowerModelIdentifier The [Identifier] for the model of the berry in flower form.
|
|
||||||
* @property flowerTexture The [Identifier] for the texture of the berry in flower form. This is resolved into a [ModelPart] on the client.
|
|
||||||
* @property fruitModelIdentifier The [Identifier] for the model of the berry in flower form. This is resolved into a [ModelPart] on the client.
|
|
||||||
* @property fruitTexture The [Identifier] for the texture of the berry in flower form.
|
|
||||||
*
|
|
||||||
* @throws IllegalArgumentException if the any yield range argument is not a positive range.
|
|
||||||
*/
|
|
||||||
class Berry(
|
|
||||||
identifier: Identifier,
|
|
||||||
val baseYield: IntRange,
|
|
||||||
val preferredBiomeTags: List<TagKey<Biome>>,
|
|
||||||
val growthTime: IntRange,
|
|
||||||
val refreshRate: IntRange,
|
|
||||||
//val lifeCycles: IntRange,
|
|
||||||
val favoriteMulches: EnumSet<MulchVariant>,
|
|
||||||
val growthFactors: Collection<GrowthFactor>,
|
|
||||||
val spawnConditions: List<BerrySpawnCondition>,
|
|
||||||
var growthPoints: Array<GrowthPoint>,
|
|
||||||
val randomizedGrowthPoints: Boolean = true,
|
|
||||||
val mutations: Map<Identifier, Identifier>,
|
|
||||||
@SerializedName("sproutShape")
|
|
||||||
private val sproutShapeBoxes: Collection<Box>,
|
|
||||||
@SerializedName("matureShape")
|
|
||||||
private val matureShapeBoxes: Collection<Box>,
|
|
||||||
private val flavors: Map<Flavor, Int>,
|
|
||||||
val tintIndexes: Map<Int, Color>,
|
|
||||||
@SerializedName("flowerModel")
|
|
||||||
val flowerModelIdentifier: Identifier,
|
|
||||||
val flowerTexture: Identifier,
|
|
||||||
@SerializedName("fruitModel")
|
|
||||||
val fruitModelIdentifier: Identifier,
|
|
||||||
val fruitTexture: Identifier,
|
|
||||||
val weight: Float
|
|
||||||
) {
|
|
||||||
|
|
||||||
@Transient
|
|
||||||
var identifier: Identifier = identifier
|
|
||||||
internal set
|
|
||||||
|
|
||||||
@Transient
|
|
||||||
private lateinit var shapedFlower: HashMap<Int, VoxelShape>
|
|
||||||
|
|
||||||
@Transient
|
|
||||||
private lateinit var shapedFruit: HashMap<Int, VoxelShape>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The [VoxelShape] of the tree during the sprouting stages.
|
|
||||||
*/
|
|
||||||
@Transient
|
|
||||||
lateinit var sproutShape: VoxelShape
|
|
||||||
private set
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The [VoxelShape] of the tree during the mature stages.
|
|
||||||
*/
|
|
||||||
@Transient
|
|
||||||
lateinit var matureShape: VoxelShape
|
|
||||||
private set
|
|
||||||
|
|
||||||
init {
|
|
||||||
this.validate()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the [BerryItem] that uses this berry for data.
|
|
||||||
*
|
|
||||||
* @return The [BerryItem] if existing.
|
|
||||||
*/
|
|
||||||
fun item(): BerryItem? = CobblemonItems.berries()[this.identifier]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the [BerryBlock] that uses this berry for data.
|
|
||||||
*
|
|
||||||
* @return The [BerryBlock] if existing.
|
|
||||||
*/
|
|
||||||
fun block(): BerryBlock? = CobblemonBlocks.berries()[this.identifier]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query the value of a certain flavor.
|
|
||||||
*
|
|
||||||
* @param flavor The [Flavor] being queried.
|
|
||||||
* @return The value if any or 0.
|
|
||||||
*/
|
|
||||||
fun flavor(flavor: Flavor): Int = this.flavors[flavor] ?: 0
|
|
||||||
|
|
||||||
fun dislikedBy(nature: Nature): Boolean {
|
|
||||||
val dislikedFlavor = nature.dislikedFlavor ?: return false
|
|
||||||
return flavor(dislikedFlavor) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the yield for a berry tree being planted or replanted after a life cycle.
|
|
||||||
* Triggers [BerryYieldCalculationEvent].
|
|
||||||
*
|
|
||||||
* @param world The [World] the tree is present in.
|
|
||||||
* @param state The [BlockState] of the tree.
|
|
||||||
* @param pos The [BlockPos] of the tree.
|
|
||||||
* @param placer The [LivingEntity] tending to the tree, if any.
|
|
||||||
* @return The total berry stack count.
|
|
||||||
*/
|
|
||||||
fun calculateYield(world: World, state: BlockState, pos: BlockPos, placer: LivingEntity? = null): Int {
|
|
||||||
val base = this.baseYield.random()
|
|
||||||
val bonus = this.bonusYield(world, state, pos)
|
|
||||||
var yield = base + bonus.first
|
|
||||||
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
|
|
||||||
if (BerryBlock.getMulch(state) == MulchVariant.RICH) {
|
|
||||||
yield = min(yield + 1, maxYield())
|
|
||||||
treeEntity.decrementMulchDuration(world, pos, state)
|
|
||||||
}
|
|
||||||
val event = BerryYieldCalculationEvent(this, world, state, pos, placer, yield, bonus.second)
|
|
||||||
CobblemonEvents.BERRY_YIELD.post(event) { yield = it.yield }
|
|
||||||
return yield
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates and returns the minimum possible yield by summing [baseYield] and [growthFactors] minimum values.
|
|
||||||
*
|
|
||||||
* @return The minimum possible yield.
|
|
||||||
*/
|
|
||||||
fun minYield() = this.baseYield.first + this.growthFactors.sumOf { it.minYield() }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates and returns the maximum possible yield by summing [baseYield] and [growthFactors] max values.
|
|
||||||
*
|
|
||||||
* @return The maximum possible yield.
|
|
||||||
*/
|
|
||||||
fun maxYield() = this.baseYield.last + this.growthFactors.sumOf { it.maxYield() }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if this berry can mutate with the given [partner].
|
|
||||||
* For the berry the mutations may produce use [mutationWith].
|
|
||||||
*
|
|
||||||
* @param partner The [Berry] being checked as a possible mutation partner.
|
|
||||||
* @return If a mutation is possible.
|
|
||||||
*/
|
|
||||||
fun canMutateWith(partner: Berry) = this.mutationWith(partner) != null
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query for the possible mutation with the given [partner].
|
|
||||||
*
|
|
||||||
* @param partner The [Berry] being mutated with.
|
|
||||||
* @return The resulting [Berry] if the mutation is possible.
|
|
||||||
*/
|
|
||||||
fun mutationWith(partner: Berry): Berry? {
|
|
||||||
val berryIdentifier = this.mutations[partner.identifier] ?: return null
|
|
||||||
return Berries.getByIdentifier(berryIdentifier)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query for a possible partner to mutate into the given [resulting].
|
|
||||||
*
|
|
||||||
* @param resulting The [Berry] the mutation should result in.
|
|
||||||
* @return The [Berry] that mutates with this berry into the given [resulting] if possible.
|
|
||||||
*/
|
|
||||||
fun partnerForMutation(resulting: Berry): Berry? {
|
|
||||||
return this.mutations.firstNotNullOfOrNull { (partner, result) ->
|
|
||||||
if (result == resulting.identifier)
|
|
||||||
Berries.getByIdentifier(partner)
|
|
||||||
else
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A cheat since gson doesn't invoke init block
|
|
||||||
internal fun validate() {
|
|
||||||
if (this.baseYield.first < 0 || this.baseYield.last < 0) {
|
|
||||||
throw IllegalArgumentException("A berry base yield must be a positive range")
|
|
||||||
}
|
|
||||||
if (this.growthTime.first < 0 || this.growthTime.last < 0) {
|
|
||||||
throw IllegalArgumentException("The growth time must be a positive range")
|
|
||||||
}
|
|
||||||
if (this.refreshRate.first < 0 || this.refreshRate.last < 0) {
|
|
||||||
throw IllegalArgumentException("The refresh rate must be a positive range")
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if (this.lifeCycles.first < 0 || this.lifeCycles.last < 0) {
|
|
||||||
throw IllegalArgumentException("A berry life cycle must be a positive range")
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
this.growthFactors.forEach { it.validateArguments() }
|
|
||||||
val maxYield = this.maxYield()
|
|
||||||
if (this.growthPoints.size < maxYield) {
|
|
||||||
throw IllegalArgumentException("Anchor points must have enough elements for the max possible yield of $maxYield you've provided ${this.growthPoints.size} points")
|
|
||||||
}
|
|
||||||
this.shapedFlower = hashMapOf()
|
|
||||||
this.shapedFruit = hashMapOf()
|
|
||||||
this.sproutShape = this.createAndUniteShapes(this.sproutShapeBoxes)
|
|
||||||
this.matureShape = this.createAndUniteShapes(this.matureShapeBoxes)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun encode(buffer: PacketByteBuf) {
|
|
||||||
buffer.writeIdentifier(this.identifier)
|
|
||||||
buffer.writeInt(this.baseYield.first)
|
|
||||||
buffer.writeInt(this.baseYield.last)
|
|
||||||
buffer.writeEnumSet(favoriteMulches, MulchVariant::class.java)
|
|
||||||
//buffer.writeInt(this.lifeCycles.first)
|
|
||||||
//buffer.writeInt(this.lifeCycles.last)
|
|
||||||
buffer.writeInt(this.growthTime.first)
|
|
||||||
buffer.writeInt(this.growthTime.last)
|
|
||||||
buffer.writeInt(this.refreshRate.first)
|
|
||||||
buffer.writeInt(this.refreshRate.last)
|
|
||||||
buffer.writeCollection(this.growthPoints.toList()) { writer, value ->
|
|
||||||
writer.writeDouble(value.position.x)
|
|
||||||
writer.writeDouble(value.position.y)
|
|
||||||
writer.writeDouble(value.position.z)
|
|
||||||
writer.writeDouble(value.rotation.x)
|
|
||||||
writer.writeDouble(value.rotation.y)
|
|
||||||
writer.writeDouble(value.rotation.z)
|
|
||||||
}
|
|
||||||
buffer.writeBoolean(this.randomizedGrowthPoints)
|
|
||||||
buffer.writeMap(this.mutations, { writer, key -> writer.writeIdentifier(key) }, { writer, value -> writer.writeIdentifier(value) })
|
|
||||||
buffer.writeCollection(this.sproutShapeBoxes) { writer, value ->
|
|
||||||
writer.writeBox(value)
|
|
||||||
}
|
|
||||||
buffer.writeCollection(this.matureShapeBoxes) { writer, value ->
|
|
||||||
writer.writeBox(value)
|
|
||||||
}
|
|
||||||
buffer.writeMap(this.flavors, { writer, key -> writer.writeEnumConstant(key) }, { writer, value -> writer.writeInt(value) })
|
|
||||||
buffer.writeMap(this.tintIndexes, { writer, key -> writer.writeInt(key) }, { writer, value -> writer.writeInt(value.rgb) })
|
|
||||||
buffer.writeIdentifier(this.flowerModelIdentifier)
|
|
||||||
buffer.writeIdentifier(this.flowerTexture)
|
|
||||||
buffer.writeIdentifier(this.fruitModelIdentifier)
|
|
||||||
buffer.writeIdentifier(this.fruitTexture)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the bonus yield for the berry tree.
|
|
||||||
*
|
|
||||||
* @param world The [World] the tree is present in.
|
|
||||||
* @param state The [BlockState] of the tree.
|
|
||||||
* @param pos The [BlockPos] of the tree.
|
|
||||||
* @return The bonus yield, the growth factors that passed.
|
|
||||||
*/
|
|
||||||
private fun bonusYield(world: World, state: BlockState, pos: BlockPos): Pair<Int, Collection<GrowthFactor>> {
|
|
||||||
var bonus = 0
|
|
||||||
val passed = arrayListOf<GrowthFactor>()
|
|
||||||
val mulchVariant = BerryBlock.getMulch(state)
|
|
||||||
val hasBiomeMulch = mulchVariant in favoriteMulches
|
|
||||||
this.growthFactors.forEach { factor ->
|
|
||||||
if (factor.isValid(world, state, pos)) {
|
|
||||||
bonus += factor.yield()
|
|
||||||
passed += factor
|
|
||||||
} else if (hasBiomeMulch) {
|
|
||||||
bonus += factor.yield()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return bonus to passed
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createAndUniteShapes(boxes: Collection<Box>): VoxelShape {
|
|
||||||
var shape: VoxelShape? = null
|
|
||||||
boxes.forEach { box ->
|
|
||||||
shape = if (shape == null) {
|
|
||||||
Block.createCuboidShape(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ)
|
|
||||||
} else {
|
|
||||||
VoxelShapes.union(shape, Block.createCuboidShape(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return shape ?: VoxelShapes.fullCube()
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
internal fun decode(buffer: PacketByteBuf): Berry {
|
|
||||||
val identifier = buffer.readIdentifier()
|
|
||||||
val baseYield = IntRange(buffer.readInt(), buffer.readInt())
|
|
||||||
val favMulchs = buffer.readEnumSet(MulchVariant::class.java)
|
|
||||||
//val lifeCycles = IntRange(buffer.readInt(), buffer.readInt())
|
|
||||||
val growthTime = IntRange(buffer.readInt(), buffer.readInt())
|
|
||||||
val refreshRate = IntRange(buffer.readInt(), buffer.readInt())
|
|
||||||
val growthPoints = buffer.readList { reader ->
|
|
||||||
GrowthPoint(Vec3d(reader.readDouble(), reader.readDouble(), reader.readDouble()), Vec3d(reader.readDouble(), reader.readDouble(), reader.readDouble()))
|
|
||||||
}.toTypedArray()
|
|
||||||
val randomizedGrowthPoints = buffer.readBoolean()
|
|
||||||
val mutations = buffer.readMap({ reader -> reader.readIdentifier() }, { reader -> reader.readIdentifier() })
|
|
||||||
val sproutShapeBoxes = buffer.readList { it.readBox() }
|
|
||||||
val matureShapeBoxes = buffer.readList { it.readBox() }
|
|
||||||
val flavors = buffer.readMap({ reader -> reader.readEnumConstant(Flavor::class.java) }, { reader -> reader.readInt() })
|
|
||||||
val tintIndexes = buffer.readMap({ reader -> reader.readInt() }, { reader -> Color(reader.readInt()) })
|
|
||||||
val flowerModelIdentifier = buffer.readIdentifier()
|
|
||||||
val flowerTexture = buffer.readIdentifier()
|
|
||||||
val fruitModelIdentifier = buffer.readIdentifier()
|
|
||||||
val fruitTexture = buffer.readIdentifier()
|
|
||||||
return Berry(identifier, baseYield, emptyList(), growthTime, refreshRate, favMulchs, emptySet(), emptyList(), growthPoints, randomizedGrowthPoints, mutations, sproutShapeBoxes, matureShapeBoxes, flavors, tintIndexes, flowerModelIdentifier, flowerTexture, fruitModelIdentifier, fruitTexture, 0F)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonBlocks
|
|
||||||
import com.cobblemon.mod.common.block.BerryBlock
|
|
||||||
import com.cobblemon.mod.common.world.feature.BerryGroveFeature
|
|
||||||
import com.google.common.cache.CacheBuilder
|
|
||||||
import com.google.common.cache.CacheLoader
|
|
||||||
import com.google.common.cache.LoadingCache
|
|
||||||
import net.minecraft.registry.entry.RegistryEntry
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
|
|
||||||
object BerryHelper {
|
|
||||||
private val CACHE_LOADER = object : CacheLoader<RegistryEntry<Biome>, List<BerryBlock>>() {
|
|
||||||
override fun load(key: RegistryEntry<Biome>): List<BerryBlock> {
|
|
||||||
return naturalBerries.filter { berryBlock ->
|
|
||||||
val berry = berryBlock.berry()
|
|
||||||
berry?.spawnConditions?.any { it.canSpawn(berry, key) } ?: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val naturalBerries = CobblemonBlocks.berries().values.filter {
|
|
||||||
(it.berry()?.spawnConditions?.size ?: 0) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
private val validBerryCache: LoadingCache<RegistryEntry<Biome>, List<BerryBlock>> = CacheBuilder.newBuilder()
|
|
||||||
.maximumSize(4)
|
|
||||||
.build(CACHE_LOADER)
|
|
||||||
|
|
||||||
|
|
||||||
fun getBerriesForBiome(biome: RegistryEntry<Biome>): List<BerryBlock> {
|
|
||||||
return validBerryCache.get(biome)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getNaturallyGeneratingBerries(): List<BerryBlock> {
|
|
||||||
return naturalBerries
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the different flavors associated with berries and other Pokémon consumables.
|
|
||||||
* See the [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Flavor) article for more information.
|
|
||||||
*
|
|
||||||
* @author Licious
|
|
||||||
* @since November 28th, 2022
|
|
||||||
*/
|
|
||||||
enum class Flavor {
|
|
||||||
|
|
||||||
SPICY,
|
|
||||||
DRY,
|
|
||||||
SWEET,
|
|
||||||
BITTER,
|
|
||||||
SOUR
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
import net.minecraft.block.BlockState
|
|
||||||
import net.minecraft.util.math.BlockPos
|
|
||||||
import net.minecraft.world.WorldView
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a condition that impacts extra berry yield.
|
|
||||||
*
|
|
||||||
* @author Licious
|
|
||||||
* @since December 2nd, 2022
|
|
||||||
*/
|
|
||||||
interface GrowthFactor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates the arguments contained in this factor, this is invoked during loading.
|
|
||||||
*
|
|
||||||
* @throws IllegalArgumentException If an argument isn't valid.
|
|
||||||
*/
|
|
||||||
fun validateArguments()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if this factor should yield a bonus.
|
|
||||||
*
|
|
||||||
* @param world The [WorldView] the berry tree is in.
|
|
||||||
* @param state The [BlockState] of the berry tree.
|
|
||||||
* @param pos The [BlockPos] of the berry tree.
|
|
||||||
* @return If the bonus should activate.
|
|
||||||
*/
|
|
||||||
fun isValid(world: WorldView, state: BlockState, pos: BlockPos): Boolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the amount of bonus berries to grow if [isValid] was true.
|
|
||||||
*
|
|
||||||
* @return The amount of extra berries to grow.
|
|
||||||
*/
|
|
||||||
fun yield(): Int
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the minimum possible yield for this factor.
|
|
||||||
*
|
|
||||||
* @return The minimum possible yield for this factor.
|
|
||||||
*/
|
|
||||||
fun minYield(): Int
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the maximum possible yield for this factor.
|
|
||||||
*
|
|
||||||
* @return The maximum possible yield for this factor.
|
|
||||||
*/
|
|
||||||
fun maxYield(): Int
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry
|
|
||||||
|
|
||||||
import net.minecraft.util.math.Vec3d
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a position in a berry tree where a berry will flower then fruit.
|
|
||||||
*
|
|
||||||
* @property position The coordinates of the berry in the tree block.
|
|
||||||
* @property rotation The degree value for the rotation each axis.
|
|
||||||
*
|
|
||||||
* @author Licious
|
|
||||||
* @since December 19th, 2022
|
|
||||||
*/
|
|
||||||
data class GrowthPoint(
|
|
||||||
val position: Vec3d,
|
|
||||||
val rotation: Vec3d
|
|
||||||
)
|
|
||||||
-35
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry.adapter
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.berry.GrowthFactor
|
|
||||||
import com.cobblemon.mod.common.util.adapters.CobblemonGrowthFactorAdapter
|
|
||||||
import com.google.gson.JsonDeserializer
|
|
||||||
import com.google.gson.JsonSerializer
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A type adapter for [GrowthFactor]s.
|
|
||||||
* For the default implementation see [CobblemonGrowthFactorAdapter].
|
|
||||||
*
|
|
||||||
* @author Licious
|
|
||||||
* @since December 2nd, 2022
|
|
||||||
*/
|
|
||||||
interface GrowthFactorAdapter : JsonDeserializer<GrowthFactor>, JsonSerializer<GrowthFactor> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a [GrowthFactor] to be used by this adapter.
|
|
||||||
*
|
|
||||||
* @param type The [KClass] of the [GrowthFactor].
|
|
||||||
* @param identifier The expected [Identifier] in the parsed JSON.
|
|
||||||
*/
|
|
||||||
fun register(type: KClass<out GrowthFactor>, identifier: Identifier)
|
|
||||||
|
|
||||||
}
|
|
||||||
-34
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry.adapter
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.berry.GrowthFactor
|
|
||||||
import com.cobblemon.mod.common.api.berry.spawncondition.BerrySpawnCondition
|
|
||||||
import com.cobblemon.mod.common.util.adapters.CobblemonBerrySpawnConditionAdapter
|
|
||||||
import com.google.gson.JsonDeserializer
|
|
||||||
import com.google.gson.JsonSerializer
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A type adapter for [GrowthFactor]s.
|
|
||||||
* For the default implementation see [CobblemonBerrySpawnConditionAdapter].
|
|
||||||
*
|
|
||||||
* @author Apion
|
|
||||||
* @since August 14, 2023
|
|
||||||
*/
|
|
||||||
interface SpawnConditionAdapter : JsonDeserializer<BerrySpawnCondition>, JsonSerializer<BerrySpawnCondition> {
|
|
||||||
/**
|
|
||||||
* Register a [BerrySpawnCondition] to be used by this adapter.
|
|
||||||
*
|
|
||||||
* @param type The [KClass] of the [BerrySpawnCondition].
|
|
||||||
* @param identifier The expected [Identifier] in the parsed JSON.
|
|
||||||
*/
|
|
||||||
fun register(type: KClass<out BerrySpawnCondition>, identifier: Identifier)
|
|
||||||
}
|
|
||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry.spawncondition
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.berry.Berry
|
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import net.minecraft.registry.entry.RegistryEntry
|
|
||||||
import net.minecraft.util.math.random.Random
|
|
||||||
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
|
|
||||||
class AllBiomeCondition(val minGroveSize: Int, val maxGroveSize: Int) : BerrySpawnCondition{
|
|
||||||
override fun canSpawn(berry: Berry, biome: RegistryEntry<Biome>): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getGroveSize(random: Random): Int {
|
|
||||||
return random.nextBetween(minGroveSize, maxGroveSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val ID = cobblemonResource("all_biome")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry.spawncondition
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.berry.Berry
|
|
||||||
import net.minecraft.registry.entry.RegistryEntry
|
|
||||||
import net.minecraft.util.math.random.Random
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
|
|
||||||
interface BerrySpawnCondition {
|
|
||||||
fun getGroveSize(random: Random): Int
|
|
||||||
|
|
||||||
fun canSpawn(berry: Berry, biome: RegistryEntry<Biome>): Boolean
|
|
||||||
}
|
|
||||||
-32
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.berry.spawncondition
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.berry.Berry
|
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import net.minecraft.registry.entry.RegistryEntry
|
|
||||||
import net.minecraft.util.math.random.Random
|
|
||||||
import net.minecraft.world.biome.Biome
|
|
||||||
import kotlin.math.min
|
|
||||||
|
|
||||||
class PreferredBiomeCondition(val minGroveSize: Int, val maxGroveSize: Int) : BerrySpawnCondition{
|
|
||||||
|
|
||||||
override fun getGroveSize(random: Random): Int {
|
|
||||||
return random.nextBetween(minGroveSize, maxGroveSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun canSpawn(berry: Berry, biome: RegistryEntry<Biome>): Boolean {
|
|
||||||
val preferredBiomeTags = berry.preferredBiomeTags
|
|
||||||
return preferredBiomeTags.any {biome.isIn(it)}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val ID = cobblemonResource("preferred_biome")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+1
-6
@@ -13,10 +13,8 @@ import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
|||||||
import com.cobblemon.mod.common.api.moves.Move
|
import com.cobblemon.mod.common.api.moves.Move
|
||||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyMoveCallbackPacket
|
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyMoveCallbackPacket
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import com.cobblemon.mod.common.util.lang
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
import net.minecraft.server.network.ServerPlayerEntity
|
||||||
import net.minecraft.text.MutableText
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for opening a party select screen for players which routes to move selection when they choose a Pokémon.
|
* Used for opening a party select screen for players which routes to move selection when they choose a Pokémon.
|
||||||
@@ -32,7 +30,6 @@ object PartyMoveSelectCallbacks {
|
|||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun create(
|
fun create(
|
||||||
player: ServerPlayerEntity,
|
player: ServerPlayerEntity,
|
||||||
partyTitle: MutableText = lang("ui.party"),
|
|
||||||
pokemon: List<Pair<PartySelectPokemonDTO, List<MoveSelectDTO>>>,
|
pokemon: List<Pair<PartySelectPokemonDTO, List<MoveSelectDTO>>>,
|
||||||
cancel: (ServerPlayerEntity) -> Unit = {},
|
cancel: (ServerPlayerEntity) -> Unit = {},
|
||||||
handler: (ServerPlayerEntity, pokemonIndex: Int, PartySelectPokemonDTO, moveIndex: Int, MoveSelectDTO) -> Unit
|
handler: (ServerPlayerEntity, pokemonIndex: Int, PartySelectPokemonDTO, moveIndex: Int, MoveSelectDTO) -> Unit
|
||||||
@@ -43,13 +40,12 @@ object PartyMoveSelectCallbacks {
|
|||||||
handler = handler
|
handler = handler
|
||||||
)
|
)
|
||||||
callbacks[player.uuid] = callback
|
callbacks[player.uuid] = callback
|
||||||
player.sendPacket(OpenPartyMoveCallbackPacket(callback.uuid, partyTitle, callback.pokemon))
|
player.sendPacket(OpenPartyMoveCallbackPacket(callback.uuid, callback.pokemon))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun createFromPokemon(
|
fun createFromPokemon(
|
||||||
player: ServerPlayerEntity,
|
player: ServerPlayerEntity,
|
||||||
partyTitle: MutableText = lang("ui.party"),
|
|
||||||
pokemon: List<Pokemon>,
|
pokemon: List<Pokemon>,
|
||||||
moves: (Pokemon) -> List<Move> = { it.moveSet.getMoves() },
|
moves: (Pokemon) -> List<Move> = { it.moveSet.getMoves() },
|
||||||
canSelectPokemon: (Pokemon) -> Boolean = { true },
|
canSelectPokemon: (Pokemon) -> Boolean = { true },
|
||||||
@@ -66,7 +62,6 @@ object PartyMoveSelectCallbacks {
|
|||||||
|
|
||||||
create(
|
create(
|
||||||
player = player,
|
player = player,
|
||||||
partyTitle = partyTitle,
|
|
||||||
pokemon = pokemonList,
|
pokemon = pokemonList,
|
||||||
cancel = cancel,
|
cancel = cancel,
|
||||||
handler = { _, pkIndex, _, moveIndex, _ ->
|
handler = { _, pkIndex, _, moveIndex, _ ->
|
||||||
|
|||||||
+8
-19
@@ -12,10 +12,10 @@ import com.cobblemon.mod.common.Cobblemon
|
|||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonPropertyExtractor
|
import com.cobblemon.mod.common.api.pokemon.PokemonPropertyExtractor
|
||||||
|
import com.cobblemon.mod.common.api.text.text
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
|
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import com.cobblemon.mod.common.util.lang
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.NbtCompound
|
import net.minecraft.nbt.NbtCompound
|
||||||
@@ -36,7 +36,7 @@ object PartySelectCallbacks {
|
|||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun create(
|
fun create(
|
||||||
player: ServerPlayerEntity,
|
player: ServerPlayerEntity,
|
||||||
title: Text = lang("ui.party"),
|
title: Text = "".text(),
|
||||||
pokemon: List<PartySelectPokemonDTO>,
|
pokemon: List<PartySelectPokemonDTO>,
|
||||||
cancel: (ServerPlayerEntity) -> Unit = {},
|
cancel: (ServerPlayerEntity) -> Unit = {},
|
||||||
handler: (ServerPlayerEntity, index: Int) -> Unit
|
handler: (ServerPlayerEntity, index: Int) -> Unit
|
||||||
@@ -61,14 +61,12 @@ object PartySelectCallbacks {
|
|||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun createBattleSelect(
|
fun createBattleSelect(
|
||||||
player: ServerPlayerEntity,
|
player: ServerPlayerEntity,
|
||||||
title: Text = lang("ui.party"),
|
|
||||||
pokemon: List<BattlePokemon>,
|
pokemon: List<BattlePokemon>,
|
||||||
canSelect: (BattlePokemon) -> Boolean,
|
canSelect: (BattlePokemon) -> Boolean,
|
||||||
cancel: (ServerPlayerEntity) -> Unit = {},
|
cancel: (ServerPlayerEntity) -> Unit = {},
|
||||||
handler: (BattlePokemon) -> Unit
|
handler: (BattlePokemon) -> Unit
|
||||||
) = create(
|
) = create(
|
||||||
player = player,
|
player = player,
|
||||||
title = title,
|
|
||||||
cancel = cancel,
|
cancel = cancel,
|
||||||
pokemon = pokemon.map { pk -> PartySelectPokemonDTO(pk.effectedPokemon).also { it.enabled = canSelect(pk) } }
|
pokemon = pokemon.map { pk -> PartySelectPokemonDTO(pk.effectedPokemon).also { it.enabled = canSelect(pk) } }
|
||||||
) { _, index -> handler(pokemon[index]) }
|
) { _, index -> handler(pokemon[index]) }
|
||||||
@@ -76,14 +74,12 @@ object PartySelectCallbacks {
|
|||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun createFromPokemon(
|
fun createFromPokemon(
|
||||||
player: ServerPlayerEntity,
|
player: ServerPlayerEntity,
|
||||||
title: Text = lang("ui.party"),
|
|
||||||
pokemon: List<Pokemon>,
|
pokemon: List<Pokemon>,
|
||||||
canSelect: (Pokemon) -> Boolean,
|
canSelect: (Pokemon) -> Boolean,
|
||||||
cancel: (ServerPlayerEntity) -> Unit = {},
|
cancel: (ServerPlayerEntity) -> Unit = {},
|
||||||
handler: (Pokemon) -> Unit
|
handler: (Pokemon) -> Unit
|
||||||
) = create(
|
) = create(
|
||||||
player = player,
|
player = player,
|
||||||
title = title,
|
|
||||||
cancel = cancel,
|
cancel = cancel,
|
||||||
pokemon = pokemon.map { pk -> PartySelectPokemonDTO(pk).also { it.enabled = canSelect(pk) } }
|
pokemon = pokemon.map { pk -> PartySelectPokemonDTO(pk).also { it.enabled = canSelect(pk) } }
|
||||||
) { _, index -> handler(pokemon[index]) }
|
) { _, index -> handler(pokemon[index]) }
|
||||||
@@ -121,43 +117,36 @@ class PartySelectCallback(
|
|||||||
|
|
||||||
open class PartySelectPokemonDTO(
|
open class PartySelectPokemonDTO(
|
||||||
val pokemonProperties: PokemonProperties,
|
val pokemonProperties: PokemonProperties,
|
||||||
val aspects: Set<String>,
|
|
||||||
val heldItem: ItemStack = ItemStack.EMPTY,
|
val heldItem: ItemStack = ItemStack.EMPTY,
|
||||||
var currentHealth: Int,
|
var hpRatio: Float = 1F,
|
||||||
var maxHealth: Int,
|
|
||||||
var enabled: Boolean
|
var enabled: Boolean
|
||||||
) {
|
) {
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(pokemon: Pokemon, enabled: Boolean = true): this(
|
constructor(pokemon: Pokemon, enabled: Boolean = true): this(
|
||||||
pokemonProperties = pokemon.createPokemonProperties(
|
pokemonProperties = pokemon.createPokemonProperties(
|
||||||
|
PokemonPropertyExtractor.ASPECTS,
|
||||||
PokemonPropertyExtractor.SPECIES,
|
PokemonPropertyExtractor.SPECIES,
|
||||||
PokemonPropertyExtractor.LEVEL,
|
PokemonPropertyExtractor.LEVEL,
|
||||||
PokemonPropertyExtractor.NICKNAME,
|
PokemonPropertyExtractor.NICKNAME,
|
||||||
PokemonPropertyExtractor.POKEBALL,
|
PokemonPropertyExtractor.POKEBALL,
|
||||||
PokemonPropertyExtractor.STATUS,
|
PokemonPropertyExtractor.STATUS
|
||||||
),
|
),
|
||||||
aspects = pokemon.aspects,
|
|
||||||
heldItem = pokemon.heldItemNoCopy(),
|
heldItem = pokemon.heldItemNoCopy(),
|
||||||
currentHealth = pokemon.currentHealth,
|
hpRatio = pokemon.currentHealth / pokemon.hp.toFloat(),
|
||||||
maxHealth = pokemon.hp,
|
|
||||||
enabled = enabled
|
enabled = enabled
|
||||||
)
|
)
|
||||||
|
|
||||||
constructor(buffer: PacketByteBuf): this(
|
constructor(buffer: PacketByteBuf): this(
|
||||||
pokemonProperties = PokemonProperties().loadFromNBT(buffer.readNbt() as NbtCompound),
|
pokemonProperties = PokemonProperties().loadFromNBT(buffer.readNbt() as NbtCompound),
|
||||||
aspects = buffer.readList { it.readString() }.toSet(),
|
|
||||||
heldItem = buffer.readItemStack(),
|
heldItem = buffer.readItemStack(),
|
||||||
currentHealth = buffer.readInt(),
|
hpRatio = buffer.readFloat(),
|
||||||
maxHealth = buffer.readInt(),
|
|
||||||
enabled = buffer.readBoolean()
|
enabled = buffer.readBoolean()
|
||||||
)
|
)
|
||||||
|
|
||||||
fun writeToBuffer(buffer: PacketByteBuf) {
|
fun writeToBuffer(buffer: PacketByteBuf) {
|
||||||
buffer.writeNbt(pokemonProperties.saveToNBT())
|
buffer.writeNbt(pokemonProperties.saveToNBT())
|
||||||
buffer.writeCollection(aspects) { _, aspect -> buffer.writeString(aspect) }
|
|
||||||
buffer.writeItemStack(heldItem)
|
buffer.writeItemStack(heldItem)
|
||||||
buffer.writeInt(currentHealth)
|
buffer.writeFloat(hpRatio)
|
||||||
buffer.writeInt(maxHealth)
|
|
||||||
buffer.writeBoolean(enabled)
|
buffer.writeBoolean(enabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,9 +8,11 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.data
|
package com.cobblemon.mod.common.api.data
|
||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
import com.cobblemon.mod.common.util.endsWith
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import java.io.File
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
import net.minecraft.resource.ResourceManager
|
import net.minecraft.resource.ResourceManager
|
||||||
import net.minecraft.util.Identifier
|
import net.minecraft.util.Identifier
|
||||||
|
|
||||||
@@ -42,7 +44,20 @@ interface JsonDataRegistry<T> : DataRegistry {
|
|||||||
val resourcePath: String
|
val resourcePath: String
|
||||||
|
|
||||||
override fun reload(manager: ResourceManager) {
|
override fun reload(manager: ResourceManager) {
|
||||||
this.reload(Cobblemon.implementation.reloadJsonRegistry(this, manager))
|
val data = hashMapOf<Identifier, T>()
|
||||||
|
manager.findResources(this.resourcePath) { path -> path.endsWith(JSON_EXTENSION) }.forEach { (identifier, resource) ->
|
||||||
|
resource.inputStream.use { stream ->
|
||||||
|
stream.bufferedReader().use { reader ->
|
||||||
|
val resolvedIdentifier = Identifier(identifier.namespace, File(identifier.path).nameWithoutExtension)
|
||||||
|
try {
|
||||||
|
data[resolvedIdentifier] = this.gson.fromJson(reader, this.typeToken.type)
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
throw ExecutionException("Error loading JSON for data: $identifier", exception)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.reload(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,6 +68,6 @@ interface JsonDataRegistry<T> : DataRegistry {
|
|||||||
fun reload(data: Map<Identifier, T>)
|
fun reload(data: Map<Identifier, T>)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val JSON_EXTENSION = ".json"
|
private const val JSON_EXTENSION = ".json"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
|
||||||
import com.bedrockk.molang.runtime.struct.MoStruct
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.input.ActiveInput
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addFunctions
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.getQueryStruct
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
|
||||||
import com.cobblemon.mod.common.api.scheduling.ServerRealTimeTaskTracker
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
|
|
||||||
import java.util.UUID
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An active instance of [Dialogue]. Bound to a player. These all need to be created through DialogueManager
|
|
||||||
* or things will go to shit.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
class ActiveDialogue(var playerEntity: ServerPlayerEntity, var dialogueReference: Dialogue) {
|
|
||||||
val dialogueId = UUID.randomUUID()
|
|
||||||
val runtime = MoLangRuntime().setup()
|
|
||||||
var currentPage = dialogueReference.pages[0]
|
|
||||||
val playerStruct = playerEntity.asMoLangValue()
|
|
||||||
var activeInput = ActiveInput(this, currentPage.input)
|
|
||||||
|
|
||||||
init {
|
|
||||||
runtime.environment.getQueryStruct().addFunctions(
|
|
||||||
mapOf(
|
|
||||||
"dialogue" to java.util.function.Function { _ -> toMoLangStruct() },
|
|
||||||
"player" to java.util.function.Function { _ -> playerStruct }
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val currentPageIndex
|
|
||||||
get() = dialogueReference.pages.indexOf(currentPage)
|
|
||||||
|
|
||||||
fun setPage(value: MoValue) {
|
|
||||||
val page = if (value is StringValue) {
|
|
||||||
dialogueReference.pages.find { it.id == value.value }
|
|
||||||
?: return Cobblemon.LOGGER.error("Dialogue requested page ${value.value} but it doesn't exist")
|
|
||||||
} else {
|
|
||||||
val pageNum = value.asDouble().toInt()
|
|
||||||
if (pageNum < 0 || pageNum >= dialogueReference.pages.size) {
|
|
||||||
return Cobblemon.LOGGER.error("Dialogue requested page $pageNum but it doesn't exist")
|
|
||||||
} else {
|
|
||||||
dialogueReference.pages[pageNum]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setPage(page)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isActive() = DialogueManager.activeDialogues[playerEntity.uuid] == this
|
|
||||||
|
|
||||||
fun incrementPage() {
|
|
||||||
setPage(currentPageIndex + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setPage(page: DialoguePage) {
|
|
||||||
currentPage = page
|
|
||||||
activeInput = ActiveInput(this, currentPage.input)
|
|
||||||
val deadline = currentPage.input.timeout?.duration
|
|
||||||
val inputId = activeInput.inputId
|
|
||||||
if (deadline != null && deadline > 0) {
|
|
||||||
ServerRealTimeTaskTracker.after(seconds = deadline) {
|
|
||||||
if (inputId == activeInput.inputId && isActive()) {
|
|
||||||
activeInput.dialogueInput.timeout?.action?.invoke(this, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playerEntity.sendPacket(DialogueOpenedPacket(this, false))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setPage(index: Int) {
|
|
||||||
if (index == dialogueReference.pages.size) {
|
|
||||||
return close()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < 0 || index > dialogueReference.pages.size) {
|
|
||||||
return Cobblemon.LOGGER.error("Dialogue requested page $index but it doesn't exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
setPage(dialogueReference.pages[index])
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toMoLangStruct(): MoStruct {
|
|
||||||
return QueryStruct(
|
|
||||||
hashMapOf(
|
|
||||||
"current_page" to java.util.function.Function { _ -> currentPage.toMoLangStruct(this) },
|
|
||||||
"current_page_number" to java.util.function.Function { _ -> DoubleValue(currentPageIndex) },
|
|
||||||
"next_page" to java.util.function.Function { _ -> incrementPage() },
|
|
||||||
"set_page" to java.util.function.Function { args -> setPage(args[0]) },
|
|
||||||
"close" to java.util.function.Function { _ -> close() },
|
|
||||||
"input" to java.util.function.Function { params -> activeInput.handle(if (params.params.size > 0) params.get<MoValue>(0).asString() else "") },
|
|
||||||
)
|
|
||||||
).addStandardFunctions()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun close() {
|
|
||||||
DialogueManager.stopDialogue(playerEntity)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun escape() {
|
|
||||||
val action = currentPage.escapeAction ?: dialogueReference.escapeAction
|
|
||||||
action(this, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A dialogue that could be sent to players.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
class Dialogue(
|
|
||||||
val pages: List<DialoguePage> = mutableListOf(),
|
|
||||||
val escapeAction: DialogueAction = FunctionDialogueAction { dialogue, _ -> dialogue.close() },
|
|
||||||
val speakers: Map<String, DialogueSpeaker> = emptyMap()
|
|
||||||
) {
|
|
||||||
companion object {
|
|
||||||
fun of(
|
|
||||||
pages: Iterable<DialoguePage>,
|
|
||||||
escapeAction: ExpressionLike,
|
|
||||||
speakers: Map<String, DialogueSpeaker>
|
|
||||||
): Dialogue {
|
|
||||||
return Dialogue(
|
|
||||||
pages = pages.toList(),
|
|
||||||
escapeAction = ExpressionLikeDialogueAction(escapeAction),
|
|
||||||
speakers = speakers
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun of(
|
|
||||||
pages: Iterable<DialoguePage>,
|
|
||||||
escapeAction: (ActiveDialogue) -> Unit,
|
|
||||||
speakers: Map<String, DialogueSpeaker>
|
|
||||||
): Dialogue {
|
|
||||||
val dialogue = Dialogue(
|
|
||||||
pages = pages.toList(),
|
|
||||||
escapeAction = FunctionDialogueAction { activeDialogue, _ -> escapeAction(activeDialogue) },
|
|
||||||
speakers = speakers
|
|
||||||
)
|
|
||||||
return dialogue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.resolve
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Something that can happen in the context of an [ActiveDialogue]. The input field is nullable because I'm reusing
|
|
||||||
* this for dialogue input timeouts which don't have an input. It'll be fine.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 29th, 2023
|
|
||||||
*/
|
|
||||||
interface DialogueAction {
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
val types = mutableMapOf<String, Class<out DialogueAction>>()
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun invoke(dialogue: ActiveDialogue, input: String? = null)
|
|
||||||
}
|
|
||||||
|
|
||||||
class FunctionDialogueAction(val consumer: (ActiveDialogue, String?) -> Unit) : DialogueAction {
|
|
||||||
override fun invoke(dialogue: ActiveDialogue, input: String?) {
|
|
||||||
consumer(dialogue, input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExpressionLikeDialogueAction(val expression: ExpressionLike) : DialogueAction {
|
|
||||||
override fun invoke(dialogue: ActiveDialogue, input: String?) {
|
|
||||||
if (input != null) {
|
|
||||||
dialogue.runtime.environment.setSimpleVariable("selected_option", StringValue(input))
|
|
||||||
}
|
|
||||||
dialogue.runtime.resolve(expression)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import java.util.UUID
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Something that produces a dialogue's renderable face. This is sealed because the client has very particular handling for this.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since January 1st, 2024
|
|
||||||
*/
|
|
||||||
sealed interface DialogueFaceProvider {
|
|
||||||
companion object {
|
|
||||||
val types = mutableMapOf(
|
|
||||||
"player" to PlayerDialogueFaceProvider::class.java,
|
|
||||||
"standard" to ArtificialDialogueFaceProvider::class.java,
|
|
||||||
"expression" to ExpressionLikeDialogueFaceProvider::class.java
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ArtificialDialogueFaceProvider(
|
|
||||||
val modelType: String = "",
|
|
||||||
val identifier: Identifier = cobblemonResource("bulbasaur"),
|
|
||||||
val aspects: Set<String> = setOf()
|
|
||||||
) : DialogueFaceProvider
|
|
||||||
|
|
||||||
class ReferenceDialogueFaceProvider(
|
|
||||||
val entityId: Int
|
|
||||||
): DialogueFaceProvider
|
|
||||||
|
|
||||||
class PlayerDialogueFaceProvider(val playerId: UUID) : DialogueFaceProvider
|
|
||||||
|
|
||||||
class ExpressionLikeDialogueFaceProvider(
|
|
||||||
val providerExpression: ExpressionLike
|
|
||||||
): DialogueFaceProvider
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueClosedPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
|
|
||||||
import com.cobblemon.mod.common.util.activeDialogue
|
|
||||||
import java.util.UUID
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manages the active dialogues for players. Map is indexed by player UUID.
|
|
||||||
* You really need to make sure any dialogues you start with a player go through this otherwise
|
|
||||||
* the player won't be able to close the dialogue.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
object DialogueManager {
|
|
||||||
val activeDialogues = mutableMapOf<UUID, ActiveDialogue>()
|
|
||||||
|
|
||||||
fun startDialogue(playerEntity: ServerPlayerEntity, dialogue: Dialogue) {
|
|
||||||
val activeDialogue = ActiveDialogue(playerEntity, dialogue)
|
|
||||||
activeDialogues[playerEntity.uuid] = activeDialogue
|
|
||||||
val packet = DialogueOpenedPacket(activeDialogue, includeFaces = true)
|
|
||||||
playerEntity.sendPacket(packet)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun stopDialogue(playerEntity: ServerPlayerEntity) {
|
|
||||||
val activeDialogue = playerEntity.activeDialogue ?: return
|
|
||||||
DialogueClosedPacket(activeDialogue.dialogueId).sendToPlayer(playerEntity)
|
|
||||||
activeDialogues.remove(activeDialogue.dialogueId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.bedrockk.molang.Expression
|
|
||||||
import com.bedrockk.molang.runtime.struct.MoStruct
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.input.DialogueInput
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.input.DialogueNoInput
|
|
||||||
import com.google.gson.JsonArray
|
|
||||||
import net.minecraft.text.MutableText
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A page of a dialogue. This has lines of text and also some kind of input expected from the player.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
class DialoguePage(
|
|
||||||
var id: String = "",
|
|
||||||
var speaker: String? = null,
|
|
||||||
var lines: MutableList<DialogueText> = mutableListOf(),
|
|
||||||
var input: DialogueInput = DialogueNoInput(),
|
|
||||||
var clientActions: MutableList<Expression> = mutableListOf(),
|
|
||||||
var escapeAction: DialogueAction? = null,
|
|
||||||
) {
|
|
||||||
companion object {
|
|
||||||
@JvmOverloads
|
|
||||||
fun of(
|
|
||||||
/** The ID is optional, but if you want to be able to jump to this page from other pages then you probably want to set this. */
|
|
||||||
id: String = "",
|
|
||||||
speaker: String? = null,
|
|
||||||
lines: Iterable<MutableText>,
|
|
||||||
input: DialogueInput = DialogueNoInput(),
|
|
||||||
clientActions: Iterable<Expression> = emptyList(),
|
|
||||||
/** The thing to do when the player presses ESC while on this page. If null, falls back to the same property on [Dialogue]. */
|
|
||||||
escapeAction: ((ActiveDialogue) -> Unit)? = null,
|
|
||||||
): DialoguePage {
|
|
||||||
return DialoguePage(
|
|
||||||
id = id,
|
|
||||||
speaker = speaker,
|
|
||||||
lines = lines.map { WrappedDialogueText(it) }.toMutableList(),
|
|
||||||
input = input,
|
|
||||||
clientActions = clientActions.toMutableList(),
|
|
||||||
escapeAction = escapeAction?.let { func -> FunctionDialogueAction { activeDialogue, _ -> func(activeDialogue) } }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toMoLangStruct(activeDialogue: ActiveDialogue): MoStruct {
|
|
||||||
return QueryStruct(
|
|
||||||
hashMapOf(
|
|
||||||
"id" to java.util.function.Function { _ -> StringValue(id) },
|
|
||||||
"input" to java.util.function.Function { _ -> activeDialogue.activeInput.struct },
|
|
||||||
"lines" to java.util.function.Function { _ ->
|
|
||||||
val array = JsonArray()
|
|
||||||
lines.forEach { array.add(it(activeDialogue).string) }
|
|
||||||
MoValue.of(array)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.resolveBoolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A predicate loaded for a particular dialogue. Tests arbitrary conditions about the dialogue context.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 29th, 2023
|
|
||||||
*/
|
|
||||||
interface DialoguePredicate {
|
|
||||||
companion object {
|
|
||||||
val types = mutableMapOf<String, Class<out DialoguePredicate>>()
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun invoke(dialogue: ActiveDialogue): Boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExpressionLikeDialoguePredicate(val expression: ExpressionLike = "true".asExpressionLike()) : DialoguePredicate {
|
|
||||||
override fun invoke(dialogue: ActiveDialogue) = dialogue.runtime.resolveBoolean(expression)
|
|
||||||
}
|
|
||||||
|
|
||||||
class FunctionDialoguePredicate(val predicate: (ActiveDialogue) -> Boolean = { true }) : DialoguePredicate {
|
|
||||||
override fun invoke(dialogue: ActiveDialogue) = predicate(dialogue)
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.text.text
|
|
||||||
import net.minecraft.text.MutableText
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A kind of speaker in a dialogue. They include a name and a face, each optional.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since January 1st, 2024
|
|
||||||
*/
|
|
||||||
class DialogueSpeaker(
|
|
||||||
val name: DialogueText? = null,
|
|
||||||
val face: DialogueFaceProvider? = null
|
|
||||||
) {
|
|
||||||
fun of(name: MutableText = "".text(), face: DialogueFaceProvider? = null) = DialogueSpeaker(WrappedDialogueText(name), face)
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
import com.cobblemon.mod.common.api.text.text
|
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.resolveString
|
|
||||||
import net.minecraft.text.MutableText
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some kind of text-resolving property. This is to hide where sometimes we want literals,
|
|
||||||
* sometimes we want the text to come from a function, and sometimes we want it to be the
|
|
||||||
* product of a MoLang script.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 29th, 2023
|
|
||||||
*/
|
|
||||||
interface DialogueText {
|
|
||||||
companion object {
|
|
||||||
val types = mutableMapOf<String, Class<out DialogueText>>(
|
|
||||||
"expression" to ExpressionLikeDialogueText::class.java,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun invoke(activeDialogue: ActiveDialogue): MutableText
|
|
||||||
}
|
|
||||||
|
|
||||||
class FunctionDialogueText(val function: (ActiveDialogue) -> MutableText = { "".text() }) : DialogueText {
|
|
||||||
override fun invoke(activeDialogue: ActiveDialogue) = function(activeDialogue)
|
|
||||||
}
|
|
||||||
|
|
||||||
class WrappedDialogueText(val text: MutableText = "".text()) : DialogueText {
|
|
||||||
override fun invoke(activeDialogue: ActiveDialogue) = text.copy()
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExpressionLikeDialogueText(val expression: ExpressionLike = "''".asExpressionLike()) : DialogueText {
|
|
||||||
override fun invoke(activeDialogue: ActiveDialogue): MutableText {
|
|
||||||
return activeDialogue.runtime.resolveString(expression).text()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue
|
|
||||||
|
|
||||||
import com.bedrockk.molang.Expression
|
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.input.DialogueInput
|
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
|
||||||
import com.cobblemon.mod.common.util.adapters.DialogueActionAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.DialogueFaceProviderAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.DialogueInputAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.DialoguePredicateAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.DialogueTextAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.ExpressionLikeAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
|
||||||
import com.cobblemon.mod.common.util.adapters.TextAdapter
|
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
|
||||||
import com.google.gson.GsonBuilder
|
|
||||||
import com.google.gson.reflect.TypeToken
|
|
||||||
import net.minecraft.resource.ResourceType
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity
|
|
||||||
import net.minecraft.text.MutableText
|
|
||||||
import net.minecraft.text.Text
|
|
||||||
import net.minecraft.util.Identifier
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registry for dialogue data.
|
|
||||||
*
|
|
||||||
* @see Dialogue
|
|
||||||
* @since December 29th, 2023
|
|
||||||
* @author Hiroku
|
|
||||||
*/
|
|
||||||
object Dialogues : JsonDataRegistry<Dialogue> {
|
|
||||||
override val id = cobblemonResource("dialogues")
|
|
||||||
override val type = ResourceType.SERVER_DATA
|
|
||||||
override val observable = SimpleObservable<Dialogues>()
|
|
||||||
|
|
||||||
val dialogues = mutableMapOf<Identifier, Dialogue>()
|
|
||||||
/** If you need custom adapters registered, subscribe to this and register them. */
|
|
||||||
val gsonObservable: SimpleObservable<GsonBuilder> = SimpleObservable()
|
|
||||||
|
|
||||||
override fun sync(player: ServerPlayerEntity) {}
|
|
||||||
|
|
||||||
override val gson = GsonBuilder()
|
|
||||||
.registerTypeAdapter(DialogueAction::class.java, DialogueActionAdapter)
|
|
||||||
.registerTypeAdapter(DialoguePredicate::class.java, DialoguePredicateAdapter)
|
|
||||||
.registerTypeAdapter(DialogueInput::class.java, DialogueInputAdapter)
|
|
||||||
.registerTypeAdapter(DialogueFaceProvider::class.java, DialogueFaceProviderAdapter)
|
|
||||||
.registerTypeAdapter(DialogueText::class.java, DialogueTextAdapter)
|
|
||||||
.registerTypeAdapter(Expression::class.java, ExpressionAdapter)
|
|
||||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
|
||||||
.registerTypeAdapter(MutableText::class.java, TextAdapter)
|
|
||||||
.registerTypeAdapter(Identifier::class.java, IdentifierAdapter)
|
|
||||||
.also { gsonObservable.emit(it) }
|
|
||||||
.create()
|
|
||||||
|
|
||||||
override val typeToken = TypeToken.get(Dialogue::class.java)
|
|
||||||
override val resourcePath = "dialogues"
|
|
||||||
|
|
||||||
override fun reload(data: Map<Identifier, Dialogue>) {
|
|
||||||
dialogues.putAll(data)
|
|
||||||
observable.emit(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue.input
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.ActiveDialogue
|
|
||||||
import com.cobblemon.mod.common.util.server
|
|
||||||
import java.util.UUID
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An active input waiting for the player as part of an [ActiveDialogue]. The purpose of this is to
|
|
||||||
* maintain some data integrity and track how long it's taken to choose an action.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
class ActiveInput(
|
|
||||||
val activeDialogue: ActiveDialogue,
|
|
||||||
val dialogueInput: DialogueInput
|
|
||||||
) {
|
|
||||||
val inputId = UUID.randomUUID()
|
|
||||||
val startTime = server()!!.overworld.time
|
|
||||||
|
|
||||||
val struct = toMoLangStruct()
|
|
||||||
|
|
||||||
fun handle(input: String) {
|
|
||||||
val secondsToChoose = (server()!!.overworld.time - startTime) / 20F
|
|
||||||
activeDialogue.runtime.environment.setSimpleVariable("seconds_taken_to_input", DoubleValue(secondsToChoose))
|
|
||||||
dialogueInput.handle(this, input)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toMoLangStruct(): MoValue {
|
|
||||||
return dialogueInput.toMoLangStruct(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-43
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue.input
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.DialogueAction
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.FunctionDialogueAction
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Input that has no input but has an action that will run after a delay.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
class DialogueAutoContinueInput : DialogueInput {
|
|
||||||
val delay = 5F
|
|
||||||
/** Whether the player can click to move on in a hurry or if they must wait. */
|
|
||||||
var allowSkip = true
|
|
||||||
var showTimer = false
|
|
||||||
val action: DialogueAction = FunctionDialogueAction { dialogue, _ -> dialogue.incrementPage() }
|
|
||||||
|
|
||||||
override var timeout: DialogueTimeout?
|
|
||||||
get() = DialogueTimeout(duration = delay, showTimer = showTimer, action)
|
|
||||||
set(_) {}
|
|
||||||
|
|
||||||
override fun toMoLangStruct(activeInput: ActiveInput) = QueryStruct(hashMapOf())
|
|
||||||
|
|
||||||
|
|
||||||
override fun handle(activeInput: ActiveInput, value: String) {
|
|
||||||
if (!allowSkip) {
|
|
||||||
return Cobblemon.LOGGER.warn("A no-skip dialogue received input from ${activeInput.activeDialogue.playerEntity.gameProfile.name}, is this person a hacker or something")
|
|
||||||
}
|
|
||||||
|
|
||||||
action.invoke(activeInput.activeDialogue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue.input
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.MoStruct
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.DialoguePage
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A type of input to [DialoguePage]s. This is sealed because the client needs to know about it. Sorry.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
*/
|
|
||||||
sealed interface DialogueInput {
|
|
||||||
var timeout: DialogueTimeout?
|
|
||||||
fun toMoLangStruct(activeInput: ActiveInput): MoStruct
|
|
||||||
fun handle(activeInput: ActiveInput, value: String)
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.dialogue.input
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.VariableStruct
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.DialogueAction
|
|
||||||
import com.cobblemon.mod.common.api.dialogue.FunctionDialogueAction
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An input type that's really just waiting for the player to click or something.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since December 27th, 2023
|
|
||||||
|
|
||||||
*/
|
|
||||||
class DialogueNoInput(
|
|
||||||
var action: DialogueAction = FunctionDialogueAction { dialogue, _ -> dialogue.incrementPage() }
|
|
||||||
) : DialogueInput {
|
|
||||||
override var timeout: DialogueTimeout?
|
|
||||||
get() = null
|
|
||||||
set(_) {}
|
|
||||||
|
|
||||||
override fun toMoLangStruct(activeInput: ActiveInput) = VariableStruct()
|
|
||||||
override fun handle(activeInput: ActiveInput, value: String) {
|
|
||||||
action(activeInput.activeDialogue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loaded 100 of 11415 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user