diff --git a/.github/ISSUE_TEMPLATE/10-bug-report.yaml b/.github/ISSUE_TEMPLATE/10-bug-report.yaml index 1410675e33e..0707c94662b 100644 --- a/.github/ISSUE_TEMPLATE/10-bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/10-bug-report.yaml @@ -12,7 +12,7 @@ body: required: true - type: checkboxes attributes: - label: Are you using the latest MineColonies Verison? + label: Are you using the latest MineColonies Version? description: Please check to see if any newer version fixes the issue you're experiencing. options: - label: I am running the latest **alpha** version of MineColonies for my Minecraft version. @@ -24,11 +24,17 @@ body: options: - label: I checked the MineColonies Wiki and made sure my issue is not covered there. Or I was sent from discord to open an issue here. required: true + - type: checkboxes + attributes: + label: What were you playing at the time? Were you able to reproduce it in both settings? + options: + - label: Single Player + - label: Multi Player - type: dropdown attributes: label: Minecraft Version description: Minecraft Version - options: [1.16, 1.18] + options: [1.19.2, 1.20.1] validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/11-log-report.yaml b/.github/ISSUE_TEMPLATE/11-log-report.yaml index 9e51e0ddc03..183911f80c0 100644 --- a/.github/ISSUE_TEMPLATE/11-log-report.yaml +++ b/.github/ISSUE_TEMPLATE/11-log-report.yaml @@ -12,7 +12,7 @@ body: required: true - type: checkboxes attributes: - label: Are you using the latest MineColonies Verison? + label: Are you using the latest MineColonies Version? description: Please check to see if any newer version fixes the issue you're experiencing. options: - label: I am running the latest **alpha** version of MineColonies for my Minecraft version. @@ -28,7 +28,7 @@ body: attributes: label: Minecraft Version description: Minecraft Version - options: [1.16, 1.18] + options: [1.18, 1.19, 1.20] validations: required: true - type: input diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index afc1c6e3868..1511ee2501a 100755 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -7,4 +7,8 @@ Closes # - - + +[ ] Yes I tested this before submitting it. +[ ] I also did a multiplayer test. + Review please diff --git a/.teamcity/patches/buildTypes/Branches_Build.kts b/.teamcity/patches/buildTypes/Branches_Build.kts new file mode 100644 index 00000000000..109f17bbd26 --- /dev/null +++ b/.teamcity/patches/buildTypes/Branches_Build.kts @@ -0,0 +1,39 @@ +package patches.buildTypes + +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle +import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* + +/* +This patch script was generated by TeamCity on settings change in UI. +To apply the patch, change the buildType with id = 'Branches_Build' +accordingly, and delete the patch script. +*/ +changeBuildType(RelativeId("Branches_Build")) { + expectSteps { + gradle { + name = "Compile" + id = "RUNNER_9" + tasks = "build" + buildFile = "build.gradle" + gradleParams = "-x test" + enableStacktrace = true + param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseText", "%Project.Type%") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionNumberOfBuilds", "300") + param("org.jfrog.artifactory.selectedDeployableServer.publishBuildInfo", "true") + param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") + param("org.jfrog.artifactory.selectedDeployableServer.urlId", "2") + param("org.jfrog.artifactory.selectedDeployableServer.envVarsExcludePatterns", "*password*,*secret*") + param("org.jfrog.artifactory.selectedDeployableServer.resolvingRepo", "modding") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetention", "true") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionDeleteArtifacts", "true") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionMaxDays", "150") + param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseFlag", "true") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionAsync", "true") + param("org.jfrog.artifactory.selectedDeployableServer.targetRepo", "libraries") + } + } + steps { + items.removeAt(0) + } +} diff --git a/.teamcity/patches/vcsRoots/Configuration.kts b/.teamcity/patches/vcsRoots/Configuration.kts new file mode 100644 index 00000000000..adab52c8529 --- /dev/null +++ b/.teamcity/patches/vcsRoots/Configuration.kts @@ -0,0 +1,22 @@ +package patches.vcsRoots + +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* +import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot + +/* +This patch script was generated by TeamCity on settings change in UI. +To apply the patch, create a vcsRoot with id = 'Configuration' +in the root project, and delete the patch script. +*/ +create(DslContext.projectId, GitVcsRoot({ + id("Configuration") + name = "Configuration" + url = "https://github.com/ldtteam/minecolonies.git" + branch = "version/main" + authMethod = password { + userName = "git" + password = "credentialsJSON:0ab5d46b-ca88-4fa8-93d2-163fe135b15a" + } +})) + diff --git a/.teamcity/settings.kts b/.teamcity/settings.kts index 7a1e2bed09a..4906e6db539 100644 --- a/.teamcity/settings.kts +++ b/.teamcity/settings.kts @@ -29,7 +29,7 @@ To debug in IntelliJ Idea, open the 'Maven Projects' tool window (View 'Debug' option is available in the context menu for the task. */ -version = "2021.2" +version = "2022.04" project { description = "The Minecolonies Minecraft Mod" @@ -41,9 +41,9 @@ project { param("env.Version.Suffix", "") param("env.Version.Major", "1") text("env.Version", "%env.Version.Major%.%env.Version.Minor%.%env.Version.Patch%%env.Version.Suffix%", label = "Version", description = "The version of the project.", display = ParameterDisplay.HIDDEN, allowEmpty = true) - param("Current Minecraft Version", "1.18.1") + param("Current Minecraft Version", "main") text("Repository", "ldtteam/minecolonies", label = "Repository", description = "The repository for minecolonies.", readOnly = true, allowEmpty = true) - param("env.Version.Minor", "0") + param("env.Version.Minor", "1") param("Upsource.Project.Id", "minecolonies") param("Default.Branch", "version/main") param("env.GRADLE_VERSION", "7.3") @@ -60,36 +60,36 @@ project { } } } - subProjectsOrder = arrayListOf(RelativeId("UpgradeBetaRelease"), RelativeId("UpgradeAlphaBeta"), RelativeId("Alpha"), RelativeId("OfficialPublications"), RelativeId("Branches"), RelativeId("PullRequests_2")) + subProjectsOrder = arrayListOf(RelativeId("Release"), RelativeId("UpgradeBetaRelease"), RelativeId("Beta"), RelativeId("OfficialPublications"), RelativeId("Branches"), RelativeId("PullRequests_2")) - subProject(Alpha) - subProject(UpgradeAlphaBeta) + subProject(Release) + subProject(UpgradeBetaRelease) + subProject(Beta) subProject(OfficialPublications) subProject(Branches) - subProject(UpgradeBetaRelease) subProject(PullRequests_2) } +object Beta : Project({ + name = "Beta" + description = "Beta version builds of minecolonies" -object Alpha : Project({ - name = "Alpha" - description = "Alpha version builds of minecolonies" - - buildType(Alpha_Release) + buildType(Beta_Release) params { - text("env.crowdinKey", "credentialsJSON:57fbe4f4-13dd-4c72-b6b3-3cc1e3a8240e", label = "Crowdin key", description = "The API key for crowdin to pull translations", allowEmpty = true) + text("env.crowdinKey", "credentialsJSON:ce949f49-133c-4bb1-83d7-257c570d43aa", label = "Crowdin key", description = "The API key for crowdin to pull translations", allowEmpty = true) + param("Current Minecraft Version", "main") param("Default.Branch", "version/%Current Minecraft Version%") param("VCS.Branches", "+:refs/heads/version/(*)") - param("env.CURSERELEASETYPE", "alpha") - param("env.Version.Suffix", "-ALPHA") + param("env.CURSERELEASETYPE", "beta") + param("env.Version.Suffix", "-BETA") } }) -object Alpha_Release : BuildType({ +object Beta_Release : BuildType({ templates(AbsoluteId("LetSDevTogether_BuildWithRelease")) name = "Release" - description = "Releases the mod as Alpha to CurseForge" + description = "Releases the mod as Beta to CurseForge" allowExternalStatus = true @@ -97,6 +97,10 @@ object Alpha_Release : BuildType({ param("env.Version.Patch", "${OfficialPublications_CommonB.depParamRefs.buildNumber}") } + vcs { + branchFilter = "+:*" + } + steps { gradle { name = "Compile" @@ -104,12 +108,6 @@ object Alpha_Release : BuildType({ tasks = "build createChangelog curseforge publish" buildFile = "build.gradle" enableStacktrace = true - dockerImagePlatform = GradleBuildStep.ImagePlatform.Linux - dockerImage = "gradle:%env.GRADLE_VERSION%-%env.JDK_VERSION%" - dockerRunParameters = """ - -v /opt/buildagent/gradle/caches:/home/gradle/.gradle/caches - -u 0 - """.trimIndent() param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseText", "%Project.Type%") param("org.jfrog.artifactory.selectedDeployableServer.publishBuildInfo", "true") param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") @@ -119,30 +117,75 @@ object Alpha_Release : BuildType({ param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseFlag", "true") param("org.jfrog.artifactory.selectedDeployableServer.targetRepo", "libraries") } + stepsOrder = arrayListOf("RUNNER_85", "RUNNER_9") + } + + features { + vcsLabeling { + id = "BUILD_EXT_11" + vcsRootId = "${DslContext.settingsRoot.id}" + labelingPattern = "%env.Version%" + successfulOnly = true + branchFilter = "" + } + } + + dependencies { + snapshot(OfficialPublications_CommonB) { + reuseBuilds = ReuseBuilds.NO + onDependencyFailure = FailureAction.FAIL_TO_START + } + } +}) + +object Release : Project({ + name = "Release" + description = "Release version builds of minecolonies" + + buildType(Release_Release) + + params { + text("env.crowdinKey", "credentialsJSON:ce949f49-133c-4bb1-83d7-257c570d43aa", label = "Crowdin key", description = "The API key for crowdin to pull translations", allowEmpty = true) + param("Current Minecraft Version", "main") + param("Default.Branch", "release/%Current Minecraft Version%") + param("VCS.Branches", "+:refs/heads/release/(*)") + param("env.CURSERELEASETYPE", "release") + param("env.Version.Suffix", "-RELEASE") + } +}) + +object Release_Release : BuildType({ + templates(AbsoluteId("LetSDevTogether_BuildWithRelease")) + name = "Release" + description = "Releases the mod as Release to CurseForge" + + allowExternalStatus = true + + params { + param("env.Version.Patch", "${OfficialPublications_CommonB.depParamRefs.buildNumber}") + } + + vcs { + branchFilter = "+:*" + } + + steps { gradle { - name = "Analyze" - id = "RUNNER_144" - tasks = "sonarqube" + name = "Compile" + id = "RUNNER_9" + tasks = "build createChangelog curseforge publish" buildFile = "build.gradle" - gradleParams = "-Dsonar.projectKey=ldtteam_minecolonies -Dsonar.host.url=https://code-analysis.ldtteam.com -Dsonar.login=%sonarqube.token%" enableStacktrace = true - dockerImagePlatform = GradleBuildStep.ImagePlatform.Linux - dockerImage = "gradle:%env.GRADLE_VERSION%-%env.JDK_VERSION%" - dockerRunParameters = """ - -v /opt/buildagent/gradle/caches:/home/gradle/.gradle/caches - -u 0 - """.trimIndent() param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseText", "%Project.Type%") - param("org.jfrog.artifactory.selectedDeployableServer.useM2CompatiblePatterns", "true") param("org.jfrog.artifactory.selectedDeployableServer.publishBuildInfo", "true") param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") - param("org.jfrog.artifactory.selectedDeployableServer.buildDependencies", "Requires Artifactory Pro.") + param("org.jfrog.artifactory.selectedDeployableServer.urlId", "2") param("org.jfrog.artifactory.selectedDeployableServer.envVarsExcludePatterns", "*password*,*secret*") - param("org.jfrog.artifactory.selectedDeployableServer.publishMavenDescriptors", "true") - param("org.jfrog.artifactory.selectedDeployableServer.publishIvyDescriptors", "true") + param("org.jfrog.artifactory.selectedDeployableServer.resolvingRepo", "modding") param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseFlag", "true") + param("org.jfrog.artifactory.selectedDeployableServer.targetRepo", "libraries") } - stepsOrder = arrayListOf("RUNNER_85", "RUNNER_9", "RUNNER_144") + stepsOrder = arrayListOf("RUNNER_85", "RUNNER_9") } features { @@ -153,17 +196,6 @@ object Alpha_Release : BuildType({ successfulOnly = true branchFilter = "" } - commitStatusPublisher { - id = "BUILD_EXT_15" - enabled = false - vcsRootExtId = "${DslContext.settingsRoot.id}" - publisher = upsource { - serverUrl = "https://code-analysis.ldtteam.com" - projectId = "%Upsource.Project.Id%" - userName = "upsource" - password = "credentialsJSON:f19631a7-1bc1-4a66-88a0-dc2b9cd36734" - } - } } dependencies { @@ -187,7 +219,6 @@ object Branches : Project({ param("VCS.Branches", """ +:refs/heads/(*) -:refs/heads/version/* - -:refs/heads/testing/* -:refs/heads/release/* -:refs/pull/*/head -:refs/heads/CI/* @@ -205,13 +236,37 @@ object Branches : Project({ object Branches_Build : BuildType({ templates(AbsoluteId("LetSDevTogether_Build")) name = "Build" - description = "Builds the branch without testing." + description = "Builds the branch without version." params { param("Project.Type", "mods") param("env.Version.Patch", "${Branches_Common.depParamRefs.buildNumber}") } + steps { + gradle { + name = "Compile" + id = "RUNNER_9" + tasks = "build" + buildFile = "build.gradle" + gradleParams = "-x test" + enableStacktrace = true + param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseText", "%Project.Type%") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionNumberOfBuilds", "300") + param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetention", "true") + param("org.jfrog.artifactory.selectedDeployableServer.deployReleaseFlag", "true") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionAsync", "true") + param("org.jfrog.artifactory.selectedDeployableServer.targetRepo", "libraries") + param("org.jfrog.artifactory.selectedDeployableServer.publishBuildInfo", "true") + param("org.jfrog.artifactory.selectedDeployableServer.urlId", "2") + param("org.jfrog.artifactory.selectedDeployableServer.envVarsExcludePatterns", "*password*,*secret*") + param("org.jfrog.artifactory.selectedDeployableServer.resolvingRepo", "modding") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionDeleteArtifacts", "true") + param("org.jfrog.artifactory.selectedDeployableServer.buildRetentionMaxDays", "150") + } + } + triggers { vcs { id = "vcsTrigger" @@ -224,7 +279,7 @@ object Branches_Build : BuildType({ onDependencyFailure = FailureAction.FAIL_TO_START } } - + disableSettings("BUILD_EXT_14") }) @@ -303,7 +358,7 @@ object PullRequests_2_BuildAndTest : BuildType({ onDependencyFailure = FailureAction.FAIL_TO_START } } - + disableSettings("BUILD_EXT_15") }) @@ -313,42 +368,6 @@ object PullRequests_2_CommonBuildCounter : BuildType({ description = "Defines version numbers uniquely over all Pull Request builds" }) - -object UpgradeAlphaBeta : Project({ - name = "Upgrade - Alpha -> Beta" - description = "Updates the current alpha to beta." - - buildType(Beta_UpgradeAlphaBeta) -}) - -object Beta_UpgradeAlphaBeta : BuildType({ - templates(AbsoluteId("LetSDevTogether_Upgrade")) - name = "Upgrade - Alpha -> Beta" - description = "Upgrades the current Alpha to Beta." - - params { - param("Source.Branch", "version") - param("Default.Branch", "testing/%Current Minecraft Version%") - param("VCS.Branches", "+:refs/heads/testing/(*)") - param("Target.Branch", "testing") - param("env.Version", "%env.Version.Major%.%env.Version.Minor%.%build.counter%-BETA") - } - - triggers { - schedule { - id = "TRIGGER_1" - schedulingPolicy = weekly { - timezone = "Europe/Berlin" - } - triggerBuild = always() - param("revisionRuleBuildBranch", "") - } - } - - disableSettings("BUILD_EXT_9") -}) - - object UpgradeBetaRelease : Project({ name = "Upgrade Beta -> Release" description = "Upgrades the current Beta to Release" @@ -362,7 +381,7 @@ object UpgradeBetaRelease_UpgradeBetaRelease : BuildType({ description = "Upgrades the current Beta to Release." params { - param("Source.Branch", "testing") + param("Source.Branch", "version") param("Default.Branch", "release/%Current Minecraft Version%") param("VCS.Branches", "+:refs/heads/release/(*)") param("Target.Branch", "release") diff --git a/README.md b/README.md index a3f584c5f8a..594e1f6b0a5 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://buildsystem.ldtteam.com/app/rest/builds/buildType:LetSDevTogether_Minecolonies_Alpha_Release/statusIcon)](http://buildsystem.ldtteam.com/) [![Crowdin](https://badges.crowdin.net/minecolonies/localized.svg)](https://crowdin.com/project/minecolonies) -![mcol logo](minecolonies.png) +![mcol logo](minecolonies_logo.png) # MineColonies @@ -41,6 +41,24 @@ MineColonies crashes every time? Have a suggestion? Found a bug? Create an issue ## For Developers +### Adding MineColonies as a dependency + +In Forge, add the following to your `build.gradle`: + +```gradle +repositories { + maven { url 'https://ldtteam.jfrog.io/ldtteam/modding' } +} + +dependencies { + implementation fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") + implementation fg.deobf("com.ldtteam:structurize:${structurize_version}") + implementation fg.deobf("com.ldtteam:multi-piston:${multipiston_version}") + implementation fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") + implementation fg.deobf("com.ldtteam:blockui:${blockui_version}") +} +``` + ### Compiling MineColonies IMPORTANT: Please report any issues you have, as there might be some problems with the documentation! Also make sure you know EXACTLY what you're doing! It's not our fault if your OS crashes, becomes corrupted, etc. diff --git a/build.gradle b/build.gradle index 652b72ad1ee..375a2b882ef 100755 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true classpath "gradle.plugin.com.github.jengelman.gradle.plugins:shadow:7.0.0" classpath "gradle.plugin.com.matthewprenger:CurseGradle:1.4.0" classpath 'de.undercouch:gradle-download-task:4.1.2' @@ -39,3 +39,6 @@ minecraft.runs.all { } } +project.tasks.getByName("processResources", {task -> + task.duplicatesStrategy 'include' +}) diff --git a/gradle.properties b/gradle.properties index c66a90fc2ff..a19a51111ac 100755 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ fml_range=[38,) forge_range=[41.1.0,) #The currently running forge. -forgeVersion=43.1.2 +forgeVersion=43.2.0 #The minimal needed forge, as marked in metadata and curseforge. forgeMinVersion=41.1.0 @@ -27,18 +27,20 @@ mappingsChannel=official mappingsVersion=1.19.2 dataGeneratorsVersion=0.1.48-ALPHA -blockUI_version=1.19-0.0.64-ALPHA -structurize_version=1.19.2-1.0.471-ALPHA -domumOrnamentumVersion=1.19-1.0.58-ALPHA -multiPistonVersion=1.19-1.2.14-ALPHA +blockUI_version=1.19.2-0.0.102-ALPHA +structurize_version=1.19.2-1.0.649-BETA +domumOrnamentumVersion=1.19-1.0.141-BETA +multiPistonVersion=1.19.2-1.2.21-ALPHA jei_mcversion=1.19 jei_version=11.1.1.239 -jmapApiVersion=1.19-1.8-SNAPSHOT -jmapMcVersion=1.19 -jmapVersion=5.8.5rc1-forge +jmapApiVersion=1.19.1-1.9-SNAPSHOT +jmapMcVersion=1.19.2 +jmapVersion=5.9.7 tinkersConstructVersion=3.5.0.17 mantleVersion=1.9.20 +dynamicTreesVersion=1.1.0-BETA10 + # some mods include the MC version as part of their "real" version number, others # store them separately (even if they look like they're included in the filename). # it's important to get them the right way around for mods.toml to work properly. @@ -56,7 +58,7 @@ projectUrl=https://www.curseforge.com/minecraft/mc-mods/minecolonies curseId=245506 usesCurse=true -requiredCurseDependencies=structurize;domum-ornamentum;blockui;multi-piston +requiredCurseDependencies=structurize;domum-ornamentum;blockui;multi-piston;towntalk usesCrowdin=false crowdinId=minecolonies @@ -70,12 +72,13 @@ projectHasApi=true primaryJarClassifier= isFMLLibrary=false -mainExcludedResources=assets/minecolonies/lang/default.json -mainIncludedResources=src/main/generated/resources +extendDefaultSourceSetConfiguration=true +mainExcludedResources=assets/minecolonies/lang/manual_en_us.json;assets/minecolonies/lang/default.json;assets/minecolonies/lang/quests.json usesMergableTranslations=true translationMergeSources[0]=src/main/resources/assets/minecolonies/lang/manual_en_us.json translationMergeSources[1]=src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json +translationMergeSources[2]=src/datagen/generated/minecolonies/assets/minecolonies/lang/quests.json translationMergeDestination[0]=src/main/resources/assets/minecolonies/lang/entries.json translationMergeDestination[1]=src/main/resources/assets/minecolonies/lang/en_us.json diff --git a/gradle/configuration.gradle b/gradle/configuration.gradle index 0fd54502f2c..ba24753b82c 100644 --- a/gradle/configuration.gradle +++ b/gradle/configuration.gradle @@ -8,4 +8,5 @@ project.ext.customChangelogHeader = "\n" + "### Optional Dependencies\n" + "- JEI: ${project.jei_version} (or above)\n" + "- Journeymap: ${project.jmapVersion} (or above)\n" + + "- Dynamic Trees: ${project.dynamicTreesVersion} (or above)\n" + "\n" \ No newline at end of file diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index bb3b69a1267..8ba61649a44 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -1,10 +1,6 @@ repositories { mavenLocal() mavenCentral() - maven { - name "JEI" - url 'https://dvs1.progwml6.com/files/maven/' - } maven { name "JourneyMap" url "https://jm.gserv.me/repository/maven-public/" @@ -13,6 +9,10 @@ repositories { name "Rei" url "https://maven.shedaniel.me/" } + maven { + name "For dynamic trees" + url "https://harleyoconnor.com/maven" + } } dependencies { @@ -40,7 +40,7 @@ dependencies { transitive = false } - implementation (fg.deobf("com.ldtteam:multi-piston:${project.multiPistonVersion}")){ + implementation (fg.deobf("com.ldtteam:multipiston:${project.multiPistonVersion}")){ transitive = false } @@ -59,8 +59,12 @@ dependencies { compileOnly fg.deobf("info.journeymap:journeymap-api:${project.jmapApiVersion}") if (project.hasProperty("runWithJourneymap") && project.runWithJourneymap.toBoolean()) { - runtimeOnly fg.deobf("flat:journeymap:${project.jmapMcVersion}-${project.jmapVersion}") + runtimeOnly fg.deobf("flat:journeymap:${project.jmapMcVersion}-${project.jmapVersion}-forge") } + + compileOnly fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-${project.exactMinecraftVersion}:${project.dynamicTreesVersion}") + apiCompileOnly fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-${project.exactMinecraftVersion}:${project.dynamicTreesVersion}") + // replace "compileOnly" with "library" when you want to include it for testing // compileOnly fg.deobf("slimeknights.tconstruct:TConstruct:${project.exactMinecraftVersion}-${project.tinkersConstructVersion}") // compileOnly fg.deobf("slimeknights.mantle:Mantle:${project.exactMinecraftVersion}-${project.mantleVersion}") diff --git a/gradle/lang.gradle b/gradle/lang.gradle deleted file mode 100644 index 274b4c365be..00000000000 --- a/gradle/lang.gradle +++ /dev/null @@ -1,15 +0,0 @@ -import groovy.json.* - -processResources { - - doLast { - if(project.rootProject.file('src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json').exists()) { - def slurper = new JsonSlurper() - def standard = slurper.parse(project.rootProject.file('src/main/resources/assets/minecolonies/lang/en_us.json'), 'UTF-8') - def generated = slurper.parse(project.rootProject.file('src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json'), 'UTF-8') - - standard += generated - project.rootProject.file('build/resources/main/assets/minecolonies/lang/en_us.json').write(JsonOutput.prettyPrint(JsonOutput.toJson(standard)), 'UTF-8') - } - } -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4..943f0cbfa75 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fceae6..37aef8d3f0c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/minecolonies.png b/minecolonies.png deleted file mode 100644 index 20c83f371f7..00000000000 Binary files a/minecolonies.png and /dev/null differ diff --git a/minecolonies_logo.png b/minecolonies_logo.png new file mode 100644 index 00000000000..883cd7eebff Binary files /dev/null and b/minecolonies_logo.png differ diff --git a/src/api/java/com/minecolonies/api/IMinecoloniesAPI.java b/src/api/java/com/minecolonies/api/IMinecoloniesAPI.java index ce12cdb09c7..a4072e4924e 100755 --- a/src/api/java/com/minecolonies/api/IMinecoloniesAPI.java +++ b/src/api/java/com/minecolonies/api/IMinecoloniesAPI.java @@ -7,6 +7,7 @@ import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventDescriptionTypeRegistryEntry; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventTypeRegistryEntry; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.colony.guardtype.GuardType; import com.minecolonies.api.colony.guardtype.registry.IGuardTypeDataManager; import com.minecolonies.api.colony.interactionhandling.registry.IInteractionResponseHandlerDataManager; @@ -18,7 +19,9 @@ import com.minecolonies.api.crafting.registry.CraftingType; import com.minecolonies.api.crafting.registry.RecipeTypeEntry; import com.minecolonies.api.entity.ai.registry.IMobAIRegistry; +import com.minecolonies.api.entity.citizen.happiness.HappinessRegistry; import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry; +import com.minecolonies.api.quests.registries.QuestRegistries; import com.minecolonies.api.research.IGlobalResearchTree; import com.minecolonies.api.research.effects.registry.ResearchEffectEntry; import com.minecolonies.api.research.registry.ResearchRequirementEntry; @@ -44,6 +47,8 @@ static IMinecoloniesAPI getInstance() IForgeRegistry getBuildingRegistry(); + IForgeRegistry getFieldRegistry(); + IJobDataManager getJobDataManager(); IForgeRegistry getJobRegistry(); @@ -75,4 +80,16 @@ static IMinecoloniesAPI getInstance() IForgeRegistry getRecipeTypeRegistry(); IForgeRegistry getCraftingTypeRegistry(); + + IForgeRegistry getQuestRewardRegistry(); + + IForgeRegistry getQuestObjectiveRegistry(); + + IForgeRegistry getQuestTriggerRegistry(); + + IForgeRegistry getQuestDialogueAnswerRegistry(); + + IForgeRegistry getHappinessTypeRegistry(); + + IForgeRegistry getHappinessFunctionRegistry(); } diff --git a/src/api/java/com/minecolonies/api/MinecoloniesAPIProxy.java b/src/api/java/com/minecolonies/api/MinecoloniesAPIProxy.java index cdd0351122d..3207a9ec789 100755 --- a/src/api/java/com/minecolonies/api/MinecoloniesAPIProxy.java +++ b/src/api/java/com/minecolonies/api/MinecoloniesAPIProxy.java @@ -7,6 +7,7 @@ import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventDescriptionTypeRegistryEntry; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventTypeRegistryEntry; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.colony.guardtype.GuardType; import com.minecolonies.api.colony.guardtype.registry.IGuardTypeDataManager; import com.minecolonies.api.colony.interactionhandling.registry.IInteractionResponseHandlerDataManager; @@ -18,7 +19,9 @@ import com.minecolonies.api.crafting.registry.CraftingType; import com.minecolonies.api.crafting.registry.RecipeTypeEntry; import com.minecolonies.api.entity.ai.registry.IMobAIRegistry; +import com.minecolonies.api.entity.citizen.happiness.HappinessRegistry; import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry; +import com.minecolonies.api.quests.registries.QuestRegistries; import com.minecolonies.api.research.IGlobalResearchTree; import com.minecolonies.api.research.effects.registry.ResearchEffectEntry; import com.minecolonies.api.research.registry.ResearchRequirementEntry; @@ -80,6 +83,12 @@ public IForgeRegistry getBuildingRegistry() return apiInstance.getBuildingRegistry(); } + @Override + public IForgeRegistry getFieldRegistry() + { + return apiInstance.getFieldRegistry(); + } + @Override public IJobDataManager getJobDataManager() { @@ -169,4 +178,40 @@ public IForgeRegistry getCraftingTypeRegistry() { return apiInstance.getCraftingTypeRegistry(); } + + @Override + public IForgeRegistry getQuestRewardRegistry() + { + return apiInstance.getQuestRewardRegistry(); + } + + @Override + public IForgeRegistry getQuestObjectiveRegistry() + { + return apiInstance.getQuestObjectiveRegistry(); + } + + @Override + public IForgeRegistry getQuestTriggerRegistry() + { + return apiInstance.getQuestTriggerRegistry(); + } + + @Override + public IForgeRegistry getQuestDialogueAnswerRegistry() + { + return apiInstance.getQuestDialogueAnswerRegistry(); + } + + @Override + public IForgeRegistry getHappinessTypeRegistry() + { + return apiInstance.getHappinessTypeRegistry(); + } + + @Override + public IForgeRegistry getHappinessFunctionRegistry() + { + return apiInstance.getHappinessFunctionRegistry(); + } } diff --git a/src/api/java/com/minecolonies/api/blocks/AbstractBlockHut.java b/src/api/java/com/minecolonies/api/blocks/AbstractBlockHut.java index 7ae8939b97e..663ceaefa64 100755 --- a/src/api/java/com/minecolonies/api/blocks/AbstractBlockHut.java +++ b/src/api/java/com/minecolonies/api/blocks/AbstractBlockHut.java @@ -6,6 +6,7 @@ import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.MinecoloniesAPIProxy; +import com.minecolonies.api.blocks.interfaces.IBuildingBrowsableBlock; import com.minecolonies.api.blocks.interfaces.ITickableBlockMinecolonies; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; @@ -21,6 +22,7 @@ import com.minecolonies.api.tileentities.MinecoloniesTileEntities; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; import com.minecolonies.api.util.*; +import com.minecolonies.api.util.constant.Constants; import com.minecolonies.api.util.constant.TranslationConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.multiplayer.ClientLevel; @@ -414,6 +416,7 @@ public boolean areRequirementsMet(final ClientLevel level, final BlockPos pos, f public List getDesc() { final List desc = new ArrayList<>(); + desc.add(Component.translatable(getBuildingEntry().getTranslationKey())); desc.add(Component.translatable(getBuildingEntry().getTranslationKey() + ".desc")); return desc; } @@ -421,7 +424,7 @@ public List getDesc() @Override public Component getBlueprintDisplayName() { - return Component.translatable("block." + Constants.MOD_ID + "." + getHutName()); + return Component.translatable(getBuildingEntry().getTranslationKey()); } @Override diff --git a/src/api/java/com/minecolonies/api/blocks/AbstractBlockMinecoloniesDirectional.java b/src/api/java/com/minecolonies/api/blocks/AbstractBlockMinecoloniesDirectional.java new file mode 100755 index 00000000000..eee99e25156 --- /dev/null +++ b/src/api/java/com/minecolonies/api/blocks/AbstractBlockMinecoloniesDirectional.java @@ -0,0 +1,29 @@ +package com.minecolonies.api.blocks; + +import com.minecolonies.api.blocks.interfaces.IBlockMinecolonies; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraftforge.registries.IForgeRegistry; + +public abstract class AbstractBlockMinecoloniesDirectional> extends DirectionalBlock implements IBlockMinecolonies +{ + public AbstractBlockMinecoloniesDirectional(final Properties properties) + { + super(properties); + } + + @Override + public void registerBlockItem(final IForgeRegistry registry, final Item.Properties properties) + { + registry.register(getRegistryName(), new BlockItem(this, properties)); + } + + @Override + public B registerBlock(final IForgeRegistry registry) + { + registry.register(getRegistryName(), this); + return (B) this; + } +} diff --git a/src/api/java/com/minecolonies/api/blocks/ModBlocks.java b/src/api/java/com/minecolonies/api/blocks/ModBlocks.java index f5bb5680ff3..bea4e8005ce 100755 --- a/src/api/java/com/minecolonies/api/blocks/ModBlocks.java +++ b/src/api/java/com/minecolonies/api/blocks/ModBlocks.java @@ -75,18 +75,19 @@ public final class ModBlocks * Utility blocks. */ public static AbstractBlockMinecoloniesConstructionTape> blockConstructionTape; - public static AbstractBlockMinecoloniesRack> blockRack; - public static AbstractBlockMinecoloniesGrave> blockGrave; - public static AbstractBlockMinecoloniesNamedGrave> blockNamedGrave; - public static AbstractBlockMinecolonies> blockWayPoint; - public static AbstractBlockBarrel> blockBarrel; - public static AbstractBlockMinecoloniesHorizontal> blockDecorationPlaceholder; - public static AbstractBlockMinecoloniesDefault> blockScarecrow; - public static AbstractBlockMinecolonies> blockCompostedDirt; - public static AbstractColonyFlagBanner> blockColonyBanner; - public static AbstractColonyFlagBanner> blockColonyWallBanner; - public static AbstractBlockGate blockIronGate; - public static AbstractBlockGate blockWoodenGate; + public static AbstractBlockMinecoloniesRack> blockRack; + public static AbstractBlockMinecoloniesGrave> blockGrave; + public static AbstractBlockMinecoloniesNamedGrave> blockNamedGrave; + public static AbstractBlockMinecolonies> blockWayPoint; + public static AbstractBlockBarrel> blockBarrel; + public static AbstractBlockMinecoloniesDirectional> blockDecorationPlaceholder; + public static AbstractBlockMinecoloniesDefault> blockScarecrow; + public static AbstractBlockMinecoloniesHorizontal> blockPlantationField; + public static AbstractBlockMinecolonies> blockCompostedDirt; + public static AbstractColonyFlagBanner> blockColonyBanner; + public static AbstractColonyFlagBanner> blockColonyWallBanner; + public static AbstractBlockGate blockIronGate; + public static AbstractBlockGate blockWoodenGate; /** * Private constructor to hide the implicit public one. @@ -150,6 +151,6 @@ public static AbstractBlockHut[] getHuts() blockSimpleQuarry, blockMediumQuarry, //blockLargeQuarry - }; + }; } } diff --git a/src/api/java/com/minecolonies/api/blocks/decorative/AbstractBlockMinecoloniesConstructionTape.java b/src/api/java/com/minecolonies/api/blocks/decorative/AbstractBlockMinecoloniesConstructionTape.java index 95b91da7625..528b1a7eae7 100755 --- a/src/api/java/com/minecolonies/api/blocks/decorative/AbstractBlockMinecoloniesConstructionTape.java +++ b/src/api/java/com/minecolonies/api/blocks/decorative/AbstractBlockMinecoloniesConstructionTape.java @@ -23,8 +23,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour.Properties; import net.minecraft.world.level.block.state.BlockState; -public abstract class AbstractBlockMinecoloniesConstructionTape> extends AbstractBlockMinecoloniesFalling - implements SimpleWaterloggedBlock +public abstract class AbstractBlockMinecoloniesConstructionTape> extends AbstractBlockMinecoloniesFalling implements SimpleWaterloggedBlock { public static final BooleanProperty NORTH = PipeBlock.NORTH; public static final BooleanProperty EAST = PipeBlock.EAST; diff --git a/src/api/java/com/minecolonies/api/blocks/types/RackType.java b/src/api/java/com/minecolonies/api/blocks/types/RackType.java index f3caa84534b..4881c83fe31 100755 --- a/src/api/java/com/minecolonies/api/blocks/types/RackType.java +++ b/src/api/java/com/minecolonies/api/blocks/types/RackType.java @@ -9,19 +9,22 @@ */ public enum RackType implements StringRepresentable { - DEFAULT("blockrackemptysingle", "emptysingle"), - FULL( "blockrackfullsingle", "fullsingle"), - DEFAULTDOUBLE( "blockrackempty", "empty"), - FULLDOUBLE( "blockrackfull", "full"), - EMPTYAIR( "blockrackair", "dontrender"); + DEFAULT("blockrackemptysingle", "emptysingle", false), + FULL( "blockrackfullsingle", "fullsingle", false), + DEFAULTDOUBLE( "blockrackempty", "empty", true), + FULLDOUBLE( "blockrackfull", "full", true), + EMPTYAIR( "blockrackair", "dontrender", true); private final String name; private final String unlocalizedName; - RackType(final String name, final String unlocalizedName) + private boolean doubleVariant = false; + + RackType(final String name, final String unlocalizedName, final boolean doubleVariant) { this.name = name; this.unlocalizedName = unlocalizedName; + this.doubleVariant = doubleVariant; } @Override @@ -40,6 +43,30 @@ public String getTranslationKey() return this.unlocalizedName; } + public boolean isDoubleVariant() + { + return doubleVariant; + } + + public RackType getInvBasedVariant(final boolean empty) + { + switch (this) + { + case FULL, DEFAULT -> + { + return empty ? DEFAULT : FULL; + } + case DEFAULTDOUBLE, FULLDOUBLE -> + { + return empty ? DEFAULTDOUBLE : FULLDOUBLE; + } + default -> + { + return EMPTYAIR; + } + } + } + @NotNull @Override public String getSerializedName() diff --git a/src/api/java/com/minecolonies/api/client/ModKeyMappings.java b/src/api/java/com/minecolonies/api/client/ModKeyMappings.java new file mode 100644 index 00000000000..5b462202830 --- /dev/null +++ b/src/api/java/com/minecolonies/api/client/ModKeyMappings.java @@ -0,0 +1,40 @@ +package com.minecolonies.api.client; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.common.util.Lazy; +import org.jetbrains.annotations.NotNull; + +/** + * Key mappings + */ +public class ModKeyMappings +{ + private static final String CATEGORY = "key.minecolonies.categories.general"; + + /** + * Toggle + */ + public static final Lazy TOGGLE_GOGGLES = Lazy.of(() -> new KeyMapping("key.minecolonies.toggle_goggles", + KeyConflictContext.IN_GAME, InputConstants.Type.KEYSYM, InputConstants.UNKNOWN.getValue(), CATEGORY)); + + /** + * Register key mappings + */ + public static void register(@NotNull final RegisterKeyMappingsEvent event) + { + event.register(TOGGLE_GOGGLES.get()); + } + + /** + * Private constructor to hide the implicit one. + */ + private ModKeyMappings() + { + /* + * Intentionally left empty. + */ + } +} diff --git a/src/api/java/com/minecolonies/api/client/render/modeltype/ISimpleModelType.java b/src/api/java/com/minecolonies/api/client/render/modeltype/ISimpleModelType.java index a89a1d74636..e5db1fc4846 100755 --- a/src/api/java/com/minecolonies/api/client/render/modeltype/ISimpleModelType.java +++ b/src/api/java/com/minecolonies/api/client/render/modeltype/ISimpleModelType.java @@ -1,6 +1,7 @@ package com.minecolonies.api.client.render.modeltype; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.util.constant.Constants; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,7 @@ public interface ISimpleModelType extends IModelType * * @return The base file name. */ - ResourceLocation getTextureBase(); + String getTextureBase(); /** * The available amount of textures in this model type. @@ -43,17 +44,24 @@ public interface ISimpleModelType extends IModelType */ default ResourceLocation getTexture(@NotNull final AbstractEntityCitizen entityCitizen) { - final String namespace = getTextureBase().getNamespace(); - final String path = getTextureBase().getPath(); final int moddedTextureId = (entityCitizen.getTextureId() % getNumTextures()) + 1; final String textureIdentifier = - path + (entityCitizen.isFemale() ? "female" : "male") + moddedTextureId + entityCitizen.getEntityData().get(DATA_TEXTURE_SUFFIX); - final ResourceLocation modified = new ResourceLocation(namespace, BASE_FOLDER + entityCitizen.getEntityData().get(DATA_STYLE) + "/" + textureIdentifier + ".png"); + getName().getPath() + (entityCitizen.isFemale() ? "female" : "male") + moddedTextureId + entityCitizen.getEntityData().get(DATA_TEXTURE_SUFFIX); + final ResourceLocation modified = new ResourceLocation(Constants.MOD_ID, BASE_FOLDER + entityCitizen.getEntityData().get(DATA_STYLE) + "/" + textureIdentifier + ".png"); if (Minecraft.getInstance().getResourceManager().getResource(modified).isPresent()) { return modified; } - return new ResourceLocation(namespace, BASE_FOLDER + DEFAULT_FOLDER + "/" + textureIdentifier + ".png"); + return new ResourceLocation(Constants.MOD_ID, BASE_FOLDER + DEFAULT_FOLDER + "/" + textureIdentifier + ".png"); + } + + default ResourceLocation getTextureIcon(@NotNull final AbstractEntityCitizen entityCitizen) + { + final int moddedTextureId = (entityCitizen.getTextureId() % getNumTextures()) + 1; + final String textureIdentifier = + getTextureBase() + (entityCitizen.isFemale() ? "female" : "male") + moddedTextureId + entityCitizen.getEntityData() + .get(DATA_TEXTURE_SUFFIX); + return new ResourceLocation(Constants.MOD_ID, "textures/entity_icon/citizen/" + entityCitizen.getEntityData().get(DATA_STYLE) + "/" + textureIdentifier + ".png"); } } diff --git a/src/api/java/com/minecolonies/api/client/render/modeltype/SimpleModelType.java b/src/api/java/com/minecolonies/api/client/render/modeltype/SimpleModelType.java index 38aa2ef3c82..2681a37d6c5 100644 --- a/src/api/java/com/minecolonies/api/client/render/modeltype/SimpleModelType.java +++ b/src/api/java/com/minecolonies/api/client/render/modeltype/SimpleModelType.java @@ -47,9 +47,9 @@ public ResourceLocation getName() } @Override - public ResourceLocation getTextureBase() + public String getTextureBase() { - return name; + return name.getPath(); } @Override diff --git a/src/api/java/com/minecolonies/api/colony/GraveData.java b/src/api/java/com/minecolonies/api/colony/GraveData.java index d5cd4665506..a9fb0629009 100644 --- a/src/api/java/com/minecolonies/api/colony/GraveData.java +++ b/src/api/java/com/minecolonies/api/colony/GraveData.java @@ -96,9 +96,9 @@ public void setCitizenJobName(@Nullable final String citizenJobName) @Override public void read(CompoundTag compound) { - citizenDataNBT = compound.getAllKeys().contains(TAG_CITIZEN_NBT) ? compound.getCompound(TAG_CITIZEN_NBT) : null; - citizenName = compound.getAllKeys().contains(TAG_CITIZEN_NAME) ? compound.getString(TAG_CITIZEN_NAME) : null; - citizenJobName = compound.getAllKeys().contains(TAG_CITIZEN_JOB_NAME) ? compound.getString(TAG_CITIZEN_JOB_NAME) : null; + citizenDataNBT = compound.contains(TAG_CITIZEN_NBT) ? compound.getCompound(TAG_CITIZEN_NBT) : null; + citizenName = compound.contains(TAG_CITIZEN_NAME) ? compound.getString(TAG_CITIZEN_NAME) : null; + citizenJobName = compound.contains(TAG_CITIZEN_JOB_NAME) ? compound.getString(TAG_CITIZEN_JOB_NAME) : null; } @Override diff --git a/src/api/java/com/minecolonies/api/colony/IChunkmanagerCapability.java b/src/api/java/com/minecolonies/api/colony/IChunkmanagerCapability.java index b888aed5b28..1d4d2fe18b0 100755 --- a/src/api/java/com/minecolonies/api/colony/IChunkmanagerCapability.java +++ b/src/api/java/com/minecolonies/api/colony/IChunkmanagerCapability.java @@ -105,7 +105,7 @@ public static void readNBT( @NotNull final Capability capability, @NotNull final IChunkmanagerCapability instance, @Nullable final Direction side, @NotNull final Tag nbt) { - if (nbt instanceof CompoundTag && ((CompoundTag) nbt).getAllKeys().contains(TAG_ALL_CHUNK_STORAGES)) + if (nbt instanceof CompoundTag && ((CompoundTag) nbt).contains(TAG_ALL_CHUNK_STORAGES)) { NBTUtils.streamCompound(((CompoundTag) nbt).getList(TAG_ALL_CHUNK_STORAGES, Tag.TAG_COMPOUND)) .map(Storage::read).forEach(key -> instance.addChunkStorage(key.getA().x, key.getA().z, key.getB())); diff --git a/src/api/java/com/minecolonies/api/colony/ICitizen.java b/src/api/java/com/minecolonies/api/colony/ICitizen.java index 8bcf2f09af2..71a4e73c483 100755 --- a/src/api/java/com/minecolonies/api/colony/ICitizen.java +++ b/src/api/java/com/minecolonies/api/colony/ICitizen.java @@ -62,4 +62,11 @@ public interface ICitizen * @return true for paused, false for working. */ boolean isPaused(); + + /** + * Returns the visitor's colony + * + * @return colony + */ + public IColony getColony(); } diff --git a/src/api/java/com/minecolonies/api/colony/ICitizenData.java b/src/api/java/com/minecolonies/api/colony/ICitizenData.java index 7a1fbf8665c..4b5b1ca4936 100644 --- a/src/api/java/com/minecolonies/api/colony/ICitizenData.java +++ b/src/api/java/com/minecolonies/api/colony/ICitizenData.java @@ -1,6 +1,5 @@ package com.minecolonies.api.colony; -import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; @@ -8,7 +7,11 @@ import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenHappinessHandler; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenMournHandler; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenSkillHandler; +import com.minecolonies.api.quests.IQuestGiver; +import com.minecolonies.api.quests.IQuestParticipant; import com.minecolonies.api.util.Tuple; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.core.BlockPos; import org.jetbrains.annotations.NotNull; @@ -18,7 +21,7 @@ import java.util.Optional; import java.util.Random; -public interface ICitizenData extends ICivilianData +public interface ICitizenData extends ICivilianData, IQuestGiver, IQuestParticipant { /** * Maximum saturation of a citizen. @@ -55,13 +58,6 @@ public interface ICitizenData extends ICivilianData @Nullable IBuilding getWorkBuilding(); - /** - * Sets the work building of a citizen. - * - * @param building work building. - */ - void setWorkBuilding(@Nullable IBuilding building); - /** * Returns the job of the citizen. * @@ -231,6 +227,20 @@ public interface ICitizenData extends ICivilianData */ void setVisibleStatus(VisibleCitizenStatus status); + /** + * Gets a location of interest of this citizen's job. + * + * @return the location, or null if nowhere is particularly interesting right now. + */ + @Nullable BlockPos getStatusPosition(); + + /** + * Sets the location of interest of this citizen. + * + * @param pos the location, or null to clear. + */ + void setStatusPosition(@Nullable BlockPos pos); + /** * Get the random var of the citizen. * @return the random. @@ -370,4 +380,29 @@ default boolean hasCustomTexture() { return false; } + + /** + * Sets the citizen idle for a certain amount of days + * + * @param days amount of days + */ + void setIdleDays(int days); + + /** + * On completing a quest. + * @param questId the id of the completed quest. + */ + void onQuestCompletion(ResourceLocation questId); + + /** + * Trigger for server side interaction closing. + * @param key the key of the interaction. + * @param sender the player closing it. + */ + void onInteractionClosed(Component key, ServerPlayer sender); + + /** + * Called after buildings loaded + */ + void onBuildingLoad(); } diff --git a/src/api/java/com/minecolonies/api/colony/ICitizenDataView.java b/src/api/java/com/minecolonies/api/colony/ICitizenDataView.java index 5f99757ce73..75bfed63deb 100755 --- a/src/api/java/com/minecolonies/api/colony/ICitizenDataView.java +++ b/src/api/java/com/minecolonies/api/colony/ICitizenDataView.java @@ -7,6 +7,7 @@ import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenSkillHandler; import com.minecolonies.api.util.Tuple; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -31,6 +32,12 @@ public interface ICitizenDataView extends ICitizen */ String getJob(); + /** + * Get the job as mutable component. + * @return the job desc. + */ + MutableComponent getJobComponent(); + /** * Get the entities home building. * @@ -157,6 +164,13 @@ public interface ICitizenDataView extends ICitizen */ VisibleCitizenStatus getVisibleStatus(); + /** + * Gets a location of interest of this citizen's job. + * + * @return the location, or null if nowhere is particularly interesting right now. + */ + @Nullable BlockPos getStatusPosition(); + /** * Get the job view that belongs to this citizen (or null). * @return the job. diff --git a/src/api/java/com/minecolonies/api/colony/ICivilianData.java b/src/api/java/com/minecolonies/api/colony/ICivilianData.java index ec96d164873..33d8e43ef66 100644 --- a/src/api/java/com/minecolonies/api/colony/ICivilianData.java +++ b/src/api/java/com/minecolonies/api/colony/ICivilianData.java @@ -36,14 +36,7 @@ public interface ICivilianData extends ICitizen, INBTSerializable /** * Marks the instance dirty. */ - void markDirty(); - - /** - * Returns the colony of the citizen. - * - * @return colony of the citizen. - */ - IColony getColony(); + void markDirty(final int time); /** * Initializes a new citizen, when not read from nbt @@ -157,15 +150,15 @@ public interface ICivilianData extends ICitizen, INBTSerializable * Trigger the response on the server side. * * @param key the key of the component. - * @param response the triggered response. + * @param responseId the triggered response. * @param player the world it was triggered in. */ - void onResponseTriggered(@NotNull Component key, @NotNull Component response, Player player); + void onResponseTriggered(@NotNull Component key, @NotNull int responseId, Player player); /** * Tick the data to update values. */ - void tick(); + void update(); /** * Trigger a possible interaction. @@ -194,4 +187,10 @@ public interface ICivilianData extends ICitizen, INBTSerializable * @return */ Optional getEntity(); + + /** + * Get the sound profile of the citizen. + * @return the profile id. + */ + int getSoundProfile(); } diff --git a/src/api/java/com/minecolonies/api/colony/IColony.java b/src/api/java/com/minecolonies/api/colony/IColony.java index 87240983f92..87920c78510 100755 --- a/src/api/java/com/minecolonies/api/colony/IColony.java +++ b/src/api/java/com/minecolonies/api/colony/IColony.java @@ -6,18 +6,19 @@ import com.minecolonies.api.colony.requestsystem.requester.IRequester; import com.minecolonies.api.colony.workorders.IWorkManager; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.quests.IQuestManager; import com.minecolonies.api.research.IResearchManager; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.player.Player; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.world.scores.PlayerTeam; import net.minecraft.resources.ResourceKey; -import net.minecraft.core.BlockPos; -import net.minecraft.ChatFormatting; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.scores.PlayerTeam; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.CapabilityToken; @@ -129,6 +130,13 @@ default String getTeamName() return TEAM_COLONY_NAME + "_" + (dim.length() > 10 ? dim.hashCode() : dim) + "_" + getID(); } + /** + * Getter for the team colony color. + * + * @return the color. + */ + ChatFormatting getTeamColonyColor(); + /** * Returns this colony's banner patterns, as a List * @@ -408,6 +416,8 @@ default List getWayPoints(@NotNull BlockPos position, @NotNull BlockPo */ int getLoadedChunkCount(); + Set getLoadedChunks(); + /** * Returns the colonies current state. * @@ -475,4 +485,17 @@ default List getWayPoints(@NotNull BlockPos position, @NotNull BlockPo * @return the current day progress of the colony. */ int getDay(); + + /** + * Get the quest manager of the colony. + * @return the quest manager. + */ + IQuestManager getQuestManager(); + + /** + * Get citizen from colony. + * @param id the id of the cit. + * @return the cit. + */ + ICitizen getCitizen(int id); } diff --git a/src/api/java/com/minecolonies/api/colony/IColonyManager.java b/src/api/java/com/minecolonies/api/colony/IColonyManager.java index 5c3c16b2347..c9f7de00a7d 100755 --- a/src/api/java/com/minecolonies/api/colony/IColonyManager.java +++ b/src/api/java/com/minecolonies/api/colony/IColonyManager.java @@ -5,11 +5,11 @@ import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.compatibility.ICompatibilityManager; import com.minecolonies.api.crafting.IRecipeManager; -import net.minecraft.world.entity.player.Player; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; -import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraftforge.event.TickEvent; import org.jetbrains.annotations.NotNull; @@ -34,8 +34,10 @@ static IColonyManager getInstance() * @param player the player that creates the colony - owner. * @param colonyName the initial colony name. * @param pack the default pack of the colony. + * @return the created colony instance. */ - void createColony(@NotNull Level w, BlockPos pos, @NotNull Player player, @NotNull String colonyName, @NotNull String pack); + @Nullable + IColony createColony(@NotNull Level w, BlockPos pos, @NotNull Player player, @NotNull String colonyName, @NotNull String pack); /** * Delete the colony in a world. @@ -371,7 +373,7 @@ static IColonyManager getInstance() * @param buildingId ID of the building. * @param dim the dimension. */ - void handleColonyViewRemoveBuildingMessage(int colonyId, BlockPos buildingId, ResourceKey dim); + void handleColonyViewRemoveBuildingMessage(int colonyId, final BlockPos buildingId, final ResourceKey dim); /** * Returns result of {@link IColonyView#handleColonyViewRemoveWorkOrderMessage(int)} if {@link #getColonyView(int, ResourceKey)} gives a not-null result. If {@link #getColonyView(int, diff --git a/src/api/java/com/minecolonies/api/colony/IColonyTagCapability.java b/src/api/java/com/minecolonies/api/colony/IColonyTagCapability.java index 02cfda2f298..c599844debe 100755 --- a/src/api/java/com/minecolonies/api/colony/IColonyTagCapability.java +++ b/src/api/java/com/minecolonies/api/colony/IColonyTagCapability.java @@ -1,6 +1,7 @@ package com.minecolonies.api.colony; import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.Log; import com.minecolonies.api.util.NBTUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -183,6 +184,11 @@ public void reset(final LevelChunk chunk) @Override public void addBuildingClaim(final int colonyId, final BlockPos pos, final LevelChunk chunk) { + if (chunk.getPos().equals(ChunkPos.ZERO)) + { + Log.getLogger().warn("Claiming id:" + colonyId + " building at zero pos!" + pos, new Exception()); + } + if (owningColony == NO_COLONY_ID) { setOwningColony(colonyId, chunk); diff --git a/src/api/java/com/minecolonies/api/colony/IColonyView.java b/src/api/java/com/minecolonies/api/colony/IColonyView.java index d4e6b80f932..70d4662fe1f 100755 --- a/src/api/java/com/minecolonies/api/colony/IColonyView.java +++ b/src/api/java/com/minecolonies/api/colony/IColonyView.java @@ -2,23 +2,26 @@ import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.buildings.workerbuildings.ITownHallView; -import com.minecolonies.api.colony.permissions.*; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.permissions.ColonyPlayer; +import com.minecolonies.api.colony.permissions.IPermissions; import com.minecolonies.api.colony.requestsystem.manager.IRequestManager; import com.minecolonies.api.colony.requestsystem.requester.IRequester; import com.minecolonies.api.colony.workorders.IWorkOrderView; import com.minecolonies.api.network.IMessage; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.entity.player.Player; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.scores.PlayerTeam; import net.minecraft.resources.ResourceKey; -import net.minecraft.core.BlockPos; -import net.minecraft.ChatFormatting; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.scores.PlayerTeam; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Predicate; public interface IColonyView extends IColony { @@ -266,6 +269,35 @@ public interface IColonyView extends IColony @Nullable IMessage handleColonyBuildingViewMessage(BlockPos buildingId, @NotNull FriendlyByteBuf buf); + /** + * Handle the colony view research manager updating. + * @param compoundTag the tag to update the research manager with. + */ + void handleColonyViewResearchManagerUpdate(CompoundTag compoundTag); + + /** + * Update all field instances in the colony view. + * + * @param fields the list of fields. + */ + void handleColonyFieldViewUpdateMessage(Set fields); + + /** + * Get all fields. + * + * @param matcher the field matcher predicate. + * @return a collection of fields. + */ + @NotNull List getFields(Predicate matcher); + + /** + * Get a specific field. + * + * @param matcher the field matcher predicate. + * @return a field instance, or null. + */ + @Nullable IField getField(Predicate matcher); + /** * Update a players permissions. * @@ -293,13 +325,6 @@ public interface IColonyView extends IColony @Override String getName(); - /** - * Getter for the team colony color. - * - * @return the color. - */ - ChatFormatting getTeamColonyColor(); - /** * Sets the name of the view. * diff --git a/src/api/java/com/minecolonies/api/colony/IVisitorViewData.java b/src/api/java/com/minecolonies/api/colony/IVisitorViewData.java index c8966d331f4..19df62a1976 100644 --- a/src/api/java/com/minecolonies/api/colony/IVisitorViewData.java +++ b/src/api/java/com/minecolonies/api/colony/IVisitorViewData.java @@ -7,13 +7,6 @@ */ public interface IVisitorViewData extends ICitizenDataView { - /** - * Returns the visitor's colony - * - * @return colony - */ - public IColonyView getColonyView(); - /** * Gets the visitors recruitment cost * diff --git a/src/api/java/com/minecolonies/api/colony/buildings/HiringMode.java b/src/api/java/com/minecolonies/api/colony/buildings/HiringMode.java index a0f219aec11..3df4c953b96 100755 --- a/src/api/java/com/minecolonies/api/colony/buildings/HiringMode.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/HiringMode.java @@ -9,7 +9,8 @@ public enum HiringMode { DEFAULT(HIRING_MODE_DEFAULT), AUTO(HIRING_MODE_AUTOMATIC), - MANUAL(HIRING_MODE_MANUAL); + MANUAL(HIRING_MODE_MANUAL), + LOCKED(HIRING_MODE_LOCKED); private final String translationKey; diff --git a/src/api/java/com/minecolonies/api/colony/buildings/IBuilding.java b/src/api/java/com/minecolonies/api/colony/buildings/IBuilding.java index 67dd95352c7..3cb4d9d88b1 100755 --- a/src/api/java/com/minecolonies/api/colony/buildings/IBuilding.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/IBuilding.java @@ -10,7 +10,9 @@ import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.jobs.registry.JobEntry; +import com.minecolonies.api.colony.modules.IModuleContainer; import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.colony.requestsystem.requestable.IRequestable; import com.minecolonies.api.colony.requestsystem.requester.IRequester; import com.minecolonies.api.colony.requestsystem.resolver.IRequestResolver; @@ -32,64 +34,15 @@ import java.util.function.Predicate; import static com.minecolonies.api.util.constant.Suppression.GENERIC_WILDCARD; -import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_MAXIMUM; -import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; +import static com.minecolonies.api.util.constant.ToolLevelConstants.*; -public interface IBuilding extends IBuildingContainer, IRequestResolverProvider, IRequester, ISchematicProvider +public interface IBuilding extends IBuildingContainer, IModuleContainer, IRequestResolverProvider, IRequester, ISchematicProvider { /** * Minimal level to ask for wood tools. (WOOD_HUT_LEVEL + 1 == stone) */ int WOOD_HUT_LEVEL = 0; - /** - * Check if the building has a particular module. - * @param clazz the class or interface of the module to check. - * @return true if so. - */ - boolean hasModule(final Class clazz); - - /** - * Get the first module with a particular class or interface. - * @param clazz the module's class or interface. - * @return the module or empty if not existent. - */ - @NotNull - T getFirstModuleOccurance(Class clazz); - - /** - * Get the first module with a particular class or interface. - * @param clazz the module's class or interface. - * @return the module or empty if not existent. - */ - @NotNull - Optional getFirstOptionalModuleOccurance(Class clazz); - - /** - * Get all modules with a particular class or interface. - * @param clazz the module's interface (or class, but prefer getModule in that case) - * @return the list of modules or empty if none match. - */ - @NotNull - List getModules(Class clazz); - - /** - * Get a module matching a certain predicate. - * @param clazz the class of the module. - * @param modulePredicate the predicate to match. - * @param the module type. - * @return the first matching module. - * @throws IllegalArgumentException if your condition does not match any modules - */ - @NotNull - T getModuleMatching(Class clazz, Predicate modulePredicate); - - /** - * Register a specific module to the building. - * @param module the module to register. - */ - void registerModule(@NotNull final IBuildingModule module); - /** * Getter for the custom name of a building. * @@ -417,9 +370,10 @@ ImmutableList> getOpenRequestsOfTypeFiltered( /** * Calculate the number of reserved stacks the resolver can't touch. + * @param request ignore reservations that would exist for the current request. * @return a list of itemstorages. */ - Map reservedStacks(); + Map reservedStacksExcluding(@NotNull final IRequest request); /** * Process time the colony was offline. @@ -496,7 +450,7 @@ default int getMaxToolLevel() } else if (getBuildingLevel() <= WOOD_HUT_LEVEL) { - return TOOL_LEVEL_WOOD_OR_GOLD; + return BASIC_TOOL_LEVEL; } return getBuildingLevel() - WOOD_HUT_LEVEL; } diff --git a/src/api/java/com/minecolonies/api/colony/buildings/IGuardBuilding.java b/src/api/java/com/minecolonies/api/colony/buildings/IGuardBuilding.java index 931b1652f00..339503c6b7b 100755 --- a/src/api/java/com/minecolonies/api/colony/buildings/IGuardBuilding.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/IGuardBuilding.java @@ -1,10 +1,9 @@ package com.minecolonies.api.colony.buildings; -import com.minecolonies.api.colony.guardtype.GuardType; import com.minecolonies.api.colony.requestsystem.location.ILocation; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; public interface IGuardBuilding extends IBuilding @@ -160,12 +159,21 @@ static boolean checkIfGuardShouldTakeDamage(final AbstractEntityCitizen citizen, /** * If we have to calculate a new target manually. + * * @return true if so. */ boolean requiresManualTarget(); + /** + * Sets a one time consumed temporary next position to patrol towards + * + * @param pos Position to set + */ + void setTempNextPatrolPoint(BlockPos pos); + /** * Get the position of the assigned mine + * * @return the coords of the assigned mine */ BlockPos getMinePos(); diff --git a/src/api/java/com/minecolonies/api/colony/buildings/ISchematicProvider.java b/src/api/java/com/minecolonies/api/colony/buildings/ISchematicProvider.java index 99a9b81e99a..2844255a8dd 100755 --- a/src/api/java/com/minecolonies/api/colony/buildings/ISchematicProvider.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/ISchematicProvider.java @@ -66,18 +66,6 @@ public interface ISchematicProvider extends INBTSerializable */ Set getChildren(); - /** - * Add a child building position - * @param pos - */ - void addChild(BlockPos pos); - - /** - * Remove a child building position - * @param pos - */ - void removeChild(BlockPos pos); - /** * Returns the rotation of the current building. * diff --git a/src/api/java/com/minecolonies/api/colony/buildings/event/AbstractBuildingEvent.java b/src/api/java/com/minecolonies/api/colony/buildings/event/AbstractBuildingEvent.java new file mode 100644 index 00000000000..f5759a3399f --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/buildings/event/AbstractBuildingEvent.java @@ -0,0 +1,36 @@ +package com.minecolonies.api.colony.buildings.event; + +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.event.AbstractColonyEvent; + +/** + * Abstract event for building related things. + */ +public abstract class AbstractBuildingEvent extends AbstractColonyEvent +{ + /** + * The building related to the event. + */ + protected final IBuilding building; + + /** + * Constructs a building-based event. + * + * @param building the building related to the event. + */ + protected AbstractBuildingEvent(final IBuilding building) + { + super(building.getColony()); + this.building = building; + } + + /** + * Get the building related to the event. + * + * @return the building instance. + */ + public IBuilding getBuilding() + { + return building; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/buildings/event/BuildingConstructionEvent.java b/src/api/java/com/minecolonies/api/colony/buildings/event/BuildingConstructionEvent.java new file mode 100644 index 00000000000..f470839e587 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/buildings/event/BuildingConstructionEvent.java @@ -0,0 +1,65 @@ +package com.minecolonies.api.colony.buildings.event; + +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.workorders.WorkOrderType; + +/** + * Event for when a building was built/repaired/removed. + */ +public final class BuildingConstructionEvent extends AbstractBuildingEvent +{ + /** + * What happened to the building. + */ + private final EventType eventType; + + /** + * Building construction event. + * + * @param building the building the event was for. + * @param eventType what happened to the building. + */ + public BuildingConstructionEvent(final IBuilding building, final EventType eventType) + { + super(building); + this.eventType = eventType; + } + + /** + * Get what happened to the building. + * + * @return the event type. + */ + public EventType getEventType() + { + return eventType; + } + + /** + * What happened to the building. + */ + public enum EventType + { + BUILT, + UPGRADED, + REPAIRED, + REMOVED; + + /** + * Obtain the construction event type from the work order type. + * + * @param workOrderType the work order type. + * @return the construction event type. + */ + public static EventType fromWorkOrderType(final WorkOrderType workOrderType) + { + return switch (workOrderType) + { + case BUILD -> BUILT; + case UPGRADE -> UPGRADED; + case REPAIR -> REPAIRED; + case REMOVE -> REMOVED; + }; + } + } +} diff --git a/src/api/java/com/minecolonies/api/colony/buildings/modules/ICraftingBuildingModule.java b/src/api/java/com/minecolonies/api/colony/buildings/modules/ICraftingBuildingModule.java index 50891f83c22..cf4b6369e10 100644 --- a/src/api/java/com/minecolonies/api/colony/buildings/modules/ICraftingBuildingModule.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/modules/ICraftingBuildingModule.java @@ -324,4 +324,11 @@ static ResourceLocation getUid(@NotNull final JobEntry job, @NotNull final Strin * @param recipeLocation the location of the recipe. */ void toggle(int recipeLocation); + + /** + * Check if a recipe is disabled. + * @param token the recipe id to check for. + * @return true if so. + */ + boolean isDisabled(final IToken token); } diff --git a/src/api/java/com/minecolonies/api/colony/buildings/modules/IHasRequiredItemsModule.java b/src/api/java/com/minecolonies/api/colony/buildings/modules/IHasRequiredItemsModule.java index e87521391fd..06d052e27ab 100644 --- a/src/api/java/com/minecolonies/api/colony/buildings/modules/IHasRequiredItemsModule.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/modules/IHasRequiredItemsModule.java @@ -1,8 +1,11 @@ package com.minecolonies.api.colony.buildings.modules; +import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.crafting.ItemStorage; -import net.minecraft.world.item.ItemStack; import net.minecraft.util.Tuple; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.function.Predicate; @@ -24,5 +27,15 @@ public interface IHasRequiredItemsModule extends IBuildingModule * Calculate the number of reserved stacks the resolver can't touch. * @return a list of itemstorages. */ - Map reservedStacks(); + default Map reservedStacks() + { + return reservedStacksExcluding(null); + } + + /** + * Calculate the number of reserved stacks the resolver can't touch. + * @param excluded ignore reservations that would exist for the current request. + * @return a list of itemstorages. + */ + Map reservedStacksExcluding(@Nullable final IRequest excluded); } diff --git a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISetting.java b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISetting.java index a20ea1ab2ee..877c5c2c1c5 100644 --- a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISetting.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISetting.java @@ -1,81 +1,149 @@ package com.minecolonies.api.colony.buildings.modules.settings; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.modules.ISettingsModule; import com.minecolonies.api.colony.buildings.views.IBuildingView; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; /** * Generic ISetting that represents all possible setting objects (string, numbers, boolean, etc). */ public interface ISetting { + /** + * Get the resource location of the view you want to use for this setting. + * + * @return the resource location indicating which view to use. + */ + ResourceLocation getLayoutItem(); + /** * Add the handling of the specific setting to the box in the UI. - * @param key the key of the setting. - * @param rowPane the pane of it. + * + * @param key the key of the setting. + * @param rowPane the pane of it. * @param settingsModuleView the module view that holds the setting. - * @param building the building. - * @param window the calling window. + * @param building the building. + * @param window the calling window. */ void setupHandler( final ISettingKey key, final Pane rowPane, final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window); + final IBuildingView building, + final BOWindow window); /** * Update the handling (e.g update settings text). - * @param key the key of the setting. - * @param rowPane the pane of it. + * + * @param key the key of the setting. + * @param rowPane the pane of it. * @param settingsModuleView the module view that holds the setting. - * @param building the building. - * @param window the calling window. + * @param building the building. + * @param window the calling window. */ void render( final ISettingKey key, final Pane rowPane, final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window); + final IBuildingView building, + final BOWindow window); /** * Trigger a setting. */ - void trigger(); + default void trigger() {} /** - * Check if this setting is effective (provided {@link ISettingsModule#getOptionalSetting(ISettingKey)} is used). - * @return true by default + * Check if this setting is active (provided {@link ISettingsModule#getOptionalSetting(ISettingKey)} is used). + * + * @return true if the setting is active; */ - default boolean isActive(ISettingsModule module) + default boolean isActive(final ISettingsModule module) { return true; } /** - * Check if this setting is visible in the GUI. - * @return true by default. + * Configures if this setting is inactive, whether it should show in the settings at all. + * This would default to false in most cases as we want to prevent not showing settings, but certain settings related to + * addon mods may want to be hidden if another mod is not loaded. + * + * @return true if the inactive setting should be hidden. */ - default boolean isActive(ISettingsModuleView module) + default boolean shouldHideWhenInactive() { - return true; + return false; } /** * Called when updated. + * * @param building the building its updated for. - * @param sender the player triggering the update. + * @param sender the player triggering the update. */ - default void onUpdate(IBuilding building, final ServerPlayer sender) { }; + default void onUpdate(final IBuilding building, final ServerPlayer sender) {} /** * Allow updating a setting with new data. - * @param iSetting the setting with new data + * + * @param setting the setting with new data + */ + default void updateSetting(final ISetting setting) {} + + /** + * Copy value from another instance. + * + * @param setting the setting to copy from + */ + void copyValue(final ISetting setting); + + /** + * Generates the hover pane for inactive settings. + * + * @param component the component to put the hover pane on. + * @param settingsModuleView the module view that holds the setting. */ - default void updateSetting(final ISetting iSetting) + default void setInActiveHoverPane(final Pane component, final ISettingsModuleView settingsModuleView) { + final Component inActiveReason = getInactiveReason(); + if (!isActive(settingsModuleView) && inActiveReason != null) + { + PaneBuilders.tooltipBuilder() + .append(inActiveReason) + .hoverPane(component) + .build(); + } + else + { + component.setHoverPane(null); + } + } + + /** + * Get the reason why this setting is inactive. + * + * @return a component stating why this is inactive, or null if no reason. + */ + @Nullable + default Component getInactiveReason() + { + return null; + } + /** + * Check if this setting is active (provided {@link ISettingsModule#getOptionalSetting(ISettingKey)} is used). + * + * @return a component containing a message why this setting is not active, return null if the setting is supposed to be active. + */ + default boolean isActive(final ISettingsModuleView module) + { + return true; } } diff --git a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISettingsModuleView.java b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISettingsModuleView.java index fcdcfe417cf..c0757543f1d 100644 --- a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISettingsModuleView.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/ISettingsModuleView.java @@ -1,6 +1,7 @@ package com.minecolonies.api.colony.buildings.modules.settings; import com.minecolonies.api.colony.buildings.modules.IBuildingModuleView; +import org.jetbrains.annotations.Nullable; /** * Client side part of the settings module. @@ -19,5 +20,6 @@ public interface ISettingsModuleView extends IBuildingModuleView * @param the type of setting. * @return the setting. */ + @Nullable T getSetting(final ISettingKey key); } diff --git a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/IStringSetting.java b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/IStringSetting.java index 595b11a4fec..b0ac50a0eb0 100644 --- a/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/IStringSetting.java +++ b/src/api/java/com/minecolonies/api/colony/buildings/modules/settings/IStringSetting.java @@ -36,4 +36,13 @@ public interface IStringSetting extends ISetting * @param value the value to set. */ void set(final String value); + + @Override + default void copyValue(final ISetting setting) + { + if (setting instanceof final IStringSetting other) + { + set(other.getValue()); + } + } } diff --git a/src/api/java/com/minecolonies/api/colony/citizens/event/AbstractCitizenEvent.java b/src/api/java/com/minecolonies/api/colony/citizens/event/AbstractCitizenEvent.java new file mode 100644 index 00000000000..05942def618 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/citizens/event/AbstractCitizenEvent.java @@ -0,0 +1,39 @@ +package com.minecolonies.api.colony.citizens.event; + +import com.minecolonies.api.colony.ICitizen; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.event.AbstractColonyEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Abstract event for citizen related things. + */ +public class AbstractCitizenEvent extends AbstractColonyEvent +{ + /** + * The citizen related to the event. + */ + private final @NotNull ICitizenData citizen; + + /** + * Constructs a citizen-based event. + * + * @param citizen the citizen related to the event. + */ + protected AbstractCitizenEvent(final @NotNull ICitizenData citizen) + { + super(citizen.getColony()); + this.citizen = citizen; + } + + /** + * Get the citizen related to the event. + * + * @return the citizen instance. + */ + @NotNull + public ICitizen getCitizen() + { + return citizen; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenAddedEvent.java b/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenAddedEvent.java new file mode 100644 index 00000000000..c2baf35e0d0 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenAddedEvent.java @@ -0,0 +1,63 @@ +package com.minecolonies.api.colony.citizens.event; + +import com.minecolonies.api.colony.ICitizenData; + +/** + * Event for when a citizen was added to the colony. + */ +public class CitizenAddedEvent extends AbstractCitizenEvent +{ + /** + * The way the citizen came into the colony. + */ + private final Source source; + + /** + * Citizen added event. + * + * @param citizen the citizen related to the event. + * @param source the way the citizen came into the colony. + */ + public CitizenAddedEvent(final ICitizenData citizen, final Source source) + { + super(citizen); + this.source = source; + } + + /** + * Get the way the citizen came into the colony. + * + * @return the enum value. + */ + public Source getSource() + { + return source; + } + + /** + * How the citizen came into the colony. + */ + public enum Source + { + /** + * The citizen spawned as part of the {@link com.minecolonies.api.configuration.ServerConfiguration#initialCitizenAmount}. + */ + INITIAL, + /** + * The citizen was born naturally. + */ + BORN, + /** + * The citizen was hired from the tavern. + */ + HIRED, + /** + * The citizen got resurrected from his grave. + */ + RESURRECTED, + /** + * The citizen was spawned in using commands. + */ + COMMANDS + } +} diff --git a/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenRemovedEvent.java b/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenRemovedEvent.java new file mode 100644 index 00000000000..779372a5be6 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/citizens/event/CitizenRemovedEvent.java @@ -0,0 +1,39 @@ +package com.minecolonies.api.colony.citizens.event; + +import com.minecolonies.api.colony.ICitizenData; +import net.minecraft.world.damagesource.DamageSource; +import org.jetbrains.annotations.NotNull; + +/** + * Event for when a citizen was removed from the colony. + */ +public class CitizenRemovedEvent extends AbstractCitizenEvent +{ + /** + * The damage source that caused a citizen to die. + */ + private final @NotNull DamageSource source; + + /** + * Citizen removed event. + * + * @param citizen the citizen related to the event. + * @param source the way the citizen went out of the colony. + */ + public CitizenRemovedEvent(final @NotNull ICitizenData citizen, final @NotNull DamageSource source) + { + super(citizen); + this.source = source; + } + + /** + * The damage source that caused the citizen to die. + * + * @return the damage source. + */ + @NotNull + public DamageSource getDamageSource() + { + return source; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/colonyEvents/IColonyRaidEvent.java b/src/api/java/com/minecolonies/api/colony/colonyEvents/IColonyRaidEvent.java index 9c921b3cc58..7b27cc87db3 100755 --- a/src/api/java/com/minecolonies/api/colony/colonyEvents/IColonyRaidEvent.java +++ b/src/api/java/com/minecolonies/api/colony/colonyEvents/IColonyRaidEvent.java @@ -42,4 +42,18 @@ public interface IColonyRaidEvent extends IColonyEntitySpawnEvent * Gets the list of waypoints */ List getWayPoints(); + + /** + * Whether or not the raid is still active. + * @return true if so. + */ + default boolean isRaidActive() + { + return getStatus() == EventStatus.PROGRESSING ||getStatus() == EventStatus.PREPARING; + } + + /** + * Set the raid event to mercy. + */ + void setMercyEnd(); } diff --git a/src/api/java/com/minecolonies/api/colony/event/AbstractColonyEvent.java b/src/api/java/com/minecolonies/api/colony/event/AbstractColonyEvent.java index b66fda57b69..4e672d2faa2 100644 --- a/src/api/java/com/minecolonies/api/colony/event/AbstractColonyEvent.java +++ b/src/api/java/com/minecolonies/api/colony/event/AbstractColonyEvent.java @@ -10,6 +10,10 @@ */ public abstract class AbstractColonyEvent extends Event { + /** + * The colony this event was called in. + */ + @NotNull private final IColony colony; /** @@ -25,6 +29,7 @@ protected AbstractColonyEvent(@NotNull final IColony colony) /** * Gets the colony related to the event. */ + @NotNull public IColony getColony() { return colony; diff --git a/src/api/java/com/minecolonies/api/colony/event/ColonyCreatedEvent.java b/src/api/java/com/minecolonies/api/colony/event/ColonyCreatedEvent.java new file mode 100644 index 00000000000..8b0e1d66fef --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/event/ColonyCreatedEvent.java @@ -0,0 +1,20 @@ +package com.minecolonies.api.colony.event; + +import com.minecolonies.api.colony.IColony; +import org.jetbrains.annotations.NotNull; + +/** + * Colony created event. + */ +public class ColonyCreatedEvent extends AbstractColonyEvent +{ + /** + * Constructs a colony created event. + * + * @param colony The colony related to the event. + */ + public ColonyCreatedEvent(final @NotNull IColony colony) + { + super(colony); + } +} diff --git a/src/api/java/com/minecolonies/api/colony/event/ColonyDeletedEvent.java b/src/api/java/com/minecolonies/api/colony/event/ColonyDeletedEvent.java new file mode 100644 index 00000000000..cb08a6daecc --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/event/ColonyDeletedEvent.java @@ -0,0 +1,20 @@ +package com.minecolonies.api.colony.event; + +import com.minecolonies.api.colony.IColony; +import org.jetbrains.annotations.NotNull; + +/** + * Colony deleted event. + */ +public class ColonyDeletedEvent extends AbstractColonyEvent +{ + /** + * Constructs a colony deleted event. + * + * @param colony The colony related to the event. + */ + public ColonyDeletedEvent(final @NotNull IColony colony) + { + super(colony); + } +} diff --git a/src/api/java/com/minecolonies/api/colony/event/ColonyInformationChangedEvent.java b/src/api/java/com/minecolonies/api/colony/event/ColonyInformationChangedEvent.java new file mode 100644 index 00000000000..69e62fdb966 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/event/ColonyInformationChangedEvent.java @@ -0,0 +1,47 @@ +package com.minecolonies.api.colony.event; + +import com.minecolonies.api.colony.IColony; +import org.jetbrains.annotations.NotNull; + +/** + * Colony information changed event. + */ +public class ColonyInformationChangedEvent extends AbstractColonyEvent +{ + /** + * What type of information changed on the colony. + */ + private final Type type; + + /** + * Constructs a colony information changed event. + * + * @param colony the colony related to the event. + * @param type what type of information changed on the colony. + */ + public ColonyInformationChangedEvent(final @NotNull IColony colony, final Type type) + { + super(colony); + this.type = type; + } + + /** + * Get what type of information changed on the colony. + * + * @return the enum value. + */ + public Type getType() + { + return type; + } + + /** + * What information of the colony changed. + */ + public enum Type + { + NAME, + TEAM_COLOR, + FLAG + } +} diff --git a/src/api/java/com/minecolonies/api/colony/event/ColonyViewUpdatedEvent.java b/src/api/java/com/minecolonies/api/colony/event/ColonyViewUpdatedEvent.java index 5397406a943..23e7a3f0151 100644 --- a/src/api/java/com/minecolonies/api/colony/event/ColonyViewUpdatedEvent.java +++ b/src/api/java/com/minecolonies/api/colony/event/ColonyViewUpdatedEvent.java @@ -19,7 +19,7 @@ public ColonyViewUpdatedEvent(final @NotNull IColonyView colony) } @Override - public IColonyView getColony() + public @NotNull IColonyView getColony() { return (IColonyView) super.getColony(); } diff --git a/src/api/java/com/minecolonies/api/colony/fields/IField.java b/src/api/java/com/minecolonies/api/colony/fields/IField.java new file mode 100644 index 00000000000..1f02f069b7f --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/fields/IField.java @@ -0,0 +1,110 @@ +package com.minecolonies.api.colony.fields; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.modules.IFieldModule; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.colony.modules.IModuleContainer; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Interface for field instances. + */ +public interface IField extends IModuleContainer +{ + /** + * Return the field type for this field. + * + * @return the field registry entry. + */ + @NotNull FieldRegistries.FieldEntry getFieldType(); + + /** + * Gets the position of the field. + * + * @return central location of the field. + */ + @NotNull BlockPos getPosition(); + + /** + * Getter for the owning building of the field. + * + * @return the id or null. + */ + @Nullable BlockPos getBuildingId(); + + /** + * Sets the owning building of the field. + * + * @param buildingId id of the building. + */ + void setBuilding(final BlockPos buildingId); + + /** + * Resets the ownership of the field. + */ + void resetOwningBuilding(); + + /** + * Has the field been taken. + * + * @return true if the field is not free to use, false after releasing it. + */ + boolean isTaken(); + + /** + * Get the distance to a building. + * + * @param building the building to get the distance to. + * @return the distance + */ + int getSqDistance(IBuildingView building); + + /** + * Stores the NBT data of the field. + */ + @NotNull CompoundTag serializeNBT(); + + /** + * Reconstruct the field from the given NBT data. + * + * @param compound the compound to read from. + */ + void deserializeNBT(@NotNull CompoundTag compound); + + /** + * Serialize a field to a buffer. + * + * @param buf the buffer to write the field data to. + */ + void serialize(@NotNull FriendlyByteBuf buf); + + /** + * Deserialize a field from a buffer. + * + * @param buf the buffer to read the field data from. + */ + void deserialize(@NotNull FriendlyByteBuf buf); + + /** + * Condition to check whether this field instance is currently properly placed down. + * + * @param colony the colony this field is in. + * @return true if the field is correctly placed at the current position. + */ + boolean isValidPlacement(IColony colony); + + /** + * Hashcode implementation for this field. + */ + int hashCode(); + + /** + * Equals implementation for this field. + */ + boolean equals(Object other); +} diff --git a/src/api/java/com/minecolonies/api/colony/fields/modules/IFieldModule.java b/src/api/java/com/minecolonies/api/colony/fields/modules/IFieldModule.java new file mode 100644 index 00000000000..fcaa7a47834 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/fields/modules/IFieldModule.java @@ -0,0 +1,16 @@ +package com.minecolonies.api.colony.fields.modules; + +import com.minecolonies.api.colony.fields.IField; + +/** + * Default interface for all field modules. + */ +public interface IFieldModule +{ + /** + * Get the field of the module. + * + * @return the field. + */ + IField getField(); +} diff --git a/src/api/java/com/minecolonies/api/colony/fields/plantation/IPlantationModule.java b/src/api/java/com/minecolonies/api/colony/fields/plantation/IPlantationModule.java new file mode 100644 index 00000000000..f3de6fb22a8 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/fields/plantation/IPlantationModule.java @@ -0,0 +1,440 @@ +package com.minecolonies.api.colony.fields.plantation; + +import com.minecolonies.api.colony.fields.modules.IFieldModule; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.util.constant.ToolType; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Interface for planter modules that determines how the AI should work specific fields. + */ +public interface IPlantationModule extends IFieldModule +{ + /** + * Get the field tag property. + * + * @return the field tag. + */ + String getFieldTag(); + + /** + * Get the work tag property. + * + * @return the work tag. + */ + String getWorkTag(); + + /** + * Get the item the module uses. + * + * @return the item. + */ + Item getItem(); + + /** + * Get the amount of plants to request when the planter no longer has any left. + * Defaults to quarter stack size of the block. + * + * @return the amount of plants to request. + */ + int getPlantsToRequest(); + + /** + * Get the required research effect for this module. + * Null if there is no research required for this field. + * + * @return the key of where to find the effect. + */ + ResourceLocation getRequiredResearchEffect(); + + /** + * Core function for the planter module, is responsible for telling the AI what to do on the specific field. + * + * @param world the world reference that can be used for block state lookups. + * @param workingPosition the position that has been chosen for work. + * @return a basic enum state telling the planter AI what the AI should be doing next. + */ + PlantationModuleResult.Builder decideFieldWork(Level world, @NotNull BlockPos workingPosition); + + /** + * Obtains the next working position for the given field, if any. + * + * @param world the world reference that can be used for block state lookups. + * @return the next position to work on, or null. + */ + @Nullable BlockPos getNextWorkingPosition(Level world); + + /** + * Get a list of actual valid working positions, based on the tags read from the plantation field. + * + * @param world the level the tags were read from. + * @param workingPositions the list of initially parsed working positions, based on work tag. + * @return the list of actually valid parsed working positions. + */ + List getValidWorkingPositions(final @NotNull Level world, final List workingPositions); + + /** + * Returns the maximum amount of actions that can be performed on a field, before the planter must forcefully switch to a new field. + * + * @return the maximum of actions the planter can perform on the field per cycle. + */ + int getActionLimit(); + + /** + * Returns which items are considered valid bonemeal items. + * Defaults to an empty list. (Most modules should not need any bonemeal). + */ + List getValidBonemeal(); + + /** + * Determines where the planter should walk to, in order to most effectively work on the given working position. + * Defaults to the same block. + * + * @param world the world reference that can be used for block state lookups. + * @param workingPosition the original working position. + * @return the position for the planter to walk to. + */ + BlockPos getPositionToWalkTo(Level world, BlockPos workingPosition); + + /** + * Generate a block state for a new plant. + * + * @param world the world reference that can be used for block state lookups. + * @param workPosition the position that has been chosen for work. + * @param blockState the default block state for the block. + */ + BlockState getPlantingBlockState(Level world, BlockPos workPosition, BlockState blockState); + + /** + * Logic for applying bonemeal to the working position. + * + * @param worker the worker entity working on the plantation. + * @param workPosition the position that has been chosen for work. + * @param stackInSlot the item stack to use for the planting. + * @param fakePlayer a fake player class to use. + */ + void applyBonemeal(final AbstractEntityCitizen worker, final BlockPos workPosition, final ItemStack stackInSlot, final Player fakePlayer); + + /** + * Returns a list of items that are mandatory for this module to function. + * + * @return a list of items. + */ + List getRequiredItemsForOperation(); + + /** + * Returns the requested tool type in order to work on this module. + * + * @return the tool to work on this module. + */ + ToolType getRequiredTool(); + + /** + * Hashcode implementation for this field. + */ + int hashCode(); + + /** + * Equals implementation for this field. + */ + boolean equals(Object other); + + /** + * Enum containing the reset state of the result state. + */ + enum PlanterAIModuleResultResetState + { + /** + * Do not reset the position/field. + */ + NONE, + /** + * Reset the current position. + */ + POSITION, + /** + * Reset the current field. + */ + FIELD + } + + /** + * The different actions this module is able to perform. + */ + enum ActionToPerform + { + NONE(false), + PLANT(true), + BONEMEAL(true), + HARVEST(true), + CLEAR(false); + + /** + * Whether this action increases the action counter for the field. + */ + private final boolean increasesActionCount; + + /** + * Default constructor. + */ + ActionToPerform(final boolean increasesActionCount) + { + this.increasesActionCount = increasesActionCount; + } + + /** + * Whether this action increases the action counter for the field. + * + * @return true if so. + */ + public boolean increasesActionCount() + { + return increasesActionCount; + } + } + + /** + * Class containing possible states that the planter AI can be in. + */ + class PlantationModuleResult + { + /** + * Simplest action, indicating no work was needed on the given position. + */ + public static final PlantationModuleResult.Builder NONE = new PlantationModuleResult.Builder().pickNewField(); + + /** + * The original plantation module. + */ + private final IPlantationModule module; + + /** + * The working position where the planter was told to perform work. + */ + private final BlockPos workingPosition; + + /** + * The action for the planter to perform. + */ + private final ActionToPerform action; + + /** + * The position to actually perform the action on. + */ + @Nullable + private final BlockPos actionPosition; + + /** + * The reset state of the result. + */ + private final PlanterAIModuleResultResetState resetState; + + /** + * Default constructor. + * + * @param module the plantation module. + * @param workingPosition the working position. + * @param action the action to perform on this position. + * @param actionPosition the position to actually perform the action on. + * @param resetState the reset state. + */ + private PlantationModuleResult( + final IPlantationModule module, + final BlockPos workingPosition, + final ActionToPerform action, + final @Nullable BlockPos actionPosition, + final PlanterAIModuleResultResetState resetState) + { + this.module = module; + this.workingPosition = workingPosition; + this.action = action; + this.actionPosition = actionPosition; + this.resetState = resetState; + } + + /** + * Get the plantation module this result was generated from. + * + * @return the plantation module. + */ + public IPlantationModule getModule() + { + return module; + } + + /** + * Get the working position. + * + * @return the working position. + */ + public BlockPos getWorkingPosition() + { + return workingPosition; + } + + /** + * What kind of action to perform. + * + * @return the action type. + */ + public ActionToPerform getAction() + { + return action; + } + + /** + * Get the position to actually perform the action on. + * + * @return the position to actually perform the action on. + */ + public @Nullable BlockPos getActionPosition() + { + return actionPosition; + } + + /** + * Whether to reset the current working position. + * + * @return true if so. + */ + public boolean shouldResetWorkingPosition() + { + return resetState == PlanterAIModuleResultResetState.POSITION || resetState == PlanterAIModuleResultResetState.FIELD; + } + + /** + * Whether to reset the current field. + * + * @return true if so. + */ + public boolean shouldResetCurrentField() + { + return resetState == PlanterAIModuleResultResetState.FIELD; + } + + /** + * Builder class for the {@link PlantationModuleResult}. + */ + public static class Builder + { + /** + * The action for the planter to perform. + */ + private ActionToPerform action; + + /** + * The position to work perform the action on. + */ + @Nullable + private BlockPos actionPosition; + + /** + * The reset state of the result. + */ + private PlanterAIModuleResultResetState resetState; + + /** + * Default constructor. + */ + public Builder() + { + action = ActionToPerform.NONE; + resetState = PlanterAIModuleResultResetState.NONE; + } + + /** + * Tell the planter he should go to a new field after this work is finished. + * + * @return the builder instance for chaining. + */ + public Builder pickNewField() + { + resetState = PlanterAIModuleResultResetState.FIELD; + return this; + } + + /** + * Tell the planter he should go to a new position on the same field after this work is finished. + * + * @return the builder instance for chaining. + */ + public Builder pickNewPosition() + { + resetState = PlanterAIModuleResultResetState.POSITION; + return this; + } + + /** + * Tell the planter he should plant the given item on the position. + * + * @param position the position where to plant on. + * @return the builder instance for chaining. + */ + public Builder plant(BlockPos position) + { + action = ActionToPerform.PLANT; + actionPosition = position; + return this; + } + + /** + * Tell the planter he should use bonemeal on the given position. + * + * @param position the position where to use bonemeal on. + * @return the builder instance for chaining. + */ + public Builder bonemeal(BlockPos position) + { + action = ActionToPerform.BONEMEAL; + actionPosition = position; + return this; + } + + /** + * Tell the planter he should harvest an item at the given position. + * + * @param position the position where to harvest the plant from. + * @return the builder instance for chaining. + */ + public Builder harvest(BlockPos position) + { + action = ActionToPerform.HARVEST; + actionPosition = position; + return this; + } + + /** + * Tell the planter he should clear an obstructed work position. + * + * @param position the position to clear. + * @return the builder instance for chaining. + */ + public Builder clear(BlockPos position) + { + action = ActionToPerform.CLEAR; + actionPosition = position; + return this; + } + + /** + * Finishes the construction of the result. + * + * @return the result instance. + */ + public PlantationModuleResult build(IPlantationModule module, BlockPos workingPosition) + { + return new PlantationModuleResult(module, workingPosition, action, actionPosition, resetState); + } + } + } +} diff --git a/src/api/java/com/minecolonies/api/colony/fields/registry/FieldRegistries.java b/src/api/java/com/minecolonies/api/colony/fields/registry/FieldRegistries.java new file mode 100644 index 00000000000..5931cb12186 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/fields/registry/FieldRegistries.java @@ -0,0 +1,208 @@ +package com.minecolonies.api.colony.fields.registry; + +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.modules.IFieldModule; +import com.minecolonies.api.util.constant.Constants; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryObject; +import org.apache.commons.lang3.Validate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; + +/** + * Registry implementation for field instances. + */ +public class FieldRegistries +{ + public static final ResourceLocation FARM_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "farmfield"); + public static final ResourceLocation PLANTATION_SUGAR_CANE_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_sugar_cane"); + public static final ResourceLocation PLANTATION_CACTUS_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_cactus"); + public static final ResourceLocation PLANTATION_BAMBOO_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_bamboo"); + public static final ResourceLocation PLANTATION_COCOA_BEANS_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_cocoa_beans"); + public static final ResourceLocation PLANTATION_VINES_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_vines"); + public static final ResourceLocation PLANTATION_KELP_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_kelp"); + public static final ResourceLocation PLANTATION_SEAGRASS_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_seagrass"); + public static final ResourceLocation PLANTATION_SEA_PICKLES_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_sea_pickles"); + public static final ResourceLocation PLANTATION_GLOWBERRIES_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_glowberries"); + public static final ResourceLocation PLANTATION_WEEPING_VINES_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_weeping_vines"); + public static final ResourceLocation PLANTATION_TWISTING_VINES_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_twisting_vines"); + public static final ResourceLocation PLANTATION_CRIMSON_PLANTS_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_crimson_plants"); + public static final ResourceLocation PLANTATION_WARPED_PLANTS_FIELD_ID = new ResourceLocation(Constants.MOD_ID, "plantation_warped_plants"); + + public static RegistryObject farmField; + public static RegistryObject plantationSugarCaneField; + public static RegistryObject plantationCactusField; + public static RegistryObject plantationBambooField; + public static RegistryObject plantationCocoaBeansField; + public static RegistryObject plantationVinesField; + public static RegistryObject plantationKelpField; + public static RegistryObject plantationSeagrassField; + public static RegistryObject plantationSeaPicklesField; + public static RegistryObject plantationGlowberriesField; + public static RegistryObject plantationWeepingVinesField; + public static RegistryObject plantationTwistingVinesField; + public static RegistryObject plantationCrimsonPlantsField; + public static RegistryObject plantationWarpedPlantsField; + + private FieldRegistries() + { + } + + /** + * Get the field registry. + * + * @return the field registry. + */ + public static IForgeRegistry getFieldRegistry() + { + return IMinecoloniesAPI.getInstance().getFieldRegistry(); + } + + /** + * Entry for the {@link IField} registry. Makes it possible to create a single registry for a {@link IField}. Used to lookup how to create {@link IField}. + */ + public static class FieldEntry + { + private final ResourceLocation registryName; + private final BiFunction fieldProducer; + private final List> fieldModuleProducers; + + /** + * Default internal constructor. + */ + private FieldEntry( + final ResourceLocation registryName, + final BiFunction fieldProducer, + final List> fieldModuleProducers) + { + this.registryName = registryName; + this.fieldProducer = fieldProducer; + this.fieldModuleProducers = fieldModuleProducers; + } + + /** + * Produces a field instance based on a colony and block pos. + * + * @param position the position the field is at. + * @return the field instance. + */ + public IField produceField(final BlockPos position) + { + final IField field = fieldProducer.apply(this, position); + for (final Function moduleProducer : fieldModuleProducers) + { + field.registerModule(moduleProducer.apply(field)); + } + return field; + } + + /** + * Get all field module producers. + * + * @return a list of all the field module producers. + */ + public List> getFieldModuleProducers() + { + return Collections.unmodifiableList(fieldModuleProducers); + } + + /** + * Get the assigned registry name. + * + * @return the resource location. + */ + public ResourceLocation getRegistryName() + { + return registryName; + } + + @Override + public int hashCode() + { + return registryName.hashCode(); + } + + @Override + public boolean equals(final Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final FieldEntry that = (FieldEntry) o; + + return registryName.equals(that.registryName); + } + + /** + * A builder class for {@link FieldEntry}. + */ + public static class Builder + { + private final List> fieldModuleProducers = new ArrayList<>(); + private ResourceLocation registryName; + private BiFunction fieldProducer; + + /** + * Sets the registry name for the new field entry. + * + * @param registryName The name for the registry entry. + * @return The builder. + */ + public FieldEntry.Builder setRegistryName(final ResourceLocation registryName) + { + this.registryName = registryName; + return this; + } + + /** + * Sets the callback that is used to create the {@link IField} from its position in the world. + * + * @param fieldProducer The callback used to create the {@link IField}. + * @return The builder. + */ + public FieldEntry.Builder setFieldProducer(final BiFunction fieldProducer) + { + this.fieldProducer = fieldProducer; + return this; + } + + /** + * Add a field module producer. + * + * @param moduleProducer the module producer. + * @return the builder again. + */ + public FieldEntry.Builder addFieldModuleProducer(final Function moduleProducer) + { + fieldModuleProducers.add(moduleProducer); + return this; + } + + /** + * Method used to create the entry. + * + * @return The entry. + */ + public FieldEntry createFieldEntry() + { + Validate.notNull(registryName); + Validate.notNull(fieldProducer); + + return new FieldEntry(registryName, fieldProducer, fieldModuleProducers); + } + } + } +} diff --git a/src/api/java/com/minecolonies/api/colony/interactionhandling/IInteractionResponseHandler.java b/src/api/java/com/minecolonies/api/colony/interactionhandling/IInteractionResponseHandler.java index 05b23b37b40..e3528dfc72f 100644 --- a/src/api/java/com/minecolonies/api/colony/interactionhandling/IInteractionResponseHandler.java +++ b/src/api/java/com/minecolonies/api/colony/interactionhandling/IInteractionResponseHandler.java @@ -27,6 +27,16 @@ public interface IInteractionResponseHandler extends INBTSerializable pos; public static RegistryObject request; public static RegistryObject recruitment; + public static RegistryObject quest; + public static RegistryObject questAction; private ModInteractionResponseHandlers() { diff --git a/src/api/java/com/minecolonies/api/colony/jobs/IJob.java b/src/api/java/com/minecolonies/api/colony/jobs/IJob.java index fad9594b5a0..5c6741bd534 100755 --- a/src/api/java/com/minecolonies/api/colony/jobs/IJob.java +++ b/src/api/java/com/minecolonies/api/colony/jobs/IJob.java @@ -2,15 +2,17 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.modules.IAssignsJob; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.colony.requestsystem.token.IToken; +import com.minecolonies.api.entity.ai.ITickingStateAI; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.ai.goal.GoalSelector; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.util.INBTSerializable; import org.jetbrains.annotations.NotNull; @@ -20,7 +22,7 @@ import static com.minecolonies.api.util.constant.HappinessConstants.IDLE_AT_JOB_COMPLAINS_DAYS; import static com.minecolonies.api.util.constant.HappinessConstants.IDLE_AT_JOB_DEMANDS_DAYS; -public interface IJob extends INBTSerializable +public interface IJob extends INBTSerializable { /** * The {@link JobEntry} for this job. @@ -51,11 +53,9 @@ public interface IJob extends INBTSerializable Set> getAsyncRequests(); /** - * Override to add Job-specific AI tasks to the given EntityAITask list. - * - * @param tasks EntityAITasks list to add tasks to. + * Creates the work AI */ - void addWorkerAIToTaskList(@NotNull GoalSelector tasks); + void createAI(); /** * Generate your AI class to register. @@ -122,7 +122,9 @@ default void onLevelUp() * @param citizen */ default void initEntityValues(AbstractEntityCitizen citizen) - {} + { + citizen.getCitizenData().setIdleAtJob(false); + } /** * Get the CitizenData that this Job belongs to. @@ -288,4 +290,28 @@ default boolean isGuard() { return false; } + + /** + * Gets the position of the building the job is assigned to + * @return + */ + public BlockPos getBuildingPos(); + + /** + * Gets the work building + * @return + */ + public IBuilding getWorkBuilding(); + + /** + * Gets the module this job is assigned to + */ + IAssignsJob getWorkModule(); + + /** + * Assigns the job to its specific work module + * @param module + * @return + */ + boolean assignTo(IAssignsJob module); } diff --git a/src/api/java/com/minecolonies/api/colony/jobs/ModJobs.java b/src/api/java/com/minecolonies/api/colony/jobs/ModJobs.java index 67162ad60b3..3a6546c1912 100755 --- a/src/api/java/com/minecolonies/api/colony/jobs/ModJobs.java +++ b/src/api/java/com/minecolonies/api/colony/jobs/ModJobs.java @@ -24,14 +24,14 @@ public final class ModJobs public static final ResourceLocation COWBOY_ID = new ResourceLocation(Constants.MOD_ID, "cowboy"); public static final ResourceLocation SWINE_HERDER_ID = new ResourceLocation(Constants.MOD_ID, "swineherder"); public static final ResourceLocation CHICKEN_HERDER_ID = new ResourceLocation(Constants.MOD_ID, "chickenherder"); - public static final ResourceLocation SMELTER_ID = new ResourceLocation(Constants.MOD_ID, "smelter"); - public static final ResourceLocation RANGER_ID = new ResourceLocation(Constants.MOD_ID, "ranger"); - public static final ResourceLocation KNIGHT_ID = new ResourceLocation(Constants.MOD_ID, "knight"); + public static final ResourceLocation SMELTER_ID = new ResourceLocation(Constants.MOD_ID, "smelter"); + public static final ResourceLocation ARCHER_ID = new ResourceLocation(Constants.MOD_ID, "ranger"); + public static final ResourceLocation KNIGHT_ID = new ResourceLocation(Constants.MOD_ID, "knight"); public static final ResourceLocation COMPOSTER_ID = new ResourceLocation(Constants.MOD_ID, "composter"); - public static final ResourceLocation STUDENT_ID = new ResourceLocation(Constants.MOD_ID, "student"); - public static final ResourceLocation ARCHER_ID = new ResourceLocation(Constants.MOD_ID, "archertraining"); - public static final ResourceLocation COMBAT_ID = new ResourceLocation(Constants.MOD_ID, "combattraining"); - public static final ResourceLocation SAWMILL_ID = new ResourceLocation(Constants.MOD_ID, "sawmill"); + public static final ResourceLocation STUDENT_ID = new ResourceLocation(Constants.MOD_ID, "student"); + public static final ResourceLocation ARCHER_TRAINING_ID = new ResourceLocation(Constants.MOD_ID, "archertraining"); + public static final ResourceLocation KNIGHT_TRAINING_ID = new ResourceLocation(Constants.MOD_ID, "combattraining"); + public static final ResourceLocation SAWMILL_ID = new ResourceLocation(Constants.MOD_ID, "sawmill"); public static final ResourceLocation BLACKSMITH_ID = new ResourceLocation(Constants.MOD_ID, "blacksmith"); public static final ResourceLocation STONEMASON_ID = new ResourceLocation(Constants.MOD_ID, "stonemason"); public static final ResourceLocation STONE_SMELTERY_ID = new ResourceLocation(Constants.MOD_ID, "stonesmeltery"); @@ -72,12 +72,12 @@ public final class ModJobs public static RegistryObject swineHerder; public static RegistryObject chickenHerder; public static RegistryObject smelter; - public static RegistryObject ranger; + public static RegistryObject archer; public static RegistryObject knight; public static RegistryObject composter; public static RegistryObject student; - public static RegistryObject archer; - public static RegistryObject combat; + public static RegistryObject archerInTraining; + public static RegistryObject knightInTraining; public static RegistryObject sawmill; public static RegistryObject blacksmith; public static RegistryObject stoneMason; diff --git a/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerLoadedEvent.java b/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerLoadedEvent.java new file mode 100644 index 00000000000..a3d7a78881a --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerLoadedEvent.java @@ -0,0 +1,35 @@ +package com.minecolonies.api.colony.managers.events; + +import com.minecolonies.api.colony.IColonyManager; +import net.minecraftforge.eventbus.api.Event; +import org.jetbrains.annotations.NotNull; + +/** + * Colony manager loaded event. + */ +public final class ColonyManagerLoadedEvent extends Event +{ + /** + * The colony manager instance. + */ + @NotNull + private final IColonyManager colonyManager; + + /** + * Event for colony manager loaded. + */ + public ColonyManagerLoadedEvent(final @NotNull IColonyManager colonyManager) + { + this.colonyManager = colonyManager; + } + + /** + * Get the colony manager instance. + * + * @return the colony manager. + */ + public @NotNull IColonyManager getColonyManager() + { + return colonyManager; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerUnloadedEvent.java b/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerUnloadedEvent.java new file mode 100644 index 00000000000..980b9719932 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/managers/events/ColonyManagerUnloadedEvent.java @@ -0,0 +1,35 @@ +package com.minecolonies.api.colony.managers.events; + +import com.minecolonies.api.colony.IColonyManager; +import net.minecraftforge.eventbus.api.Event; +import org.jetbrains.annotations.NotNull; + +/** + * Colony manager unloaded event. + */ +public class ColonyManagerUnloadedEvent extends Event +{ + /** + * The colony manager instance. + */ + @NotNull + private final IColonyManager colonyManager; + + /** + * Event for colony manager loaded. + */ + public ColonyManagerUnloadedEvent(final @NotNull IColonyManager colonyManager) + { + this.colonyManager = colonyManager; + } + + /** + * Get the colony manager instance. + * + * @return the colony manager. + */ + public @NotNull IColonyManager getColonyManager() + { + return colonyManager; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java b/src/api/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java index 70464a7b549..071d514be4d 100644 --- a/src/api/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java +++ b/src/api/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java @@ -1,6 +1,7 @@ package com.minecolonies.api.colony.managers.interfaces; import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.entity.citizen.happiness.IHappinessModifier; import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -153,11 +154,11 @@ default ICitizenData spawnOrCreateCitizen(final ICitizenData data, @NotNull fina ICitizenData getRandomCitizen(); /** - * Update a modifier for all citizens. + * Inject a modifier into all citizens * - * @param id the name of it. + * @param modifier the modifier. */ - void updateModifier(final String id); + void injectModifier(final IHappinessModifier modifier); /** * Call this when citizens sleep @@ -171,4 +172,9 @@ default ICitizenData spawnOrCreateCitizen(final ICitizenData data, @NotNull fina * Called in the morning. */ void onWakeUp(); + + /** + * Post building load actions + */ + void afterBuildingLoad(); } diff --git a/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRaiderManager.java b/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRaiderManager.java index 9c9c70c771d..d5bbecbbfc6 100755 --- a/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRaiderManager.java +++ b/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRaiderManager.java @@ -1,8 +1,9 @@ package com.minecolonies.api.colony.managers.interfaces; import com.minecolonies.api.colony.ICitizenData; -import net.minecraft.nbt.CompoundTag; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import java.util.List; @@ -11,6 +12,15 @@ */ public interface IRaiderManager { + public enum RaidSpawnResult + { + SUCCESS, + TOO_SMALL, + CANNOT_RAID, + NO_SPAWN_POINT, + ERROR + } + /** * Checks if the raider manager can have raider events. * @@ -33,18 +43,21 @@ public interface IRaiderManager void setCanHaveRaiderEvents(final boolean canHave); /** - * Add a spawnPoint to the last raiders spawns. + * Set if raiders will raid tonight. * - * @param pos the position to set. + * @param willRaid true or false. */ - void addRaiderSpawnPoint(final BlockPos pos); + default void setRaidNextNight(final boolean willRaid) + { + setRaidNextNight(willRaid, "", true); + } /** * Set if raiders will raid tonight. * * @param willRaid true or false. */ - void setRaidNextNight(final boolean willRaid); + void setRaidNextNight(final boolean willRaid, final String raidType, final boolean allowShips); /** * Set if a specific type of raiders will raid tonight. @@ -54,7 +67,10 @@ public interface IRaiderManager * Accepted names include "pirate", "egyptian", "norsemen", "barbarian", and "amazon". * Defaults to "barbarian" if unsupported type is attempted. */ - void setRaidNextNight(final boolean willRaid, final String raidType); + default void setRaidNextNight(final boolean willRaid, final String raidType) + { + setRaidNextNight(willRaid, raidType, true); + } /** * Returns whether spies are enabled @@ -77,8 +93,21 @@ public interface IRaiderManager /** * Trigger a specific type of raid on a colony. + * @param raidType the type of raid (or empty). + * @param overrideConfig if it should override the config to allow raiders. */ - void raiderEvent(String raidType); + default RaidSpawnResult raiderEvent(String raidType, final boolean overrideConfig) + { + return raiderEvent(raidType, overrideConfig, true); + } + + /** + * Trigger a specific type of raid on a colony. + * @param raidType the type of raid (or empty). + * @param overrideConfig if it should override the config to allow raiders. + * @param allowShips if ship spawns are allowed. + */ + RaidSpawnResult raiderEvent(String raidType, final boolean overrideConfig, final boolean allowShips); /** * Calculates the spawn position for raids @@ -135,6 +164,14 @@ public interface IRaiderManager */ boolean canRaid(); + /** + * Whether the colony can be raided. + * + * @param overrideConfig if the config should be overriden. + * @return true if possible. + */ + boolean canRaid(final boolean overrideConfig); + /** * calculates the colonies raid level * @@ -180,4 +217,16 @@ public interface IRaiderManager * @return weighted amount of list citizen */ int getLostCitizen(); + + /** + * Called when a raider mob dies + * + * @param entity + */ + void onRaiderDeath(AbstractEntityRaiderMob entity); + + /** + * Notify raid manager of a passing through raid. + */ + void setPassThroughRaid(); } diff --git a/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRegisteredStructureManager.java b/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRegisteredStructureManager.java index 78091b64c7d..8d04b66c62c 100644 --- a/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRegisteredStructureManager.java +++ b/src/api/java/com/minecolonies/api/colony/managers/interfaces/IRegisteredStructureManager.java @@ -3,23 +3,26 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.IMysticalSite; +import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.buildings.workerbuildings.ITownHall; import com.minecolonies.api.colony.buildings.workerbuildings.IWareHouse; +import com.minecolonies.api.colony.fields.IField; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; +import com.minecolonies.api.quests.IQuestInstance; import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.chunk.LevelChunk; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Predicate; @@ -80,12 +83,14 @@ public interface IRegisteredStructureManager /** * Get the leisure site positions. + * * @return the list. */ List getLeisureSites(); /** * Get the first building matching the conditions. + * * @param predicate the predicate matching the building. * @return the position or null. */ @@ -94,18 +99,21 @@ public interface IRegisteredStructureManager /** * Register a new leisure site. + * * @param pos the position of it. */ void addLeisureSite(BlockPos pos); /** * Remove a leisure site. + * * @param pos the position of it. */ void removeLeisureSite(BlockPos pos); /** * Get the closest warehouse relative to a position. + * * @param pos the position,. * @return the closest warehouse. */ @@ -163,35 +171,7 @@ public interface IRegisteredStructureManager * @param Building class. * @return the building with the specified id. */ - @Nullable - B getBuilding(final BlockPos buildingId, @NotNull final Class type); - - /** - * Getter for a unmodifiable version of the farmerFields list. - * - * @return list of fields and their id. - */ - @NotNull - List getFields(); - - /** - * Creates a field from a tile entity and adds it to the colony. - * - * @param tileEntity the scarecrow which contains the inventory. - * @param pos Position where the field has been placed. - * @param world the world of the field. - */ - void addNewField(final AbstractScarecrowTileEntity tileEntity, final BlockPos pos, final Level world); - - /** - * Returns a field which has not been taken yet. - * - * @param owner id of the owner of the field. - * @param world the world it is in. - * @return a field if there is one available, else null. - */ - @Nullable - AbstractScarecrowTileEntity getFreeField(final int owner, final Level world); + @Nullable B getBuilding(final BlockPos buildingId, @NotNull final Class type); /** * Remove a IBuilding from the Colony (when it is destroyed). @@ -206,6 +186,11 @@ public interface IRegisteredStructureManager */ void markBuildingsDirty(); + /** + * Marks fields data dirty. + */ + void markFieldsDirty(); + /** * Creates a building from a tile entity and adds it to the colony. * @@ -216,17 +201,10 @@ public interface IRegisteredStructureManager @Nullable IBuilding addNewBuilding(@NotNull final AbstractTileEntityColonyBuilding tileEntity, final Level world); - /** - * Removes a field from the farmerFields list. - * - * @param pos the position-id. - */ - void removeField(final BlockPos pos); - /** * Calculate a good cook for a certain citizen. * - * @param citizen the citizen. + * @param citizen the citizen. * @param building the type of building. * @return the Position of it. */ @@ -235,7 +213,7 @@ public interface IRegisteredStructureManager /** * Calculate a good building for a certain pos. * - * @param pos the pos. + * @param pos the pos. * @param building the building class type. * @return the Position of it. */ @@ -259,8 +237,9 @@ public interface IRegisteredStructureManager /** * Event once a guard building changed at a certain level. + * * @param guardBuilding the guard building. - * @param newLevel the level of it. + * @param newLevel the level of it. */ void guardBuildingChangedAt(IBuilding guardBuilding, int newLevel); @@ -311,6 +290,7 @@ public interface IRegisteredStructureManager /** * Check if the chunk position it within of the building zone of the colony. + * * @param chunk the chunk to check * @return true if within. */ @@ -318,6 +298,7 @@ public interface IRegisteredStructureManager /** * Get a house with a spare bed. + * * @return the house or null. */ IBuilding getHouseWithSpareBed(); @@ -332,7 +313,54 @@ public interface IRegisteredStructureManager /** * Get a random leisure site to go to. + * * @return the position of it. */ BlockPos getRandomLeisureSite(); -} + + /** + * Track building leveling. + * @param buildingEntry the type of building to track. + * @param colonyQuest the quest. + */ + void trackBuildingLevelUp(@NotNull final BuildingEntry buildingEntry, @NotNull final IQuestInstance colonyQuest); + + /** + * Stop tracking building leveling. + * @param buildingEntry the type of building to track. + * @param colonyQuest the quest. + */ + void stopTrackingBuildingLevelUp(@NotNull final BuildingEntry buildingEntry, @NotNull final IQuestInstance colonyQuest); + + /** + * Get all the fields + * + * @param matcher the field matcher predicate. + * @return an unmodifiable collection of all fields. + */ + @NotNull List getFields(Predicate matcher); + + /** + * Get a specific field on the given location. + * + * @param matcher the field matcher predicate. + * @return the field, if any. + */ + Optional getField(Predicate matcher); + + /** + * Add a new field to the building manager. + * If an identical field already exists, this field won't be added. + * + * @param field the new field to add. + * @return true if the field was added. + */ + boolean addField(IField field); + + /** + * Remove a field from the field collection. + * + * @param matcher the field matcher predicate. + */ + void removeField(Predicate matcher); +} \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/colony/modules/IModuleContainer.java b/src/api/java/com/minecolonies/api/colony/modules/IModuleContainer.java new file mode 100644 index 00000000000..d014bd0e567 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/modules/IModuleContainer.java @@ -0,0 +1,63 @@ +package com.minecolonies.api.colony.modules; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +/** + * Default interface for objects that contain module instances. + */ +public interface IModuleContainer +{ + /** + * Check if the object has a particular module. + * + * @param clazz the class or interface of the module to check. + * @return true if so. + */ + boolean hasModule(final Class clazz); + + /** + * Get the first module with a particular class or interface. + * + * @param clazz the module's class or interface. + * @return the module or empty if not existent. + */ + @NotNull T2 getFirstModuleOccurance(Class clazz); + + /** + * Get the first module with a particular class or interface. + * + * @param clazz the module's class or interface. + * @return the module or empty if not existent. + */ + @NotNull Optional getFirstOptionalModuleOccurance(Class clazz); + + /** + * Get all modules with a particular class or interface. + * + * @param clazz the module's interface (or class, but prefer getModule in that case) + * @return the list of modules or empty if none match. + */ + @NotNull List getModules(Class clazz); + + /** + * Get a module matching a certain predicate. + * + * @param clazz the class of the module. + * @param modulePredicate the predicate to match. + * @param the module type. + * @return the first matching module. + * @throws IllegalArgumentException if your condition does not match any modules + */ + @NotNull T2 getModuleMatching(Class clazz, Predicate modulePredicate); + + /** + * Register a specific module to the object. + * + * @param module the module to register. + */ + void registerModule(@NotNull final T module); +} diff --git a/src/api/java/com/minecolonies/api/colony/modules/ModuleContainerUtils.java b/src/api/java/com/minecolonies/api/colony/modules/ModuleContainerUtils.java new file mode 100644 index 00000000000..7ee490d7186 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/modules/ModuleContainerUtils.java @@ -0,0 +1,127 @@ +package com.minecolonies.api.colony.modules; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +/** + * Class that contains generic logic for handling with modules. + */ +@SuppressWarnings("unchecked") +public class ModuleContainerUtils +{ + private ModuleContainerUtils() + { + } + + /** + * Check if the object has a particular module. + * + * @param modules the collection of modules given from the implementing module handler. + * @param clazz the class or interface of the module to check. + * @return true if so. + */ + public static boolean hasModule(final Collection modules, Class clazz) + { + for (final T module : modules) + { + if (clazz.isInstance(module)) + { + return true; + } + } + return false; + } + + /** + * Get the first module with a particular class or interface. + * + * @param modules the collection of modules given from the implementing module handler. + * @param clazz the module's class or interface. + * @return the module or empty if not existent. + */ + public static @NotNull Optional getFirstOptionalModuleOccurance(final Collection modules, final Class clazz) + { + for (final T module : modules) + { + if (clazz.isInstance(module)) + { + return Optional.of((T2) module); + } + } + return Optional.empty(); + } + + /** + * Get the first module with a particular class or interface. + * + * @param modules the collection of modules given from the implementing module handler. + * @param clazz the module's class or interface. + * @return the module or empty if not existent. + */ + public static @NotNull T2 getFirstModuleOccurance(final Collection modules, final Class clazz, String errorMessage) + { + for (final T module : modules) + { + if (clazz.isInstance(module)) + { + return (T2) module; + } + } + + throw new IllegalStateException(errorMessage); + } + + /** + * Get a module matching a certain predicate. + * + * @param modules the collection of modules given from the implementing module handler. + * @param clazz the class of the module. + * @param modulePredicate the predicate to match. + * @param the module type. + * @return the first matching module. + * @throws IllegalArgumentException if your condition does not match any modules + */ + public static @NotNull T2 getModuleMatching( + final Collection modules, + final Class clazz, + final Predicate modulePredicate, + String errorMessage) + { + for (final T module : modules) + { + if (clazz.isInstance(module) && modulePredicate.test((T2) module)) + { + return (T2) module; + } + } + + throw new IllegalStateException(errorMessage); + } + + /** + * Get all modules with a particular class or interface. + * + * @param modules the collection of modules given from the implementing module handler. + * @param clazz the module's interface (or class, but prefer getModule in that case) + * @return the list of modules or empty if none match. + */ + public static @NotNull List getModules(final Collection modules, final Class clazz) + { + final List result = new ArrayList<>(); + + for (T module : modules) + { + if (clazz.isInstance(module)) + { + result.add((T2) module); + } + } + + return result; + } +} diff --git a/src/api/java/com/minecolonies/api/colony/permissions/IPermissions.java b/src/api/java/com/minecolonies/api/colony/permissions/IPermissions.java index 1026dd0b351..a0533a36cab 100755 --- a/src/api/java/com/minecolonies/api/colony/permissions/IPermissions.java +++ b/src/api/java/com/minecolonies/api/colony/permissions/IPermissions.java @@ -87,7 +87,7 @@ public interface IPermissions boolean addPlayer(@NotNull UUID id, String name, Rank rank); - @Nullable + @NotNull String getOwnerName(); /** diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/StandardFactoryController.java b/src/api/java/com/minecolonies/api/colony/requestsystem/StandardFactoryController.java index 8f09c5e7d03..2ad887cef86 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/StandardFactoryController.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/StandardFactoryController.java @@ -30,6 +30,8 @@ public final class StandardFactoryController implements IFactoryController ////// --------------------------- NBTConstants --------------------------- \\\\\\ public static final String NBT_TYPE = "Type"; public static final String NBT_DATA = "Data"; + public static final String NEW_NBT_TYPE = "NType"; + ////// --------------------------- NBTConstants --------------------------- \\\\\\ /** @@ -270,7 +272,7 @@ public CompoundTag serialize(@NotNull final OUTPUT object) throws Illeg final CompoundTag compound = new CompoundTag(); final IFactory factory = getFactoryForOutput((TypeToken) TypeToken.of(object.getClass())); - compound.putString(NBT_TYPE, object.getClass().getName()); + compound.putShort(NEW_NBT_TYPE, factory.getSerializationId()); compound.put(NBT_DATA, factory.serialize(this, object)); return compound; @@ -279,18 +281,31 @@ public CompoundTag serialize(@NotNull final OUTPUT object) throws Illeg @Override public OUTPUT deserialize(@NotNull final CompoundTag compound) throws IllegalArgumentException { - String className = compound.getString(NBT_TYPE); - className = processClassRenaming(className); - final IFactory factory; - - try + if (compound.contains(NEW_NBT_TYPE)) { - factory = getFactoryForOutput(className); + short classId = compound.getShort(NEW_NBT_TYPE); + try + { + factory = getFactoryForOutput(classId); + } + catch (final IllegalArgumentException e) + { + throw (IllegalArgumentException) new IllegalArgumentException("The given compound holds an unknown output type for this Controller").initCause(e); + } } - catch (final IllegalArgumentException e) + else { - throw (IllegalArgumentException) new IllegalArgumentException("The given compound holds an unknown output type for this Controller: " + className).initCause(e); + String className = compound.getString(NBT_TYPE); + className = processClassRenaming(className); + try + { + factory = getFactoryForOutput(className); + } + catch (final IllegalArgumentException e) + { + throw (IllegalArgumentException) new IllegalArgumentException("The given compound holds an unknown output type for this Controller: " + className).initCause(e); + } } try diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/manager/IRequestManager.java b/src/api/java/com/minecolonies/api/colony/requestsystem/manager/IRequestManager.java index 8afcd1357a8..74f38c9f5d5 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/manager/IRequestManager.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/manager/IRequestManager.java @@ -225,11 +225,11 @@ default IToken createAndAssignRequest(@NotNull IRequ void markDirty(); /** - * Get a logger. + * Log a debug message. * - * @return a logger. + * @param message the message to log. */ - Logger getLogger(); + void log(final String message); /** * serialize this request manager to the give {@link FriendlyByteBuf} diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Burnable.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Burnable.java index ea1c1ecf72f..f1926d2bc98 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Burnable.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Burnable.java @@ -72,7 +72,7 @@ public static CompoundTag serialize(final IFactoryController controller, final B public static Burnable deserialize(final IFactoryController controller, final CompoundTag compound) { final int count = compound.getInt(NBT_COUNT); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; return new Burnable(count, result); } diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Food.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Food.java index 8d7390ab47d..1e17400823d 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Food.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Food.java @@ -111,7 +111,7 @@ public static CompoundTag serialize(final IFactoryController controller, final F public static Food deserialize(final IFactoryController controller, final CompoundTag compound) { final int count = compound.getInt(NBT_COUNT); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; final List items = new ArrayList<>(); if (compound.contains(NBT_EXCLUSION)) @@ -183,7 +183,7 @@ public boolean matches(@NotNull final ItemStack stack) return ItemStackUtils.ISFOOD.test(stack) && !exclusionList.contains(new ItemStorage(stack)) && !(ItemStackUtils.ISCOOKABLE.test(stack) && exclusionList.contains(new ItemStorage(MinecoloniesAPIProxy.getInstance().getFurnaceRecipes().getSmeltingResult(stack)))) - && (ItemStackUtils.ISCOOKABLE.test(stack) || stack.getItem().getFoodProperties().getNutrition() >= minNutrition); + && (ItemStackUtils.ISCOOKABLE.test(stack) || stack.getItem().getFoodProperties(stack, null).getNutrition() >= minNutrition); } @Override @@ -256,4 +256,10 @@ public Set> getSuperClasses() { return TYPE_TOKENS; } + + @Override + public boolean canBeResolvedByBuilding() + { + return false; + } } diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IDeliverable.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IDeliverable.java index 87f1f94f3f8..7931fd28097 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IDeliverable.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IDeliverable.java @@ -52,4 +52,14 @@ public interface IDeliverable extends IRetryable * @return the deliverable. */ IDeliverable copyWithCount(final int newCount); + + + /** + * Can this type of request be resolved by the building, or only by external resolvers. + * @return true if so. + */ + default boolean canBeResolvedByBuilding() + { + return true; + } } diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IStackBasedTask.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IStackBasedTask.java new file mode 100644 index 00000000000..f18c7695164 --- /dev/null +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/IStackBasedTask.java @@ -0,0 +1,28 @@ +package com.minecolonies.api.colony.requestsystem.requestable; + +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; + +/** + * Stack based requests interface for display purposes. + */ +public interface IStackBasedTask +{ + /** + * Get the stack associated to the task. + * @return the stack. + */ + ItemStack getTaskStack(); + + /** + * Get the request related count. + * @return the count. + */ + int getDisplayCount(); + + /** + * Get a display prefix component. + * @return the component. + */ + MutableComponent getDisplayPrefix(); +} diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/RequestTag.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/RequestTag.java index ddecbd6fc46..92a2a730ed2 100644 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/RequestTag.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/RequestTag.java @@ -249,11 +249,11 @@ public static RequestTag deserialize(final IFactoryController controller, final public static RequestTag deserialize(final IFactoryController controller, final CompoundTag compound) { final TagKey theTag = ItemTags.create(new ResourceLocation(compound.getString(NBT_TAG))); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; int count = compound.getInt("size"); int minCount = count; - if (compound.getAllKeys().contains(NBT_COUNT)) + if (compound.contains(NBT_COUNT)) { count = compound.getInt(NBT_COUNT); minCount = compound.getInt(NBT_MINCOUNT); diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Stack.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Stack.java index 3c7b835bdad..298f2ad0e9f 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Stack.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Stack.java @@ -32,8 +32,9 @@ public class Stack implements IConcreteDeliverable private static final String NBT_STACK = "Stack"; private static final String NBT_MATCHMETA = "MatchMeta"; private static final String NBT_MATCHNBT = "MatchNBT"; - private static final String NBT_MATCHOREDIC = "MatchOreDic"; - private static final String NBT_RESULT = "Result"; + private static final String NBT_MATCHOREDIC = "MatchOreDic"; + private static final String NBT_BUILDING_RES = "BuildingRes"; + private static final String NBT_RESULT = "Result"; private static final String NBT_COUNT = "Count"; private static final String NBT_MINCOUNT = "MinCount"; ////// --------------------------- NBTConstants --------------------------- \\\\\\ @@ -69,6 +70,11 @@ public class Stack implements IConcreteDeliverable @NotNull private ItemStack result; + /** + * If this request can be resolved by building. + */ + private boolean canBeResolvedByBuilding; + /** * Create a Stack deliverable. * @@ -144,6 +150,23 @@ public Stack( @NotNull final ItemStack result, final int count, final int minCount) + { + this(stack, matchDamage, matchNBT, matchOreDic, ItemStackUtils.EMPTY, count, minCount, true); + } + + /** + * Create a Stack deliverable. + * + * @param stack the required stack. + * @param matchDamage if damage has to be matched. + * @param matchNBT if NBT has to be matched. + * @param matchOreDic if the oredict has to be matched. + * @param result the result stack. + * @param count the count. + * @param minCount the min count. + * @param canBeResolvedByBuilding if can be resolved by building. + */ + public Stack(final ItemStack stack, final boolean matchDamage, final boolean matchNBT, final boolean matchOreDic, final ItemStack result, final int count, final int minCount, final boolean canBeResolvedByBuilding) { if (ItemStackUtils.isEmpty(stack)) { @@ -157,6 +180,7 @@ public Stack( this.result = result; this.count = count; this.minCount = minCount; + this.canBeResolvedByBuilding = canBeResolvedByBuilding; } /** @@ -173,6 +197,8 @@ public static CompoundTag serialize(final IFactoryController controller, final S compound.putBoolean(NBT_MATCHMETA, input.matchDamage); compound.putBoolean(NBT_MATCHNBT, input.matchNBT); compound.putBoolean(NBT_MATCHOREDIC, input.matchOreDic); + compound.putBoolean(NBT_BUILDING_RES, input.canBeResolvedByBuilding); + if (!ItemStackUtils.isEmpty(input.result)) { compound.put(NBT_RESULT, input.result.serializeNBT()); @@ -196,17 +222,19 @@ public static Stack deserialize(final IFactoryController controller, final Compo final boolean matchMeta = compound.getBoolean(NBT_MATCHMETA); final boolean matchNBT = compound.getBoolean(NBT_MATCHNBT); final boolean matchOreDic = compound.getBoolean(NBT_MATCHOREDIC); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final boolean canBeResolved = compound.contains(NBT_BUILDING_RES) ? compound.getBoolean(NBT_BUILDING_RES) : true; + + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; int count = compound.getInt("size"); int minCount = count; - if (compound.getAllKeys().contains(NBT_COUNT)) + if (compound.contains(NBT_COUNT)) { count = compound.getInt(NBT_COUNT); minCount = compound.getInt(NBT_MINCOUNT); } - return new Stack(stack, matchMeta, matchNBT, matchOreDic, result, count, minCount); + return new Stack(stack, matchMeta, matchNBT, matchOreDic, result, count, minCount, canBeResolved); } /** @@ -222,6 +250,7 @@ public static void serialize(final IFactoryController controller, final Friendly buffer.writeBoolean(input.matchDamage); buffer.writeBoolean(input.matchNBT); buffer.writeBoolean(input.matchOreDic); + buffer.writeBoolean(input.canBeResolvedByBuilding); buffer.writeBoolean(!ItemStackUtils.isEmpty(input.result)); if (!ItemStackUtils.isEmpty(input.result)) @@ -245,13 +274,13 @@ public static Stack deserialize(final IFactoryController controller, final Frien final boolean matchMeta = buffer.readBoolean(); final boolean matchNBT = buffer.readBoolean(); final boolean matchOreDic = buffer.readBoolean(); + final boolean canBeResolved = buffer.readBoolean(); final ItemStack result = buffer.readBoolean() ? buffer.readItem() : ItemStack.EMPTY; int count = buffer.readInt(); int minCount = buffer.readInt(); - - return new Stack(stack, matchMeta, matchNBT, matchOreDic, result, count, minCount); + return new Stack(stack, matchMeta, matchNBT, matchOreDic, result, count, minCount, canBeResolved); } @Override @@ -341,6 +370,10 @@ public boolean equals(final Object o) { return false; } + if (canBeResolvedByBuilding != stack1.canBeResolvedByBuilding) + { + return false; + } if (matchNBT != stack1.matchNBT) { return false; @@ -363,10 +396,22 @@ public int hashCode() result1 = 31 * result1 + (matchDamage ? 1 : 0); result1 = 31 * result1 + (matchNBT ? 1 : 0); result1 = 31 * result1 + (matchOreDic ? 1 : 0); + result1 = 31 * result1 + (canBeResolvedByBuilding ? 1 : 0); result1 = 31 * result1 + getResult().hashCode(); return result1; } + @Override + public boolean canBeResolvedByBuilding() + { + return canBeResolvedByBuilding; + } + + public void setCanBeResolvedByBuilding(final boolean canBeResolvedByBuilding) + { + this.canBeResolvedByBuilding = canBeResolvedByBuilding; + } + @Override public List getRequestedItems() { diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/StackList.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/StackList.java index ec53643aae9..2ffbbfe9e56 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/StackList.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/StackList.java @@ -225,11 +225,11 @@ public static StackList deserialize(final IFactoryController controller, final C final boolean matchMeta = compound.getBoolean(NBT_MATCHMETA); final boolean matchNBT = compound.getBoolean(NBT_MATCHNBT); final boolean matchOreDic = compound.getBoolean(NBT_MATCHOREDIC); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; - final String desc = compound.getAllKeys().contains(TAG_DESCRIPTION) ? compound.getString(TAG_DESCRIPTION) : REQUEST_SYSTEM_STACK_LIST; + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final String desc = compound.contains(TAG_DESCRIPTION) ? compound.getString(TAG_DESCRIPTION) : REQUEST_SYSTEM_STACK_LIST; int count = stacks.isEmpty() ? 0 : stacks.get(0).getCount(); int minCount = count; - if (compound.getAllKeys().contains(NBT_COUNT)) + if (compound.contains(NBT_COUNT)) { count = compound.getInt(NBT_COUNT); minCount = compound.getInt(NBT_MINCOUNT); diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Tool.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Tool.java index cde033481b3..4de2f4e2c07 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Tool.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/Tool.java @@ -8,10 +8,10 @@ import com.minecolonies.api.util.constant.IToolType; import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.api.util.constant.TypeConstants; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.common.ToolAction; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.*; import net.minecraftforge.common.ToolActions; import org.jetbrains.annotations.NotNull; @@ -19,16 +19,6 @@ import java.util.Set; import java.util.stream.Collectors; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.BowItem; -import net.minecraft.world.item.FishingRodItem; -import net.minecraft.world.item.FlintAndSteelItem; -import net.minecraft.world.item.HoeItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ShearsItem; -import net.minecraft.world.item.ShieldItem; -import net.minecraft.world.item.SwordItem; - /** * Class used to represent tools inside the request system. */ @@ -248,25 +238,23 @@ private Set getToolClasses(final ItemStack stack) set.add(ToolType.SWORD.getName()); } - if (stack.getItem() instanceof BowItem) - { - set.add("bow"); - } - else if (stack.getItem() instanceof SwordItem || Compatibility.isTinkersWeapon(stack)) + if (stack.canPerformAction(ToolActions.SHEARS_DIG)) { - set.add("weapon"); + set.add(ToolType.SHEARS.getName()); } - else if (stack.getItem() instanceof HoeItem) + + if (stack.canPerformAction(ToolActions.FISHING_ROD_CAST)) { - set.add(ToolType.HOE.getName()); + set.add(ToolType.FISHINGROD.getName()); } - else if (stack.getItem() instanceof FishingRodItem) + + if (stack.getItem() instanceof BowItem) { - set.add("rod"); + set.add("bow"); } - else if (stack.getItem() instanceof ShearsItem) + else if (stack.getItem() instanceof SwordItem || Compatibility.isTinkersWeapon(stack)) { - set.add("shears"); + set.add("weapon"); } else if (stack.getItem() instanceof ShieldItem) { diff --git a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/crafting/PrivateCrafting.java b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/crafting/PrivateCrafting.java index aa398117365..7bab1e7c7a4 100755 --- a/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/crafting/PrivateCrafting.java +++ b/src/api/java/com/minecolonies/api/colony/requestsystem/requestable/crafting/PrivateCrafting.java @@ -48,7 +48,8 @@ public static CompoundTag serialize(final IFactoryController controller, final P compound.put(NBT_STACK, input.getStack().serializeNBT()); compound.putInt(NBT_COUNT, input.getCount()); compound.putInt(NBT_MIN_COUNT, input.getMinCount()); - StandardFactoryController.getInstance().serialize(input.getRecipeID()); + final CompoundTag tokenCompound = StandardFactoryController.getInstance().serialize(input.getRecipeID()); + compound.put(NBT_TOKEN, tokenCompound); return compound; } @@ -65,8 +66,15 @@ public static PrivateCrafting deserialize(final IFactoryController controller, f final ItemStack stack = ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_STACK)); final int count = compound.getInt(NBT_COUNT); final int minCount = compound.getInt(NBT_MIN_COUNT); - final IToken token = StandardFactoryController.getInstance().deserialize(compound); - + IToken token = null; + if (compound.contains(NBT_TOKEN)) + { + token = StandardFactoryController.getInstance().deserialize(compound.getCompound(NBT_TOKEN)); + } + else + { + throw new IllegalArgumentException("Old Data - Missing Token!"); + } return new PrivateCrafting(stack, count, minCount == 0 ? count : minCount, token); } diff --git a/src/api/java/com/minecolonies/api/colony/workorders/IWorkOrder.java b/src/api/java/com/minecolonies/api/colony/workorders/IWorkOrder.java index 8a064b56613..5f1b0f069eb 100755 --- a/src/api/java/com/minecolonies/api/colony/workorders/IWorkOrder.java +++ b/src/api/java/com/minecolonies/api/colony/workorders/IWorkOrder.java @@ -1,15 +1,18 @@ package com.minecolonies.api.colony.workorders; +import com.ldtteam.structurize.blueprints.v1.Blueprint; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.IJob; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.Future; + import static com.minecolonies.api.util.constant.Suppression.UNUSED_METHOD_PARAMETERS_SHOULD_BE_REMOVED; public interface IWorkOrder @@ -56,6 +59,12 @@ public interface IWorkOrder */ String getStructurePack(); + /** + * Get a blueprint future. + * @return the blueprint future (might contain null). + */ + Future getBlueprintFuture(); + /** * Get the current level of the structure of the work order. * diff --git a/src/api/java/com/minecolonies/api/compatibility/Compatibility.java b/src/api/java/com/minecolonies/api/compatibility/Compatibility.java index 29d42651815..55e8709ff3b 100755 --- a/src/api/java/com/minecolonies/api/compatibility/Compatibility.java +++ b/src/api/java/com/minecolonies/api/compatibility/Compatibility.java @@ -296,4 +296,4 @@ public static List getCombsFromHive(BlockPos pos, Level world, int am { return beeHiveCompat.getCombsFromHive(pos, world, amount); } -} +} \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/compatibility/CompatibilityManager.java b/src/api/java/com/minecolonies/api/compatibility/CompatibilityManager.java index 4e1d9bd0437..9690e3dacfa 100755 --- a/src/api/java/com/minecolonies/api/compatibility/CompatibilityManager.java +++ b/src/api/java/com/minecolonies/api/compatibility/CompatibilityManager.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.minecolonies.api.MinecoloniesAPIProxy; +import com.minecolonies.api.colony.buildings.ModBuildings; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.compatibility.dynamictrees.DynamicTreeCompat; import com.minecolonies.api.compatibility.resourcefulbees.ResourcefulBeesCompat; @@ -42,6 +43,8 @@ import org.jetbrains.annotations.NotNull; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -125,7 +128,7 @@ public class CompatibilityManager implements ICompatibilityManager /** * List of lucky oreBlocks which get dropped by the miner. */ - private final List luckyOres = new ArrayList<>(); + private final Map> luckyOres = new HashMap<>(); /** * The items and weights of the recruitment. @@ -163,6 +166,11 @@ public class CompatibilityManager implements ICompatibilityManager */ private ImmutableSet monsters = ImmutableSet.of(); + /** + * List of all the items that can be used by the apiary. + */ + private ImmutableSet flowers = ImmutableSet.of(); + /** * Instantiates the compatibilityManager. */ @@ -179,6 +187,8 @@ private void clear() oreBlocks.clear(); smeltableOres.clear(); plantables.clear(); + flowers = ImmutableSet.of(); + food.clear(); edibles.clear(); fuel.clear(); @@ -206,6 +216,8 @@ public void discover(@NotNull final RecipeManager recipeManager) discoverSaplings(); discoverOres(); discoverPlantables(); + discoverFlowers(); + discoverFood(); discoverFuel(); discoverMobs(); @@ -230,6 +242,8 @@ public void serialize(@NotNull final FriendlyByteBuf buf) serializeBlockList(buf, oreBlocks); serializeItemStorageList(buf, smeltableOres); serializeItemStorageList(buf, plantables); + serializeItemStorageList(buf, flowers); + serializeItemStorageList(buf, food); serializeItemStorageList(buf, edibles); serializeItemStorageList(buf, fuel); @@ -256,6 +270,8 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) oreBlocks.addAll(deserializeBlockList(buf)); smeltableOres.addAll(deserializeItemStorageList(buf)); plantables.addAll(deserializeItemStorageList(buf)); + flowers = ImmutableSet.copyOf(deserializeItemStorageList(buf)); + food.addAll(deserializeItemStorageList(buf)); edibles.addAll(deserializeItemStorageList(buf)); fuel.addAll(deserializeItemStorageList(buf)); @@ -264,6 +280,8 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) Log.getLogger().info("Synchronized {} saplings", saplings.size()); Log.getLogger().info("Synchronized {} ore blocks with {} smeltable ores", oreBlocks.size(), smeltableOres.size()); Log.getLogger().info("Synchronized {} plantables", plantables.size()); + Log.getLogger().info("Synchronized {} flowers", flowers.size()); + Log.getLogger().info("Synchronized {} food types with {} edible", food.size(), edibles.size()); Log.getLogger().info("Synchronized {} fuel types", fuel.size()); Log.getLogger().info("Synchronized {} monsters", monsters.size()); @@ -409,7 +427,7 @@ public Set getEdibles(final int minNutrition) final Set filteredEdibles = new HashSet<>(); for (final ItemStorage storage : edibles) { - if ((storage.getItem().getFoodProperties() != null && storage.getItem().getFoodProperties().getNutrition() >= minNutrition)) + if ((storage.getItemStack().getFoodProperties(null) != null && storage.getItemStack().getFoodProperties(null).getNutrition() >= minNutrition)) { filteredEdibles.add(storage); } @@ -447,6 +465,13 @@ public Set getCopyOfPlantables() return new HashSet<>(plantables); } + @Override + public Set getImmutableFlowers() + { + if (flowers.isEmpty()) Log.getLogger().error("getImmutableFlowers when empty"); + return flowers; + } + @Override public String getRandomDisease() { @@ -529,11 +554,19 @@ public void connectLeafToSapling(final BlockState leaf, final ItemStack stack) } @Override - public ItemStack getRandomLuckyOre(final double chanceBonus) + public ItemStack getRandomLuckyOre(final double chanceBonus, final int buildingLevel) { if (random.nextDouble() * ONE_HUNDRED_PERCENT <= MinecoloniesAPIProxy.getInstance().getConfig().getServer().luckyBlockChance.get() * chanceBonus) { - return luckyOres.get(random.nextInt(luckyOres.size())).getItemStack().copy(); + // fetch default config for all level + // override it if specific config for this level is available. + List luckyOresInLevel = luckyOres.get(0); + if (luckyOres.containsKey(buildingLevel)) + { + luckyOresInLevel = luckyOres.get(buildingLevel); + } + + return luckyOresInLevel.get(random.nextInt(luckyOresInLevel.size())).getItemStack().copy(); } return ItemStack.EMPTY; } @@ -583,7 +616,7 @@ else if (entry.getValue().is(ModTags.hostile)) } /** - * Create complete list of all existing items, client side only. + * Create complete list of all existing items. */ private void discoverAllItems() { @@ -593,7 +626,15 @@ private void discoverAllItems() for (final Item item : ForgeRegistries.ITEMS.getValues()) { final NonNullList list = NonNullList.create(); - item.fillItemCategory(CreativeModeTab.TAB_SEARCH, list); + try + { + item.fillItemCategory(CreativeModeTab.TAB_SEARCH, list); + } + catch (Exception e) + { + Log.getLogger().warn("Error populating items for " + ForgeRegistries.ITEMS.getKey(item) + "; using fallback", e); + list.add(new ItemStack(item)); + } listBuilder.addAll(list); for (final ItemStack stack : list) @@ -768,20 +809,47 @@ private void discoverLuckyOres() continue; } + final int defaultMineLevel = 0; + int buildingLevel = defaultMineLevel; final ItemStack stack = new ItemStack(item, 1); try { - final int rarity = Integer.parseInt(split[split.length - 1]); + if (split.length == 3) + { + buildingLevel = Integer.parseInt(split[2]); + } + + final int rarity = Integer.parseInt(split[1]); + + luckyOres.putIfAbsent(buildingLevel, new ArrayList<>()); + for (int i = 0; i < rarity; i++) { - luckyOres.add(new ItemStorage(stack)); + List luckyOreOnLevel = luckyOres.get(buildingLevel); + luckyOreOnLevel.add(new ItemStorage(stack)); } } catch (final NumberFormatException ex) { - Log.getLogger().warn("Ore has invalid rarity: " + ore); + Log.getLogger().warn("Ore has invalid rarity or building level: " + ore); } } + + List alternative = null; + int mineMaxLevel = 5; + for (int levelToTest = 0; levelToTest <= mineMaxLevel; levelToTest++) + { + if (luckyOres.containsKey(levelToTest) && !luckyOres.get(levelToTest).isEmpty()) + { + alternative = luckyOres.get(levelToTest); + break; + } + } + + for (int levelToReplace = 0; levelToReplace <= mineMaxLevel; levelToReplace++) + { + luckyOres.putIfAbsent(levelToReplace, alternative); + } } Log.getLogger().info("Finished discovering lucky oreBlocks " + luckyOres.size()); } @@ -933,24 +1001,24 @@ private void discoverModCompat() } /** - * Gets all the possible flowers for the beekeeper. - * - * @return a set of the flowers. + * Discover all the possible flowers for the beekeeper. + * */ - public static Set getAllBeekeeperFlowers() + private void discoverFlowers() { - Set flowers = new HashSet<>(); - - for (final Item item : ForgeRegistries.ITEMS.tags().getTag(ItemTags.FLOWERS)) + if (flowers.isEmpty()) { - final NonNullList list = NonNullList.create(); - item.fillItemCategory(CreativeModeTab.TAB_SEARCH, list); - for (final ItemStack stack : list) + final HashSet tempFlowers = new HashSet(); + for (final Item item : ForgeRegistries.ITEMS.tags().getTag(ItemTags.FLOWERS)) { - flowers.add(new ItemStorage(stack)); + final NonNullList list = NonNullList.create(); + item.fillItemCategory(CreativeModeTab.TAB_SEARCH, list); + for (final ItemStack stack : list) + { + tempFlowers.add(new ItemStorage(stack)); + } } + flowers = ImmutableSet.copyOf(tempFlowers); } - - return flowers; } -} \ No newline at end of file +} diff --git a/src/api/java/com/minecolonies/api/compatibility/ICompatibilityManager.java b/src/api/java/com/minecolonies/api/compatibility/ICompatibilityManager.java index 5529b32638a..5a6f0c7c6be 100755 --- a/src/api/java/com/minecolonies/api/compatibility/ICompatibilityManager.java +++ b/src/api/java/com/minecolonies/api/compatibility/ICompatibilityManager.java @@ -123,6 +123,13 @@ public interface ICompatibilityManager */ Set getCopyOfPlantables(); + /** + * Get a copy of the list of flowers. + * + * @return the list of flowers. + */ + Set getImmutableFlowers(); + /** * Get the set of all monsters. * @return the set. @@ -228,11 +235,13 @@ public interface ICompatibilityManager /** * Get a random lucky ore from a luckyblock. + * Loot may change depending on the mine level * * @param chanceBonus the chance bonus. + * @param buildingLevel level of the mine * @return the lucky ore. */ - ItemStack getRandomLuckyOre(final double chanceBonus); + ItemStack getRandomLuckyOre(final double chanceBonus, final int buildingLevel); /** * Check if the block is configured to bypass the colony restrictions. diff --git a/src/api/java/com/minecolonies/api/compatibility/dynamictrees/DynamicTreeCompat.java b/src/api/java/com/minecolonies/api/compatibility/dynamictrees/DynamicTreeCompat.java index b9d1c299652..d692f08dbaf 100755 --- a/src/api/java/com/minecolonies/api/compatibility/dynamictrees/DynamicTreeCompat.java +++ b/src/api/java/com/minecolonies/api/compatibility/dynamictrees/DynamicTreeCompat.java @@ -1,5 +1,10 @@ package com.minecolonies.api.compatibility.dynamictrees; +import com.ferreusveritas.dynamictrees.block.branch.BranchBlock; +import com.ferreusveritas.dynamictrees.block.branch.TrunkShellBlock; +import com.ferreusveritas.dynamictrees.block.leaves.DynamicLeavesBlock; +import com.ferreusveritas.dynamictrees.item.Seed; +import com.ferreusveritas.dynamictrees.tree.family.Family; import com.minecolonies.api.util.Log; import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; @@ -13,6 +18,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; import net.minecraftforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; @@ -65,12 +71,11 @@ public static boolean isDynTreePresent() @Override public boolean checkForDynamicTreeBlock(@NotNull final Block block) { - return false; - //return block instanceof BranchBlock; + return block instanceof BranchBlock; } /** - * Check wether the block is part of a dynamic Tree + * Check whether the block is part of a dynamic Tree * * @param block Block to check * @return true if so. @@ -81,19 +86,18 @@ public static boolean isDynamicTreeBlock(final Block block) } /** - * Check wether the block is a dynamic leaf + * Check whether the block is a dynamic leaf * * @param block Block to check */ @Override public boolean checkForDynamicLeavesBlock(final Block block) { - return false; - //return block instanceof DynamicLeavesBlock; + return block instanceof DynamicLeavesBlock; } /** - * Check wether the block is a dynamic leaf + * Check whether the block is a dynamic leaf * * @param block Block to check * @return true if so. @@ -112,8 +116,7 @@ public static boolean isDynamicLeavesBlock(final Block block) @Override public boolean checkForDynamicTrunkShellBlock(final Block block) { - return false; - //return block instanceof TrunkShellBlock; + return block instanceof TrunkShellBlock; } /** @@ -132,7 +135,7 @@ public static boolean isDynamicTrunkShellBlock(final Block block) * * @param world world the Leaf is in * @param pos position of the Leaf - * @param blockstate Blockstate of the Leaf + * @param blockState Blockstate of the Leaf * @param fortune amount of fortune to use * @param leaf The leaf to check */ @@ -140,17 +143,17 @@ public static boolean isDynamicTrunkShellBlock(final Block block) public NonNullList getDropsForLeaf( final LevelAccessor world, final BlockPos pos, - final BlockState blockstate, + final BlockState blockState, final int fortune, final Block leaf) { - /*if (isDynamicLeavesBlock(leaf)) + if (isDynamicLeavesBlock(leaf)) { ItemStack stack = ((DynamicLeavesBlock) leaf).getFamily(blockState, world, pos).getCommonSpecies().getSeedStack(1); final NonNullList list = NonNullList.create(); list.add(stack); return list; - }*/ + } return NonNullList.create(); } @@ -170,19 +173,18 @@ public static NonNullList getDropsForLeafCompat(final LevelAccessor w } /** - * Check wether the item is a dynamic Sapling + * Check whether the item is a dynamic Sapling * * @param item Item to check */ @Override public boolean checkForDynamicSapling(@NotNull final Item item) { - return false; - //return item instanceof Seed; + return item instanceof Seed; } /** - * Check wether the item is a dynamic Sapling + * Check whether the item is a dynamic Sapling * * @param item Item to check * @return true if so. @@ -193,7 +195,7 @@ public static boolean isDynamicTreeSapling(final Item item) } /** - * Check wether the Itemstack is a dynamic Sapling + * Check whether the Itemstack is a dynamic Sapling * * @param stack Itemstack to check * @return true if it is a dynamic Sapling @@ -217,7 +219,7 @@ public Runnable getTreeBreakActionCompat(@NotNull final Level world, @NotNull fi { return () -> { - /*final BlockState curBlockState = world.getBlockState(blockToBreak); + final BlockState curBlockState = world.getBlockState(blockToBreak); final Block curBlock = curBlockState.getBlock(); if (world.getServer() == null) @@ -244,9 +246,11 @@ public Runnable getTreeBreakActionCompat(@NotNull final Level world, @NotNull fi if (toolToUse != null) { fake.setItemInHand(InteractionHand.MAIN_HAND, toolToUse); + } - curBlock.removedByPlayer(curBlockState, world, blockToBreak, fake, true, world.getFluidState(blockToBreak));*/ + FluidState fluidState = world.getFluidState(blockToBreak); + curBlock.onDestroyedByPlayer(curBlockState, world, blockToBreak, fake, true, fluidState); }; } @@ -275,11 +279,11 @@ public static Runnable getTreeBreakAction(final Level world, final BlockPos bloc @Override public boolean plantDynamicSaplingCompat(@NotNull final Level world, @NotNull final BlockPos location, @NotNull final ItemStack saplingStack) { - /*if (saplingStack.getItem() instanceof Seed) + if (saplingStack.getItem() instanceof Seed) { return ((Seed) saplingStack.getItem()).getSpecies().plantSapling(world, location, false); } - else*/ + else { return false; } @@ -319,13 +323,13 @@ public String getDynamicTreeDamage() @Override public boolean hasFittingTreeFamilyCompat(@NotNull final BlockPos block1, @NotNull final BlockPos block2, @NotNull final LevelAccessor world) { - /*Family fam1 = getFamilyForBlock(block1, world); + Family fam1 = getFamilyForBlock(block1, world); Family fam2 = getFamilyForBlock(block2, world); if (fam1 != null && fam2 != null) { return fam1 == fam2; - }*/ + } return false; } @@ -336,7 +340,7 @@ public boolean hasFittingTreeFamilyCompat(@NotNull final BlockPos block1, @NotNu * @param world world * @return dynamic tree family */ - /*private static Family getFamilyForBlock(@NotNull final BlockPos blockPos, @NotNull final IWorld world) + private static Family getFamilyForBlock(@NotNull final BlockPos blockPos, @NotNull final LevelAccessor world) { final Block block = world.getBlockState(blockPos).getBlock(); if (block instanceof BranchBlock) @@ -349,7 +353,7 @@ public boolean hasFittingTreeFamilyCompat(@NotNull final BlockPos block1, @NotNu } return null; - }*/ + } /** * Method to check if two given blocks have the same Tree family diff --git a/src/api/java/com/minecolonies/api/configuration/CommonConfiguration.java b/src/api/java/com/minecolonies/api/configuration/CommonConfiguration.java index 608c14790b1..f235a068b98 100644 --- a/src/api/java/com/minecolonies/api/configuration/CommonConfiguration.java +++ b/src/api/java/com/minecolonies/api/configuration/CommonConfiguration.java @@ -5,6 +5,7 @@ public class CommonConfiguration extends AbstractConfiguration { public final ForgeConfigSpec.BooleanValue generateSupplyLoot; + public final ForgeConfigSpec.BooleanValue rsEnableDebugLogging; /** * Builds client configuration. @@ -16,5 +17,9 @@ protected CommonConfiguration(final ForgeConfigSpec.Builder builder) createCategory(builder, "gameplay"); generateSupplyLoot = defineBoolean(builder, "generatesupplyloot", true); finishCategory(builder); + + createCategory(builder, "requestsystem"); + rsEnableDebugLogging = defineBoolean(builder, "enabledebuglogging", false); + finishCategory(builder); } } diff --git a/src/api/java/com/minecolonies/api/configuration/ServerConfiguration.java b/src/api/java/com/minecolonies/api/configuration/ServerConfiguration.java index 53024f54bae..cce5d426939 100755 --- a/src/api/java/com/minecolonies/api/configuration/ServerConfiguration.java +++ b/src/api/java/com/minecolonies/api/configuration/ServerConfiguration.java @@ -1,6 +1,7 @@ package com.minecolonies.api.configuration; import com.minecolonies.api.colony.permissions.Explosions; +import com.minecolonies.api.util.constant.CitizenConstants; import net.minecraftforge.common.ForgeConfigSpec; import java.util.Arrays; @@ -32,7 +33,6 @@ public class ServerConfiguration extends AbstractConfiguration public final ForgeConfigSpec.BooleanValue sendEnteringLeavingMessages; public final ForgeConfigSpec.IntValue allowGlobalNameChanges; public final ForgeConfigSpec.BooleanValue holidayFeatures; - public final ForgeConfigSpec.IntValue updateRate; public final ForgeConfigSpec.IntValue dirtFromCompost; public final ForgeConfigSpec.IntValue luckyBlockChance; public final ForgeConfigSpec.IntValue minThLevelToTeleport; @@ -40,6 +40,7 @@ public class ServerConfiguration extends AbstractConfiguration public final ForgeConfigSpec.DoubleValue foodModifier; public final ForgeConfigSpec.IntValue diseaseModifier; public final ForgeConfigSpec.BooleanValue forceLoadColony; + public final ForgeConfigSpec.IntValue loadtime; public final ForgeConfigSpec.IntValue colonyLoadStrictness; public final ForgeConfigSpec.IntValue badVisitorsChance; public final ForgeConfigSpec.IntValue maxTreeSize; @@ -138,7 +139,6 @@ public class ServerConfiguration extends AbstractConfiguration * ------------------- ######## Request System Settings ######## ------------------- * * --------------------------------------------------------------------------------- */ - public final ForgeConfigSpec.BooleanValue enableDebugLogging; public final ForgeConfigSpec.IntValue maximalRetries; public final ForgeConfigSpec.IntValue delayBetweenRetries; public final ForgeConfigSpec.BooleanValue creativeResolve; @@ -159,7 +159,7 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder) allowInfiniteColonies = defineBoolean(builder, "allowinfinitecolonies", false); allowOtherDimColonies = defineBoolean(builder, "allowotherdimcolonies", true); citizenRespawnInterval = defineInteger(builder, "citizenrespawninterval", 60, CITIZEN_RESPAWN_INTERVAL_MIN, CITIZEN_RESPAWN_INTERVAL_MAX); - maxCitizenPerColony = defineInteger(builder, "maxcitizenpercolony", 250, 4, 500); + maxCitizenPerColony = defineInteger(builder, "maxcitizenpercolony", 250, 4, CitizenConstants.CITIZEN_LIMIT_MAX); builderBuildBlockDelay = defineInteger(builder, "builderbuildblockdelay", 15, 1, 500); blockMiningDelayModifier = defineInteger(builder, "blockminingdelaymodifier", 500, 1, 10000); enableInDevelopmentFeatures = defineBoolean(builder, "enableindevelopmentfeatures", false); @@ -168,7 +168,6 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder) sendEnteringLeavingMessages = defineBoolean(builder, "sendenteringleavingmessages", true); allowGlobalNameChanges = defineInteger(builder, "allowglobalnamechanges", 1, -1, 1); holidayFeatures = defineBoolean(builder, "holidayfeatures", true); - updateRate = defineInteger(builder, "updaterate", 1, 1, 100); dirtFromCompost = defineInteger(builder, "dirtfromcompost", 1, 0, 100); luckyBlockChance = defineInteger(builder, "luckyblockchance", 1, 0, 100); minThLevelToTeleport = defineInteger(builder, "minthleveltoteleport", 3, 0, 5); @@ -176,6 +175,7 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder) foodModifier = defineDouble(builder, "foodmodifier", 1.0, 0.1, 100); diseaseModifier = defineInteger(builder, "diseasemodifier", 5, 1, 100); forceLoadColony = defineBoolean(builder, "forceloadcolony", false); + loadtime = defineInteger(builder, "loadtime", 10,1,1440); colonyLoadStrictness = defineInteger(builder, "colonyloadstrictness", 3, 1, 15); badVisitorsChance = defineInteger(builder, "badvisitorchance", 2, 1, 100); maxTreeSize = defineInteger(builder, "maxtreesize", 400, 1, 1000); @@ -202,7 +202,7 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder) swapToCategory(builder, "claims"); - maxColonySize = defineInteger(builder, "maxColonySize", 20, 1, 50); + maxColonySize = defineInteger(builder, "maxColonySize", 20, 1, 250); minColonyDistance = defineInteger(builder, "minColonyDistance", 8, 1, 200); initialColonySize = defineInteger(builder, "initialColonySize", 4, 1, 15); restrictColonyPlacement = defineBoolean(builder, "restrictcolonyplacement", false); @@ -303,7 +303,6 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder) swapToCategory(builder, "requestSystem"); - enableDebugLogging = defineBoolean(builder, "enabledebuglogging", false); maximalRetries = defineInteger(builder, "maximalretries", 3, 1, 10); delayBetweenRetries = defineInteger(builder, "delaybetweenretries", 1200, 30, 10000); creativeResolve = defineBoolean(builder, "creativeresolve", false); diff --git a/src/api/java/com/minecolonies/api/crafting/ExactMatchItemStorage.java b/src/api/java/com/minecolonies/api/crafting/ExactMatchItemStorage.java new file mode 100755 index 00000000000..8f2f4b2a52a --- /dev/null +++ b/src/api/java/com/minecolonies/api/crafting/ExactMatchItemStorage.java @@ -0,0 +1,37 @@ +package com.minecolonies.api.crafting; + +import com.google.gson.JsonObject; +import com.minecolonies.api.util.ItemStackUtils; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Used to exact match stacks when storing them. + */ +public class ExactMatchItemStorage extends ItemStorage +{ + /** + * Creates an instance of the storage. + * + * @param stack the stack. + */ + public ExactMatchItemStorage(@NotNull final ItemStack stack) + { + super(stack); + } + + @Override + public boolean equals(final Object comparisonObject) + { + if (this == comparisonObject) + { + return true; + } + if (comparisonObject instanceof final ExactMatchItemStorage that) + { + return ItemStackUtils.compareItemStacksIgnoreStackSize(that.getItemStack(), this.getItemStack(), !(super.shouldIgnoreDamageValue || that.shouldIgnoreDamageValue), !(this.shouldIgnoreNBTValue || that.shouldIgnoreNBTValue), false, true); + + } + return false; + } +} \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/crafting/GenericRecipe.java b/src/api/java/com/minecolonies/api/crafting/GenericRecipe.java index b88b1526e67..d4a8fc7eaef 100644 --- a/src/api/java/com/minecolonies/api/crafting/GenericRecipe.java +++ b/src/api/java/com/minecolonies/api/crafting/GenericRecipe.java @@ -8,6 +8,7 @@ import com.minecolonies.api.util.constant.ToolType; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; @@ -66,7 +67,7 @@ public static IGenericRecipe of(@Nullable final IRecipeStorage storage, @NotNull .collect(Collectors.toList()); return new GenericRecipe(storage.getRecipeSource(), storage.getPrimaryOutput(), storage.getAlternateOutputs(), storage.getSecondaryOutputs(), inputs, storage.getGridSize(), - storage.getIntermediate(), storage.getLootTable(), storage.getRequiredTool(), restrictions, levelSort); + storage.getIntermediate(), storage.getLootTable(), storage.getRequiredTool(), null, restrictions, levelSort); } @Nullable @@ -91,6 +92,7 @@ public static IGenericRecipe of(@Nullable final IToken recipeToken) private final Block intermediate; private final ResourceLocation lootTable; private final IToolType requiredTool; + private final LivingEntity requiredEntity; private final List restrictions; private final int levelSort; @@ -113,6 +115,7 @@ public GenericRecipe(@Nullable final ResourceLocation id, this.intermediate = intermediate; this.lootTable = lootTable; this.requiredTool = requiredTool; + this.requiredEntity = null; this.restrictions = Collections.unmodifiableList(restrictions); this.levelSort = levelSort; } @@ -125,20 +128,20 @@ public GenericRecipe(@Nullable final ResourceLocation id, final int gridSize, @NotNull final Block intermediate, @Nullable final ResourceLocation lootTable, @NotNull final IToolType requiredTool, + @Nullable final LivingEntity requiredEntity, @NotNull final List restrictions, final int levelSort) { this.id = id; this.output = output; - this.allMultiOutputs = Collections.unmodifiableList( - Stream.concat(Stream.of(output), - altOutputs.stream()).collect(Collectors.toList())); + this.allMultiOutputs = Stream.concat(Stream.of(output), altOutputs.stream()).filter(ItemStackUtils::isNotEmpty).toList(); this.additionalOutputs = Collections.unmodifiableList(additionalOutputs); this.inputs = Collections.unmodifiableList(inputs); this.gridSize = gridSize; this.intermediate = intermediate; this.lootTable = lootTable; this.requiredTool = requiredTool; + this.requiredEntity = requiredEntity; this.restrictions = Collections.unmodifiableList(restrictions); this.levelSort = levelSort; } @@ -242,6 +245,12 @@ public IToolType getRequiredTool() return this.requiredTool; } + @Override + public @Nullable LivingEntity getRequiredEntity() + { + return this.requiredEntity; + } + @Override public String toString() { @@ -283,7 +292,7 @@ public boolean stillValid(@NotNull final Player playerIn) final ItemStack[] stacks = inputs.get(slot).getItems(); if (stacks.length > 0) { - inv.setItem(slot, stacks[0]); + inv.setItem(slot, stacks[0].copy()); } } if (((CraftingRecipe) recipe).matches(inv, world)) diff --git a/src/api/java/com/minecolonies/api/crafting/IGenericRecipe.java b/src/api/java/com/minecolonies/api/crafting/IGenericRecipe.java index c445d172e84..e1cb4c5dc09 100644 --- a/src/api/java/com/minecolonies/api/crafting/IGenericRecipe.java +++ b/src/api/java/com/minecolonies/api/crafting/IGenericRecipe.java @@ -2,10 +2,11 @@ import com.minecolonies.api.util.OptionalPredicate; import com.minecolonies.api.util.constant.IToolType; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.item.ItemStack; -import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -127,6 +128,14 @@ public interface IGenericRecipe @NotNull IToolType getRequiredTool(); + /** + * Gets a creature required to produce this recipe, if any. + * + * @return The required creature. + */ + @Nullable + LivingEntity getRequiredEntity(); + /** * Gets some human-readable restrictions on when this recipe is valid. * diff --git a/src/api/java/com/minecolonies/api/crafting/ItemStorage.java b/src/api/java/com/minecolonies/api/crafting/ItemStorage.java index 9a582a1c8e6..1d120a73d99 100755 --- a/src/api/java/com/minecolonies/api/crafting/ItemStorage.java +++ b/src/api/java/com/minecolonies/api/crafting/ItemStorage.java @@ -29,12 +29,12 @@ public class ItemStorage /** * Set this to ignore the damage value in comparisons. */ - private final boolean shouldIgnoreDamageValue; + protected final boolean shouldIgnoreDamageValue; /** * Set this to ignore the damage value in comparisons. */ - private final boolean shouldIgnoreNBTValue; + protected final boolean shouldIgnoreNBTValue; /** * The creative tab index of the storage. diff --git a/src/api/java/com/minecolonies/api/crafting/MultiOutputRecipe.java b/src/api/java/com/minecolonies/api/crafting/MultiOutputRecipe.java index 0d0ade55ba4..9db12161638 100644 --- a/src/api/java/com/minecolonies/api/crafting/MultiOutputRecipe.java +++ b/src/api/java/com/minecolonies/api/crafting/MultiOutputRecipe.java @@ -1,12 +1,11 @@ package com.minecolonies.api.crafting; -import java.util.ArrayList; -import java.util.List; - import com.google.common.collect.ImmutableList; - -import net.minecraft.world.item.ItemStack; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; /** * The mult-output recipe type @@ -31,7 +30,10 @@ public List getOutputDisplayStacks() { if(outputDisplayStacks.isEmpty()) { - outputDisplayStacks.add(recipe.getPrimaryOutput()); + if (!recipe.getPrimaryOutput().isEmpty()) + { + outputDisplayStacks.add(recipe.getPrimaryOutput()); + } outputDisplayStacks.addAll(recipe.getAlternateOutputs()); } return ImmutableList.copyOf(outputDisplayStacks); diff --git a/src/api/java/com/minecolonies/api/crafting/RecipeStorage.java b/src/api/java/com/minecolonies/api/crafting/RecipeStorage.java index 1e9448b35bb..1eb928131f8 100755 --- a/src/api/java/com/minecolonies/api/crafting/RecipeStorage.java +++ b/src/api/java/com/minecolonies/api/crafting/RecipeStorage.java @@ -237,7 +237,7 @@ private List calculateSecondaryOutputs() continue; } - final ItemStack container = inputItem.getItem().getCraftingRemainingItem(inputItem.getItemStack()); + final ItemStack container = inputItem.getItemStack().getCraftingRemainingItem(); if (!ItemStackUtils.isEmpty(container)) { container.setCount(inputItem.getAmount()); @@ -352,7 +352,7 @@ private boolean canFulfillItemStorage(final int qty, final Map handlers) { for (final ItemStorage stack : input) { - final ItemStack container = stack.getItem().getCraftingRemainingItem(stack.getItemStack()); + final ItemStack container = stack.getItemStack().getCraftingRemainingItem(); if (!ItemStackUtils.isEmpty(container)) { container.setCount(stack.getAmount()); @@ -679,7 +679,7 @@ public RecipeStorage getClassicForMultiOutput(final ItemStack requiredOutput) @Override public RecipeStorage getClassicForMultiOutput(final Predicate stackPredicate) { - if(stackPredicate.test(getPrimaryOutput())) + if(!getPrimaryOutput().isEmpty() && stackPredicate.test(getPrimaryOutput())) { return getClassicForMultiOutput(getPrimaryOutput()); } diff --git a/src/api/java/com/minecolonies/api/entity/AbstractFastMinecoloniesEntity.java b/src/api/java/com/minecolonies/api/entity/AbstractFastMinecoloniesEntity.java new file mode 100644 index 00000000000..c0c1d34b2fc --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/AbstractFastMinecoloniesEntity.java @@ -0,0 +1,283 @@ +package com.minecolonies.api.entity; + +import com.minecolonies.api.entity.pathfinding.IStuckHandlerEntity; +import com.minecolonies.api.util.EntityUtils; +import com.minecolonies.api.util.LookHandler; +import com.minecolonies.api.util.constant.ColonyConstants; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraftforge.common.util.ITeleporter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Special abstract minecolonies mob that overrides laggy vanilla behaviour. + */ +public abstract class AbstractFastMinecoloniesEntity extends PathfinderMob implements IStuckHandlerEntity +{ + /** + * Whether this entity can be stuck for stuckhandling + */ + private boolean canBeStuck = true; + + /** + * Random update variance for this entity, used to spread out updates equalls + */ + public final int randomVariance = ColonyConstants.rand.nextInt(20); + + /** + * Cache fluid state + */ + private boolean isInFluid = false; + + /** + * Cache fire state + */ + private boolean onFire = false; + + /** + * Entity push cache. + */ + private List entityPushCache = new ArrayList<>(); + + /** + * Create a new instance. + * + * @param type from type. + * @param worldIn the world. + */ + protected AbstractFastMinecoloniesEntity(final EntityType type, final Level worldIn) + { + super(type, worldIn); + lookControl = new LookHandler(this); + } + + @Override + public boolean canBeLeashed(Player player) + { + return false; + } + + @Override + public boolean canBeStuck() + { + return canBeStuck; + } + + /** + * Sets whether the entity currently can be stuck + * + * @param canBeStuck + */ + public void setCanBeStuck(final boolean canBeStuck) + { + this.canBeStuck = canBeStuck; + } + + @Override + public boolean checkBedExists() + { + return false; + } + + @Override + protected void removeFrost() + { + + } + + @Override + protected void tryAddFrost() + { + + } + + @Override + public void onInsideBubbleColumn(boolean down) + { + + } + + @Override + protected int decreaseAirSupply(final int supply) + { + return supply - 1; + } + + @Override + protected int increaseAirSupply(final int supply) + { + return supply + 1; + } + + @Override + protected void onChangedBlock(final BlockPos pos) + { + // This just tries to apply soulspeed or frostwalker + } + + /** + * Ignores cramming + */ + @Override + public void pushEntities() + { + if (this.level.isClientSide()) + { + this.level.getEntities(EntityTypeTest.forClass(Player.class), this.getBoundingBox(), EntityUtils.pushableBy()).forEach(this::doPush); + } + else + { + if (this.tickCount % 10 == randomVariance % 10) + { + entityPushCache.clear(); + entityPushCache = this.level.getEntities(this, this.getBoundingBox(), EntityUtils.pushableBy()); + } + for (Entity entity : entityPushCache) + { + this.doPush(entity); + } + } + } + + /** + * Prevent citizens and visitors from travelling to other dimensions through portals. + */ + @Nullable + @Override + public Entity changeDimension(@NotNull final ServerLevel serverWorld, @NotNull final ITeleporter teleporter) + { + return null; + } + + @Override + public boolean canSpawnSprintParticle() + { + return false; + } + + @Override + public void updateFluidOnEyes() + { + if (tickCount % 20 == randomVariance) + { + super.updateFluidOnEyes(); + } + } + + @Override + protected boolean updateInWaterStateAndDoFluidPushing() + { + if (tickCount % 10 == randomVariance % 10) + { + isInFluid = super.updateInWaterStateAndDoFluidPushing(); + } + + return isInFluid; + } + + @Override + public void setSharedFlagOnFire(boolean newState) + { + if (newState != onFire) + { + super.setSharedFlagOnFire(newState); + onFire = newState; + } + } + + @Override + protected void handleNetherPortal() + { + // Noop our entities dont use portals + } + + @Override + public void updateSwimming() + { + // Noop our entities dont swim + } + + @Override + public boolean isInWall() + { + if (tickCount % 10 == randomVariance % 10) + { + return super.isInWall(); + } + + return false; + } + + @Override + public boolean isInWaterRainOrBubble() + { + // Used to extinguish fire, only check if on fire + if (getRemainingFireTicks() > 0 || level.isClientSide) + { + return super.isInWaterRainOrBubble(); + } + + return false; + } + + @Override + protected void tryAddSoulSpeed() + { + + } + + @Override + protected void removeSoulSpeed() + { + + } + + @Override + public boolean canSpawnSoulSpeedParticle() + { + return false; + } + + @Override + public void updateFallFlying() + { + // Simplified updateFallflying to only set flags when they did change + if (!this.level.isClientSide && tickCount % 5 == randomVariance % 5) + { + boolean flag = this.getSharedFlag(7); + if (!flag || this.onGround || this.isPassenger() || this.hasEffect(MobEffects.LEVITATION)) + { + flag = false; + this.setSharedFlag(7, flag); + } + } + } + + @Override + protected void sendDebugPackets() + { + } + + @Override + public void setTicksFrozen(int p_146918_) + { + + } + + @Override + public void updateSwimAmount() + { + + } +} diff --git a/src/api/java/com/minecolonies/api/entity/MinecoloniesMinecart.java b/src/api/java/com/minecolonies/api/entity/MinecoloniesMinecart.java index 89bab39474f..738d2995863 100755 --- a/src/api/java/com/minecolonies/api/entity/MinecoloniesMinecart.java +++ b/src/api/java/com/minecolonies/api/entity/MinecoloniesMinecart.java @@ -3,11 +3,8 @@ import com.google.common.collect.Maps; import com.mojang.datafixers.util.Pair; import net.minecraft.tags.BlockTags; -import net.minecraft.world.entity.EntitySelector; -import net.minecraft.world.entity.animal.IronGolem; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.vehicle.Minecart; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; import net.minecraft.world.level.block.BaseRailBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.PoweredRailBlock; @@ -18,28 +15,19 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.util.*; -import net.minecraft.world.phys.shapes.BooleanOp; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.Vec3; import net.minecraft.core.Vec3i; import net.minecraft.world.level.Level; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.Map; -import java.util.stream.Stream; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.phys.AABB; - -import net.minecraft.world.entity.Entity.RemovalReason; /** * Special minecolonies minecart that doesn't collide. @@ -252,6 +240,12 @@ else if (this.isNormalCube(pos.south())) } } + @Override + public void destroy(final DamageSource source) + { + this.kill(); + } + private boolean isNormalCube(BlockPos pos) { return this.level.getBlockState(pos).isRedstoneConductor(this.level, pos); diff --git a/src/api/java/com/minecolonies/api/entity/ModEntities.java b/src/api/java/com/minecolonies/api/entity/ModEntities.java index 1d88a14ffc4..f8ba202ff38 100755 --- a/src/api/java/com/minecolonies/api/entity/ModEntities.java +++ b/src/api/java/com/minecolonies/api/entity/ModEntities.java @@ -1,19 +1,22 @@ package com.minecolonies.api.entity; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.amazons.AbstractEntityAmazon; import com.minecolonies.api.entity.mobs.barbarians.AbstractEntityBarbarian; import com.minecolonies.api.entity.mobs.egyptians.AbstractEntityEgyptian; import com.minecolonies.api.entity.mobs.pirates.AbstractEntityPirate; import com.minecolonies.api.entity.mobs.vikings.AbstractEntityNorsemen; -import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.entity.projectile.ThrownTrident; +import java.util.List; + public class ModEntities { public static EntityType CITIZEN; @@ -22,10 +25,10 @@ public class ModEntities public static EntityType FISHHOOK; - public static EntityType BARBARIAN; - public static EntityType MERCENARY; + public static EntityType BARBARIAN; + public static EntityType ARCHERBARBARIAN; public static EntityType CHIEFBARBARIAN; @@ -64,5 +67,26 @@ public class ModEntities public static EntityType DRUID_POTION; - public static EntityType SPEAR; + public static EntityType SPEAR; + + public static List> getRaiders() + { + return List.of( + BARBARIAN, + ARCHERBARBARIAN, + CHIEFBARBARIAN, + AMAZON, + AMAZONSPEARMAN, + AMAZONCHIEF, + MUMMY, + ARCHERMUMMY, + PHARAO, + PIRATE, + ARCHERPIRATE, + CHIEFPIRATE, + SHIELDMAIDEN, + NORSEMEN_ARCHER, + NORSEMEN_CHIEF + ); + } } diff --git a/src/api/java/com/minecolonies/api/entity/ai/ITickingStateAI.java b/src/api/java/com/minecolonies/api/entity/ai/ITickingStateAI.java new file mode 100644 index 00000000000..226cc5f2d56 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/ai/ITickingStateAI.java @@ -0,0 +1,31 @@ +package com.minecolonies.api.entity.ai; + +import com.minecolonies.api.entity.ai.statemachine.states.IState; + +/** + * Interface for ticking AI's + */ +public interface ITickingStateAI +{ + /** + * Ticks the ai + */ + public void tick(); + + /** + * Called when the AI get removed + */ + public void onRemoval(); + + /** + * Resets the AI as needed + */ + public void resetAI(); + + /** + * Gets the current state + * + * @return + */ + public IState getState(); +} diff --git a/src/api/java/com/minecolonies/api/entity/ai/registry/IMobAIRegistry.java b/src/api/java/com/minecolonies/api/entity/ai/registry/IMobAIRegistry.java index 185040a7802..a69a5e6fed2 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/registry/IMobAIRegistry.java +++ b/src/api/java/com/minecolonies/api/entity/ai/registry/IMobAIRegistry.java @@ -3,7 +3,7 @@ import com.google.common.collect.Multimap; import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.entity.ai.IStateAI; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import net.minecraft.world.entity.ai.goal.Goal; import org.jetbrains.annotations.NotNull; @@ -21,7 +21,7 @@ public interface IMobAIRegistry * @return The map with the entity AI tasks that are needed for the given mob, with their priorities. */ @NotNull - Multimap getEntityAiTasksForMobs(final AbstractEntityMinecoloniesMob mob); + Multimap getEntityAiTasksForMobs(final AbstractEntityRaiderMob mob); /** * Method used to register a entity AI task for a mob that matches the predicate. @@ -31,7 +31,7 @@ public interface IMobAIRegistry * @return The registry. */ @NotNull - default IMobAIRegistry registerNewAiTaskForMobs(final int priority, final Function aiTaskProducer) + default IMobAIRegistry registerNewAiTaskForMobs(final int priority, final Function aiTaskProducer) { return this.registerNewAiTaskForMobs(priority, aiTaskProducer, mob -> true); } @@ -47,8 +47,8 @@ default IMobAIRegistry registerNewAiTaskForMobs(final int priority, final Functi @NotNull IMobAIRegistry registerNewAiTaskForMobs( final int priority, - final Function aiTaskProducer, - Predicate applyPredicate); + final Function aiTaskProducer, + Predicate applyPredicate); /** * Method used to register a entity AI task for a mob that matches the predicate. @@ -59,14 +59,14 @@ IMobAIRegistry registerNewAiTaskForMobs( */ @NotNull IMobAIRegistry registerNewStateAI( - final Function aiTaskProducer, - Predicate applyPredicate); + final Function aiTaskProducer, + Predicate applyPredicate); /** * Applies the registered AI's to the given mob */ @NotNull - void applyToMob(AbstractEntityMinecoloniesMob mob); + void applyToMob(AbstractEntityRaiderMob mob); /** * Method to get the AI target tasks registered for a given mob. Used by minecolonies to get the AIs that are required for a given mob. @@ -75,7 +75,7 @@ IMobAIRegistry registerNewStateAI( * @return The map with the entity AI tasks that are needed for the given mob, with their priorities. */ @NotNull - Multimap getEntityAiTargetTasksForMobs(final AbstractEntityMinecoloniesMob mob); + Multimap getEntityAiTargetTasksForMobs(final AbstractEntityRaiderMob mob); /** * Method used to register a entity AI target task for a mob that matches the predicate. @@ -85,7 +85,7 @@ IMobAIRegistry registerNewStateAI( * @return The registry. */ @NotNull - default IMobAIRegistry registerNewAiTargetTaskForMobs(final int priority, final Function aiTaskProducer) + default IMobAIRegistry registerNewAiTargetTaskForMobs(final int priority, final Function aiTaskProducer) { return this.registerNewAiTargetTaskForMobs(priority, aiTaskProducer, mob -> true); } @@ -101,6 +101,6 @@ default IMobAIRegistry registerNewAiTargetTaskForMobs(final int priority, final @NotNull IMobAIRegistry registerNewAiTargetTaskForMobs( final int priority, - final Function aiTaskProducer, - Predicate applyPredicate); + final Function aiTaskProducer, + Predicate applyPredicate); } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/AIOneTimeEventTarget.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/AIOneTimeEventTarget.java index 9e8f912c96a..54ffdc1e5e9 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/AIOneTimeEventTarget.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/AIOneTimeEventTarget.java @@ -1,7 +1,7 @@ package com.minecolonies.api.entity.ai.statemachine; import com.minecolonies.api.entity.ai.statemachine.states.AIBlockingEventType; -import com.minecolonies.api.entity.ai.statemachine.states.IAIState; +import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingOneTimeEvent; import org.jetbrains.annotations.NotNull; @@ -11,7 +11,7 @@ /** * One time usage AITarget, unregisters itself after usage */ -public class AIOneTimeEventTarget extends TickingOneTimeEvent +public class AIOneTimeEventTarget extends TickingOneTimeEvent { /** * Event to trigger a one time transition. @@ -19,7 +19,7 @@ public class AIOneTimeEventTarget extends TickingOneTimeEvent * @param predicate which has to be true to execute * @param action Supplier for the state to transition into */ - public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull final Supplier action) + public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull final Supplier action) { super(AIBlockingEventType.EVENT, predicate, action, 1); } @@ -30,7 +30,7 @@ public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull f * @param predicate which has to be true to execute * @param state state to transition into */ - public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull final IAIState state) + public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull final S state) { super(AIBlockingEventType.EVENT, predicate, () -> state, 1); } @@ -40,7 +40,7 @@ public AIOneTimeEventTarget(@NotNull final BooleanSupplier predicate, @NotNull f * * @param action Supplier for the state to transition into */ - public AIOneTimeEventTarget(@NotNull final Supplier action) + public AIOneTimeEventTarget(@NotNull final Supplier action) { super(AIBlockingEventType.EVENT, () -> true, action, 1); } @@ -50,7 +50,7 @@ public AIOneTimeEventTarget(@NotNull final Supplier action) * * @param state state to transition into */ - public AIOneTimeEventTarget(@NotNull final IAIState state) + public AIOneTimeEventTarget(@NotNull final S state) { super(AIBlockingEventType.EVENT, () -> true, () -> state, 1); } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/AITarget.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/AITarget.java index cd3f87519ae..b0b77fd61c2 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/AITarget.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/AITarget.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.ai.statemachine; -import com.minecolonies.api.entity.ai.statemachine.states.IAIState; +import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,7 +12,7 @@ * A simple target the AI tries to accomplish. It has a state matcher, so it only gets executed on matching state. It has a tester function to make more checks to tell if execution * is wanted. And it can change state. */ -public class AITarget extends TickingTransition +public class AITarget extends TickingTransition { /** * Construct a target. @@ -23,9 +23,9 @@ public class AITarget extends TickingTransition * @param tickRate the tick rate. */ public AITarget( - @NotNull final IAIState state, + @NotNull final S state, @NotNull final BooleanSupplier predicate, - @NotNull final Supplier action, + @NotNull final Supplier action, final int tickRate) { super(state, predicate, action, tickRate); @@ -40,7 +40,7 @@ public AITarget( */ protected AITarget( @NotNull final BooleanSupplier predicate, - @NotNull final Supplier action, + @NotNull final Supplier action, final int tickRate) { super(predicate, action, tickRate); @@ -53,7 +53,7 @@ protected AITarget( * @param state the state to switch to * @param tickRate the tick rate. */ - public AITarget(@NotNull final IAIState predicateState, @Nullable final IAIState state, final int tickRate) + public AITarget(@NotNull final S predicateState, @Nullable final S state, final int tickRate) { this(predicateState, () -> state, tickRate); } @@ -65,7 +65,7 @@ public AITarget(@NotNull final IAIState predicateState, @Nullable final IAIState * @param action the action to apply * @param tickRate the tick rate. */ - public AITarget(@NotNull final IAIState state, @NotNull final Supplier action, final int tickRate) + public AITarget(@NotNull final S state, @NotNull final Supplier action, final int tickRate) { this(state, () -> true, action, tickRate); } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/basestatemachine/BasicStateMachine.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/basestatemachine/BasicStateMachine.java index e14f1e5b3ee..0e87e29c0db 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/basestatemachine/BasicStateMachine.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/basestatemachine/BasicStateMachine.java @@ -142,7 +142,7 @@ public boolean checkTransition(@NotNull final T transition) } catch (final RuntimeException e) { - Log.getLogger().warn("Condition check for transition " + transition + " threw an exception:", e); + Log.getLogger().warn("Condition check for state " + getState() + " threw an exception:", e); this.onException(e); return false; } @@ -164,7 +164,7 @@ public boolean transitionToNext(@NotNull final T transition) } catch (final RuntimeException e) { - Log.getLogger().warn("Statemachine for transition " + transition + " threw an exception:", e); + Log.getLogger().warn("Statemachine for state " + getState() + " threw an exception:", e); this.onException(e); return false; } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/AIWorkerState.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/AIWorkerState.java index d5518f4cc95..2faf0585719 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/AIWorkerState.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/AIWorkerState.java @@ -106,6 +106,10 @@ public enum AIWorkerState implements IAIState * There are no trees in his search range. */ LUMBERJACK_NO_TREES_FOUND(true), + /** + * The Lumberjack is gathering saplings (second pass). + */ + LUMBERJACK_GATHERING_2(true), /* ###Miner### @@ -151,17 +155,17 @@ public enum AIWorkerState implements IAIState /** * Hoe the field. */ - FARMER_HOE(false), + FARMER_HOE(true), /** * Plant the seeds. */ - FARMER_PLANT(false), + FARMER_PLANT(true), /** * Harvest the crops. */ - FARMER_HARVEST(false), + FARMER_HARVEST(true), /* ###Undertaker### @@ -241,6 +245,11 @@ public enum AIWorkerState implements IAIState */ GUARD_REGEN(true), + /** + * Flee to work building. + */ + GUARD_FLEE(false), + /** * Helping out a citizen in danger */ @@ -323,6 +332,11 @@ public enum AIWorkerState implements IAIState */ ADD_FUEL_TO_FURNACE(true), + /** + * Break down ores. + */ + BREAK_ORES(true), + /* ###Cook### */ @@ -365,6 +379,11 @@ public enum AIWorkerState implements IAIState */ COWBOY_MILK(false), + /** + * Milk mooshrooms! + */ + COWBOY_STEW(false), + /* ### Shepherd ### */ @@ -564,19 +583,6 @@ public enum AIWorkerState implements IAIState */ ENCHANT(false), - /* -### Avoid-AI ### - */ - - /** - * Checking it the Avoid AI should start. - */ - SAFE(true), - - NEED_RUN(true), - - RUNNING(true), - /* ### Healer ### */ @@ -600,15 +606,11 @@ public enum AIWorkerState implements IAIState /* ### Plantation related ### */ - PLANTATION_MOVE_TO_SOIL(true), - - PLANTATION_CHECK_SOIL(true), - - PLANTATION_CLEAR_OBSTACLE(true), - - PLANTATION_FARM(true), - - PLANTATION_PLANT(true), + PLANTATION_PICK_FIELD(false), + PLANTATION_MOVE_TO_FIELD(false), + PLANTATION_DECIDE_FIELD_WORK(false), + PLANTATION_WORK_FIELD(true), + PLANTATION_RETURN_TO_BUILDING(false), /* ### Beekeeper ### diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/CitizenAIState.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/CitizenAIState.java new file mode 100644 index 00000000000..577a0c7ec68 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/CitizenAIState.java @@ -0,0 +1,22 @@ +package com.minecolonies.api.entity.ai.statemachine.states; + +/** + * AI States for citizen's state + */ +public enum CitizenAIState implements IState +{ + IDLE(), + FLEE(), + EATING(), + SICK(), + SLEEP, + MOURN, + WORK, + WORKING, + INACTIVE(); + + CitizenAIState() + { + + } +} diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/EntityState.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/EntityState.java new file mode 100644 index 00000000000..dbe259e43ac --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/states/EntityState.java @@ -0,0 +1,16 @@ +package com.minecolonies.api.entity.ai.statemachine.states; + +/** + * States of entity loading/activity + */ +public enum EntityState implements IState +{ + // Initial state, entity is loading/data is missing or not present + INIT, + // Entity is loaded and ticking on the server + ACTIVE_SERVER, + // Entity is loaded and ticking on the client + ACTIVE_CLIENT, + // Entity is inactive + INACTIVE; +} diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/ITickRateStateMachine.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/ITickRateStateMachine.java index 6fa60c1e042..f0e03d44c7f 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/ITickRateStateMachine.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/ITickRateStateMachine.java @@ -34,4 +34,11 @@ public interface ITickRateStateMachine extends IStateMachine extends IStateMachineTrans * * @return random */ - int getTickOffset(); + int countdownTicksToUpdate(); + + /** + * Sets the ticks until next update + * + * @param ticksToUpdate + */ + void setTicksToUpdate(int ticksToUpdate); } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickRateStateMachine.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickRateStateMachine.java index e92c3dfd271..93ed5b1b7c0 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickRateStateMachine.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickRateStateMachine.java @@ -5,18 +5,22 @@ import com.minecolonies.api.entity.ai.statemachine.states.IState; import org.jetbrains.annotations.NotNull; +import java.beans.EventHandler; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Consumer; -import static com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateConstants.MAX_TICKRATE; - /** * Statemachine with an added tickrate limiting of transitions, allowing transitions to be checked at a lower rate. Default tickrate is 20 tps (Minecraft default). */ public class TickRateStateMachine extends BasicStateMachine, S> implements ITickRateStateMachine { + /** + * TPS factor of the server + */ + public static double slownessFactor = 1.0D; + /** * Counter keeping track of ticks */ @@ -32,6 +36,11 @@ public class TickRateStateMachine extends BasicStateMachine executedTransition = null; + /** * Reference to our used global transition lists */ @@ -64,48 +73,40 @@ public TickRateStateMachine(@NotNull final S initialState, @NotNull final Consum @Override public void tick() { - // Update the tickrate counter, skip tick if we're lower - tickRateCounter++; - if (tickRateCounter < tickRate) + if (tickRateCounter > 1) { + tickRateCounter--; return; } - tickRateCounter = 0; + tickRateCounter = tickRate; - // Update the tick counter for transitions - tickCounter++; - if (tickCounter > MAX_TICKRATE) + for (int i = 0, aiBlockingTransitionsSize = aiBlockingTransitions.size(); i < aiBlockingTransitionsSize; i++) { - tickCounter = 1; - } - - for (final ITickingTransition transition : aiBlockingTransitions) - { - if (checkTransition(transition)) + if (checkTransition(aiBlockingTransitions.get(i))) { return; } } - for (final ITickingTransition transition : eventTransitions) + for (int i = 0, eventTransitionsSize = eventTransitions.size(); i < eventTransitionsSize; i++) { - if (checkTransition(transition)) + if (checkTransition(eventTransitions.get(i))) { return; } } - for (final ITickingTransition transition : stateBlockingTransitions) + for (int i = 0, stateBlockingTransitionsSize = stateBlockingTransitions.size(); i < stateBlockingTransitionsSize; i++) { - if (checkTransition(transition)) + if (checkTransition(stateBlockingTransitions.get(i))) { return; } } - for (final ITickingTransition transition : currentStateTransitions) + for (int i = 0, currentStateTransitionsSize = currentStateTransitions.size(); i < currentStateTransitionsSize; i++) { - if (checkTransition(transition)) + if (checkTransition(currentStateTransitions.get(i))) { return; } @@ -122,10 +123,13 @@ public void tick() public boolean checkTransition(@NotNull final ITickingTransition transition) { // Check if the target should be run this Tick - if ((tickCounter % transition.getTickRate()) != transition.getTickOffset()) + if (transition.countdownTicksToUpdate() > 0) { return false; } + + transition.setTicksToUpdate((int) (transition.getTickRate() / slownessFactor)); + executedTransition = transition; return super.checkTransition(transition); } @@ -141,4 +145,10 @@ public void setTickRate(final int tickRate) this.tickRate = tickRate; tickRateCounter = new Random().nextInt(tickRate); } + + @Override + public void setCurrentDelay(final int ticksToNext) + { + executedTransition.setTicksToUpdate(ticksToNext); + } } diff --git a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickingTransition.java b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickingTransition.java index 68c73c52c33..8c5a62b3397 100755 --- a/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickingTransition.java +++ b/src/api/java/com/minecolonies/api/entity/ai/statemachine/tickratestatemachine/TickingTransition.java @@ -21,9 +21,9 @@ public class TickingTransition extends BasicTransition impl private int tickRate; /** - * The random offset for Ticks, so that AITargets get more distributed activations on server ticks + * Amount of ticks until next update, counts down */ - private final int tickOffset; + private int ticksToUpdate = 0; /** * The variant used upon creation of the AITarget to uniformly distribute the Tick offset Static variable counter that changes with each AITarget creation and affects the next @@ -53,7 +53,7 @@ public TickingTransition( this.tickRate = Math.max(this.tickRate, 1); // Calculate offSet % tickRate already to not have redundant calculations later - this.tickOffset = tickOffsetVariant % this.tickRate; + this.ticksToUpdate = tickOffsetVariant % this.tickRate; // Increase variant for next AITarget and reset variant at a certain point tickOffsetVariant++; if (tickOffsetVariant >= MAX_TICKRATE_VARIANT) @@ -81,7 +81,7 @@ public TickingTransition( this.tickRate = Math.max(this.tickRate, 1); // Calculate offSet % tickRate already to not have redundant calculations later - this.tickOffset = tickOffsetVariant % this.tickRate; + this.ticksToUpdate = tickOffsetVariant % this.tickRate; // Increase variant for next AITarget and reset variant at a certain point tickOffsetVariant++; if (tickOffsetVariant >= MAX_TICKRATE_VARIANT) @@ -118,8 +118,14 @@ public void setTickRate(final int tickRate) * @return random */ @Override - public int getTickOffset() + public int countdownTicksToUpdate() { - return tickOffset; + return --ticksToUpdate; + } + + @Override + public void setTicksToUpdate(final int ticksToUpdate) + { + this.ticksToUpdate = ticksToUpdate; } } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/AbstractCivilianEntity.java b/src/api/java/com/minecolonies/api/entity/citizen/AbstractCivilianEntity.java index f1ca65bf831..739a62a8425 100644 --- a/src/api/java/com/minecolonies/api/entity/citizen/AbstractCivilianEntity.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/AbstractCivilianEntity.java @@ -1,28 +1,24 @@ package com.minecolonies.api.entity.citizen; import com.minecolonies.api.colony.ICivilianData; -import com.minecolonies.api.entity.pathfinding.IStuckHandlerEntity; +import com.minecolonies.api.entity.AbstractFastMinecoloniesEntity; import com.minecolonies.api.sounds.SoundManager; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.AgeableMob; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.npc.Npc; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.common.util.ITeleporter; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static com.minecolonies.api.sounds.EventType.SUCCESS; -import static com.minecolonies.api.util.SoundUtils.playSoundAtCivilian; +import static com.minecolonies.api.sounds.EventType.GREETING; +import static com.minecolonies.api.util.SoundUtils.playSoundAtCitizenWith; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; -public abstract class AbstractCivilianEntity extends AgeableMob implements Npc, IStuckHandlerEntity +public abstract class AbstractCivilianEntity extends AbstractFastMinecoloniesEntity implements Npc { /** * Whether this entity can be stuck for stuckhandling @@ -44,7 +40,7 @@ public abstract class AbstractCivilianEntity extends AgeableMob implements Npc, * @param type from type. * @param worldIn the world. */ - protected AbstractCivilianEntity(final EntityType type, final Level worldIn) + protected AbstractCivilianEntity(final EntityType type, final Level worldIn) { super(type, worldIn); if (worldIn.isClientSide) @@ -70,7 +66,7 @@ protected AbstractCivilianEntity(final EntityType type, fi /** * Mark the citizen dirty to synch the data with the client. */ - public abstract void markDirty(); + public abstract void markDirty(final int time); /** * Getter for the citizen id. @@ -87,35 +83,31 @@ protected AbstractCivilianEntity(final EntityType type, fi public abstract void setCitizenId(int id); @Override - public boolean canBeLeashed(Player player) + public void tick() { - return false; + super.tick(); + if (level.isClientSide) + { + soundManager.tick(); + } } @Override - public boolean canBeStuck() - { - return canBeStuck; - } - - /** - * Sets whether the entity currently can be stuck - * - * @param canBeStuck - */ - public void setCanBeStuck(final boolean canBeStuck) + public boolean checkBedExists() { - this.canBeStuck = canBeStuck; - } + if (tickCount % 5 == randomVariance % 5) + { + return true; + } - @Override - public void tick() - { - super.tick(); - if (level.isClientSide) + if (getSleepingPos().isPresent()) { - soundManager.tick(); + final BlockPos pos = getSleepingPos().get(); + final BlockState state = level.getBlockState(getSleepingPos().get()); + return state.getBlock().isBed(state,level,pos,this); } + + return false; } @Override @@ -141,7 +133,7 @@ public void onPlayerCollide(final Player player) getNavigation().stop(); getLookControl().setLookAt(player); - playSoundAtCivilian(level, blockPosition(), SUCCESS, getCivilianData()); + playSoundAtCitizenWith(level, blockPosition(), GREETING, getCivilianData()); } } @@ -153,26 +145,4 @@ public SoundManager getSoundManager() { return soundManager; } - - @Override - protected void removeFrost() - { - - } - - @Override - protected void tryAddFrost() - { - - } - - /** - * Prevent citizens and visitors from travelling to other dimensions through portals. - */ - @Nullable - @Override - public Entity changeDimension(@NotNull final ServerLevel serverWorld, @NotNull final ITeleporter teleporter) - { - return null; - } } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java b/src/api/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java index e7a8c41ef07..d2faf5627c0 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java @@ -8,8 +8,11 @@ import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.colony.requestsystem.location.ILocation; import com.minecolonies.api.entity.MinecoloniesMinecart; -import com.minecolonies.api.entity.ai.DesiredActivity; import com.minecolonies.api.entity.ai.pathfinding.IWalkToProxy; +import com.minecolonies.api.entity.ai.statemachine.states.EntityState; +import com.minecolonies.api.entity.ai.statemachine.states.IState; +import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; +import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.citizen.citizenhandlers.*; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import com.minecolonies.api.entity.pathfinding.PathingStuckHandler; @@ -18,6 +21,7 @@ import com.minecolonies.api.sounds.EventType; import com.minecolonies.api.util.CompatibilityUtils; import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Log; import com.minecolonies.api.util.SoundUtils; import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; @@ -44,10 +48,8 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Random; import static com.minecolonies.api.util.constant.CitizenConstants.*; @@ -123,13 +125,21 @@ public abstract class AbstractEntityCitizen extends AbstractCivilianEntity imple */ private boolean isEquipmentDirty = true; + /** + * The AI for citizens, controlling different global states + */ + protected ITickRateStateMachine entityStateController = new TickRateStateMachine<>(EntityState.INIT, + e -> Log.getLogger() + .warn("Citizen " + getDisplayName().getString() + " id:" + (getCitizenData() != null ? getCitizenData().getId() : -1) + "from colony: " + + getCitizenColonyHandler().getColonyId() + " state controller exception", e)); + /** * Constructor for a new citizen typed entity. * * @param type the Entity type. * @param world the world. */ - public AbstractEntityCitizen(final EntityType type, final Level world) + public AbstractEntityCitizen(final EntityType type, final Level world) { super(type, world); } @@ -201,7 +211,18 @@ public InteractionResult interactAt(final Player player, final Vec3 vec, final I { if (!player.level.isClientSide()) { - SoundUtils.playSoundAtCitizenWith(CompatibilityUtils.getWorldFromCitizen(this), this.blockPosition(), EventType.INTERACTION, this.getCitizenData()); + if (this.getPose() == Pose.SLEEPING) + { + SoundUtils.playSoundAtCitizenWith(CompatibilityUtils.getWorldFromCitizen(this), this.blockPosition(), EventType.OFF_TO_BED, this.getCitizenData(), 100); + } + else if (getCitizenData() != null && getCitizenData().isIdleAtJob()) + { + SoundUtils.playSoundAtCitizenWith(CompatibilityUtils.getWorldFromCitizen(this), this.blockPosition(), EventType.MISSING_EQUIPMENT, this.getCitizenData(), 100); + } + else + { + SoundUtils.playSoundAtCitizenWith(CompatibilityUtils.getWorldFromCitizen(this), this.blockPosition(), EventType.INTERACTION, this.getCitizenData(), 100); + } } return super.interactAt(player, vec, hand); @@ -273,18 +294,6 @@ public ResourceLocation getModelType() return modelId; } - /** - * For the time being we don't want any childrens of our colonists. - * - * @return the child. - */ - @Nullable - @Override - public AgeableMob getBreedOffspring(final ServerLevel world, final AgeableMob parent) - { - return null; - } - @Override protected void defineSynchedData() { @@ -339,6 +348,20 @@ public AbstractAdvancedPathNavigate getNavigation() return pathNavigate; } + /** + * Don't push if we're ignoring being pushed + */ + @Override + public void pushEntities() + { + if (collisionCounter > COLL_THRESHOLD) + { + return; + } + + super.pushEntities(); + } + /** * Ignores entity collisions are colliding for a while, solves stuck e.g. for many trying to take the same door * @@ -372,7 +395,7 @@ public void onPlayerCollide(final Player player) super.onPlayerCollide(player); return; } - + final IJob job = getCitizenData().getJob(); if (job == null || !job.isGuard()) { @@ -399,6 +422,7 @@ public boolean isPushable() public void aiStep() { super.aiStep(); + entityStateController.tick(); updateSwingTime(); if (collisionCounter > 0) { @@ -406,24 +430,6 @@ public void aiStep() } } - @Override - protected void tryAddSoulSpeed() - { - - } - - @Override - protected void removeSoulSpeed() - { - - } - - @Override - public boolean canSpawnSoulSpeedParticle() - { - return false; - } - /** * Set the rotation of the citizen. * @@ -566,17 +572,6 @@ public boolean checkCanDropLoot() @NotNull public abstract IItemHandler getItemHandlerCitizen(); - @NotNull - public abstract DesiredActivity getDesiredActivity(); - - /** - * Sets the size of the citizen entity - * - * @param width Width - * @param height Height - */ - public abstract void setCitizensize(@NotNull float width, @NotNull float height); - /** * Sets whether this entity is a child * @@ -620,13 +615,6 @@ public boolean checkCanDropLoot() */ public abstract ICitizenChatHandler getCitizenChatHandler(); - /** - * The Handler for all status related methods. - * - * @return the instance of the handler. - */ - public abstract ICitizenStatusHandler getCitizenStatusHandler(); - /** * The Handler for all item related methods. * @@ -675,27 +663,6 @@ public boolean checkCanDropLoot() public abstract void setCitizenDiseaseHandler(ICitizenDiseaseHandler citizenDiseaseHandler); - /** - * Check if the citizen can eat now by considering the state and the job tasks. - * - * @return true if so. - */ - public abstract boolean isOkayToEat(); - - /** - * Check if the citizen can be fed. - * - * @return true if so. - */ - public abstract boolean shouldBeFed(); - - /** - * Check if the citizen is just idling at their job and can eat now. - * - * @return true if so. - */ - public abstract boolean isIdlingAtJob(); - public abstract float getRotationYaw(); public abstract float getRotationPitch(); @@ -712,13 +679,6 @@ public boolean checkCanDropLoot() public abstract void setCitizenExperienceHandler(ICitizenExperienceHandler citizenExperienceHandler); - /** - * Get if the citizen is fleeing from an attacker. - * - * @return true if so. - */ - public abstract boolean isCurrentlyFleeing(); - /** * Calls a guard for help against an attacker. * @@ -727,27 +687,10 @@ public boolean checkCanDropLoot() */ public abstract void callForHelp(final Entity attacker, final int guardHelpRange); - /** - * Sets the fleeing state - * - * @param fleeing true if fleeing. - */ - public abstract void setFleeingState(final boolean fleeing); - - /** - * Setter for the citizen pose. - * - * @param pose the pose to set. - */ - public void updatePose(final Pose pose) - { - setPose(pose); - } - @Override public void detectEquipmentUpdates() { - if (this.isEquipmentDirty) + if (this.isEquipmentDirty && tickCount % 20 == randomVariance) { this.isEquipmentDirty = false; List> list = Lists.newArrayListWithCapacity(6); @@ -770,22 +713,30 @@ public void setItemSlot(final EquipmentSlot slot, @NotNull final ItemStack newIt final ItemStack previous = getItemBySlot(slot); if (!ItemStackUtils.compareItemStacksIgnoreStackSize(previous, newItem, false, true)) { - if (!previous.isEmpty()) - { - this.getAttributes().removeAttributeModifiers(previous.getAttributeModifiers(slot)); - } - - if (!newItem.isEmpty()) - { - this.getAttributes().addTransientAttributeModifiers(newItem.getAttributeModifiers(slot)); - } - markEquipmentDirty(); } } super.setItemSlot(slot, newItem); } + /** + * On armor removal. + * @param stack the removed armor. + */ + public void onArmorRemove(final ItemStack stack, final EquipmentSlot equipmentSlot) + { + this.getAttributes().removeAttributeModifiers(stack.getAttributeModifiers(equipmentSlot)); + } + + /** + * On armor equip. + * @param stack the added armor. + */ + public void onArmorAdd(final ItemStack stack, final EquipmentSlot equipmentSlot) + { + this.getAttributes().addTransientAttributeModifiers(stack.getAttributeModifiers(equipmentSlot)); + } + /** * Mark the equipment as dirty. */ @@ -804,29 +755,37 @@ public boolean isPushedByFluid() return false; } - /** - * Do not allow bubble movement - * - * @param down - */ - public void onInsideBubbleColumn(boolean down) - { - - } - /** * Queue a sound at the citizen. - * @param soundEvent the sound event to play. - * @param length the length of the event. + * + * @param soundEvent the sound event to play. + * @param length the length of the event. * @param repetitions the number of times to play it. */ public abstract void queueSound(@NotNull final SoundEvent soundEvent, final BlockPos pos, final int length, final int repetitions); /** * Queue a sound at the citizen. - * @param soundEvent the sound event to play. - * @param length the length of the event. + * + * @param soundEvent the sound event to play. + * @param length the length of the event. * @param repetitions the number of times to play it. */ public abstract void queueSound(@NotNull final SoundEvent soundEvent, final BlockPos pos, final int length, final int repetitions, final float volume, final float pitch); + + /** + * Get the entities state controller + * + * @return + */ + public ITickRateStateMachine getEntityStateController() + { + return entityStateController; + } + + @Override + public boolean isSleeping() + { + return getCitizenSleepHandler().isAsleep(); + } } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenColonyHandler.java b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenColonyHandler.java index 086f2398cd2..82bb845eb9a 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenColonyHandler.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenColonyHandler.java @@ -2,7 +2,7 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.buildings.IBuilding; +import net.minecraft.network.syncher.EntityDataAccessor; import org.jetbrains.annotations.Nullable; public interface ICitizenColonyHandler @@ -64,4 +64,11 @@ public interface ICitizenColonyHandler * Actions when the entity is removed. */ void onCitizenRemoved(); + + /** + * Entity data update callback + * + * @param dataAccessor + */ + void onSyncDataUpdate(EntityDataAccessor dataAccessor); } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java index ac023e3e97c..51a0bd5c0f4 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java @@ -51,4 +51,21 @@ public interface ICitizenDiseaseHandler * Called when two citizens collide. */ void onCollission(@NotNull final AbstractEntityCitizen citizen); + + /** + * True when the citizen needs to go to a hospital because its hurt + * @return + */ + boolean isHurt(); + + /** + * Whether the citizen sleeps at a hospital + * @return + */ + boolean sleepsAtHospital(); + + /** + * Enables sleeping at the hospital + */ + void setSleepsAtHospital(); } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenHappinessHandler.java b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenHappinessHandler.java index 7304b040ae3..34d9cdf774c 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenHappinessHandler.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenHappinessHandler.java @@ -12,6 +12,13 @@ */ public interface ICitizenHappinessHandler { + /** + * Add the modifier to the handler. + * + * @param modifier the modifier. + */ + void addModifier(IHappinessModifier modifier); + /** * Reset a modifier. * @@ -40,7 +47,7 @@ public interface ICitizenHappinessHandler * @param colony the colony. * @return the happiness. */ - double getHappiness(IColony colony); + double getHappiness(final IColony colony, final ICitizenData citizenData); /** * Read the handler from NBT. diff --git a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenJobHandler.java b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenJobHandler.java index b5ad82b9569..e84acf8f77c 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenJobHandler.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenJobHandler.java @@ -1,6 +1,7 @@ package com.minecolonies.api.entity.citizen.citizenhandlers; import com.minecolonies.api.colony.jobs.IJob; +import com.minecolonies.api.entity.ai.ITickingStateAI; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,4 +45,18 @@ public interface ICitizenJobHandler * @return true if so. */ boolean shouldRunAvoidance(); + + /** + * Sets the work AI used in this job + * + * @param workAI + */ + void setWorkAI(ITickingStateAI workAI); + + /** + * Get the AI running for this job + * + * @return + */ + ITickingStateAI getWorkAI(); } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenStatusHandler.java b/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenStatusHandler.java deleted file mode 100755 index 8309d365faf..00000000000 --- a/src/api/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenStatusHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.minecolonies.api.entity.citizen.citizenhandlers; - -import com.minecolonies.api.entity.ai.Status; -import net.minecraft.network.chat.Component; - -public interface ICitizenStatusHandler -{ - /** - * Get the latest status of the citizen. - * - * @return a Component with the length 4 describing it. - */ - Component[] getLatestStatus(); - - /** - * Set the latest status of the citizen and clear the existing status - * - * @param status the new status to set. - */ - void setLatestStatus(Component... status); - - /** - * Append to the existing latestStatus list. This will override the oldest one if full and move the others one down in the array. - * - * @param status the latest status to append - */ - void addLatestStatus(Component status); - - /** - * Getter for the current status. - * - * @return the status. - */ - Status getStatus(); - - /** - * Setter for the current status. - * - * @param status the status to set. - */ - void setStatus(Status status); -} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/AbstractHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/AbstractHappinessModifier.java index 1077a27a248..878322e7cfb 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/AbstractHappinessModifier.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/AbstractHappinessModifier.java @@ -1,23 +1,30 @@ package com.minecolonies.api.entity.citizen.happiness; +import com.minecolonies.api.colony.ICitizenData; import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_VALUE; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * Abstract happiness modifier implementation. */ public abstract class AbstractHappinessModifier implements IHappinessModifier { + /** + * The supplier to get the happiness factor. + */ + private IHappinessSupplierWrapper supplier; + /** * The id of the modifier. */ - public final String id; + public String id; /** * The weight of the modifier. */ - private final double weight; + private double weight; /** * Create an instance of the happiness modifier. @@ -25,46 +32,56 @@ public abstract class AbstractHappinessModifier implements IHappinessModifier * @param id its string id. * @param weight its weight. */ - public AbstractHappinessModifier(final String id, final double weight) + public AbstractHappinessModifier(final String id, final double weight, final IHappinessSupplierWrapper supplier) { this.id = id; this.weight = weight; + this.supplier = supplier; } @Override - public String getId() + public double getFactor(@Nullable final ICitizenData citizenData) { - return id; - } - - @Override - public void read(final CompoundTag compoundNBT) - { - + return citizenData == null ? supplier.getLastCachedValue() : supplier.getValue(citizenData); } - @Override - public void write(final CompoundTag compoundNBT) + /** + * Create an empty instance of the abstract happiness modifier. + */ + public AbstractHappinessModifier() { - compoundNBT.putDouble(TAG_VALUE, getFactor()); + super(); } @Override - public void dayEnd() + public String getId() { - + return id; } @Override - public void reset() + public void read(final CompoundTag compoundNBT) { - + this.id = compoundNBT.getString(TAG_ID); + this.weight = compoundNBT.getDouble(TAG_WEIGHT); + final CompoundTag supplierCompound = compoundNBT.getCompound(TAG_SUPPLIER); + if (supplierCompound.contains(TAG_ID)) + { + supplier = new DynamicHappinessSupplier(); + } + else + { + supplier = new StaticHappinessSupplier(); + } + supplier.deserializeNBT(supplierCompound); } @Override - public int getDays() + public void write(final CompoundTag compoundNBT) { - return 0; + compoundNBT.putString(TAG_ID, this.id); + compoundNBT.putDouble(TAG_WEIGHT, this.weight); + compoundNBT.put(TAG_SUPPLIER, this.supplier.serializeNBT()); } @Override diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/ClientHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/ClientHappinessModifier.java deleted file mode 100755 index 571b868042e..00000000000 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/ClientHappinessModifier.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.minecolonies.api.entity.citizen.happiness; - -import net.minecraft.nbt.CompoundTag; - -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_VALUE; - -/** - * Client happiness modifier class. - */ -public class ClientHappinessModifier extends AbstractHappinessModifier -{ - /** - * The supplier to get the happiness factor. - */ - private double value; - - /** - * Create an instance of the happiness modifier. - * - * @param id its string id. - * @param weight its weight. - */ - public ClientHappinessModifier(final String id, final double weight) - { - super(id, weight); - } - - @Override - public void read(final CompoundTag compoundNBT) - { - this.value = compoundNBT.getDouble(TAG_VALUE); - } - - @Override - public double getFactor() - { - return value; - } -} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/DynamicHappinessSupplier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/DynamicHappinessSupplier.java new file mode 100644 index 00000000000..717897842e8 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/DynamicHappinessSupplier.java @@ -0,0 +1,71 @@ +package com.minecolonies.api.entity.citizen.happiness; + +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.ICitizenData; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ID; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_VALUE; + +/** + * Dynamic Happiness supplier. + */ +public class DynamicHappinessSupplier implements IHappinessSupplierWrapper +{ + /** + * Entry key. + */ + private ResourceLocation key; + + /** + * Last value. + */ + private double lastValue = 0.0; + + /** + * Create a new dynamic supplier. + * @param key the key of the function. + */ + public DynamicHappinessSupplier(final ResourceLocation key) + { + this.key = key; + } + + /** + * Default constructor for deserialization. + */ + public DynamicHappinessSupplier() + { + // Empty on purpose. + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putString(TAG_ID, key.toString()); + compoundTag.putDouble(TAG_VALUE, lastValue); + return compoundTag; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.key = new ResourceLocation(nbt.getString(TAG_ID)); + this.lastValue = nbt.getDouble(TAG_VALUE); + } + + @Override + public double getValue(final ICitizenData citizenData) + { + lastValue = IMinecoloniesAPI.getInstance().getHappinessFunctionRegistry().getValue(key).getDoubleSupplier().apply(citizenData); + return lastValue; + } + + @Override + public double getLastCachedValue() + { + return lastValue; + } +} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/ExpirationBasedHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/ExpirationBasedHappinessModifier.java index 29ad0c2dbcd..d9022eb5e56 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/ExpirationBasedHappinessModifier.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/ExpirationBasedHappinessModifier.java @@ -1,16 +1,16 @@ package com.minecolonies.api.entity.citizen.happiness; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.util.constant.NbtTagConstants; import net.minecraft.nbt.CompoundTag; -import java.util.function.DoubleSupplier; - -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_DAY; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * The Expiration based happiness modifier. These modifiers are invoked for a limited period of time and have a happiness buff or boost for this time on the happiness. This can * also be inverted resulting in a buff or boost if this modifier is not invoked regularly. */ -public class ExpirationBasedHappinessModifier extends StaticHappinessModifier +public final class ExpirationBasedHappinessModifier extends AbstractHappinessModifier implements ITimeBasedHappinessModifier { /** * The number of passed days. @@ -20,7 +20,7 @@ public class ExpirationBasedHappinessModifier extends StaticHappinessModifier /** * Period of time this modifier applies. */ - private final int period; + private int period; /** * If this should give a penalty if not active. @@ -35,7 +35,7 @@ public class ExpirationBasedHappinessModifier extends StaticHappinessModifier * @param period the period. * @param supplier the supplier to get the factor. */ - public ExpirationBasedHappinessModifier(final String id, final double weight, final DoubleSupplier supplier, final int period) + public ExpirationBasedHappinessModifier(final String id, final double weight, final IHappinessSupplierWrapper supplier, final int period) { super(id, weight, supplier); this.period = period; @@ -50,30 +50,38 @@ public ExpirationBasedHappinessModifier(final String id, final double weight, fi * @param supplier the supplier to get the factor. * @param inverted if inverted. */ - public ExpirationBasedHappinessModifier(final String id, final double weight, final DoubleSupplier supplier, final int period, final boolean inverted) + public ExpirationBasedHappinessModifier(final String id, final double weight, final IHappinessSupplierWrapper supplier, final int period, final boolean inverted) { this(id, weight, supplier, period); this.inverted = inverted; } + /** + * Create an instance of the happiness modifier. + */ + public ExpirationBasedHappinessModifier() + { + super(); + } + @Override - public double getFactor() + public double getFactor(final ICitizenData data) { if (inverted) { - if (days > 0) + if (days <= period) { - return 1; + return 1.0; } - return super.getFactor(); + return super.getFactor(data); } else { - if (days > 0) + if (days < period) { - return super.getFactor(); + return super.getFactor(data); } - return 1; + return 1.0; } } @@ -84,9 +92,8 @@ public void reset() } @Override - public void dayEnd() + public void dayEnd(final ICitizenData data) { - super.dayEnd(); if (days > 0) { days--; @@ -104,12 +111,17 @@ public void read(final CompoundTag compoundNBT) { super.read(compoundNBT); this.days = compoundNBT.getInt(TAG_DAY); + this.inverted = compoundNBT.getBoolean(TAG_INVERTED); + this.period = compoundNBT.getInt(TAG_PERIOD); } @Override public void write(final CompoundTag compoundNBT) { super.write(compoundNBT); + compoundNBT.putString(NbtTagConstants.TAG_MODIFIER_TYPE, HappinessRegistry.EXPIRATION_MODIFIER.toString()); compoundNBT.putInt(TAG_DAY, days); + compoundNBT.putBoolean(TAG_INVERTED, inverted); + compoundNBT.putInt(TAG_PERIOD, period); } } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/HappinessRegistry.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/HappinessRegistry.java new file mode 100755 index 00000000000..6d8e0897e5f --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/HappinessRegistry.java @@ -0,0 +1,157 @@ +package com.minecolonies.api.entity.citizen.happiness; + +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.api.util.constant.NbtTagConstants; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Happiness forge registry to facilitate loading and saving to nbt. + */ +public class HappinessRegistry +{ + /** + * Get the reward registry. + * + * @return the reward registry. + */ + static IForgeRegistry getHappinessTypeRegistry() + { + return IMinecoloniesAPI.getInstance().getHappinessTypeRegistry(); + } + + /** + * Get the reward registry. + * + * @return the reward registry. + */ + static IForgeRegistry getHappinessFunctionRegistry() + { + return IMinecoloniesAPI.getInstance().getHappinessFunctionRegistry(); + } + + /** + * Happiness Factor type. + */ + public static class HappinessFactorTypeEntry + { + private final Supplier supplier; + + public HappinessFactorTypeEntry(final Supplier productionFunction) + { + this.supplier = productionFunction; + } + + /** + * Get the modifier. + * @return the modifier. + */ + public IHappinessModifier create() + { + return supplier.get(); + } + } + + /** + * Static getter to load a happiness modifier from a compound. + * + * @param compound the compound to load it from. + * @return the modifier instance. + */ + public static IHappinessModifier loadFrom(@NotNull final CompoundTag compound) + { + final ResourceLocation modifierType = compound.contains(NbtTagConstants.TAG_MODIFIER_TYPE) + ? new ResourceLocation(compound.getString(NbtTagConstants.TAG_MODIFIER_TYPE)) + : new ResourceLocation(Constants.MOD_ID, "null"); + final IHappinessModifier modifier = getHappinessTypeRegistry().getValue(modifierType).create(); + + if (modifier != null) + { + try + { + modifier.read(compound); + } + catch (final RuntimeException ex) + { + Log.getLogger() + .error(String.format("A Happiness Modifier %s has thrown an exception during loading, its state cannot be restored. Report this to the mod author", + modifierType), ex); + return null; + } + } + else + { + Log.getLogger().warn(String.format("Unknown Happiness Modifier type '%s' or missing constructor of proper format.", modifierType)); + } + + return modifier; + } + + /** + * Happiness Factor type. + */ + public static class HappinessFunctionEntry + { + private final Function doubleSupplier; + + /** + * Create a new entry type. + * @param doubleSupplier th + */ + public HappinessFunctionEntry(final Function doubleSupplier) + { + this.doubleSupplier = doubleSupplier; + } + + /** + * Get the double supplier. + * @return the function. + */ + public Function getDoubleSupplier() + { + return doubleSupplier; + } + } + + public static ResourceLocation STATIC_MODIFIER = new ResourceLocation(Constants.MOD_ID, "static"); + public static ResourceLocation EXPIRATION_MODIFIER = new ResourceLocation(Constants.MOD_ID, "expiration"); + public static ResourceLocation TIME_PERIOD_MODIFIER = new ResourceLocation(Constants.MOD_ID, "time"); + + public static RegistryObject staticHappinessModifier; + public static RegistryObject expirationBasedHappinessModifier; + public static RegistryObject timeBasedHappinessModifier; + + public static ResourceLocation SCHOOL_FUNCTION = new ResourceLocation(Constants.MOD_ID, "school"); + public static ResourceLocation SECURITY_FUNCTION = new ResourceLocation(Constants.MOD_ID, "security"); + public static ResourceLocation SOCIAL_FUNCTION = new ResourceLocation(Constants.MOD_ID, "social"); + public static ResourceLocation SATURATION_FUNCTION = new ResourceLocation(Constants.MOD_ID, "saturation"); + public static ResourceLocation MYSTICAL_SITE_FUNCTION = new ResourceLocation(Constants.MOD_ID, "mystical"); + + public static ResourceLocation HOUSING_FUNCTION = new ResourceLocation(Constants.MOD_ID, "housing"); + public static ResourceLocation UNEMPLOYMENT_FUNCTION = new ResourceLocation(Constants.MOD_ID, "unemployment"); + public static ResourceLocation HEALTH_FUNCTION = new ResourceLocation(Constants.MOD_ID, "health"); + public static ResourceLocation IDLEATJOB_FUNCTION = new ResourceLocation(Constants.MOD_ID, "idleatjob"); + public static ResourceLocation SLEPTTONIGHT_FUNCTION = new ResourceLocation(Constants.MOD_ID, "slepttonight"); + + public static RegistryObject schoolFunction; + public static RegistryObject securityFunction; + public static RegistryObject socialFunction; + public static RegistryObject saturationFunction; + public static RegistryObject mysticalSiteFunction; + + public static RegistryObject housingFunction; + public static RegistryObject unemploymentFunction; + public static RegistryObject healthFunction; + public static RegistryObject idleatjobFunction; + public static RegistryObject sleptTonightFunction; + +} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessModifier.java index 2a684d345aa..f95de4efad6 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessModifier.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessModifier.java @@ -1,6 +1,8 @@ package com.minecolonies.api.entity.citizen.happiness; +import com.minecolonies.api.colony.ICitizenData; import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; /** * Interface describing possible happiness factors. @@ -15,11 +17,11 @@ public interface IHappinessModifier String getId(); /** - * get the factor of the happiness. value between 0 and 1 if negative. value above 1 if positive. - * + * Get the factor of the happiness. value between 0 and 1 if negative. value above 1 if positive. + * @param data the citizen the factor is for. * @return the value of the factor. */ - double getFactor(); + double getFactor(@Nullable final ICitizenData data); /** * Get the weight of the happiness. @@ -41,21 +43,4 @@ public interface IHappinessModifier * @param compoundNBT the compound to write it to. */ void write(final CompoundTag compoundNBT); - - /** - * Called at the end of each day. - */ - void dayEnd(); - - /** - * Reset the modifier. - */ - void reset(); - - /** - * Get the days this is active. - * - * @return the days. - */ - int getDays(); } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessSupplierWrapper.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessSupplierWrapper.java new file mode 100644 index 00000000000..6508d9a488d --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/IHappinessSupplierWrapper.java @@ -0,0 +1,24 @@ +package com.minecolonies.api.entity.citizen.happiness; + +import com.minecolonies.api.colony.ICitizenData; +import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.util.INBTSerializable; + +/** + * Wrapper to deal with happiness suppliers. + */ +public interface IHappinessSupplierWrapper extends INBTSerializable +{ + /** + * Get the matching value. + * @param citizenData the context. + * @return the value. + */ + double getValue(final ICitizenData citizenData); + + /** + * Get the last cache value in absence of the citizen. + * @return the last cached value. + */ + double getLastCachedValue(); +} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/ITimeBasedHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/ITimeBasedHappinessModifier.java new file mode 100755 index 00000000000..8fd97833aa3 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/ITimeBasedHappinessModifier.java @@ -0,0 +1,27 @@ +package com.minecolonies.api.entity.citizen.happiness; + +import com.minecolonies.api.colony.ICitizenData; +import net.minecraft.nbt.CompoundTag; + +/** + * Interface describing possible happiness factors. + */ +public interface ITimeBasedHappinessModifier extends IHappinessModifier +{ + /** + * Called at the end of each day. + */ + default void dayEnd(final ICitizenData data) { } + + /** + * Reset the modifier. + */ + default void reset() { } + + /** + * Get the days this is active. + * + * @return the days. + */ + int getDays(); +} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessModifier.java index 75e430c951c..4552505f7c3 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessModifier.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessModifier.java @@ -1,17 +1,13 @@ package com.minecolonies.api.entity.citizen.happiness; -import java.util.function.DoubleSupplier; +import com.minecolonies.api.util.constant.NbtTagConstants; +import net.minecraft.nbt.CompoundTag; /** * Static modifier that doesn't change. */ -public class StaticHappinessModifier extends AbstractHappinessModifier +public final class StaticHappinessModifier extends AbstractHappinessModifier { - /** - * The supplier to get the happiness factor. - */ - private final DoubleSupplier supplier; - /** * Create an instance of the happiness modifier. * @@ -19,15 +15,23 @@ public class StaticHappinessModifier extends AbstractHappinessModifier * @param weight its weight. * @param supplier the supplier to get the factor. */ - public StaticHappinessModifier(final String id, final double weight, final DoubleSupplier supplier) + public StaticHappinessModifier(final String id, final double weight, final IHappinessSupplierWrapper supplier) + { + super(id, weight, supplier); + } + + /** + * Create an instance of the static happiness modifier. + */ + public StaticHappinessModifier() { - super(id, weight); - this.supplier = supplier; + super(); } @Override - public double getFactor() + public void write(final CompoundTag compoundNBT) { - return supplier.getAsDouble(); + super.write(compoundNBT); + compoundNBT.putString(NbtTagConstants.TAG_MODIFIER_TYPE, HappinessRegistry.STATIC_MODIFIER.toString()); } } diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessSupplier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessSupplier.java new file mode 100644 index 00000000000..3ae9c2f7608 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/StaticHappinessSupplier.java @@ -0,0 +1,60 @@ +package com.minecolonies.api.entity.citizen.happiness; + +import com.minecolonies.api.colony.ICitizenData; +import net.minecraft.nbt.CompoundTag; + +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_VALUE; + +/** + * Static Happiness supplier. + */ +public class StaticHappinessSupplier implements IHappinessSupplierWrapper +{ + /** + * Static value of supplier. + */ + private double value; + + /** + * Create a new static supplier. + * @param value the static value to supply. + */ + public StaticHappinessSupplier(final double value) + { + this.value = value; + } + + /** + * Default constructor for deserialization. + */ + public StaticHappinessSupplier() + { + // Empty on purpose. + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putDouble(TAG_VALUE, this.value); + return compoundTag; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.value = nbt.getDouble(TAG_VALUE); + } + + @Override + public double getValue(final ICitizenData citizenData) + { + return value; + } + + @Override + public double getLastCachedValue() + { + return value; + } +} diff --git a/src/api/java/com/minecolonies/api/entity/citizen/happiness/TimeBasedHappinessModifier.java b/src/api/java/com/minecolonies/api/entity/citizen/happiness/TimeBasedHappinessModifier.java index 3a061336ff1..04c9863f3fa 100755 --- a/src/api/java/com/minecolonies/api/entity/citizen/happiness/TimeBasedHappinessModifier.java +++ b/src/api/java/com/minecolonies/api/entity/citizen/happiness/TimeBasedHappinessModifier.java @@ -1,21 +1,26 @@ package com.minecolonies.api.entity.citizen.happiness; +import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.util.Tuple; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.api.util.constant.NbtTagConstants; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; -import java.util.function.DoubleSupplier; +import java.util.ArrayList; +import java.util.List; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_DAY; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * The time based happiness modifier. Over a time the buff/boost gets worse. */ -public class TimeBasedHappinessModifier extends StaticHappinessModifier +public final class TimeBasedHappinessModifier extends AbstractHappinessModifier implements ITimeBasedHappinessModifier { /** * The time based factors. */ - private final Tuple[] timeBasedFactor; + private Tuple[] timeBasedFactor; /** * The number of passed days. @@ -30,16 +35,24 @@ public class TimeBasedHappinessModifier extends StaticHappinessModifier * @param supplier the supplier to get the factor. * @param timeBasedFactor tuples about the boost/buff factor over time. */ - public TimeBasedHappinessModifier(final String id, final double weight, final DoubleSupplier supplier, final Tuple[] timeBasedFactor) + public TimeBasedHappinessModifier(final String id, final double weight, final IHappinessSupplierWrapper supplier, final Tuple...timeBasedFactor) { super(id, weight, supplier); this.timeBasedFactor = timeBasedFactor; } + /** + * Create an instance of the happiness modifier. + */ + public TimeBasedHappinessModifier() + { + super(); + } + @Override - public double getFactor() + public double getFactor(final ICitizenData citizenData) { - final double baseFactor = super.getFactor(); + final double baseFactor = super.getFactor(citizenData); double factor = baseFactor; if (baseFactor < 1.0) @@ -68,10 +81,9 @@ public int getDays() } @Override - public void dayEnd() + public void dayEnd(final ICitizenData data) { - super.dayEnd(); - if (getFactor() < 1) + if (getFactor(data) < 1) { days++; } @@ -86,12 +98,30 @@ public void read(final CompoundTag compoundNBT) { super.read(compoundNBT); this.days = compoundNBT.getInt(TAG_DAY); + final ListTag listTag = compoundNBT.getList(TAG_LIST, Constants.TAG_COMPOUND); + final List> list = new ArrayList<>(); + for (int i = 0; i < listTag.size(); i++) + { + final CompoundTag entryTag = listTag.getCompound(i); + list.add(new Tuple<>(entryTag.getInt(TAG_DAY), entryTag.getDouble(TAG_VALUE))); + } + this.timeBasedFactor = list.toArray(new Tuple[0]); } @Override public void write(final CompoundTag compoundNBT) { super.write(compoundNBT); + compoundNBT.putString(NbtTagConstants.TAG_MODIFIER_TYPE, HappinessRegistry.TIME_PERIOD_MODIFIER.toString()); + compoundNBT.putInt(TAG_DAY, days); + final ListTag listTag = new ListTag(); + for (final Tuple entry : timeBasedFactor) + { + final CompoundTag listEntry = new CompoundTag(); + listEntry.putInt(TAG_DAY, entry.getA()); + listEntry.putDouble(TAG_VALUE, entry.getB()); + } + compoundNBT.put(TAG_LIST, listTag); } } diff --git a/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityMinecoloniesMob.java b/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityMinecoloniesMob.java deleted file mode 100755 index 04382dbc407..00000000000 --- a/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityMinecoloniesMob.java +++ /dev/null @@ -1,747 +0,0 @@ -package com.minecolonies.api.entity.mobs; - -import com.minecolonies.api.IMinecoloniesAPI; -import com.minecolonies.api.MinecoloniesAPIProxy; -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IColonyManager; -import com.minecolonies.api.colony.colonyEvents.IColonyCampFireRaidEvent; -import com.minecolonies.api.colony.colonyEvents.IColonyEvent; -import com.minecolonies.api.enchants.ModEnchants; -import com.minecolonies.api.entity.CustomGoalSelector; -import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; -import com.minecolonies.api.entity.combat.CombatAIStates; -import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; -import com.minecolonies.api.entity.combat.threat.ThreatTable; -import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; -import com.minecolonies.api.entity.pathfinding.IStuckHandlerEntity; -import com.minecolonies.api.entity.pathfinding.PathingStuckHandler; -import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry; -import com.minecolonies.api.items.IChiefSwordItem; -import com.minecolonies.api.sounds.RaiderSounds; -import com.minecolonies.api.util.Log; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.monster.Enemy; -import net.minecraft.world.entity.player.Player; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.scores.PlayerTeam; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.Level; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.common.util.ITeleporter; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; - -import static com.minecolonies.api.entity.mobs.RaiderMobUtils.MOB_ATTACK_DAMAGE; -import static com.minecolonies.api.util.constant.NbtTagConstants.*; -import static com.minecolonies.api.util.constant.RaiderConstants.*; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; -import net.minecraft.world.entity.SpawnGroupData; - -import net.minecraft.world.entity.Entity.RemovalReason; - -/** - * Abstract for all Barbarian entities. - */ -public abstract class AbstractEntityMinecoloniesMob extends Mob implements IStuckHandlerEntity, IThreatTableEntity, Enemy -{ - /** - * Difficulty at which raiders team up - */ - private static final double TEAM_DIFFICULTY = 2.0d; - - /** - * The percent of life taken per damage modifier - */ - private static final float HP_PERCENT_PER_DMG = 0.03f; - - /** - * The max amount of damage converted to scaling - */ - private static final int MAX_SCALED_DAMAGE = 7; - - /** - * Minimum damage done before thorns effect can happen - */ - private static final float MIN_THORNS_DAMAGE = 30; - - /** - * 1 in X Chance that thorns effect happens - */ - private static final int THORNS_CHANCE = 5; - - /** - * The New PathNavigate navigator. - */ - private AbstractAdvancedPathNavigate newNavigator; - - /** - * Sets the barbarians target colony on spawn Thus it never changes. - */ - private IColony colony; - - /** - * Current count of ticks. - */ - private int currentCount = 0; - - /** - * The world time when the barbarian spawns. - */ - private long worldTimeAtSpawn = 0; - - /** - * The current tick since creation. - */ - private int currentTick = 0; - - /** - * Amount of time the barb got stuck. - */ - private int stuckCounter = 1; - - /** - * Amount of time the barb got stuck. - */ - private int ladderCounter = 0; - - /** - * The raids event id. - */ - private int eventID = 0; - - /** - * Whether this entity is registered with the colony yet. - */ - private boolean isRegistered = false; - - /** - * The invulnerability timer for spawning, to prevent suffocate/grouping damage. - */ - private int invulTime = 2 * 20; - - /** - * Environmental damage cooldown timer - */ - private int envDmgCooldown = 0; - - /** - * Environmental damage interval - */ - private int envDamageInterval = 5; - - /** - * Environmental damage immunity - */ - private boolean envDamageImmunity = false; - - /** - * Counts entity collisions - */ - private int collisionCounter = 0; - - /** - * Whether the entity is possibly stuck - */ - private boolean canBeStuck = true; - - /** - * The collision threshold - */ - private final static int COLL_THRESHOLD = 50; - private final static String RAID_TEAM = "RAIDERS_TEAM"; - - /** - * Mob difficulty - */ - private double difficulty = 1.0d; - - /** - * The threattable of the mob - */ - private ThreatTable threatTable = new ThreatTable<>(this); - - /** - * Raiders AI statemachine - */ - private ITickRateStateMachine ai = new TickRateStateMachine<>(CombatAIStates.NO_TARGET, e -> Log.getLogger().warn(e)); - - /** - * Constructor method for Abstract Barbarians. - * - * @param world the world. - * @param type the entity type. - */ - public AbstractEntityMinecoloniesMob(final EntityType type, final Level world) - { - super(type, world); - worldTimeAtSpawn = world.getGameTime(); - this.setPersistenceRequired(); - this.goalSelector = new CustomGoalSelector(this.goalSelector); - this.targetSelector = new CustomGoalSelector(this.targetSelector); - this.xpReward = BARBARIAN_EXP_DROP; - IMinecoloniesAPI.getInstance().getMobAIRegistry().applyToMob(this); - this.setInvulnerable(true); - RaiderMobUtils.setEquipment(this); - } - - @Override - public void push(@NotNull final Entity entityIn) - { - if (invulTime > 0 || (collisionCounter += 3) > COLL_THRESHOLD) - { - return; - } - super.push(entityIn); - } - - @Override - public void playAmbientSound() - { - super.playAmbientSound(); - final SoundEvent soundevent = this.getAmbientSound(); - if (soundevent != null && level.random.nextInt(OUT_OF_ONE_HUNDRED) <= ONE) - { - this.playSound(soundevent, this.getSoundVolume(), this.getVoicePitch()); - } - } - - @Override - public boolean removeWhenFarAway(final double distanceToClosestPlayer) - { - return shouldDespawn() || (level != null && level.isAreaLoaded(this.blockPosition(), 3) && getColony() == null); - } - - /** - * Get the specific raider type of this raider. - * - * @return the type enum. - */ - public abstract RaiderType getRaiderType(); - - /** - * Should the barbs despawn. - * - * @return true if so. - */ - private boolean shouldDespawn() - { - return worldTimeAtSpawn != 0 && (level.getGameTime() - worldTimeAtSpawn) >= TICKS_TO_DESPAWN; - } - - @NotNull - @Override - public AbstractAdvancedPathNavigate getNavigation() - { - if (this.newNavigator == null) - { - this.newNavigator = IPathNavigateRegistry.getInstance().getNavigateFor(this); - this.navigation = newNavigator; - this.newNavigator.setCanFloat(true); - newNavigator.setSwimSpeedFactor(getSwimSpeedFactor()); - this.newNavigator.getNodeEvaluator().setCanPassDoors(true); - newNavigator.getPathingOptions().withDropCost(1.3D); - PathingStuckHandler stuckHandler = PathingStuckHandler.createStuckHandler() - .withTakeDamageOnStuck(0.4f) - .withBuildLeafBridges() - .withPlaceLadders(); - - if (MinecoloniesAPIProxy.getInstance().getConfig().getServer().doBarbariansBreakThroughWalls.get()) - { - stuckHandler.withBlockBreaks(); - stuckHandler.withCompleteStuckBlockBreak(6); - } - - newNavigator.setStuckHandler(stuckHandler); - } - return newNavigator; - } - - /** - * Get the swim speed factor - * - * @return speed factor - */ - public abstract double getSwimSpeedFactor(); - - /** - * Get the stack counter. - * - * @return the amount it got stuck already. - */ - public int getStuckCounter() - { - return stuckCounter; - } - - /** - * Set the stack counter. - * - * @param stuckCounter the amount. - */ - public void setStuckCounter(final int stuckCounter) - { - this.stuckCounter = stuckCounter; - } - - /** - * Get the ladder counter. - * - * @return the amount it got stuck and placed a ladder already. - */ - public int getLadderCounter() - { - return ladderCounter; - } - - /** - * Set the ladder counter. - * - * @param ladderCounter the amount. - */ - public void setLadderCounter(final int ladderCounter) - { - this.ladderCounter = ladderCounter; - } - - @Override - protected SoundEvent getHurtSound(final DamageSource damageSourceIn) - { - return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.HURT); - } - - @Override - protected SoundEvent getDeathSound() - { - return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.DEATH); - } - - @Nullable - @Override - protected SoundEvent getAmbientSound() - { - return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.SAY); - } - - @Override - public void addAdditionalSaveData(final CompoundTag compound) - { - compound.putLong(TAG_TIME, worldTimeAtSpawn); - compound.putInt(TAG_STUCK_COUNTER, stuckCounter); - compound.putInt(TAG_LADDER_COUNTER, ladderCounter); - compound.putInt(TAG_COLONY_ID, this.colony == null ? 0 : colony.getID()); - compound.putInt(TAG_EVENT_ID, eventID); - super.addAdditionalSaveData(compound); - } - - - /** - * Prevent raiders from travelling to other dimensions through portals. - */ - @Nullable - @Override - public Entity changeDimension(@NotNull final ServerLevel serverWorld, @NotNull final ITeleporter teleporter) - { - return null; - } - - @Override - public void readAdditionalSaveData(final CompoundTag compound) - { - worldTimeAtSpawn = compound.getLong(TAG_TIME); - stuckCounter = compound.getInt(TAG_STUCK_COUNTER); - ladderCounter = compound.getInt(TAG_LADDER_COUNTER); - eventID = compound.getInt(TAG_EVENT_ID); - if (compound.contains(TAG_COLONY_ID)) - { - final int colonyId = compound.getInt(TAG_COLONY_ID); - if (colonyId != 0) - { - setColony(IColonyManager.getInstance().getColonyByWorld(colonyId, level)); - } - } - - if (colony == null || eventID == 0) - { - this.remove(RemovalReason.DISCARDED); - } - - super.readAdditionalSaveData(compound); - } - - @Override - public void aiStep() - { - if (!this.isAlive()) - { - return; - } - - updateSwingTime(); - - if (invulTime > 0) - { - invulTime--; - } - else - { - this.setInvulnerable(false); - } - - if (collisionCounter > 0) - { - collisionCounter--; - } - - if (level.isClientSide) - { - super.aiStep(); - return; - } - - if (currentTick % (random.nextInt(EVERY_X_TICKS) + 1) == 0) - { - if (worldTimeAtSpawn == 0) - { - worldTimeAtSpawn = level.getGameTime(); - } - - if (shouldDespawn()) - { - this.die(new DamageSource("despawn")); - this.remove(RemovalReason.DISCARDED); - return; - } - - if (!isRegistered) - { - registerWithColony(); - } - - if (currentCount <= 0) - { - currentCount = COUNTDOWN_SECOND_MULTIPLIER * TIME_TO_COUNTDOWN; - - if (!this.getMainHandItem().isEmpty() && SPEED_EFFECT != null && this.getMainHandItem().getItem() instanceof IChiefSwordItem - && MinecoloniesAPIProxy.getInstance().getConfig().getServer().barbarianHordeDifficulty.get() >= BARBARIAN_HORDE_DIFFICULTY_FIVE) - { - RaiderMobUtils.getBarbariansCloseToEntity(this, SPEED_EFFECT_DISTANCE) - .stream().filter(entity -> !entity.hasEffect(MobEffects.MOVEMENT_SPEED)) - .forEach(entity -> entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, SPEED_EFFECT_DURATION, SPEED_EFFECT_MULTIPLIER))); - } - } - else - { - --currentCount; - } - } - currentTick++; - - if (isRegistered) - { - ai.tick(); - } - - super.aiStep(); - } - - @org.jetbrains.annotations.Nullable - @Override - public SpawnGroupData finalizeSpawn( - final ServerLevelAccessor worldIn, - final DifficultyInstance difficultyIn, - final MobSpawnType reason, - @org.jetbrains.annotations.Nullable final SpawnGroupData spawnDataIn, - @org.jetbrains.annotations.Nullable final CompoundTag dataTag) - { - RaiderMobUtils.setEquipment(this); - return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - } - - @Override - public void remove(RemovalReason reason) - { - if (!level.isClientSide && colony != null && eventID > 0) - { - colony.getEventManager().unregisterEntity(this, eventID); - } - super.remove(reason); - } - - /** - * Getter for the colony. - * - * @return the colony the barbarian is assigned to attack.e - */ - public IColony getColony() - { - return colony; - } - - /** - * Registers the entity with the colony. - */ - public void registerWithColony() - { - if (colony == null || eventID == 0 || dead) - { - remove(RemovalReason.DISCARDED); - return; - } - RaiderMobUtils.setMobAttributes(this, getColony()); - colony.getEventManager().registerEntity(this, eventID); - isRegistered = true; - } - - @Override - public void die(@NotNull final DamageSource cause) - { - super.die(cause); - if (!level.isClientSide && getColony() != null) - { - getColony().getEventManager().onEntityDeath(this, eventID); - } - } - - @Override - public boolean hurt(@NotNull final DamageSource damageSource, final float damage) - { - if (damageSource.getEntity() instanceof LivingEntity && !(damageSource.getEntity() instanceof AbstractEntityMinecoloniesMob)) - { - threatTable.addThreat((LivingEntity) damageSource.getEntity(), (int) damage); - } - - if (damageSource.getDirectEntity() == null) - { - if (envDamageImmunity) - { - return false; - } - - if (--envDmgCooldown <= 0) - { - envDmgCooldown = envDamageInterval; - } - else - { - return false; - } - } - else if (!level.isClientSide()) - { - final IColonyEvent event = colony.getEventManager().getEventByID(eventID); - if (event instanceof IColonyCampFireRaidEvent) - { - ((IColonyCampFireRaidEvent) event).setCampFireTime(0); - } - - final Entity source = damageSource.getEntity(); - if (source instanceof Player) - { - if (damage > MIN_THORNS_DAMAGE && random.nextInt(THORNS_CHANCE) == 0) - { - source.hurt(DamageSource.thorns(this), damage * 0.5f); - } - - final float raiderDamageEnchantLevel = EnchantmentHelper.getItemEnchantmentLevel(ModEnchants.raiderDamage.get(), ((Player) source).getMainHandItem()); - - // Up to 7 damage are converted to health scaling damage, 7 is the damage of a diamond sword - float baseScalingDamage = Math.min(damage, MAX_SCALED_DAMAGE); - float totalWithScaled = - Math.max(damage, (damage - baseScalingDamage) + baseScalingDamage * HP_PERCENT_PER_DMG * this.getMaxHealth() * (1 + (raiderDamageEnchantLevel / 5))); - return super.hurt(damageSource, totalWithScaled); - } - } - - return super.hurt(damageSource, damage); - } - - /** - * Get the default attributes with their values. - * @return the attribute modifier map. - */ - public static AttributeSupplier.Builder getDefaultAttributes() - { - return LivingEntity.createLivingAttributes() - .add(MOB_ATTACK_DAMAGE.get()) - .add(Attributes.MAX_HEALTH) - .add(Attributes.ARMOR) - .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED) - .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE * 2) - .add(Attributes.ATTACK_DAMAGE, Attributes.ATTACK_DAMAGE.getDefaultValue()); - } - - /** - * Set the colony to raid. - * - * @param colony the colony to set. - */ - public void setColony(final IColony colony) - { - if (colony != null) - { - this.colony = colony; - } - } - - public int getEventID() - { - return eventID; - } - - public void setEventID(final int eventID) - { - this.eventID = eventID; - } - - /** - * Sets the environmental damage interval - * - * @param interval damage interval - */ - public void setEnvDamageInterval(final int interval) - { - envDamageInterval = interval; - } - - /** - * Sets the immunity to environmental damage - * - * @param immunity whether immune - */ - public void setEnvDamageImmunity(final boolean immunity) - { - envDamageImmunity = immunity; - } - - /** - * Initializes entity stats for a given raidlevel and difficulty - * - * @param baseHealth basehealth for this raid/difficulty - * @param difficulty difficulty - * @param baseDamage basedamage for this raid/difficulty - */ - public void initStatsFor(final double baseHealth, final double difficulty, final double baseDamage) - { - this.getAttribute(MOB_ATTACK_DAMAGE.get()).setBaseValue(baseDamage); - - this.difficulty = difficulty; - final double armor = difficulty * ARMOR; - this.getAttribute(Attributes.ARMOR).setBaseValue(armor); - this.setEnvDamageInterval((int) (BASE_ENV_DAMAGE_RESIST * difficulty)); - - if (difficulty >= 1.4d) - { - this.setEnvDamageImmunity(true); - } - - if (difficulty >= TEAM_DIFFICULTY) - { - level.getScoreboard().addPlayerToTeam(getScoreboardName(), checkOrCreateTeam()); - } - - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(baseHealth); - this.setHealth(this.getMaxHealth()); - } - - /** - * Creates or gets the scoreboard team - * - * @return Scoreboard team - */ - private PlayerTeam checkOrCreateTeam() - { - if (this.level.getScoreboard().getPlayerTeam(getTeamName()) == null) - { - this.level.getScoreboard().addPlayerTeam(getTeamName()); - this.level.getScoreboard().getPlayerTeam(getTeamName()).setAllowFriendlyFire(false); - } - return this.level.getScoreboard().getPlayerTeam(getTeamName()); - } - - /** - * Gets the scoreboard team name - * - * @return - */ - protected String getTeamName() - { - return RAID_TEAM; - } - - /** - * Get the mobs difficulty - * - * @return difficulty - */ - public double getDifficulty() - { - return difficulty; - } - - @Override - public boolean canBeStuck() - { - return canBeStuck; - } - - /** - * Sets whether the entity currently could be stuck - * - * @param canBeStuck true if its possible to be stuck - */ - public void setCanBeStuck(final boolean canBeStuck) - { - this.canBeStuck = canBeStuck; - } - - /** - * Disallow pushing from fluids to prevent stuck - * - * @return - */ - public boolean isPushedByFluid() - { - return false; - } - - /** - * Do not allow bubble movement - * - * @param down - */ - public void onInsideBubbleColumn(boolean down) - { - - } - - @Override - public ThreatTable getThreatTable() - { - return threatTable; - } - - /** - * Get the AI machine - * - * @return ai statemachine - */ - public ITickRateStateMachine getAI() - { - return ai; - } -} diff --git a/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityRaiderMob.java b/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityRaiderMob.java new file mode 100644 index 00000000000..b7eafae8482 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/mobs/AbstractEntityRaiderMob.java @@ -0,0 +1,803 @@ +package com.minecolonies.api.entity.mobs; + +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.MinecoloniesAPIProxy; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyTagCapability; +import com.minecolonies.api.colony.colonyEvents.IColonyCampFireRaidEvent; +import com.minecolonies.api.colony.colonyEvents.IColonyEvent; +import com.minecolonies.api.enchants.ModEnchants; +import com.minecolonies.api.entity.CustomGoalSelector; +import com.minecolonies.api.entity.ai.statemachine.states.IState; +import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; +import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; +import com.minecolonies.api.entity.AbstractFastMinecoloniesEntity; +import com.minecolonies.api.entity.combat.CombatAIStates; +import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; +import com.minecolonies.api.entity.combat.threat.ThreatTable; +import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; +import com.minecolonies.api.entity.pathfinding.PathingStuckHandler; +import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry; +import com.minecolonies.api.items.IChiefSwordItem; +import com.minecolonies.api.sounds.RaiderSounds; +import com.minecolonies.api.util.Log; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.Level; +import net.minecraft.server.level.ServerLevel; +import net.minecraftforge.common.util.ITeleporter; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; +import static com.minecolonies.api.entity.mobs.RaiderMobUtils.MOB_ATTACK_DAMAGE; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; +import static com.minecolonies.api.util.constant.RaiderConstants.*; + +/** + * Abstract for all raider entities. + */ +public abstract class AbstractEntityRaiderMob extends AbstractFastMinecoloniesEntity implements IThreatTableEntity, Enemy +{ + /** + * Difficulty at which raiders team up + */ + private static final double TEAM_DIFFICULTY = 2.0d; + + /** + * The percent of life taken per damage modifier + */ + private static final float HP_PERCENT_PER_DMG = 0.03f; + + /** + * The max amount of damage converted to scaling + */ + private static final int MAX_SCALED_DAMAGE = 7; + + /** + * Minimum damage done before thorns effect can happen + */ + private static final float MIN_THORNS_DAMAGE = 30; + + /** + * 1 in X Chance that thorns effect happens + */ + private static final int THORNS_CHANCE = 5; + + /** + * Set the colony raided if raider is in the wrong colony. + */ + private static final int COLONY_SET_RAIDED_CHANCE = 20; + + /** + * The New PathNavigate navigator. + */ + private AbstractAdvancedPathNavigate newNavigator; + + /** + * Sets the barbarians target colony on spawn Thus it never changes. + */ + private IColony colony; + + /** + * Current count of ticks. + */ + private int currentCount = 0; + + /** + * The world time when the barbarian spawns. + */ + private long worldTimeAtSpawn = 0; + + /** + * The current tick since creation. + */ + private int currentTick = 0; + + /** + * Amount of time the barb got stuck. + */ + private int stuckCounter = 1; + + /** + * Amount of time the barb got stuck. + */ + private int ladderCounter = 0; + + /** + * The raids event id. + */ + private int eventID = 0; + + /** + * Whether this entity is registered with the colony yet. + */ + private boolean isRegistered = false; + + /** + * The invulnerability timer for spawning, to prevent suffocate/grouping damage. + */ + private int invulTime = 2 * 20; + + /** + * Environmental damage cooldown timer + */ + private int envDmgCooldown = 0; + + /** + * Environmental damage interval + */ + private int envDamageInterval = 5; + + /** + * Environmental damage immunity + */ + private boolean envDamageImmunity = false; + + /** + * Temporary Environmental damage immunity shortly after spawning. + */ + private boolean tempEnvDamageImmunity = true; + + /** + * Counts entity collisions + */ + private int collisionCounter = 0; + + /** + * The collision threshold + */ + private final static int COLL_THRESHOLD = 50; + private final static String RAID_TEAM = "RAIDERS_TEAM"; + + /** + * Mob difficulty + */ + private double difficulty = 1.0d; + + /** + * The threattable of the mob + */ + private ThreatTable threatTable = new ThreatTable<>(this); + + /** + * Last chunk pos. + */ + private ChunkPos lastChunkPos = null; + + /** + * Raiders AI statemachine + */ + private ITickRateStateMachine ai = new TickRateStateMachine<>(CombatAIStates.NO_TARGET, e -> Log.getLogger().warn(e)); + + /** + * Constructor method for Abstract Barbarians. + * + * @param world the world. + * @param type the entity type. + */ + public AbstractEntityRaiderMob(final EntityType type, final Level world) + { + super(type, world); + worldTimeAtSpawn = world.getGameTime(); + this.setPersistenceRequired(); + this.goalSelector = new CustomGoalSelector(this.goalSelector); + this.targetSelector = new CustomGoalSelector(this.targetSelector); + this.xpReward = BARBARIAN_EXP_DROP; + IMinecoloniesAPI.getInstance().getMobAIRegistry().applyToMob(this); + this.setInvulnerable(true); + RaiderMobUtils.setEquipment(this); + } + + /** + * Ignores cramming + */ + @Override + public void pushEntities() + { + if (collisionCounter > COLL_THRESHOLD) + { + return; + } + + super.pushEntities(); + } + + @Override + public void push(@NotNull final Entity entityIn) + { + if (invulTime > 0) + { + return; + } + + if ((collisionCounter += 3) > COLL_THRESHOLD) + { + if (collisionCounter > (COLL_THRESHOLD * 3)) + { + collisionCounter = 0; + } + + return; + } + + super.push(entityIn); + } + + @Override + public void playAmbientSound() + { + super.playAmbientSound(); + final SoundEvent soundevent = this.getAmbientSound(); + if (soundevent != null && level.random.nextInt(OUT_OF_ONE_HUNDRED) <= ONE) + { + this.playSound(soundevent, this.getSoundVolume(), this.getVoicePitch()); + } + } + + @Override + public boolean removeWhenFarAway(final double distanceToClosestPlayer) + { + return shouldDespawn() || (level != null && level.isAreaLoaded(this.blockPosition(), 3) && getColony() == null); + } + + /** + * Get the specific raider type of this raider. + * + * @return the type enum. + */ + public abstract RaiderType getRaiderType(); + + /** + * Should the barbs despawn. + * + * @return true if so. + */ + private boolean shouldDespawn() + { + return worldTimeAtSpawn != 0 && (level.getGameTime() - worldTimeAtSpawn) >= TICKS_TO_DESPAWN; + } + + @NotNull + @Override + public AbstractAdvancedPathNavigate getNavigation() + { + if (this.newNavigator == null) + { + this.newNavigator = IPathNavigateRegistry.getInstance().getNavigateFor(this); + this.navigation = newNavigator; + this.newNavigator.setCanFloat(true); + newNavigator.setSwimSpeedFactor(getSwimSpeedFactor()); + this.newNavigator.getPathingOptions().setEnterDoors(true); + newNavigator.getPathingOptions().withDropCost(1.3D); + newNavigator.getPathingOptions().setPassDanger(true); + PathingStuckHandler stuckHandler = PathingStuckHandler.createStuckHandler() + .withTakeDamageOnStuck(0.4f) + .withBuildLeafBridges() + .withChanceToByPassMovingAway(0.20) + .withPlaceLadders(); + + if (MinecoloniesAPIProxy.getInstance().getConfig().getServer().doBarbariansBreakThroughWalls.get()) + { + stuckHandler.withBlockBreaks(); + stuckHandler.withCompleteStuckBlockBreak(6); + } + + newNavigator.setStuckHandler(stuckHandler); + } + return newNavigator; + } + + /** + * Get the swim speed factor + * + * @return speed factor + */ + public abstract double getSwimSpeedFactor(); + + /** + * Get the stack counter. + * + * @return the amount it got stuck already. + */ + public int getStuckCounter() + { + return stuckCounter; + } + + /** + * Set the stack counter. + * + * @param stuckCounter the amount. + */ + public void setStuckCounter(final int stuckCounter) + { + this.stuckCounter = stuckCounter; + } + + /** + * Get the ladder counter. + * + * @return the amount it got stuck and placed a ladder already. + */ + public int getLadderCounter() + { + return ladderCounter; + } + + /** + * Set the ladder counter. + * + * @param ladderCounter the amount. + */ + public void setLadderCounter(final int ladderCounter) + { + this.ladderCounter = ladderCounter; + } + + @Override + protected SoundEvent getHurtSound(final DamageSource damageSourceIn) + { + return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.HURT); + } + + @Override + protected SoundEvent getDeathSound() + { + return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.DEATH); + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() + { + return RaiderSounds.raiderSounds.get(getRaiderType()).get(RaiderSounds.RaiderSoundTypes.SAY); + } + + @Override + public void addAdditionalSaveData(final CompoundTag compound) + { + compound.putLong(TAG_TIME, worldTimeAtSpawn); + compound.putInt(TAG_STUCK_COUNTER, stuckCounter); + compound.putInt(TAG_LADDER_COUNTER, ladderCounter); + compound.putInt(TAG_COLONY_ID, this.colony == null ? 0 : colony.getID()); + compound.putInt(TAG_EVENT_ID, eventID); + super.addAdditionalSaveData(compound); + } + + + /** + * Prevent raiders from travelling to other dimensions through portals. + */ + @Nullable + @Override + public Entity changeDimension(@NotNull final ServerLevel serverWorld, @NotNull final ITeleporter teleporter) + { + return null; + } + + @Override + public void readAdditionalSaveData(final CompoundTag compound) + { + worldTimeAtSpawn = compound.getLong(TAG_TIME); + stuckCounter = compound.getInt(TAG_STUCK_COUNTER); + ladderCounter = compound.getInt(TAG_LADDER_COUNTER); + eventID = compound.getInt(TAG_EVENT_ID); + if (compound.contains(TAG_COLONY_ID)) + { + final int colonyId = compound.getInt(TAG_COLONY_ID); + if (colonyId != 0) + { + setColony(IColonyManager.getInstance().getColonyByWorld(colonyId, level)); + } + } + + if (colony == null || eventID == 0) + { + this.remove(RemovalReason.DISCARDED); + } + + super.readAdditionalSaveData(compound); + } + + @Override + public void aiStep() + { + if (!this.isAlive()) + { + return; + } + + updateSwingTime(); + + if (invulTime > 0) + { + invulTime--; + } + else + { + this.setInvulnerable(false); + } + + if (collisionCounter > 0) + { + collisionCounter--; + } + + if (level.isClientSide) + { + super.aiStep(); + return; + } + + if (currentTick % (random.nextInt(EVERY_X_TICKS) + 1) == 0) + { + envDmgCooldown--; + if (worldTimeAtSpawn == 0) + { + worldTimeAtSpawn = level.getGameTime(); + } + + if (this.chunkPosition() != lastChunkPos) + { + this.lastChunkPos = this.chunkPosition(); + if (random.nextInt(COLONY_SET_RAIDED_CHANCE) <= 0) + { + this.onEnterChunk(this.lastChunkPos); + } + } + + if (shouldDespawn()) + { + this.die(new DamageSource("despawn")); + this.remove(RemovalReason.DISCARDED); + return; + } + + if (!isRegistered) + { + registerWithColony(); + } + + if (currentCount <= 0) + { + currentCount = COUNTDOWN_SECOND_MULTIPLIER * TIME_TO_COUNTDOWN; + + if (!this.getMainHandItem().isEmpty() && SPEED_EFFECT != null && this.getMainHandItem().getItem() instanceof IChiefSwordItem + && MinecoloniesAPIProxy.getInstance().getConfig().getServer().barbarianHordeDifficulty.get() >= BARBARIAN_HORDE_DIFFICULTY_FIVE) + { + RaiderMobUtils.getBarbariansCloseToEntity(this, SPEED_EFFECT_DISTANCE) + .stream().filter(entity -> !entity.hasEffect(MobEffects.MOVEMENT_SPEED)) + .forEach(entity -> entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, SPEED_EFFECT_DURATION, SPEED_EFFECT_MULTIPLIER))); + } + } + else + { + --currentCount; + } + } + currentTick++; + + if (isRegistered) + { + ai.tick(); + } + + super.aiStep(); + } + + /** + * Even on when a raider entered a new chunk. + * @param newChunkPos the new chunk pos. + */ + private void onEnterChunk(final ChunkPos newChunkPos) + { + final LevelChunk chunk = colony.getWorld().getChunk(newChunkPos.x, newChunkPos.z); + final IColonyTagCapability chunkCapability = chunk.getCapability(CLOSE_COLONY_CAP, null).resolve().orElse(null); + if (chunkCapability != null && chunkCapability.getOwningColony() != 0 && colony.getID() != chunkCapability.getOwningColony()) + { + final IColony tempColony = IColonyManager.getInstance().getColonyByWorld(chunkCapability.getOwningColony(), level); + tempColony.getRaiderManager().setPassThroughRaid(); + } + } + + @org.jetbrains.annotations.Nullable + @Override + public SpawnGroupData finalizeSpawn( + final ServerLevelAccessor worldIn, + final DifficultyInstance difficultyIn, + final MobSpawnType reason, + @org.jetbrains.annotations.Nullable final SpawnGroupData spawnDataIn, + @org.jetbrains.annotations.Nullable final CompoundTag dataTag) + { + RaiderMobUtils.setEquipment(this); + return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + } + + @Override + public void remove(RemovalReason reason) + { + if (!level.isClientSide && colony != null && eventID > 0) + { + colony.getEventManager().unregisterEntity(this, eventID); + } + super.remove(reason); + } + + /** + * Getter for the colony. + * + * @return the colony the barbarian is assigned to attack.e + */ + public IColony getColony() + { + return colony; + } + + /** + * Registers the entity with the colony. + */ + public void registerWithColony() + { + if (colony == null || eventID == 0 || dead) + { + remove(RemovalReason.DISCARDED); + return; + } + RaiderMobUtils.setMobAttributes(this, getColony()); + colony.getEventManager().registerEntity(this, eventID); + isRegistered = true; + } + + @Override + public void die(@NotNull final DamageSource cause) + { + super.die(cause); + if (!level.isClientSide && getColony() != null) + { + getColony().getEventManager().onEntityDeath(this, eventID); + } + } + + @Override + public boolean hurt(@NotNull final DamageSource damageSource, final float damage) + { + if (damageSource.getEntity() instanceof AbstractEntityRaiderMob) + { + return false; + } + + if (damageSource.getEntity() instanceof LivingEntity) + { + threatTable.addThreat((LivingEntity) damageSource.getEntity(), (int) damage); + } + + if (damageSource == DamageSource.OUT_OF_WORLD) + { + return super.hurt(damageSource, damage); + } + + if (damageSource.getDirectEntity() == null) + { + if (envDamageImmunity || tempEnvDamageImmunity) + { + return false; + } + + if (--envDmgCooldown <= 0) + { + envDmgCooldown = envDamageInterval; + } + else + { + return false; + } + } + else if (!level.isClientSide()) + { + final IColonyEvent event = colony.getEventManager().getEventByID(eventID); + if (event instanceof IColonyCampFireRaidEvent) + { + ((IColonyCampFireRaidEvent) event).setCampFireTime(0); + } + + final Entity source = damageSource.getEntity(); + if (source instanceof Player) + { + if (damage > MIN_THORNS_DAMAGE && random.nextInt(THORNS_CHANCE) == 0) + { + source.hurt(DamageSource.thorns(this), damage * 0.5f); + } + + final float raiderDamageEnchantLevel = EnchantmentHelper.getItemEnchantmentLevel(ModEnchants.raiderDamage.get(), ((Player) source).getMainHandItem()); + + // Up to 7 damage are converted to health scaling damage, 7 is the damage of a diamond sword + float baseScalingDamage = Math.min(damage, MAX_SCALED_DAMAGE); + float totalWithScaled = + Math.max(damage, (damage - baseScalingDamage) + baseScalingDamage * HP_PERCENT_PER_DMG * this.getMaxHealth() * (1 + (raiderDamageEnchantLevel / 5))); + return super.hurt(damageSource, totalWithScaled); + } + } + + return super.hurt(damageSource, damage); + } + + /** + * Get the default attributes with their values. + * @return the attribute modifier map. + */ + public static AttributeSupplier.Builder getDefaultAttributes() + { + return LivingEntity.createLivingAttributes() + .add(MOB_ATTACK_DAMAGE.get()) + .add(Attributes.MAX_HEALTH) + .add(Attributes.ARMOR) + .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED) + .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE * 2) + .add(Attributes.ATTACK_DAMAGE, Attributes.ATTACK_DAMAGE.getDefaultValue()); + } + + /** + * Set the colony to raid. + * + * @param colony the colony to set. + */ + public void setColony(final IColony colony) + { + if (colony != null) + { + this.colony = colony; + } + } + + public int getEventID() + { + return eventID; + } + + public void setEventID(final int eventID) + { + this.eventID = eventID; + } + + /** + * Sets the environmental damage interval + * + * @param interval damage interval + */ + public void setEnvDamageInterval(final int interval) + { + envDamageInterval = interval; + } + + /** + * Sets the immunity to environmental damage + * + * @param immunity whether immune + */ + public void setEnvDamageImmunity(final boolean immunity) + { + envDamageImmunity = immunity; + } + + + /** + * Sets the temporary immunity to environmental damage + * + * @param immunity whether immune + */ + public void setTempEnvDamageImmunity(final boolean immunity) + { + tempEnvDamageImmunity = immunity; + } + + /** + * Initializes entity stats for a given raidlevel and difficulty + * + * @param baseHealth basehealth for this raid/difficulty + * @param difficulty difficulty + * @param baseDamage basedamage for this raid/difficulty + */ + public void initStatsFor(final double baseHealth, final double difficulty, final double baseDamage) + { + this.getAttribute(MOB_ATTACK_DAMAGE.get()).setBaseValue(baseDamage); + + this.difficulty = difficulty; + final double armor = difficulty * ARMOR; + this.getAttribute(Attributes.ARMOR).setBaseValue(armor); + this.setEnvDamageInterval((int) (BASE_ENV_DAMAGE_RESIST * difficulty)); + + if (difficulty >= 1.4d) + { + this.setEnvDamageImmunity(true); + } + + if (difficulty >= TEAM_DIFFICULTY) + { + level.getScoreboard().addPlayerToTeam(getScoreboardName(), checkOrCreateTeam()); + } + + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(baseHealth); + this.setHealth(this.getMaxHealth()); + } + + /** + * Creates or gets the scoreboard team + * + * @return Scoreboard team + */ + private PlayerTeam checkOrCreateTeam() + { + if (this.level.getScoreboard().getPlayerTeam(getTeamName()) == null) + { + this.level.getScoreboard().addPlayerTeam(getTeamName()); + this.level.getScoreboard().getPlayerTeam(getTeamName()).setAllowFriendlyFire(false); + } + return this.level.getScoreboard().getPlayerTeam(getTeamName()); + } + + /** + * Gets the scoreboard team name + * + * @return + */ + protected String getTeamName() + { + return RAID_TEAM; + } + + /** + * Get the mobs difficulty + * + * @return difficulty + */ + public double getDifficulty() + { + return difficulty; + } + + /** + * Disallow pushing from fluids to prevent stuck + * + * @return + */ + public boolean isPushedByFluid() + { + return false; + } + + @Override + public ThreatTable getThreatTable() + { + return threatTable; + } + + /** + * Get the AI machine + * + * @return ai statemachine + */ + public ITickRateStateMachine getAI() + { + return ai; + } +} diff --git a/src/api/java/com/minecolonies/api/entity/mobs/RaiderMobUtils.java b/src/api/java/com/minecolonies/api/entity/mobs/RaiderMobUtils.java index a3369bf3512..ede704586ae 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/RaiderMobUtils.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/RaiderMobUtils.java @@ -71,7 +71,7 @@ private RaiderMobUtils() * @param mob The mob to set the attributes on. * @param colony The colony that the mob is attacking. */ - public static void setMobAttributes(final AbstractEntityMinecoloniesMob mob, final IColony colony) + public static void setMobAttributes(final AbstractEntityRaiderMob mob, final IColony colony) { final double difficultyModifier = colony.getRaiderManager().getRaidDifficultyModifier(); mob.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(FOLLOW_RANGE * 2); @@ -129,7 +129,7 @@ public static void spawn( for (int i = 0; i < numberOfSpawns; i++) { - final AbstractEntityMinecoloniesMob entity = (AbstractEntityMinecoloniesMob) entityToSpawn.create(world); + final AbstractEntityRaiderMob entity = (AbstractEntityRaiderMob) entityToSpawn.create(world); if (entity != null) { @@ -155,7 +155,7 @@ public static void spawn( * * @param mob the equipment to set up. */ - public static void setEquipment(final AbstractEntityMinecoloniesMob mob) + public static void setEquipment(final AbstractEntityRaiderMob mob) { if (mob instanceof IMeleeBarbarianEntity || mob instanceof IMeleeNorsemenEntity || mob instanceof INorsemenChiefEntity) { @@ -211,10 +211,10 @@ else if (mob instanceof IPirateEntity) * @param distanceFromEntity The distance to check for * @return the barbarians (if any) that is nearest */ - public static List getBarbariansCloseToEntity(final Entity entity, final double distanceFromEntity) + public static List getBarbariansCloseToEntity(final Entity entity, final double distanceFromEntity) { return CompatibilityUtils.getWorldFromEntity(entity).getEntitiesOfClass( - AbstractEntityMinecoloniesMob.class, + AbstractEntityRaiderMob.class, entity.getBoundingBox().expandTowards( distanceFromEntity, 3.0D, diff --git a/src/api/java/com/minecolonies/api/entity/mobs/amazons/AbstractEntityAmazon.java b/src/api/java/com/minecolonies/api/entity/mobs/amazons/AbstractEntityAmazon.java index f3edac8fafa..e39389584e5 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/amazons/AbstractEntityAmazon.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/amazons/AbstractEntityAmazon.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.mobs.amazons; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderType; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobSpawnType; @@ -14,7 +14,7 @@ /** * Abstract for all egyptian entities. */ -public abstract class AbstractEntityAmazon extends AbstractEntityMinecoloniesMob +public abstract class AbstractEntityAmazon extends AbstractEntityRaiderMob { /** * Swim speed for amazons diff --git a/src/api/java/com/minecolonies/api/entity/mobs/barbarians/AbstractEntityBarbarian.java b/src/api/java/com/minecolonies/api/entity/mobs/barbarians/AbstractEntityBarbarian.java index 3bb2fdb8871..86fa2aef434 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/barbarians/AbstractEntityBarbarian.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/barbarians/AbstractEntityBarbarian.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.mobs.barbarians; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderType; import net.minecraft.world.entity.EntityType; import net.minecraft.sounds.SoundEvent; @@ -12,7 +12,7 @@ /** * Abstract for all Barbarian entities. */ -public abstract class AbstractEntityBarbarian extends AbstractEntityMinecoloniesMob +public abstract class AbstractEntityBarbarian extends AbstractEntityRaiderMob { /** * Swim speed for barbarians diff --git a/src/api/java/com/minecolonies/api/entity/mobs/egyptians/AbstractEntityEgyptian.java b/src/api/java/com/minecolonies/api/entity/mobs/egyptians/AbstractEntityEgyptian.java index 35308a90d21..31e4a96ec18 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/egyptians/AbstractEntityEgyptian.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/egyptians/AbstractEntityEgyptian.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.mobs.egyptians; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderType; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobSpawnType; @@ -14,7 +14,7 @@ /** * Abstract for all egyptian entities. */ -public abstract class AbstractEntityEgyptian extends AbstractEntityMinecoloniesMob +public abstract class AbstractEntityEgyptian extends AbstractEntityRaiderMob { /** * Swim speed for mummies diff --git a/src/api/java/com/minecolonies/api/entity/mobs/pirates/AbstractEntityPirate.java b/src/api/java/com/minecolonies/api/entity/mobs/pirates/AbstractEntityPirate.java index 7caa68f55be..8cdde3dea3a 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/pirates/AbstractEntityPirate.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/pirates/AbstractEntityPirate.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.mobs.pirates; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderType; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import net.minecraft.world.entity.EntityType; @@ -18,7 +18,7 @@ /** * Abstract for all Barbarian entities. */ -public abstract class AbstractEntityPirate extends AbstractEntityMinecoloniesMob +public abstract class AbstractEntityPirate extends AbstractEntityRaiderMob { /** * Swim speed for pirates diff --git a/src/api/java/com/minecolonies/api/entity/mobs/vikings/AbstractEntityNorsemen.java b/src/api/java/com/minecolonies/api/entity/mobs/vikings/AbstractEntityNorsemen.java index d0112c734c3..fa04e3e443d 100755 --- a/src/api/java/com/minecolonies/api/entity/mobs/vikings/AbstractEntityNorsemen.java +++ b/src/api/java/com/minecolonies/api/entity/mobs/vikings/AbstractEntityNorsemen.java @@ -1,6 +1,6 @@ package com.minecolonies.api.entity.mobs.vikings; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderType; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import net.minecraft.world.entity.EntityType; @@ -18,7 +18,7 @@ /** * Abstract for all norsemen entities. */ -public abstract class AbstractEntityNorsemen extends AbstractEntityMinecoloniesMob +public abstract class AbstractEntityNorsemen extends AbstractEntityRaiderMob { /** * Swim speed for pirates diff --git a/src/api/java/com/minecolonies/api/entity/pathfinding/AbstractAdvancedPathNavigate.java b/src/api/java/com/minecolonies/api/entity/pathfinding/AbstractAdvancedPathNavigate.java index 7767c04b349..0e9a0ba7ffd 100755 --- a/src/api/java/com/minecolonies/api/entity/pathfinding/AbstractAdvancedPathNavigate.java +++ b/src/api/java/com/minecolonies/api/entity/pathfinding/AbstractAdvancedPathNavigate.java @@ -66,7 +66,7 @@ public BlockPos getDestination() * @param safeDestination if the destination is save and should be set. * @return the result of the pathing. */ - public abstract PathResult moveAwayFromXYZ(final BlockPos currentPosition, final double range, final double speed, final boolean safeDestination); + public abstract PathResult moveAwayFromXYZ(final BlockPos currentPosition, final double range, final double speed, final boolean safeDestination); /** * Try to move to a certain position. @@ -77,7 +77,7 @@ public BlockPos getDestination() * @param speed the speed to walk. * @return the PathResult. */ - public abstract PathResult moveToXYZ(final double x, final double y, final double z, final double speed); + public abstract PathResult moveToXYZ(final double x, final double y, final double z, final double speed); /** * Used to find a water. @@ -97,7 +97,7 @@ public BlockPos getDestination() * @param combatMovementSpeed the speed to run at. * @return the result of the pathing. */ - public abstract PathResult moveAwayFromLivingEntity(final Entity target, final double distance, final double combatMovementSpeed); + public abstract PathResult moveAwayFromLivingEntity(final Entity target, final double distance, final double combatMovementSpeed); /** * Attempt to move to a specific pos. @@ -114,7 +114,7 @@ public BlockPos getDestination() * @param speed the speed to run at. * @return the result of the pathing. */ - public abstract PathResult moveToRandomPos(final double range, final double speed); + public abstract PathResult moveToRandomPos(final double range, final double speed); /** * Used to path towards a random pos. @@ -124,7 +124,7 @@ public BlockPos getDestination() * @param pos the pos to circle around. * @return the result of the pathing. */ - public abstract PathResult moveToRandomPosAroundX(final int range, final double speed, final BlockPos pos); + public abstract PathResult moveToRandomPosAroundX(final int range, final double speed, final BlockPos pos); /** * Used to path towards a random pos within some restrictions @@ -132,9 +132,10 @@ public BlockPos getDestination() * @param range the range he should move out of. * @param speed the speed to run at. * @param corners the corners they can't leave. + * @param prioDoors if doors should have higher path prio. * @return the result of the pathing. */ - public abstract PathResult moveToRandomPos(final int range, final double speed, final net.minecraft.util.Tuple corners, final RestrictionType restrictionType); + public abstract PathResult moveToRandomPos(final int range, final double speed, final net.minecraft.util.Tuple corners, final RestrictionType restrictionType, boolean prioDoors); /** * Used to find a tree. @@ -170,7 +171,7 @@ public abstract TreePathResult moveToTree( * @param speed the speed. * @return the result. */ - public abstract PathResult moveToLivingEntity(@NotNull final Entity e, final double speed); + public abstract PathResult moveToLivingEntity(@NotNull final Entity e, final double speed); /** * Get the pathing options diff --git a/src/api/java/com/minecolonies/api/entity/pathfinding/IPathJob.java b/src/api/java/com/minecolonies/api/entity/pathfinding/IPathJob.java new file mode 100644 index 00000000000..92f71f5f899 --- /dev/null +++ b/src/api/java/com/minecolonies/api/entity/pathfinding/IPathJob.java @@ -0,0 +1,23 @@ +package com.minecolonies.api.entity.pathfinding; + +import net.minecraft.world.level.pathfinder.Path; + +import java.util.concurrent.Callable; + +/** + * Interface for path jobs + */ +public interface IPathJob extends Callable +{ + /** + * Get the path result holder for this job + * @return + */ + PathResult getResult(); + + /** + * Get the pathing options used for this job + * @return + */ + public PathingOptions getPathingOptions(); +} diff --git a/src/api/java/com/minecolonies/api/entity/pathfinding/PathingOptions.java b/src/api/java/com/minecolonies/api/entity/pathfinding/PathingOptions.java index 0bc731f1a1e..602631ecfc4 100755 --- a/src/api/java/com/minecolonies/api/entity/pathfinding/PathingOptions.java +++ b/src/api/java/com/minecolonies/api/entity/pathfinding/PathingOptions.java @@ -43,7 +43,7 @@ public class PathingOptions /** * Cost to traverse trap doors */ - public double traverseToggleAbleCost = 2D; + public double traverseToggleAbleCost = 10D; /** * Cost to climb a vine. @@ -71,6 +71,11 @@ public class PathingOptions */ private boolean canClimbVines = false; + /** + * Whether to path through dangerous blocks. + */ + private boolean canPassDanger = false; + public PathingOptions() {} @@ -124,6 +129,16 @@ public void setEnterDoors(final boolean enterDoors) this.enterDoors = enterDoors; } + public void setPassDanger(final boolean danger) + { + this.canPassDanger = danger; + } + + public boolean canPassDanger() + { + return canPassDanger; + } + public PathingOptions withStartSwimCost(final double startSwimCost) { swimCostEnter = startSwimCost; @@ -200,4 +215,28 @@ public PathingOptions withCanEnterDoors(final boolean canEnter) setEnterDoors(canEnter); return this; } + + /** + * Imports all options from the given other pathing options + * @param pathingOptions + */ + public void importFrom(final PathingOptions pathingOptions) + { + jumpCost = pathingOptions.jumpCost; + dropCost = pathingOptions.dropCost; + onPathCost = pathingOptions.onPathCost; + onRailCost = pathingOptions.onRailCost; + railsExitCost = pathingOptions.railsExitCost; + swimCost = pathingOptions.swimCost; + swimCostEnter = pathingOptions.swimCostEnter; + traverseToggleAbleCost = pathingOptions.traverseToggleAbleCost; + vineCost = pathingOptions.vineCost; + canUseRails = pathingOptions.canUseRails; + canSwim = pathingOptions.canSwim; + enterDoors = pathingOptions.enterDoors; + canOpenDoors = pathingOptions.canOpenDoors; + canClimbVines = pathingOptions.canClimbVines; + canPassDanger = pathingOptions.canPassDanger; + } + } diff --git a/src/api/java/com/minecolonies/api/entity/pathfinding/PathingStuckHandler.java b/src/api/java/com/minecolonies/api/entity/pathfinding/PathingStuckHandler.java index 4d0f15e76dd..74ecdc89090 100644 --- a/src/api/java/com/minecolonies/api/entity/pathfinding/PathingStuckHandler.java +++ b/src/api/java/com/minecolonies/api/entity/pathfinding/PathingStuckHandler.java @@ -96,6 +96,11 @@ public class PathingStuckHandler implements IStuckHandler */ private int completeStuckBlockBreakRange = 0; + /** + * Chance to bypass moving away. + */ + private double chanceToByPassMovingAway = 0; + /** * Temporary comparison variables to compare with last update */ @@ -279,7 +284,7 @@ private void tryUnstuck(final AbstractAdvancedPathNavigate navigator) { return; } - delayToNextUnstuckAction = 50; + delayToNextUnstuckAction = 100; // Clear path if (stuckLevel == 0) @@ -291,8 +296,8 @@ private void tryUnstuck(final AbstractAdvancedPathNavigate navigator) return; } - // Move away - if (stuckLevel == 1) + // Move away, with chance to skip this. + if (stuckLevel == 1 && rand.nextDouble() > chanceToByPassMovingAway) { stuckLevel++; delayToNextUnstuckAction = 300; @@ -323,9 +328,9 @@ private void tryUnstuck(final AbstractAdvancedPathNavigate navigator) // Place ladders & leaves if (stuckLevel >= 3 && stuckLevel <= 5) { + delayToNextUnstuckAction = 200; if (canPlaceLadders && rand.nextBoolean()) { - delayToNextUnstuckAction = 200; placeLadders(navigator); } else if (canBuildLeafBridges && rand.nextBoolean()) @@ -387,27 +392,36 @@ private void resetStuckTimers() * @param start the position the entity is at. * @param facing the direction the goal is in. */ - private void breakBlocksAhead(final Level world, final BlockPos start, final Direction facing) + private boolean breakBlocksAhead(final Level world, final BlockPos start, final Direction facing) { + // In entity + if (!world.isEmptyBlock(start)) + { + setAirIfPossible(world, start); + return true; + } + // Above entity if (!world.isEmptyBlock(start.above(3))) { setAirIfPossible(world, start.above(3)); - return; + return true; } // Goal direction up if (!world.isEmptyBlock(start.above().relative(facing))) { setAirIfPossible(world, start.above().relative(facing)); - return; + return true; } // In goal direction if (!world.isEmptyBlock(start.relative(facing))) { setAirIfPossible(world, start.relative(facing)); + return true; } + return false; } /** @@ -420,7 +434,7 @@ private void setAirIfPossible(final Level world, final BlockPos pos) { final BlockState state = world.getBlockState(pos); final Block blockAtPos = state.getBlock(); - if (blockAtPos instanceof IBuilderUndestroyable || state.is(blockAtPos)) + if (blockAtPos instanceof IBuilderUndestroyable || state.is(ModTags.indestructible)) { return; } @@ -507,7 +521,10 @@ private void breakBlocks(final AbstractAdvancedPathNavigate navigator) final Direction facing = BlockPosUtil.getFacing(new BlockPos(entity.position()), navigator.getDesiredPos()); - breakBlocksAhead(world, new BlockPos(entity.position()), facing); + if (breakBlocksAhead(world, new BlockPos(entity.position()), facing) && entity.getHealth() >= entity.getMaxHealth() / 3) + { + entity.hurt(new EntityDamageSource("Stuck-damage", entity), (float) Math.max(0.5, entity.getHealth() / 20.0)); + } } /** @@ -519,7 +536,7 @@ private void breakBlocks(final AbstractAdvancedPathNavigate navigator) private void tryPlaceLadderAt(final Level world, final BlockPos pos) { final BlockState state = world.getBlockState(pos); - if (state.getBlock() != Blocks.LADDER && !state.canOcclude() && world.getFluidState(pos).isEmpty()) + if (state.getBlock() != Blocks.LADDER && !(state.getBlock() instanceof IBuilderUndestroyable) && !state.is(ModTags.indestructible)) { for (final Direction dir : HORIZONTAL_DIRS) { @@ -551,6 +568,12 @@ public PathingStuckHandler withBuildLeafBridges() return this; } + public PathingStuckHandler withChanceToByPassMovingAway(final double chance) + { + chanceToByPassMovingAway = chance; + return this; + } + /** * Enables teleporting a certain amount of steps along a generated path * diff --git a/src/api/java/com/minecolonies/api/entity/pathfinding/SurfaceType.java b/src/api/java/com/minecolonies/api/entity/pathfinding/SurfaceType.java index 68afe6a0675..2f9092fd31d 100644 --- a/src/api/java/com/minecolonies/api/entity/pathfinding/SurfaceType.java +++ b/src/api/java/com/minecolonies/api/entity/pathfinding/SurfaceType.java @@ -37,23 +37,61 @@ public enum SurfaceType */ @NotNull public static SurfaceType getSurfaceType(final BlockGetter world, final BlockState blockState, final BlockPos pos) + { + return getSurfaceType(world,blockState,pos,null); + } + + /** + * Is the block solid and can be stood upon. + * + * @param blockState Block to check. + * @param pos the position. + * @param pathingOptions the pathing options to consider + * @return true if the block at that location can be walked on. + */ + @NotNull + public static SurfaceType getSurfaceType(final BlockGetter world, final BlockState blockState, final BlockPos pos,@Nullable final PathingOptions pathingOptions) { final Block block = blockState.getBlock(); + + if (block instanceof FireBlock) + { + if (pathingOptions != null && pathingOptions.canPassDanger()) + { + return SurfaceType.DROPABLE; + } + + return SurfaceType.NOT_PASSABLE; + } + + if (block instanceof CampfireBlock + || block instanceof AbstractBlockBarrel + || block instanceof MagmaBlock + || block instanceof PowderSnowBlock) + { + if (pathingOptions != null && pathingOptions.canPassDanger()) + { + return SurfaceType.WALKABLE; + } + + return SurfaceType.NOT_PASSABLE; + } + if (block instanceof FenceBlock || block instanceof FenceGateBlock || block instanceof WallBlock - || block instanceof FireBlock - || block instanceof CampfireBlock || block instanceof AbstractBlockMinecoloniesDefault - || block instanceof AbstractBlockBarrel || block instanceof BambooBlock - || block instanceof DoorBlock - || block instanceof MagmaBlock - || block instanceof PowderSnowBlock) + || block instanceof DoorBlock) { return SurfaceType.NOT_PASSABLE; } + if ((block instanceof PanelBlock || block instanceof TrapdoorBlock) && !blockState.getValue(TrapdoorBlock.OPEN)) + { + return SurfaceType.WALKABLE; + } + final VoxelShape shape = blockState.getShape(world, pos); if (shape.max(Direction.Axis.Y) > 1.0) { diff --git a/src/api/java/com/minecolonies/api/inventory/InventoryCitizen.java b/src/api/java/com/minecolonies/api/inventory/InventoryCitizen.java index 54382a60479..cb6ae29b8f8 100755 --- a/src/api/java/com/minecolonies/api/inventory/InventoryCitizen.java +++ b/src/api/java/com/minecolonies/api/inventory/InventoryCitizen.java @@ -1,7 +1,10 @@ package com.minecolonies.api.inventory; import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Log; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; @@ -18,7 +21,7 @@ import java.util.function.Consumer; import static com.minecolonies.api.research.util.ResearchConstants.CITIZEN_INV_SLOTS; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_SIZE; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * Basic inventory for the citizens. @@ -42,9 +45,10 @@ public class InventoryCitizen implements IItemHandlerModifiable, Nameable private int freeSlots = DEFAULT_INV_SIZE; /** - * The inventory. (27 main inventory, 4 armor slots, 1 offhand slot) + * The inventory. (27 main inventory, 4 armor slots) */ private NonNullList mainInventory = NonNullList.withSize(DEFAULT_INV_SIZE, ItemStackUtils.EMPTY); + private NonNullList armorInventory = NonNullList.withSize(4, ItemStackUtils.EMPTY); /** * The index of the currently held items (0-8). @@ -255,6 +259,95 @@ public ItemStack getStackInSlot(final int index) } } + /** + * Get the armor from a specific equipment slot. + * @param equipmentSlot the slot to get it from. + * @return the stack. + */ + public ItemStack getArmorInSlot(final EquipmentSlot equipmentSlot) + { + if (equipmentSlot.getType() == EquipmentSlot.Type.ARMOR) + { + return armorInventory.get(equipmentSlot.getIndex()); + } + return ItemStack.EMPTY; + } + + /** + * Force an armor stack in a slot. This is for container interaction only. + * @param equipmentSlot the slot to pick. + * @param stack the stack to set. + */ + public void forceArmorStackToSlot(final EquipmentSlot equipmentSlot, final ItemStack stack) + { + armorInventory.set(equipmentSlot.getIndex(), stack); + if (citizen != null) + { + citizen.getEntity().ifPresent(citizen -> citizen.onArmorAdd(stack, equipmentSlot)); + markDirty(); + } + } + + /** + * Force remove armor stack from a slot. This is for container interaction only. + * @param equipmentSlot the slot to clear. + * @param stack the stack being removed. + */ + public void forceClearArmorInSlot(final EquipmentSlot equipmentSlot, final ItemStack stack) + { + if (equipmentSlot.getType() == EquipmentSlot.Type.ARMOR) + { + armorInventory.set(equipmentSlot.getIndex(), ItemStack.EMPTY); + if (citizen != null) + { + citizen.getEntity().ifPresent(citizen -> citizen.onArmorRemove(stack, equipmentSlot)); + markDirty(); + } + } + } + + /** + * Transfer from inventory slot to armor. + * @param equipmentSlot the slot to transfer it to. + * @param slot the slot to transfer it from. + */ + public void transferArmorToSlot(final EquipmentSlot equipmentSlot, final int slot) + { + if (equipmentSlot.getType() == EquipmentSlot.Type.ARMOR) + { + markDirty(); + final ItemStack oldArmorStack = armorInventory.get(equipmentSlot.getIndex()); + final ItemStack newArmorStack = getStackInSlot(slot); + + if (!oldArmorStack.isEmpty()) + { + citizen.getEntity().ifPresent(citizen -> citizen.onArmorRemove(oldArmorStack, equipmentSlot)); + } + + armorInventory.set(equipmentSlot.getIndex(), newArmorStack); + citizen.getEntity().ifPresent(citizen -> citizen.onArmorAdd(newArmorStack, equipmentSlot)); + setStackInSlot(slot, oldArmorStack); + } + } + + /** + * Move armor from armor slots to inventory. + * @param equipmentSlot the origin slot. + */ + public void moveArmorToInventory(final EquipmentSlot equipmentSlot) + { + if (equipmentSlot.getType() == EquipmentSlot.Type.ARMOR) + { + final ItemStack armorStack = armorInventory.get(equipmentSlot.getIndex()); + if (InventoryUtils.addItemStackToItemHandler(this, armorStack)) + { + markDirty(); + armorInventory.set(equipmentSlot.getIndex(), ItemStack.EMPTY); + citizen.getEntity().ifPresent(citizen -> citizen.onArmorRemove(armorStack, equipmentSlot)); + } + } + } + /** * Damage an item within the inventory * @@ -413,7 +506,7 @@ public void markDirty() { if (this.citizen != null) { - this.citizen.markDirty(); + this.citizen.markDirty(20); } } @@ -428,12 +521,11 @@ public Component getDisplayName() } /** - * Writes the inventory out as a list of compound tags. This is where the slot indices are used (+100 for armor, +80 for crafting). + * Writes the inventory to nbt. * - * @param nbtTagList the taglist in. - * @return the filled list. + * @param nbtTagCompound the compound to store it in. */ - public ListTag write(final ListTag nbtTagList) + public void write(final CompoundTag nbtTagCompound) { if (citizen != null && citizen.getColony() != null) { @@ -444,10 +536,9 @@ public ListTag write(final ListTag nbtTagList) } } - final CompoundTag sizeNbt = new CompoundTag(); - sizeNbt.putInt(TAG_SIZE, this.mainInventory.size()); - nbtTagList.add(sizeNbt); + nbtTagCompound.putInt(TAG_INV_SIZE, this.mainInventory.size()); + final ListTag invTagList = new ListTag(); freeSlots = mainInventory.size(); for (int i = 0; i < this.mainInventory.size(); ++i) { @@ -456,43 +547,103 @@ public ListTag write(final ListTag nbtTagList) final CompoundTag compoundNBT = new CompoundTag(); compoundNBT.putByte("Slot", (byte) i); (this.mainInventory.get(i)).save(compoundNBT); - nbtTagList.add(compoundNBT); + invTagList.add(compoundNBT); freeSlots--; } } + nbtTagCompound.put(TAG_INVENTORY, invTagList); - return nbtTagList; + final ListTag armorTagList = new ListTag(); + for (int i = 0; i < this.armorInventory.size(); ++i) + { + if (!(this.armorInventory.get(i)).isEmpty()) + { + final CompoundTag compoundNBT = new CompoundTag(); + compoundNBT.putByte("Slot", (byte) i); + (this.armorInventory.get(i)).save(compoundNBT); + armorTagList.add(compoundNBT); + } + } + nbtTagCompound.put(TAG_ARMOR_INVENTORY, armorTagList); } /** - * Reads from the given tag list and fills the slots in the inventory with the correct items. + * Reads from the given compound and fills the slots in the inventory with the correct items. * - * @param nbtTagList the tag list. + * @param nbtTagCompound the compound. */ - public void read(final ListTag nbtTagList) + public void read(final CompoundTag nbtTagCompound) { - if (this.mainInventory.size() < nbtTagList.getCompound(0).getInt(TAG_SIZE)) + if (nbtTagCompound.contains(TAG_ARMOR_INVENTORY)) { - int size = nbtTagList.getCompound(0).getInt(TAG_SIZE); - size -= size % ROW_SIZE; - this.mainInventory = NonNullList.withSize(size, ItemStackUtils.EMPTY); - } + int size = nbtTagCompound.getInt(TAG_INV_SIZE); + if (this.mainInventory.size() < size) + { + size -= size % ROW_SIZE; + this.mainInventory = NonNullList.withSize(size, ItemStackUtils.EMPTY); + } - freeSlots = mainInventory.size(); + freeSlots = mainInventory.size(); + + final ListTag nbtTagList = nbtTagCompound.getList(TAG_INVENTORY, 10); + for (int i = 0; i < nbtTagList.size(); i++) + { + final CompoundTag compoundNBT = nbtTagList.getCompound(i); + final int j = compoundNBT.getByte("Slot") & 255; + final ItemStack itemstack = ItemStack.of(compoundNBT); + + if (!itemstack.isEmpty()) + { + if (j < this.mainInventory.size()) + { + this.mainInventory.set(j, itemstack); + freeSlots--; + } + } + } + + final ListTag armorTagList = nbtTagCompound.getList(TAG_ARMOR_INVENTORY, 10); + for (int i = 0; i < armorTagList.size(); ++i) + { + final CompoundTag compoundNBT = armorTagList.getCompound(i); + final int j = compoundNBT.getByte("Slot") & 255; + final ItemStack itemstack = ItemStack.of(compoundNBT); - for (int i = 1; i < nbtTagList.size(); ++i) + if (!itemstack.isEmpty()) + { + if (j < this.armorInventory.size()) + { + this.armorInventory.set(j, itemstack); + } + } + } + } + else { - final CompoundTag compoundNBT = nbtTagList.getCompound(i); + final ListTag nbtTagList = nbtTagCompound.getList(TAG_INVENTORY, 10); + if (this.mainInventory.size() < nbtTagList.getCompound(0).getInt(TAG_SIZE)) + { + int size = nbtTagList.getCompound(0).getInt(TAG_SIZE); + size -= size % ROW_SIZE; + this.mainInventory = NonNullList.withSize(size, ItemStackUtils.EMPTY); + } - final int j = compoundNBT.getByte("Slot") & 255; - final ItemStack itemstack = ItemStack.of(compoundNBT); + freeSlots = mainInventory.size(); - if (!itemstack.isEmpty()) + for (int i = 1; i < nbtTagList.size(); i++) { - if (j < this.mainInventory.size()) + final CompoundTag compoundNBT = nbtTagList.getCompound(i); + + final int j = compoundNBT.getByte("Slot") & 255; + final ItemStack itemstack = ItemStack.of(compoundNBT); + + if (!itemstack.isEmpty()) { - this.mainInventory.set(j, itemstack); - freeSlots--; + if (j < this.mainInventory.size()) + { + this.mainInventory.set(j, itemstack); + freeSlots--; + } } } } diff --git a/src/api/java/com/minecolonies/api/inventory/ModContainers.java b/src/api/java/com/minecolonies/api/inventory/ModContainers.java index 8464a5db4ff..f9fdc8a34b8 100755 --- a/src/api/java/com/minecolonies/api/inventory/ModContainers.java +++ b/src/api/java/com/minecolonies/api/inventory/ModContainers.java @@ -18,7 +18,5 @@ public class ModContainers public static RegistryObject> craftingGrid; - public static RegistryObject> field; - public static RegistryObject> craftingBrewingstand; } diff --git a/src/api/java/com/minecolonies/api/inventory/api/CombinedItemHandler.java b/src/api/java/com/minecolonies/api/inventory/api/CombinedItemHandler.java index 8ab2f81befa..2dfe52c05e8 100755 --- a/src/api/java/com/minecolonies/api/inventory/api/CombinedItemHandler.java +++ b/src/api/java/com/minecolonies/api/inventory/api/CombinedItemHandler.java @@ -108,7 +108,7 @@ public CompoundTag serializeNBT() @Override public void deserializeNBT(final CompoundTag nbt) { - final ListTag handlerList = nbt.getList(NBT_KEY_NAME, Tag.TAG_COMPOUND); + final ListTag handlerList = nbt.getList(NBT_KEY_HANDLERS, Tag.TAG_COMPOUND); final ListTag indexList = nbt.getList(NBT_KEY_HANDLERS_INDEXLIST, Tag.TAG_INT); if (handlerList.size() == handlers.length) @@ -125,7 +125,7 @@ public void deserializeNBT(final CompoundTag nbt) } } - setName(nbt.getAllKeys().contains(NBT_KEY_NAME) ? nbt.getString(NBT_KEY_NAME) : null); + setName(nbt.contains(NBT_KEY_NAME) ? nbt.getString(NBT_KEY_NAME) : null); } /** diff --git a/src/api/java/com/minecolonies/api/inventory/container/ContainerCitizenInventory.java b/src/api/java/com/minecolonies/api/inventory/container/ContainerCitizenInventory.java index fe12c6e126b..8d0e44f5125 100755 --- a/src/api/java/com/minecolonies/api/inventory/container/ContainerCitizenInventory.java +++ b/src/api/java/com/minecolonies/api/inventory/container/ContainerCitizenInventory.java @@ -2,20 +2,33 @@ import com.minecolonies.api.colony.*; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.entity.ai.citizen.guards.GuardGear; +import com.minecolonies.api.entity.ai.citizen.guards.GuardGearBuilder; import com.minecolonies.api.inventory.InventoryCitizen; import com.minecolonies.api.inventory.ModContainers; import com.minecolonies.api.util.ItemStackUtils; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.core.BlockPos; import net.minecraftforge.items.SlotItemHandler; import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static com.minecolonies.api.util.constant.GuardConstants.*; import static com.minecolonies.api.util.constant.InventoryConstants.*; +import static com.minecolonies.api.util.constant.ToolLevelConstants.*; +import static com.minecolonies.api.util.constant.ToolLevelConstants.ARMOR_LEVEL_GOLD; /** * Container for Mie @@ -30,8 +43,18 @@ public class ContainerCitizenInventory extends AbstractContainerMenu /** * Amount of rows. */ - private final int inventorySize; - private String displayName; + private final int inventorySize; + + /** + * Citizen related data. + */ + private ICitizen citizenData; + + /** + * Related entity. + */ + private Optional entity = Optional.empty(); + private String displayName; /** * Deserialize packet buffer to container instance. @@ -80,12 +103,19 @@ public ContainerCitizenInventory(final int windowId, final Inventory inv, final final InventoryCitizen inventory; final BlockPos workBuilding; + int workBuildingLevel = 0; if (inv.player.level.isClientSide) { final ICitizenDataView data = ((IColonyView) colony).getCitizen(citizenId); + this.entity = Optional.of(inv.player.level.getEntity(data.getEntityId())); + this.citizenData = data; inventory = data.getInventory(); this.displayName = data.getName(); workBuilding = data.getWorkBuilding(); + if (workBuilding != null) + { + workBuildingLevel = ((IColonyView) colony).getBuilding(workBuilding).getBuildingLevel(); + } } else { @@ -98,19 +128,37 @@ public ContainerCitizenInventory(final int windowId, final Inventory inv, final { data = colony.getVisitorManager().getCivilian(citizenId); } + this.entity = data.getEntity(); + this.citizenData = data; inventory = data.getInventory(); this.displayName = data.getName(); workBuilding = data.getWorkBuilding() == null ? null : data.getWorkBuilding().getID(); + if (workBuilding != null) + { + workBuildingLevel = data.getWorkBuilding().getBuildingLevel(); + } } this.inventorySize = inventory.getSlots() / INVENTORY_COLUMNS; final int size = inventory.getSlots(); final int columns = inventorySize <= INVENTORY_BAR_SIZE ? INVENTORY_COLUMNS : ((size / INVENTORY_BAR_SIZE) + 1); - final int extraOffset = inventorySize <= INVENTORY_BAR_SIZE ? 0 : 2; + final int extraOffset = (inventorySize <= INVENTORY_BAR_SIZE ? 0 : 2) + 1; + final int newOffset = 5; int index = 0; + + List guardGear = switch (workBuildingLevel) + { + case 5-> GuardGearBuilder.buildGearForLevel(ARMOR_LEVEL_IRON, ARMOR_LEVEL_MAX, LEATHER_BUILDING_LEVEL_RANGE, DIA_BUILDING_LEVEL_RANGE); + case 4-> GuardGearBuilder.buildGearForLevel(ARMOR_LEVEL_CHAIN, ARMOR_LEVEL_DIAMOND, LEATHER_BUILDING_LEVEL_RANGE, DIA_BUILDING_LEVEL_RANGE); + case 3-> GuardGearBuilder.buildGearForLevel(ARMOR_LEVEL_LEATHER, ARMOR_LEVEL_IRON, LEATHER_BUILDING_LEVEL_RANGE, IRON_BUILDING_LEVEL_RANGE); + case 2-> GuardGearBuilder.buildGearForLevel(ARMOR_LEVEL_LEATHER, ARMOR_LEVEL_CHAIN, LEATHER_BUILDING_LEVEL_RANGE, CHAIN_BUILDING_LEVEL_RANGE); + case 1-> GuardGearBuilder.buildGearForLevel(ARMOR_LEVEL_LEATHER, ARMOR_LEVEL_GOLD, LEATHER_BUILDING_LEVEL_RANGE, GOLD_BUILDING_LEVEL_RANGE); + default-> Collections.emptyList(); + }; + for (int j = 0; j < Math.min(this.inventorySize, INVENTORY_BAR_SIZE); ++j) { for (int k = 0; k < columns; ++k) @@ -120,14 +168,13 @@ public ContainerCitizenInventory(final int windowId, final Inventory inv, final this.addSlot( new SlotItemHandler(inventory, index, INVENTORY_BAR_SIZE + k * PLAYER_INVENTORY_OFFSET_EACH, - PLAYER_INVENTORY_OFFSET_EACH + j * PLAYER_INVENTORY_OFFSET_EACH) + newOffset + PLAYER_INVENTORY_OFFSET_EACH + j * PLAYER_INVENTORY_OFFSET_EACH) { @Override public void set(@NotNull final ItemStack stack) { if (workBuilding != null && !playerInventory.player.level.isClientSide && !ItemStackUtils.isEmpty(stack)) { - final IColony colony = IColonyManager.getInstance().getColonyByWorld(colonyId, inv.player.level); final IBuilding building = colony.getBuildingManager().getBuilding(workBuilding); final ICitizenData citizenData = colony.getCitizenManager().getCivilian(citizenId); @@ -141,6 +188,57 @@ public void set(@NotNull final ItemStack stack) } } + + index = 3; + for (int j = 0; j < 4; ++j) + { + final EquipmentSlot equipmentSlot = EquipmentSlot.byTypeAndIndex(EquipmentSlot.Type.ARMOR, index); + this.addSlot( + new Slot(new SimpleContainer(inventory.getArmorInSlot(equipmentSlot)), 0,INVENTORY_BAR_SIZE + 215, + 23 + j * PLAYER_INVENTORY_OFFSET_EACH) + { + @Override + public void set(@NotNull final ItemStack stack) + { + if (workBuilding != null && !playerInventory.player.level.isClientSide && !ItemStackUtils.isEmpty(stack)) + { + final IBuilding building = colony.getBuildingManager().getBuilding(workBuilding); + final ICitizenData citizenData = colony.getCitizenManager().getCivilian(citizenId); + + building.overruleNextOpenRequestOfCitizenWithStack(citizenData, stack); + } + super.set(stack); + inventory.forceArmorStackToSlot(equipmentSlot, stack); + } + + @Override + public ItemStack remove(final int slot) + { + final ItemStack stack = inventory.getArmorInSlot(equipmentSlot); + inventory.forceClearArmorInSlot(equipmentSlot, stack); + return stack; + } + + @Override + public boolean mayPlace(final ItemStack stack) + { + if (stack.getItem() instanceof ArmorItem armorItem && armorItem.getSlot() == equipmentSlot) + { + for (final GuardGear gear : guardGear) + { + if (gear.test(stack)) + { + return true; + } + } + return false; + } + return false; + } + }); + index--; + } + // Player inventory slots // Note: The slot numbers are within the player inventory and may be the same as the field inventory. int i; @@ -152,7 +250,7 @@ public void set(@NotNull final ItemStack stack) playerInventory, j + i * INVENTORY_COLUMNS + INVENTORY_COLUMNS, PLAYER_INVENTORY_INITIAL_X_OFFSET + j * PLAYER_INVENTORY_OFFSET_EACH, - PLAYER_INVENTORY_INITIAL_Y_OFFSET + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * Math.min(this.inventorySize, INVENTORY_BAR_SIZE) + PLAYER_INVENTORY_INITIAL_Y_OFFSET + newOffset + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * Math.min(this.inventorySize, INVENTORY_BAR_SIZE) + i * PLAYER_INVENTORY_OFFSET_EACH )); } @@ -163,7 +261,7 @@ public void set(@NotNull final ItemStack stack) addSlot(new Slot( playerInventory, i, PLAYER_INVENTORY_INITIAL_X_OFFSET + i * PLAYER_INVENTORY_OFFSET_EACH, - PLAYER_INVENTORY_HOTBAR_OFFSET + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * Math.min(this.inventorySize, + PLAYER_INVENTORY_HOTBAR_OFFSET + newOffset + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * Math.min(this.inventorySize, INVENTORY_BAR_SIZE) )); } @@ -232,4 +330,13 @@ public String getDisplayName() { return displayName; } + + /** + * Get the entity of this container. + * @return the entity. + */ + public Optional getEntity() + { + return this.entity; + } } \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/inventory/container/ContainerField.java b/src/api/java/com/minecolonies/api/inventory/container/ContainerField.java deleted file mode 100755 index 8c50a5a8dd3..00000000000 --- a/src/api/java/com/minecolonies/api/inventory/container/ContainerField.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.minecolonies.api.inventory.container; - -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IColonyManager; -import com.minecolonies.api.colony.permissions.Action; -import com.minecolonies.api.inventory.ModContainers; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; -import com.minecolonies.api.util.ItemStackUtils; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; -import org.jetbrains.annotations.NotNull; - -import static com.minecolonies.api.util.constant.InventoryConstants.*; - -public class ContainerField extends AbstractContainerMenu -{ - /** - * Inventory lines until the player inv starts. - */ - private static final int LINES_PER_OFFSET = 3; - - /** - * The inventory. - */ - private final IItemHandler inventory; - - /** - * The colony. - */ - private final IColony colony; - - /** - * The tile entity. - */ - private final AbstractScarecrowTileEntity tileEntity; - - /** - * Deserialize packet buffer to container instance. - * - * @param windowId the id of the window. - * @param inv the player inventory. - * @param packetBuffer network buffer - * @return new instance - */ - public static ContainerField fromFriendlyByteBuf(final int windowId, final Inventory inv, final FriendlyByteBuf packetBuffer) - { - final BlockPos tePos = packetBuffer.readBlockPos(); - return new ContainerField(windowId, inv, tePos); - } - - /** - * Constructs the GUI with the player. - * - * @param windowId the window id. - * @param playerInventory the player inventory. - * @param pos te world pos. - */ - public ContainerField(final int windowId, final Inventory playerInventory, BlockPos pos) - { - super(ModContainers.field.get(), windowId); - - final Level world = playerInventory.player.level; - - if (world.getBlockState(pos).getValue(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) - { - pos = pos.below(); - } - - this.colony = IColonyManager.getInstance().getColonyByPosFromWorld(world, pos); - this.tileEntity = ((AbstractScarecrowTileEntity) world.getBlockEntity(pos)); - this.inventory = getTileEntity().getInventory(); - final int extraOffset = 0; - - addSlot(new SlotItemHandler(inventory, 0, X_OFFSET, Y_OFFSET)); - - // Player inventory slots - // Note: The slot numbers are within the player inventory and may be the same as the field inventory. - int i; - for (i = 0; i < INVENTORY_ROWS; i++) - { - for (int j = 0; j < INVENTORY_COLUMNS; j++) - { - addSlot(new Slot( - playerInventory, - j + i * INVENTORY_COLUMNS + INVENTORY_COLUMNS, - PLAYER_INVENTORY_INITIAL_X_OFFSET + j * PLAYER_INVENTORY_OFFSET_EACH, - PLAYER_INVENTORY_INITIAL_Y_OFFSET + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * LINES_PER_OFFSET - + i * PLAYER_INVENTORY_OFFSET_EACH - )); - } - } - - for (i = 0; i < INVENTORY_COLUMNS; i++) - { - addSlot(new Slot( - playerInventory, i, - PLAYER_INVENTORY_INITIAL_X_OFFSET + i * PLAYER_INVENTORY_OFFSET_EACH, - PLAYER_INVENTORY_HOTBAR_OFFSET + extraOffset + PLAYER_INVENTORY_OFFSET_EACH * LINES_PER_OFFSET - )); - } - } - - @NotNull - @Override - public ItemStack quickMoveStack(@NotNull final Player playerIn, final int index) - { - ItemStack transfer = ItemStackUtils.EMPTY; - Slot slot = this.slots.get(index); - - if (slot == null || !slot.hasItem()) - { - return transfer; - } - - transfer = slot.getItem(); - - if (index == 0) - { - if (!moveItemStackTo(transfer, 1, 37, true)) - { - return ItemStackUtils.EMPTY; - } - } - else - { - if (!this.moveItemStackTo(transfer, 0, 1, false)) - { - return ItemStackUtils.EMPTY; - } - } - - return transfer; - } - - @Override - public boolean stillValid(@NotNull final Player playerIn) - { - if (colony == null) - { - return false; - } - return colony.getPermissions().hasPermission(playerIn, Action.ACCESS_HUTS); - } - - /** - * Get the assigned tile entity. - * - * @return the tile. - */ - public AbstractScarecrowTileEntity getTileEntity() - { - return tileEntity; - } -} diff --git a/src/api/java/com/minecolonies/api/inventory/container/ContainerRack.java b/src/api/java/com/minecolonies/api/inventory/container/ContainerRack.java index 3db9c75158b..3cddd9c521f 100755 --- a/src/api/java/com/minecolonies/api/inventory/container/ContainerRack.java +++ b/src/api/java/com/minecolonies/api/inventory/container/ContainerRack.java @@ -1,5 +1,7 @@ package com.minecolonies.api.inventory.container; +import com.minecolonies.api.blocks.AbstractBlockMinecoloniesRack; +import com.minecolonies.api.blocks.types.RackType; import com.minecolonies.api.inventory.ModContainers; import com.minecolonies.api.tileentities.AbstractTileEntityRack; import com.minecolonies.api.util.ItemStackUtils; @@ -77,7 +79,7 @@ public ContainerRack(final int windowId, final Inventory inv, final BlockPos rac if (neighborRack != null) { - if (abstractTileEntityRack.isMain()) + if (abstractTileEntityRack.getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT) != RackType.EMPTYAIR) { this.inventory = new CombinedInvWrapper(abstractTileEntityRack.getInventory(), neighborRack.getInventory()); } diff --git a/src/api/java/com/minecolonies/api/items/CheckedNbtKey.java b/src/api/java/com/minecolonies/api/items/CheckedNbtKey.java new file mode 100644 index 00000000000..806e2bfa2dc --- /dev/null +++ b/src/api/java/com/minecolonies/api/items/CheckedNbtKey.java @@ -0,0 +1,84 @@ +package com.minecolonies.api.items; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; +import java.util.Set; + +/** + * Representation of a nbt key to match two item stacks. + */ +public class CheckedNbtKey +{ + @NotNull + public String key; + + @NotNull + public Set children; + + public CheckedNbtKey(@NotNull final String key, @NotNull final Set children) + { + this.key = key; + this.children = children; + } + + @Override + public boolean equals(final Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + final CheckedNbtKey keyObject = (CheckedNbtKey) o; + return key.equals(keyObject.key) && children.equals(keyObject.children); + } + + @Override + public int hashCode() + { + return Objects.hash(key, children); + } + + /** + * Check if two nbt match according to this checked nbt keys rules. + * @param nbt1 the first nbt. + * @param nbt2 the second nbt. + * @return true if they match. + */ + public boolean matches(final CompoundTag nbt1, final CompoundTag nbt2) + { + final Tag tag1 = nbt1.get(key); + final Tag tag2 = nbt2.get(key); + + if (tag1 == null || tag2 == null) + { + return (tag1 == null) == (tag2 == null); + } + else + { + if (children.isEmpty()) + { + return tag1.equals(tag2); + } + + if (tag1 instanceof CompoundTag && tag2 instanceof CompoundTag) + { + for (final CheckedNbtKey key : children) + { + if (!key.matches((CompoundTag) tag1, (CompoundTag) tag2)) + { + return false; + } + } + return true; + } + return false; + } + } +} diff --git a/src/api/java/com/minecolonies/api/items/IBlockOverlayItem.java b/src/api/java/com/minecolonies/api/items/IBlockOverlayItem.java new file mode 100644 index 00000000000..686ae56f18e --- /dev/null +++ b/src/api/java/com/minecolonies/api/items/IBlockOverlayItem.java @@ -0,0 +1,31 @@ +package com.minecolonies.api.items; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * An interface to be implemented by items that want to render overlays while the player is holding the item. + */ +public interface IBlockOverlayItem +{ + /** + * Called client-side only. + * @return a list of overlay boxes that should be rendered for this item. + */ + @NotNull + List getOverlayBoxes(@NotNull final Level world, @NotNull final Player player, @NotNull final ItemStack stack); + + /** + * Details about the overlay box to draw. + * @param bounds the bounds of the box. + * @param color the line color. + * @param width the line width. + * @param showThroughBlocks true to display through blocks. + */ + record OverlayBox(AABB bounds, int color, float width, boolean showThroughBlocks) { } +} diff --git a/src/api/java/com/minecolonies/api/items/ModBannerPatterns.java b/src/api/java/com/minecolonies/api/items/ModBannerPatterns.java new file mode 100755 index 00000000000..974bc3ad311 --- /dev/null +++ b/src/api/java/com/minecolonies/api/items/ModBannerPatterns.java @@ -0,0 +1,43 @@ +package com.minecolonies.api.items; + +import com.minecolonies.api.util.constant.Constants; +import net.minecraft.core.Registry; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.block.entity.BannerPattern; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +/** + * Registering of sound events for our colony. + */ +public final class ModBannerPatterns +{ + public static final DeferredRegister BANNER_PATTERNS = DeferredRegister.create(Registry.BANNER_PATTERN_REGISTRY, Constants.MOD_ID); + + /** + * Private constructor to hide the implicit public one. + */ + private ModBannerPatterns() + { + /* + * Intentionally left empty. + */ + } + + /** + * Register the {@link SoundEvent}s. + * + * @param registry the registry to register at. + */ + static + { + BANNER_PATTERNS.register("horse", () -> new BannerPattern("hsy")); + BANNER_PATTERNS.register("eagle", () -> new BannerPattern("egl")); + BANNER_PATTERNS.register("lion", () -> new BannerPattern("lin")); + BANNER_PATTERNS.register("tower", () -> new BannerPattern("twr")); + BANNER_PATTERNS.register("bear", () -> new BannerPattern("ber")); + BANNER_PATTERNS.register("fleur", () -> new BannerPattern("flr")); + BANNER_PATTERNS.register("tinycross", () -> new BannerPattern("tcr")); + BANNER_PATTERNS.register("cantabrian", () -> new BannerPattern("ctbr")); + } +} diff --git a/src/api/java/com/minecolonies/api/items/ModItems.java b/src/api/java/com/minecolonies/api/items/ModItems.java index 4271f22a446..2bc02aaaae5 100755 --- a/src/api/java/com/minecolonies/api/items/ModItems.java +++ b/src/api/java/com/minecolonies/api/items/ModItems.java @@ -21,6 +21,7 @@ public final class ModItems public static Item scepterLumberjack; public static Item pharaoscepter; public static Item firearrow; + public static Item questLog; public static Item scepterBeekeeper; public static Item mistletoe; public static Item spear; @@ -76,6 +77,7 @@ public final class ModItems public static Item magicpotion; public static Item buildGoggles; + public static Item scanAnalyzer; /** * Private constructor to hide the implicit public one. diff --git a/src/api/java/com/minecolonies/api/items/ModTags.java b/src/api/java/com/minecolonies/api/items/ModTags.java index 253803e6687..3e40e02a476 100644 --- a/src/api/java/com/minecolonies/api/items/ModTags.java +++ b/src/api/java/com/minecolonies/api/items/ModTags.java @@ -25,11 +25,19 @@ public class ModTags public static final TagKey decorationItems = BlockTags.create(TagConstants.DECORATION_ITEMS); public static final TagKey concretePowder = ItemTags.create(TagConstants.CONCRETE_POWDER); - public static final TagKey concreteBlock = BlockTags.create(TagConstants.CONCRETE_BLOCK); - public static final TagKey pathingBlocks = BlockTags.create(TagConstants.PATHING_BLOCKS); + public static final TagKey concreteBlock = BlockTags.create(TagConstants.CONCRETE_BLOCK); + public static final TagKey pathingBlocks = BlockTags.create(TagConstants.PATHING_BLOCKS); + public static final TagKey tier1blocks = BlockTags.create(TagConstants.TIER1_BLOCKS); + public static final TagKey tier2blocks = BlockTags.create(TagConstants.TIER2_BLOCKS); + public static final TagKey tier3blocks = BlockTags.create(TagConstants.TIER3_BLOCKS); + public static final TagKey tier4blocks = BlockTags.create(TagConstants.TIER4_BLOCKS); + public static final TagKey tier5blocks = BlockTags.create(TagConstants.TIER5_BLOCKS); + public static final TagKey tier6blocks = BlockTags.create(TagConstants.TIER6_BLOCKS); + public static final TagKey mangroveTree = BlockTags.create(TagConstants.MANGROVE_TREE_BLOCKS); + public static final TagKey tree = BlockTags.create(TagConstants.TREE_BLOCKS); public static final TagKey colonyProtectionException = BlockTags.create(TagConstants.COLONYPROTECTIONEXCEPTION); - public static final TagKey indestructible = BlockTags.create(TagConstants.INDESTRUCTIBLE); + public static final TagKey indestructible = BlockTags.create(TagConstants.INDESTRUCTIBLE); public static final TagKey oreChanceBlocks = BlockTags.create(TagConstants.ORECHANCEBLOCKS); @@ -51,10 +59,16 @@ public class ModTags public static final TagKey> hostile = TagKey.create(Registry.ENTITY_TYPE_REGISTRY, TagConstants.HOSTILE); public static final TagKey> mobAttackBlacklist = TagKey.create(Registry.ENTITY_TYPE_REGISTRY, TagConstants.MOB_ATTACK_BLACKLIST); + public static final TagKey> raiders = TagKey.create(Registry.ENTITY_TYPE_REGISTRY, TagConstants.RAIDERS); + + public static final TagKey ignoreNBT = ItemTags.create(TagConstants.IGNORE_NBT); + public static final Map> crafterProduct = new HashMap<>(); public static final Map> crafterProductExclusions = new HashMap<>(); public static final Map> crafterIngredient = new HashMap<>(); public static final Map> crafterIngredientExclusions = new HashMap<>(); + public static final Map> crafterDoIngredient = new HashMap<>(); + /** * Tag specifier for Products to Include @@ -76,6 +90,11 @@ public class ModTags */ private static final String INGREDIENT_EXCLUDED = "_ingredient_excluded"; + /** + * Tag specifier for Ingredients to include + */ + private static final String DO_INGREDIENT = "_do_ingredient"; + public static void init() { initCrafterRules(TagConstants.CRAFTING_BAKER); // both crafting and smelting @@ -106,11 +125,13 @@ private static void initCrafterRules(@NotNull final String crafterName) final ResourceLocation ingredients = new ResourceLocation(MOD_ID, crafterName.concat(INGREDIENT)); final ResourceLocation productsExcluded = new ResourceLocation(MOD_ID, crafterName.concat(PRODUCT_EXCLUDED)); final ResourceLocation ingredientsExcluded = new ResourceLocation(MOD_ID, crafterName.concat(INGREDIENT_EXCLUDED)); + final ResourceLocation doIngredients = new ResourceLocation(MOD_ID, crafterName.concat(DO_INGREDIENT)); crafterProduct.put(crafterName, ItemTags.create(products)); crafterProductExclusions.put(crafterName, ItemTags.create(productsExcluded)); crafterIngredient.put(crafterName, ItemTags.create(ingredients)); crafterIngredientExclusions.put(crafterName, ItemTags.create(ingredientsExcluded)); + crafterDoIngredient.put(crafterName, ItemTags.create(doIngredients)); } private ModTags() diff --git a/src/api/java/com/minecolonies/api/loot/ResearchUnlocked.java b/src/api/java/com/minecolonies/api/loot/ResearchUnlocked.java index 2c239e8dc26..528e85009f7 100644 --- a/src/api/java/com/minecolonies/api/loot/ResearchUnlocked.java +++ b/src/api/java/com/minecolonies/api/loot/ResearchUnlocked.java @@ -4,7 +4,9 @@ import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; import net.minecraft.world.entity.Entity; @@ -12,20 +14,59 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.Optional; + +/** + * Loot condition that checks whether the local colony has unlocked the specified research + */ public class ResearchUnlocked implements LootItemCondition { private final ResourceLocation effectId; + private final double minStrength; + private final double maxStrength; - private ResearchUnlocked(@NotNull final ResourceLocation effectId) + private ResearchUnlocked(@NotNull final ResourceLocation effectId, final double minStrength, final double maxStrength) { this.effectId = effectId; + this.minStrength = minStrength; + this.maxStrength = maxStrength; } + /** + * Creates a loot condition that is true when the given research effect is unlocked. + * @param effectId the research effect id + * @return the condition + */ public static LootItemCondition.Builder effect(@NotNull final ResourceLocation effectId) { - return () -> new ResearchUnlocked(effectId); + return effect(effectId, Double.MIN_VALUE); + } + + /** + * Creates a loot condition that is true when the given research effect is unlocked at the given strength or higher. + * @param effectId the research effect id + * @param strength the minimum required strength + * @return the condition + */ + public static LootItemCondition.Builder effect(@NotNull final ResourceLocation effectId, final double strength) + { + return effect(effectId, strength, Double.MAX_VALUE); + } + + /** + * Creates a loot condition that is true when the given research effect is unlocked and within the given strength range. + * @param effectId the research effect id + * @param minStrength the minimum (inclusive) required strength + * @param maxStrength the maximum (exclusive) required strength + * @return the condition + */ + public static LootItemCondition.Builder effect(@NotNull final ResourceLocation effectId, final double minStrength, final double maxStrength) + { + return () -> new ResearchUnlocked(effectId, minStrength, maxStrength); } @NotNull @@ -38,18 +79,31 @@ public LootItemConditionType getType() @Override public boolean test(@NotNull final LootContext lootContext) { - final Entity entity = lootContext.getParamOrNull(LootContextParams.KILLER_ENTITY); - if (entity instanceof AbstractEntityCitizen) - { - final AbstractEntityCitizen citizen = (AbstractEntityCitizen) entity; - final IColony colony = citizen.getCitizenColonyHandler().getColony(); - if (colony != null) - { - return colony.getResearchManager().getResearchEffects().getEffectStrength(this.effectId) > 0; - } - } + return test(lootContext, lootContext.getParamOrNull(LootContextParams.KILLER_ENTITY)) + .or(() -> test(lootContext, lootContext.getParamOrNull(LootContextParams.THIS_ENTITY))) + .or(() -> test(lootContext, lootContext.getParamOrNull(LootContextParams.ORIGIN))) + .orElse(false); + } - return false; + private Optional test(@NotNull final LootContext lootContext, @Nullable Entity entity) + { + return Optional.ofNullable(entity) + .map(e -> e instanceof AbstractEntityCitizen citizen ? citizen : null) + .flatMap(c -> test(lootContext, c.getCitizenColonyHandler().getColony())); + } + + private Optional test(@NotNull final LootContext lootContext, @Nullable Vec3 origin) + { + return Optional.ofNullable(origin) + .map(BlockPos::new) + .flatMap(pos -> test(lootContext, IColonyManager.getInstance().getIColony(lootContext.getLevel(), pos))); + } + + private Optional test(@NotNull final LootContext lootContext, @Nullable IColony colony) + { + return Optional.ofNullable(colony) + .map(c -> c.getResearchManager().getResearchEffects().getEffectStrength(this.effectId)) + .map(s -> s >= this.minStrength && s < this.maxStrength); } public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer @@ -60,6 +114,16 @@ public void serialize(@NotNull final JsonObject json, @NotNull final JsonSerializationContext context) { json.addProperty("id", condition.effectId.toString()); + + if (condition.minStrength != Double.MIN_VALUE) + { + json.addProperty("minStrength", condition.minStrength); + } + + if (condition.maxStrength != Double.MAX_VALUE) + { + json.addProperty("maxStrength", condition.maxStrength); + } } @NotNull @@ -68,7 +132,9 @@ public ResearchUnlocked deserialize(@NotNull final JsonObject json, @NotNull final JsonDeserializationContext context) { final ResourceLocation researchId = new ResourceLocation(GsonHelper.getAsString(json, "id", "")); - return new ResearchUnlocked(researchId); + final double minStrength = GsonHelper.getAsDouble(json, "minStrength", Double.MIN_VALUE); + final double maxStrength = GsonHelper.getAsDouble(json, "maxStrength", Double.MAX_VALUE); + return new ResearchUnlocked(researchId, minStrength, maxStrength); } } } diff --git a/src/api/java/com/minecolonies/api/quests/FinishedQuest.java b/src/api/java/com/minecolonies/api/quests/FinishedQuest.java new file mode 100644 index 00000000000..a8117aa4cf7 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/FinishedQuest.java @@ -0,0 +1,11 @@ +package com.minecolonies.api.quests; + +/** + * Container class for a finished quest, containing the quest template and how often it got finished. + * + * @param template the quest template. + * @param finishedCount how often this quest got completed. + */ +public record FinishedQuest(IQuestTemplate template, int finishedCount) +{ +} diff --git a/src/api/java/com/minecolonies/api/quests/IDialogueObjectiveTemplate.java b/src/api/java/com/minecolonies/api/quests/IDialogueObjectiveTemplate.java new file mode 100644 index 00000000000..86844b242e9 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IDialogueObjectiveTemplate.java @@ -0,0 +1,138 @@ +package com.minecolonies.api.quests; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecolonies.api.IMinecoloniesAPI; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Dialogue type of objective interface. + */ +public interface IDialogueObjectiveTemplate extends IQuestObjectiveTemplate +{ + + /** + * Getter for the dialogue tree. + * @return the tree. + */ + DialogueElement getDialogueTree(); + + + /** + * A dialogue element in the dialogue objective. + */ + class DialogueElement implements IQuestDialogueAnswer + { + /** + * The text the participant says. + */ + private final Component text; + + /** + * The player options. + */ + private final List answers; + + /** + * Create a new dialogue element. + * @param text the participant. + * @param answers the player answers. + */ + public DialogueElement(final Component text, final List answers) + { + this.text = text; + this.answers = answers; + } + + /** + * Parse the element from json. + * @param jsonObject the json to parse it from. + * @return a new element. + */ + public static DialogueElement parse(final JsonObject jsonObject) + { + final Component text = Component.translatable(jsonObject.get(TEXT_ID).getAsString()); + final List answerElementList = new ArrayList<>(); + for (final JsonElement answerOption : jsonObject.getAsJsonArray(OPTIONS_ID)) + { + answerElementList.add(AnswerElement.parse(answerOption.getAsJsonObject())); + } + return new DialogueElement(text, answerElementList); + } + + /** + * Getter for the element text. + * @return the text. + */ + public Component getText() + { + return this.text; + } + + /** + * Get all the response options. + * @return the response option. + */ + public List getOptions() + { + return answers.stream().map(answerElement -> answerElement.text).collect(Collectors.toList()); + } + + /** + * Get the matching answer result. + * @param responseId the triggered response to match. + * @return the next answer. + */ + @Nullable + public IQuestDialogueAnswer getOptionResult(final int responseId) + { + return responseId < answers.size() ? answers.get(responseId).answerResult : null; + } + } + + /** + * An answer element part of a dialogue path. + */ + class AnswerElement + { + /** + * The text the player displays. + */ + private final Component text; + + /** + * The result from the player answer. + */ + private final IQuestDialogueAnswer answerResult; + + /** + * Create a new answer element. + * @param text the text for the player. + * @param answerResult the result from the choice. + */ + public AnswerElement(final Component text, final IQuestDialogueAnswer answerResult) + { + this.text = text; + this.answerResult = answerResult; + } + + /** + * Parse the answer element from json. + * @param jsonObject the json obj. + * @return the answer element. + */ + public static AnswerElement parse(final JsonObject jsonObject) + { + final JsonObject resultObj = jsonObject.getAsJsonObject(RESULT_ID); + return new AnswerElement(Component.translatable(jsonObject.get(ANSWER_ID).getAsString()), IMinecoloniesAPI.getInstance().getQuestDialogueAnswerRegistry().getValue(new ResourceLocation(resultObj.get(TYPE_ID).getAsString())).produce(resultObj)); + } + } +} diff --git a/src/api/java/com/minecolonies/api/quests/IFinalQuestDialogueAnswer.java b/src/api/java/com/minecolonies/api/quests/IFinalQuestDialogueAnswer.java new file mode 100644 index 00000000000..fd9d830246e --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IFinalQuestDialogueAnswer.java @@ -0,0 +1,17 @@ +package com.minecolonies.api.quests; + +import net.minecraft.world.entity.player.Player; + +/** + * Terminal type answer. Will close the interaction. + */ +public interface IFinalQuestDialogueAnswer extends IQuestDialogueAnswer +{ + + /** + * Apply the objective to colony quest. This only applies to the terminal ones! + * @param player the player triggering it. + * @param quest the quest to apply itself to. + */ + void applyToQuest(final Player player, IQuestInstance quest); +} diff --git a/src/api/java/com/minecolonies/api/quests/IObjectiveInstance.java b/src/api/java/com/minecolonies/api/quests/IObjectiveInstance.java new file mode 100644 index 00000000000..b75cd609973 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IObjectiveInstance.java @@ -0,0 +1,22 @@ +package com.minecolonies.api.quests; + +import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.util.INBTSerializable; + +/** + * Objective data type to take track of activities. + */ +public interface IObjectiveInstance extends INBTSerializable +{ + /** + * Check if the objective has been fulfilled. + * @return true if so. + */ + boolean isFulfilled(); + + /** + * Get the missing quantity. + * @return the quantity. + */ + int getMissingQuantity(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestDeliveryObjective.java b/src/api/java/com/minecolonies/api/quests/IQuestDeliveryObjective.java new file mode 100644 index 00000000000..3ee4627f76a --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestDeliveryObjective.java @@ -0,0 +1,29 @@ +package com.minecolonies.api.quests; + +import net.minecraft.world.entity.player.Player; + +/** + * Quest objective interface for deliveries. + */ +public interface IQuestDeliveryObjective extends IDialogueObjectiveTemplate +{ + /** + * Check if the objective is ready to move on. + * @param colonyQuest the objective belongs to. + * @return true if so. + */ + boolean hasItem(final Player player, final IQuestInstance colonyQuest); + + /** + * Attempt to resolve an objective. + * @param colonyQuest the objective belongs to. + * @return true if so. + */ + boolean tryDiscountItem(final Player player, final IQuestInstance colonyQuest); + + /** + * Dialogue tree when the conditions are fulfilled. + * @return the dialogue to play. + */ + IDialogueObjectiveTemplate.DialogueElement getReadyDialogueTree(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestDialogueAnswer.java b/src/api/java/com/minecolonies/api/quests/IQuestDialogueAnswer.java new file mode 100644 index 00000000000..66be2902ff3 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestDialogueAnswer.java @@ -0,0 +1,71 @@ +package com.minecolonies.api.quests; + +import com.google.gson.JsonObject; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.GO_TO_ID; + +/** + * Possible answer results in a dialogue tree. + */ +public interface IQuestDialogueAnswer +{ + /** + * Type that will close the quest without alteration. + */ + class CloseUIDialogueAnswer implements IFinalQuestDialogueAnswer + { + @Override + public void applyToQuest(final Player player, final IQuestInstance quest) + { + // Do nothing, just close UI. + } + } + + /** + * Will advance the quest to another objective. + */ + class NextObjectiveDialogueAnswer implements IQuestPositiveDialogueAnswer + { + /** + * The next objective to go to. + */ + private final int nextObjective; + + /** + * Create a new go to result. + * @param nextObjective the next obj index. + */ + public NextObjectiveDialogueAnswer(final int nextObjective) + { + this.nextObjective = nextObjective; + } + + /** + * Create the go to result from json. + * @param jsonObject the json obj. + */ + public NextObjectiveDialogueAnswer(final JsonObject jsonObject) + { + this.nextObjective = jsonObject.get(GO_TO_ID).getAsInt(); + } + + @Override + public void applyToQuest(final Player player, final IQuestInstance quest) + { + quest.advanceObjective(player, nextObjective); + } + } + + /** + * Cancel request and remove from in-progress and available pool for now. + */ + class QuestCancellationDialogueAnswer implements IFinalQuestDialogueAnswer + { + @Override + public void applyToQuest(final Player player, final IQuestInstance quest) + { + quest.onDeletion(); + } + } +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestGiver.java b/src/api/java/com/minecolonies/api/quests/IQuestGiver.java new file mode 100644 index 00000000000..2818bab9aad --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestGiver.java @@ -0,0 +1,13 @@ +package com.minecolonies.api.quests; + +/** + * Interface describing an entity that hands out quests. + */ +public interface IQuestGiver extends IQuestParticipant +{ + /** + * Assign quest authority to quest giver. + * @param quest the quest to assign to the entity. + */ + void assignQuest(final IQuestInstance quest); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestInstance.java b/src/api/java/com/minecolonies/api/quests/IQuestInstance.java new file mode 100644 index 00000000000..c7bb5f1d996 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestInstance.java @@ -0,0 +1,118 @@ +package com.minecolonies.api.quests; + +import com.minecolonies.api.colony.IColony; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.util.INBTSerializable; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.UUID; + +/** + * Quest instance + */ +public interface IQuestInstance extends INBTSerializable +{ + /** + * Triggered when the quest is accepted + * + * @param player player accepting + */ + void onStart(final Player player, final IColony colony); + + /** + * Get the id of the quest giver. + * Server only! + * + * @return the id of the quest giver. + */ + IQuestGiver getQuestGiver(); + + /** + * Id of questgiver. + * @return the id. + */ + int getQuestGiverId(); + + /** + * Check if the expiration date relative to the colony day count was reached. + * @param colony the colony to check the validity for. + * @return true if so. + */ + boolean isValid(IColony colony); + + /** + * Get the quest id of the quest. + * @return the id. + */ + ResourceLocation getId(); + + /** + * On deletion of the quest. + */ + void onDeletion(); + + /** + * Advance the quest objective to this id. + * @param player the player advancing this objective. + * @param nextObjective the id to advance it to. + * @return the next objective instance. + */ + IObjectiveInstance advanceObjective(final Player player, int nextObjective); + + /** + * On question completion call. + */ + void onCompletion(); + + /** + * Get the current objective index. + * @return the index number. + */ + int getObjectiveIndex(); + + /** + * Get one of the other participants by index. + * @param target the target participant id. + * @return the quest participant. + */ + IQuestParticipant getParticipant(int target); + + /** + * Get the full list of quest participants. + * @return the list of participants. + */ + List getParticipants(); + + /** + * Get the objective data of the current objective. + * @return the data. + */ + @Nullable + IObjectiveInstance getCurrentObjectiveInstance(); + + /** + * Get the colony matching the quest. + * @return the colony. + */ + IColony getColony(); + + /** + * Get the player UUID that accepted the quest. + * @return the player uuid. + */ + UUID getAssignedPlayer(); + + /** + * Simple advance objective by one. + * @param player the player involved. + */ + void advanceObjective(Player player); + + /** + * On world load trigger. + */ + void onWorldLoad(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestManager.java b/src/api/java/com/minecolonies/api/quests/IQuestManager.java new file mode 100644 index 00000000000..84b057c389c --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestManager.java @@ -0,0 +1,106 @@ +package com.minecolonies.api.quests; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.util.INBTSerializable; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Interface of the Quest manager of each colony. + */ +public interface IQuestManager extends INBTSerializable +{ + /** + * All quests that exist. + */ + Map GLOBAL_SERVER_QUESTS = new HashMap<>(); + + /** + * Have player attempt to accept a colony quest. + * @param questID the unique id of the quest. + * @param player the player trying to accept it. + * @return true if successful. + */ + boolean attemptAcceptQuest(ResourceLocation questID, Player player); + + /** + * Conclude a given quest. This is called FROM the quest, to the colony. + * @param questId the unique id of the quest. + */ + void completeQuest(ResourceLocation questId); + + /** + * On each colony tick. + */ + void onColonyTick(); + + /** + * Deactivate a given quest. + * @param questID the id of the quest. + */ + void deleteQuest(ResourceLocation questID); + + /** + * Get the currently available or in progress quest with a given id. + * @param questId the id. + * @return the quest. + */ + @Nullable + IQuestInstance getAvailableOrInProgressQuest(final ResourceLocation questId); + + /** + * On world load handling. + */ + void onWorldLoad(); + + /** + * Unlock a quest with a given id. + * @param questId the quest to unlock. + */ + void unlockQuest(ResourceLocation questId); + + /** + * Check if a quest is unlocked. + * @param questId the id of the quest. + * @return true if so. + */ + boolean isUnlocked(ResourceLocation questId); + + /** + * Alter the quest reputation. + * @param difference the alteration. + */ + void alterReputation(double difference); + + /** + * Get the reputation of the colony. + * @return the reputation. + */ + double getReputation(); + + /** + * Get the list of available quests in the colony. + * + * @return the list of quest instances. + */ + List getAvailableQuests(); + + /** + * Get the list of in progress quests in the colony. + * + * @return the list of quest instances. + */ + List getInProgressQuests(); + + /** + * Get the list of completed quests in the colony. + * + * @return the list of quest templates, and how often they've been completed. + */ + List getFinishedQuests(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestObjectiveTemplate.java b/src/api/java/com/minecolonies/api/quests/IQuestObjectiveTemplate.java new file mode 100644 index 00000000000..08e96d59325 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestObjectiveTemplate.java @@ -0,0 +1,63 @@ +package com.minecolonies.api.quests; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Quest objective interface for all objectives. + */ +public interface IQuestObjectiveTemplate +{ + /** + * Initialization of an objective. + * + * @param colonyQuest the colony quest it belongs to. + * @return potentially related objective data. + */ + @Nullable + IObjectiveInstance startObjective(final IQuestInstance colonyQuest); + + /** + * On objective abort. + * + * @param colonyQuest related colony quest. + */ + default void onCancellation(final IQuestInstance colonyQuest) {} + + /** + * On world load trigger. + * + * @param colonyQuest the quest. + */ + default void onWorldLoad(IQuestInstance colonyQuest) {} + + /** + * Get a {@link Component} instance with the text containing the progress of this objective. + * + * @param quest the quest to get the info from. + * @param style the style to use on subcomponents. + * @return the chat component. + */ + Component getProgressText(IQuestInstance quest, Style style); + + /** + * Get objective data related to the objective. + * + * @return the data, default null. + */ + @Nullable + default IObjectiveInstance createObjectiveInstance() + { + return null; + } + + /** + * Get the list of reward unlocks from this objective. + * + * @return the unlocked rewards by this objective. + */ + List getRewardUnlocks(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestParticipant.java b/src/api/java/com/minecolonies/api/quests/IQuestParticipant.java new file mode 100644 index 00000000000..28877e908c1 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestParticipant.java @@ -0,0 +1,44 @@ +package com.minecolonies.api.quests; + +import net.minecraft.resources.ResourceLocation; + +/** + * Type of entity that participates somehow in quests. + */ +public interface IQuestParticipant +{ + /** + * Notify quest participant about their participation. + * @param quest the quest to assign to the entity. + */ + void addQuestParticipation(final IQuestInstance quest); + + /** + * Method for cleanup purposes on quest deletion. + * @param questId the id of the quest. + */ + void onQuestDeletion(final ResourceLocation questId); + + /** + * Check if the citizen has a quest open. + * @param questId the id of the quest. + * @return true if so. + */ + boolean isParticipantOfQuest(final ResourceLocation questId); + + /** + * Initiates a dialogue at the citizen. + * @param quest the quest to open it for. + * @param index the current objective index + */ + void openDialogue(final IQuestInstance quest, final int index); + + /** + * Get a display name for the quest participant. + * @return the display name. + */ + String getName(); +} + + + diff --git a/src/api/java/com/minecolonies/api/quests/IQuestPositiveDialogueAnswer.java b/src/api/java/com/minecolonies/api/quests/IQuestPositiveDialogueAnswer.java new file mode 100644 index 00000000000..9f43ee9ba90 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestPositiveDialogueAnswer.java @@ -0,0 +1,9 @@ +package com.minecolonies.api.quests; + +/** + * Positive terminal answer result. + */ +public interface IQuestPositiveDialogueAnswer extends IFinalQuestDialogueAnswer +{ + +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestRewardTemplate.java b/src/api/java/com/minecolonies/api/quests/IQuestRewardTemplate.java new file mode 100644 index 00000000000..b528ad4fe86 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestRewardTemplate.java @@ -0,0 +1,18 @@ +package com.minecolonies.api.quests; + +import com.minecolonies.api.colony.IColony; +import net.minecraft.world.entity.player.Player; + +/** + * Quest reward interface for all reward types. + */ +public interface IQuestRewardTemplate +{ + /** + * Apply the reward to colony and player. + * @param colony the involved colony. + * @param player the involved player. + * @param colonyQuest the related quest. + */ + void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestTemplate.java b/src/api/java/com/minecolonies/api/quests/IQuestTemplate.java new file mode 100644 index 00000000000..2c61e64d248 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestTemplate.java @@ -0,0 +1,68 @@ +package com.minecolonies.api.quests; + +import com.minecolonies.api.colony.IColony; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * Quest Data Instance. + */ +public interface IQuestTemplate +{ + /** + * This is where we actually check if the colony fulfills the quest requirements. + * @param colony the colony to check. + * @return the colony quest instance if successful. + */ + IQuestInstance attemptStart(final IColony colony); + + /** + * Timeout in ingame days until an available quest or in progress quest gets deleted. + * @return the timeout. + */ + int getQuestTimeout(); + + /** + * How often we can redo this quest. + * @return the number. + */ + int getMaxOccurrence(); + + /** + * Unlock the quest rewards. + * + * @param colony the colony. + * @param player the player. + * @param colonyQuest the quest. + * @param unlockedRewards the applicable rewards. + */ + void unlockQuestRewards(IColony colony, Player player, final IQuestInstance colonyQuest, final List unlockedRewards); + + /** + * Get the objective at a given index. + * @param index the index of the objective. + * @return the current objective. + */ + IQuestObjectiveTemplate getObjective(final int index); + + /** + * Get the objective count of this quest. + * @return the count. + */ + int getObjectiveCount(); + + /** + * The name of the quest. + * @return the name of the quest. + */ + Component getName(); + + /** + * Get the list of parent quests. + * @return the list of parent quests. + */ + List getParents(); +} diff --git a/src/api/java/com/minecolonies/api/quests/IQuestTriggerTemplate.java b/src/api/java/com/minecolonies/api/quests/IQuestTriggerTemplate.java new file mode 100644 index 00000000000..568cd250306 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/IQuestTriggerTemplate.java @@ -0,0 +1,140 @@ +package com.minecolonies.api.quests; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.minecolonies.api.colony.IColony; +import net.minecraft.nbt.*; +import net.minecraft.resources.ResourceLocation; + +/** + * Quest triggers are used to check if a colony fulfills certain conditions for a quest to be made available. + */ +public interface IQuestTriggerTemplate +{ + /** + * Check if the quest trigger condition is fulfilled. + * @param colony the colony the quest is in. + * @return true if so. + */ + ITriggerReturnData canTriggerQuest(final IColony colony); + + /** + * Check if the quest trigger condition is fulfilled. + * @param questId the quest to try to trigger. + * @param colony the colony the quest is in. + * @return true if so. + */ + default ITriggerReturnData canTriggerQuest(final ResourceLocation questId, final IColony colony) + { + return canTriggerQuest(colony); + } + + /** + * Match a nbt tag and a json element tag. + * @param nbtTag the nbt tag to check. + * @param matchTag the element tag to check. + * @return true if the matchTag fits into the nbtTag or if they match. + */ + static boolean matchNbt(final Tag nbtTag, final JsonElement matchTag) + { + return matchNbt(nbtTag, matchTag, 1); + } + + /** + * Match a nbt tag and a json element tag. + * @param nbtTag the nbt tag to check. + * @param matchTag the element tag to check. + * @param count the number of elements to match in a list. + * @return true if the matchTag fits into the nbtTag or if they match. + */ + static boolean matchNbt(final Tag nbtTag, final JsonElement matchTag, final int count) + { + if (nbtTag instanceof final CompoundTag nbtCompound) + { + if (!(matchTag instanceof JsonObject matchObject)) + { + return false; + } + + for (String key : matchObject.keySet()) + { + if (!nbtCompound.contains(key)) + { + return false; + } + + if (!matchNbt(nbtCompound.get(key), matchObject.get(key))) + { + return false; + } + } + return true; + } + + if (nbtTag instanceof ListTag nbtList) + { + // Check if we're trying to match an element in the list. + int matchCount = 0; + for (final Tag tag : nbtList) + { + if (matchNbt(tag, matchTag)) + { + matchCount++; + if (matchCount >= count) + { + return true; + } + } + } + + // This can also be partial matching (e.g. find 3 elements). + if (!(matchTag instanceof JsonArray arrayTag)) + { + return false; + } + + for (final JsonElement element: arrayTag) + { + boolean matched = false; + for (final Tag tag : nbtList) + { + if (matchNbt(tag, element)) + { + matched = true; + break; + } + } + + if (!matched) + { + return false; + } + } + return true; + } + + // Don't handle non primitives from here on. + if (!(matchTag instanceof JsonPrimitive)) + { + return false; + } + + // Full equals for string. + if (nbtTag instanceof StringTag && ((JsonPrimitive) matchTag).isString()) + { + return nbtTag.getAsString().equals(matchTag.getAsString()); + } + else if (nbtTag instanceof ByteTag && ((JsonPrimitive) matchTag).isBoolean()) + { + return (((ByteTag) nbtTag).getAsByte() == 0) != matchTag.getAsBoolean(); + } + // Larger equals for numbers. + else if (nbtTag instanceof NumericTag && ((JsonPrimitive) matchTag).isNumber()) + { + return ((NumericTag) nbtTag).getAsDouble() >= matchTag.getAsDouble(); + } + return false; + } +} diff --git a/src/api/java/com/minecolonies/api/quests/ITriggerReturnData.java b/src/api/java/com/minecolonies/api/quests/ITriggerReturnData.java new file mode 100644 index 00000000000..4a2639938fa --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/ITriggerReturnData.java @@ -0,0 +1,19 @@ +package com.minecolonies.api.quests; + +/** + * Custom return data for triggers. This allows a trigger to return things like the building or citizen it was supposed to check on. + */ +public interface ITriggerReturnData +{ + /** + * Check if it is a match. + * @return true if so. + */ + boolean isPositive(); + + /** + * Get the actual content of the return data. + * @return the content. + */ + T getContent(); +} diff --git a/src/api/java/com/minecolonies/api/quests/QuestParseConstant.java b/src/api/java/com/minecolonies/api/quests/QuestParseConstant.java new file mode 100644 index 00000000000..b4391c30a82 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/QuestParseConstant.java @@ -0,0 +1,43 @@ +package com.minecolonies.api.quests; + +/** + * Constant for quest parsing. + */ +public class QuestParseConstant +{ + /** + * Json parse constants. + */ + public static final String DETAILS_KEY = "details"; + public static final String TARGET_KEY = "target"; + public static final String QUANTITY_KEY = "qty"; + public static final String NEXT_OBJ_KEY = "next-objective"; + public static final String BLOCK_KEY = "block"; + public static final String ITEM_KEY = "item"; + public static final String NBT_KEY = "nbt"; + public static final String NBT_MODE_KEY = "nbt-mode"; + public static final String UNLOCKS_REWARDS_KEY = "unlocks-rewards"; + public static final String ENTITY_TYPE_KEY = "entity-type"; + public static final String DAYS_KEY = "days"; + public static final String CHANGE_KEY = "change"; + public static final String TYPE_KEY = "type"; + public static final String TARGET1_KEY = "target1"; + public static final String TARGET2_KEY = "target2"; + public static final String ID_KEY = "id"; + public static final String SKILL_KEY = "skill"; + public static final String TEXT_ID = "text"; + public static final String OPTIONS_ID = "options"; + public static final String RESULT_ID = "result"; + public static final String ANSWER_ID = "answer"; + public static final String TYPE_ID = "type"; + public static final String GO_TO_ID = "go-to"; + public static final String BUILDING_KEY = "type"; + public static final String STATE_ID = "state"; + public static final String MATCH_ID = "match"; + public static final String COUNT_ID = "count"; + public static final String PATH_ID = "path"; + public static final String RARITY_ID = "rarity"; + public static final String REPUTATION_ID = "reputation"; + public static final String LEVEL_KEY = "lvl"; + public static final String COUNT_EXIST_KEY = "count-existing"; +} diff --git a/src/api/java/com/minecolonies/api/quests/registries/QuestRegistries.java b/src/api/java/com/minecolonies/api/quests/registries/QuestRegistries.java new file mode 100755 index 00000000000..3eb1c5cd428 --- /dev/null +++ b/src/api/java/com/minecolonies/api/quests/registries/QuestRegistries.java @@ -0,0 +1,202 @@ +package com.minecolonies.api.quests.registries; + +import com.google.gson.JsonObject; +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.quests.*; +import com.minecolonies.api.util.constant.Constants; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryObject; +import java.util.function.Function; + +/** + * All quest registries related things. + */ +public class QuestRegistries +{ + /** + * Get the reward registry. + * @return the reward registry. + */ + static IForgeRegistry getQuestRewardsRegistry() + { + return IMinecoloniesAPI.getInstance().getQuestRewardRegistry(); + } + + /** + * Get the objective registry. + * @return the reward registry. + */ + static IForgeRegistry getQuestObjectiveRegistry() + { + return IMinecoloniesAPI.getInstance().getQuestObjectiveRegistry(); + } + + /** + * Get the trigger registry. + * @return the reward registry. + */ + static IForgeRegistry getQuestTriggerRegistry() + { + return IMinecoloniesAPI.getInstance().getQuestTriggerRegistry(); + } + + /** + * Get the dialogue answer result registry. + * @return the reward registry. + */ + static IForgeRegistry getDialogueAnswerResultRegistry() + { + return IMinecoloniesAPI.getInstance().getQuestDialogueAnswerRegistry(); + } + + /** + * Quest reward entry type. + */ + public static class RewardEntry + { + //todo create instance getters + + private final Function producer; + + public RewardEntry(final Function productionFunction) + { + this.producer = productionFunction; + } + + /** + * Create one from json. + * @param jsonObject the input. + * @return the reward. + */ + public IQuestRewardTemplate produce(final JsonObject jsonObject) + { + return producer.apply(jsonObject); + } + } + + /** + * Quest objective entry type. + */ + public static class ObjectiveEntry + { + private final Function producer; + + public ObjectiveEntry(final Function productionFunction) + { + this.producer = productionFunction; + } + + /** + * Create one from json. + * @param jsonObject the input. + * @return the objective. + */ + public IQuestObjectiveTemplate produce(final JsonObject jsonObject) + { + return producer.apply(jsonObject); + } + } + + /** + * Quest trigger entry type. + */ + public static class TriggerEntry + { + private final Function producer; + + public TriggerEntry(final Function productionFunction) + { + this.producer = productionFunction; + } + + /** + * Create one from json. + * @param jsonObject the input. + * @return the trigger. + */ + public IQuestTriggerTemplate produce(final JsonObject jsonObject) + { + return producer.apply(jsonObject); + } + } + + /** + * Quest dialogue entry type. + */ + public static class DialogueAnswerEntry + { + private final Function producer; + + public DialogueAnswerEntry(final Function productionFunction) + { + this.producer = productionFunction; + } + + /** + * Create one from json. + * @param jsonObject the input. + * @return the answer result. + */ + public IQuestDialogueAnswer produce(final JsonObject jsonObject) + { + return producer.apply(jsonObject); + } + } + + public static ResourceLocation ITEM_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "item"); + public static ResourceLocation SKILL_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "skill"); + public static ResourceLocation RESEARCH_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "research"); + public static ResourceLocation RAID_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "raid"); + public static ResourceLocation RELATIONSHIP_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "relationship"); + public static ResourceLocation HAPPINESS_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "happiness"); + public static ResourceLocation UNLOCK_QUEST_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "unlockquest"); + public static ResourceLocation QUEST_REPUTATION_REWARD_ID = new ResourceLocation(Constants.MOD_ID, "questreputation"); + + public static ResourceLocation DIALOGUE_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "dialogue"); + public static ResourceLocation BREAKBLOCK_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "breakblock"); + public static ResourceLocation DELIVERY_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "delivery"); + public static ResourceLocation KILLENTITY_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "killentity"); + public static ResourceLocation PLACEBLOCK_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "placeblock"); + public static ResourceLocation BUILD_BUILDING_OBJECTIVE_ID = new ResourceLocation(Constants.MOD_ID, "buildbuilding"); + + public static ResourceLocation STATE_TRIGGER_ID = new ResourceLocation(Constants.MOD_ID, "state"); + public static ResourceLocation RANDOM_TRIGGER_ID = new ResourceLocation(Constants.MOD_ID, "random"); + public static ResourceLocation CITIZEN_TRIGGER_ID = new ResourceLocation(Constants.MOD_ID, "citizen"); + public static ResourceLocation UNLOCK_TRIGGER_ID = new ResourceLocation(Constants.MOD_ID, "unlock"); + public static ResourceLocation QUEST_REPUTATION_TRIGGER_ID = new ResourceLocation(Constants.MOD_ID, "questreputation"); + + public static ResourceLocation DIALOGUE_ANSWER_ID = new ResourceLocation(Constants.MOD_ID, "dialogue"); + public static ResourceLocation RETURN_ANSWER_ID = new ResourceLocation(Constants.MOD_ID, "return"); + public static ResourceLocation CANCEL_ANSWER_ID = new ResourceLocation(Constants.MOD_ID, "cancel"); + public static ResourceLocation GOTO_ANSWER_ID = new ResourceLocation(Constants.MOD_ID, "advanceobjective"); + + + public static RegistryObject itemReward; + public static RegistryObject skillReward; + public static RegistryObject researchReward; + public static RegistryObject raidReward; + public static RegistryObject relationshipReward; + public static RegistryObject happinessReward; + public static RegistryObject unlockQuestReward; + public static RegistryObject questReputationReward; + + public static RegistryObject dialogueObjective; + public static RegistryObject breakBlockObjective; + public static RegistryObject deliveryObjective; + public static RegistryObject killEntityObjective; + public static RegistryObject placeBlockObjective; + public static RegistryObject buildBuildingObjective; + + public static RegistryObject stateTrigger; + public static RegistryObject randomTrigger; + public static RegistryObject citizenTrigger; + public static RegistryObject unlockTrigger; + public static RegistryObject questReputationTrigger; + + public static RegistryObject dialogueAnswerResult; + public static RegistryObject returnAnswerResult; + public static RegistryObject cancelAnswerResult; + public static RegistryObject gotoAnswerResult; + +} diff --git a/src/api/java/com/minecolonies/api/research/IGlobalResearchBranch.java b/src/api/java/com/minecolonies/api/research/IGlobalResearchBranch.java index 9dc7fc847bd..e3ea5eb18e6 100644 --- a/src/api/java/com/minecolonies/api/research/IGlobalResearchBranch.java +++ b/src/api/java/com/minecolonies/api/research/IGlobalResearchBranch.java @@ -22,7 +22,7 @@ public interface IGlobalResearchBranch * Get the base progress requirements for non-instant research on the branch. * @param depth The university level for the research. * @return The number of progress 'ticks' required to complete the research for the included depth. - * Each tick is (on average) 12.5 seconds, but this depends on researcher availability, time of minecraft day, and may be reduced by stored researcher time. + * Each tick is (on average) 25 seconds, but this depends on researcher availability and may be reduced by stored researcher time. */ int getBaseTime(final int depth); diff --git a/src/api/java/com/minecolonies/api/research/IResearchManager.java b/src/api/java/com/minecolonies/api/research/IResearchManager.java index 070718f8327..342e1e2b40f 100755 --- a/src/api/java/com/minecolonies/api/research/IResearchManager.java +++ b/src/api/java/com/minecolonies/api/research/IResearchManager.java @@ -1,11 +1,14 @@ package com.minecolonies.api.research; import com.minecolonies.api.research.effects.IResearchEffectManager; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.block.Block; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; +import java.util.Set; + /** * Research manager of the colony holding the tree and effects. */ @@ -25,6 +28,14 @@ public interface IResearchManager */ void writeToNBT(@NotNull final CompoundTag statsCompound); + void sendPackets(Set closeSubscribers, Set newSubscribers); + + void markDirty(); + + boolean isDirty(); + + void clearDirty(); + /** * Get the instance of the researchTree. * diff --git a/src/api/java/com/minecolonies/api/research/util/ResearchConstants.java b/src/api/java/com/minecolonies/api/research/util/ResearchConstants.java index a3f7b5387fe..b23f3edd6ff 100755 --- a/src/api/java/com/minecolonies/api/research/util/ResearchConstants.java +++ b/src/api/java/com/minecolonies/api/research/util/ResearchConstants.java @@ -17,7 +17,7 @@ public final class ResearchConstants /** * Base research time, default to 3h playtime. */ - public static final int BASE_RESEARCH_TIME = 60 * 60 / 25; + public static final int BASE_RESEARCH_TIME = 60 * 60 / 25 / 2; /** * Constants to write the research to NBT. @@ -139,7 +139,11 @@ public final class ResearchConstants public static final ResourceLocation KNIGHT_TAUNT = new ResourceLocation(Constants.MOD_ID, "effects/knighttauntmobsunlock"); public static final ResourceLocation FIRE_RES = new ResourceLocation(Constants.MOD_ID, "effects/minerfireresunlock"); public static final ResourceLocation ARROW_PIERCE = new ResourceLocation(Constants.MOD_ID, "effects/piercingarrowsunlock"); - public static final ResourceLocation PLANT_2 = new ResourceLocation(Constants.MOD_ID, "effects/plant2unlock"); + public static final ResourceLocation PLANTATION_LARGE = new ResourceLocation(Constants.MOD_ID, "effects/plantationlarge"); + public static final ResourceLocation PLANTATION_JUNGLE = new ResourceLocation(Constants.MOD_ID, "effects/plantationjungle"); + public static final ResourceLocation PLANTATION_SEA = new ResourceLocation(Constants.MOD_ID, "effects/plantationsea"); + public static final ResourceLocation PLANTATION_EXOTIC = new ResourceLocation(Constants.MOD_ID, "effects/plantationexotic"); + public static final ResourceLocation PLANTATION_NETHER = new ResourceLocation(Constants.MOD_ID, "effects/plantationnether"); public static final ResourceLocation BEEKEEP_2 = new ResourceLocation(Constants.MOD_ID, "effects/beekeep2unlock"); public static final ResourceLocation PLATE_ARMOR = new ResourceLocation(Constants.MOD_ID, "effects/platearmorunlock"); public static final ResourceLocation RAILS = new ResourceLocation(Constants.MOD_ID, "effects/railsunlock"); @@ -159,11 +163,18 @@ public final class ResearchConstants public static final ResourceLocation VACCINES = new ResourceLocation(Constants.MOD_ID, "effects/vaccines"); public static final ResourceLocation TELESCOPE = new ResourceLocation(Constants.MOD_ID, "effects/telescope"); public static final ResourceLocation STANDARD = new ResourceLocation(Constants.MOD_ID, "effects/standard"); - public static final ResourceLocation MORE_AIR = new ResourceLocation(Constants.MOD_ID, "effects/air"); - public static final ResourceLocation MIN_ORDER = new ResourceLocation(Constants.MOD_ID, "effects/min_order"); + //Recipe unlocks + public static final ResourceLocation THE_END = new ResourceLocation(Constants.MOD_ID, "effects/knowledgeoftheendunlock"); + public static final ResourceLocation THE_DEPTHS = new ResourceLocation(Constants.MOD_ID, "effects/knowledgeofthedepthsunlock"); + public static final ResourceLocation MORE_SCROLLS = new ResourceLocation(Constants.MOD_ID, "effects/morescrollsunlock"); + public static final ResourceLocation SIFTER_STRING = new ResourceLocation(Constants.MOD_ID, "effects/sifterstringunlock"); + public static final ResourceLocation SIFTER_FLINT = new ResourceLocation(Constants.MOD_ID, "effects/sifterflintunlock"); + public static final ResourceLocation SIFTER_IRON = new ResourceLocation(Constants.MOD_ID, "effects/sifterironunlock"); + public static final ResourceLocation SIFTER_DIAMOND = new ResourceLocation(Constants.MOD_ID, "effects/sifterdiamondunlock"); + /** * Private constructor to hide implicit public one. */ diff --git a/src/api/java/com/minecolonies/api/sounds/EventType.java b/src/api/java/com/minecolonies/api/sounds/EventType.java index f3cf25caedb..3f0d79bb401 100755 --- a/src/api/java/com/minecolonies/api/sounds/EventType.java +++ b/src/api/java/com/minecolonies/api/sounds/EventType.java @@ -5,22 +5,29 @@ */ public enum EventType { - GENERAL(0.2), - NOISE(2), - OFF_TO_BED(2), - BAD_WEATHER(2), - SATURATION_LOW(0.2), - SATURATION_HIGH(0.2), - BAD_HOUSING(0.2), - GREETING(2), - FAREWELL(2), - MISSING_EQUIPMENT(2), - HAPPY(0.2), - UNHAPPY(0.2), - SICKNESS(0.2), - INTERACTION(100), - SUCCESS(20), - DANGER(2); + GENERAL(0.2, "general"), + NOISE(2, "noise"), + OFF_TO_BED(2, "gotobed"), + BAD_WEATHER(2, "badweather"), + SATURATION_LOW(0.2, "lowsaturation"), + SATURATION_HIGH(0.2, "highsaturation"), + BAD_HOUSING(0.2, "badhousing"), + GOOD_HOUSING(0.2, "goodhousing"), + + GREETING(2, "greeting"), + FAREWELL(2, "farewell"), + MISSING_EQUIPMENT(2, "missingequipment"), + HAPPY(0.2, "happy"), + UNHAPPY(0.2, "unhappy"), + SICKNESS(0.2, "sick"), + INTERACTION(100, "interaction"), + SUCCESS(20, "success"), + DANGER(2, "danger"); + + /** + * The id of it. + */ + private final String id; /** * The chance for the sound to get played. @@ -32,9 +39,10 @@ public enum EventType * * @param chance the chance for the sound to be played. */ - EventType(final double chance) + EventType(final double chance, final String id) { this.chance = chance; + this.id = id; } /** @@ -46,4 +54,13 @@ public double getChance() { return chance; } + + /** + * Get the id. + * @return the id. + */ + public String getId() + { + return this.id; + } } diff --git a/src/api/java/com/minecolonies/api/sounds/ModSoundEvents.java b/src/api/java/com/minecolonies/api/sounds/ModSoundEvents.java index 0d10424d3b8..cd422d3f89f 100755 --- a/src/api/java/com/minecolonies/api/sounds/ModSoundEvents.java +++ b/src/api/java/com/minecolonies/api/sounds/ModSoundEvents.java @@ -1,7 +1,6 @@ package com.minecolonies.api.sounds; import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.entity.mobs.RaiderType; import com.minecolonies.api.util.Tuple; import com.minecolonies.api.util.constant.Constants; @@ -10,21 +9,24 @@ import net.minecraft.sounds.SoundEvent; import net.minecraftforge.registries.*; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; /** * Registering of sound events for our colony. */ public final class ModSoundEvents { + /** + * Citizen sound prefix. + */ + public static final String CITIZEN_SOUND_EVENT_PREFIX = "citizen."; + public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(Registry.SOUND_EVENT_REGISTRY, Constants.MOD_ID); /** * Map of sound events. */ - public static Map>> CITIZEN_SOUND_EVENTS = new HashMap<>(); + public static Map>>> CITIZEN_SOUND_EVENTS = new HashMap<>(); /** * Saw sound event. @@ -48,49 +50,34 @@ private ModSoundEvents() */ static { - for (final ResourceLocation job : ModJobs.getJobs()) + final List mainTypes = new ArrayList<>(ModJobs.getJobs()); + mainTypes.remove(ModJobs.placeHolder.getId()); + mainTypes.add(new ResourceLocation(Constants.MOD_ID, "unemployed")); + mainTypes.add(new ResourceLocation(Constants.MOD_ID, "visitor")); + mainTypes.add(new ResourceLocation(Constants.MOD_ID, "child")); + + for (final ResourceLocation job : mainTypes) { - if (job.getNamespace().equals(Constants.MOD_ID) && !job.getPath().equals("placeholder")) + final Map>> map = new HashMap<>(); + for (final EventType event : EventType.values()) { - final Map> map = new HashMap<>(); - for (final EventType soundEvents : EventType.values()) + final List> individualSounds = new ArrayList<>(); + for (int i = 1; i <= 4; i++) { - final SoundEvent maleSoundEvent = ModSoundEvents.getSoundID("mob." + job.getPath() + ".male." + soundEvents.name().toLowerCase(Locale.US)); + final SoundEvent maleSoundEvent = + ModSoundEvents.getSoundID(CITIZEN_SOUND_EVENT_PREFIX + job.getPath() + ".male" + i + "." + event.getId()); final SoundEvent femaleSoundEvent = - ModSoundEvents.getSoundID("mob." + job.getPath() + ".female." + soundEvents.name().toLowerCase(Locale.US)); + ModSoundEvents.getSoundID(CITIZEN_SOUND_EVENT_PREFIX + job.getPath() + ".female" + i + "." + event.getId()); SOUND_EVENTS.register(maleSoundEvent.getLocation().getPath(), () -> maleSoundEvent); - SOUND_EVENTS.register(femaleSoundEvent.getLocation().getPath(), () -> femaleSoundEvent); - map.put(soundEvents, new Tuple<>(maleSoundEvent, femaleSoundEvent)); + SOUND_EVENTS.register(femaleSoundEvent.getLocation().getPath(), () -> femaleSoundEvent); + individualSounds.add(new Tuple<>(maleSoundEvent, femaleSoundEvent)); } - CITIZEN_SOUND_EVENTS.put(job.getPath(), map); + map.put(event, individualSounds); } + CITIZEN_SOUND_EVENTS.put(job.getPath(), map); } - final Map> citizenMap = new HashMap<>(); - for (final EventType soundEvents : EventType.values()) - { - final SoundEvent maleSoundEvent = ModSoundEvents.getSoundID("mob.citizen.male." + soundEvents.name().toLowerCase(Locale.US)); - final SoundEvent femaleSoundEvent = ModSoundEvents.getSoundID("mob.citizen.female." + soundEvents.name().toLowerCase(Locale.US)); - - SOUND_EVENTS.register(maleSoundEvent.getLocation().getPath(), () -> maleSoundEvent); - SOUND_EVENTS.register(femaleSoundEvent.getLocation().getPath(), () -> femaleSoundEvent); - citizenMap.put(soundEvents, new Tuple<>(maleSoundEvent, femaleSoundEvent)); - } - CITIZEN_SOUND_EVENTS.put("citizen", citizenMap); - - final Map> childMap = new HashMap<>(); - for (final EventType soundEvents : EventType.values()) - { - final SoundEvent maleSoundEvent = ModSoundEvents.getSoundID("mob.child.male." + soundEvents.name().toLowerCase(Locale.US)); - final SoundEvent femaleSoundEvent = ModSoundEvents.getSoundID("mob.child.female." + soundEvents.name().toLowerCase(Locale.US)); - - SOUND_EVENTS.register(maleSoundEvent.getLocation().getPath(), () -> maleSoundEvent); - SOUND_EVENTS.register(femaleSoundEvent.getLocation().getPath(), () -> femaleSoundEvent); - childMap.put(soundEvents, new Tuple<>(maleSoundEvent, femaleSoundEvent)); - } - CITIZEN_SOUND_EVENTS.put("child", childMap); - SOUND_EVENTS.register(TavernSounds.tavernTheme.getLocation().getPath(), () -> TavernSounds.tavernTheme); for (final RaiderType raiderType : RaiderType.values()) diff --git a/src/api/java/com/minecolonies/api/tileentities/AbstractScarecrowTileEntity.java b/src/api/java/com/minecolonies/api/tileentities/AbstractScarecrowTileEntity.java deleted file mode 100755 index 503344d445a..00000000000 --- a/src/api/java/com/minecolonies/api/tileentities/AbstractScarecrowTileEntity.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.minecolonies.api.tileentities; - -import com.minecolonies.api.colony.IColonyView; -import com.minecolonies.api.util.WorldUtil; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.items.IItemHandler; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public abstract class AbstractScarecrowTileEntity extends BlockEntity implements MenuProvider -{ - - /** - * Default constructor. - */ - public AbstractScarecrowTileEntity(final BlockPos pos, final BlockState state) - { - super(MinecoloniesTileEntities.SCARECROW.get(), pos, state); - } - - /** - * Checks if a certain position is part of the field. Complies with the definition of field block. - * - * @param world the world object. - * @param position the position. - * @return true if it is. - */ - public abstract boolean isNoPartOfField(@NotNull Level world, @NotNull BlockPos position); - - /** - * Returns the {@link BlockPos} of the current object, also used as ID. - * - * @return {@link BlockPos} of the current object. - */ - public abstract BlockPos getID(); - - /** - * Has the field been taken? - * - * @return true if the field is not free to use, false after releasing it. - */ - public abstract boolean isTaken(); - - /** - * Sets the field taken. - * - * @param taken is field free or not - */ - public abstract void setTaken(boolean taken); - - public abstract void nextState(); - - /** - * Checks if the field has been planted. - * - * @return true if there are crops planted. - */ - public abstract ScarecrowFieldStage getFieldStage(); - - /** - * Sets if there are any crops planted. - * - * @param fieldStage true after planting, false after harvesting. - */ - public abstract void setFieldStage(ScarecrowFieldStage fieldStage); - - /** - * Checks if the field needs work (planting, hoeing). - * - * @return true if so. - */ - public abstract boolean needsWork(); - - @Override - public void setChanged() - { - if (level != null) - { - WorldUtil.markChunkDirty(level, worldPosition); - } - } - - /** - * Sets that the field needs work. - * - * @param needsWork true if work needed, false after completing the job. - */ - public abstract void setNeedsWork(boolean needsWork); - - /** - * Getter of the seed of the field. - * - * @return the ItemSeed - */ - @Nullable - public abstract ItemStack getSeed(); - - /** - * Location getter. - * - * @return the location of the scarecrow of the field. - */ - public abstract BlockPos getPosition(); - - /** - * Getter of the owner of the field. - * - * @return the string description of the citizen. - */ - @NotNull - public abstract String getOwner(); - - /** - * Sets the owner of the field. - * - * @param ownerId the id of the citizen. - */ - public abstract void setOwner(@NotNull int ownerId); - - /** - * Getter for the ownerId of the field. - * - * @return the int id. - */ - public abstract int getOwnerId(); - - /** - * Sets the owner of the field. - * - * @param ownerId the name of the citizen. - * @param tempColony the colony view. - */ - public abstract void setOwner(int ownerId, IColonyView tempColony); - - /** - * Get the inventory of the scarecrow. - * - * @return the IItemHandler. - */ - public abstract IItemHandler getInventory(); - - /** - * Returns the type of the scarecrow (Important for the rendering). - * - * @return the enum type. - */ - public abstract ScareCrowType getScarecrowType(); - - /** - * @param direction the direction to get the range for - * @return the number of blocks away from the scarecrow the farmer will work with in that direction - */ - public abstract int getRadius(Direction direction); - - /** - * Sets the radius of the field plot the farmer works with - * @param direction the direction for the radius - * @param radius the number of blocks from the scarecrow that the farmer will work with - */ - public abstract void setRadius(Direction direction, int radius); -} diff --git a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityNamedGrave.java b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityNamedGrave.java index c277f1448fa..27cc1682f3d 100644 --- a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityNamedGrave.java +++ b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityNamedGrave.java @@ -54,7 +54,7 @@ public void load(final CompoundTag compound) super.load(compound); textLines.clear(); - if (compound.getAllKeys().contains(TAG_CONTENT)) + if (compound.contains(TAG_CONTENT)) { final ListTag lines = compound.getList(TAG_CONTENT, TAG_STRING); for (int i = 0; i < lines.size(); i++) diff --git a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityPlantationField.java b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityPlantationField.java new file mode 100644 index 00000000000..a7820a5d9a8 --- /dev/null +++ b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityPlantationField.java @@ -0,0 +1,82 @@ +package com.minecolonies.api.tileentities; + +import com.ldtteam.structurize.api.util.IRotatableBlockEntity; +import com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; + +/** + * The abstract implementation for plantation field tile entities. + */ +public abstract class AbstractTileEntityPlantationField extends BlockEntity implements IBlueprintDataProviderBE, IRotatableBlockEntity +{ + /** + * Default method. + * + * @param entityType the entity type. + * @param pos the positions this tile entity is at. + * @param state the state the entity is in. + */ + protected AbstractTileEntityPlantationField(final BlockEntityType entityType, final BlockPos pos, final BlockState state) + { + super(entityType, pos, state); + } + + /** + * The field type of this plantation. + * + * @return the field type. + */ + public abstract Set getPlantationFieldTypes(); + + /** + * The working positions stored in this field. + * + * @param tag the tag to search for. + * @return a list of working positions. + */ + public abstract List getWorkingPositions(String tag); + + /** + * The colony this field is located in. + * + * @return the colony instance. + */ + public abstract IColony getCurrentColony(); + + /** + * Get the dimension this plantation field is placed in. + * + * @return the dimension key. + */ + @Nullable + public abstract ResourceKey getDimension(); + + @Nullable + @Override + public abstract ClientboundBlockEntityDataPacket getUpdatePacket(); + + /** + * Get the rotation of the controller. + * @return the placed rotation. + */ + public abstract Rotation getRotation(); + + /** + * Get the mirroring setting of the controller. + * @return true if mirrored. + */ + public abstract boolean getMirror(); +} \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityRack.java b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityRack.java index 0195ad300f7..782a95e9d97 100755 --- a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityRack.java +++ b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityRack.java @@ -1,7 +1,5 @@ package com.minecolonies.api.tileentities; -import com.minecolonies.api.blocks.AbstractBlockMinecoloniesRack; -import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; @@ -25,21 +23,6 @@ public abstract class AbstractTileEntityRack extends BlockEntity implements MenuProvider { - /** - * Variable which determines if it is a single or doublechest. - */ - protected boolean single = true; - - /** - * Neighbor position of the rack (double chest). - */ - protected BlockPos relativeNeighbor = null; - - /** - * Is this the main chest of the doubleChest. - */ - protected boolean main = false; - /** * whether this rack is in a warehouse or not. defaults to not set by the warehouse building upon being built */ @@ -161,6 +144,7 @@ public void updateWarehouseIfAvailable(final ItemStack stack) if (building != null) { building.overruleNextOpenRequestWithStack(stack); + building.markDirty(); } } } @@ -282,93 +266,8 @@ public void setBuildingPos(final BlockPos pos) */ public abstract boolean isEmpty(); - /** - * Method to change the main attribute of the rack. - * - * @param main the boolean value defining it. - */ - public void setMain(final boolean main) - { - this.main = main; - setChanged(); - } - - /** - * On neighbor changed this will be called from the block. - * - * @param newNeighbor the blockPos which has changed. - */ - public void neighborChanged(final BlockPos newNeighbor) - { - if (level == null) - { - return; - } - - final BlockEntity entity = level.getBlockEntity(newNeighbor); - - if (relativeNeighbor == null && level.getBlockState(newNeighbor).getBlock() instanceof AbstractBlockMinecoloniesRack - && !(entity instanceof AbstractTileEntityRack && ((AbstractTileEntityRack) entity).getOtherChest() != null)) - { - if (!setNeighbor(newNeighbor)) - { - return; - } - - setSingle(false); - if (entity instanceof AbstractTileEntityRack) - { - if (!((AbstractTileEntityRack) entity).isMain()) - { - this.main = true; - ((AbstractTileEntityRack) entity).setMain(false); - } - ((AbstractTileEntityRack) entity).setNeighbor(this.getBlockPos()); - - entity.setChanged(); - } - - updateItemStorage(); - this.setChanged(); - updateBlockState(); - } - else if (relativeNeighbor != null && this.worldPosition.subtract(relativeNeighbor).equals(newNeighbor) - && level.getBlockState(newNeighbor).getBlock() != ModBlocks.blockRack) - { - this.relativeNeighbor = null; - setSingle(true); - this.main = false; - updateItemStorage(); - updateBlockState(); - } - } - - /** - * Set the rack as single (or unset). - * - * @param single if so. - */ - public void setSingle(final boolean single) - { - this.single = single; - } - - /** - * Check if this is the main chest of the double chest. - * - * @return true if so. - */ - public boolean isMain() - { - return this.main; - } - public IItemHandlerModifiable getInventory() { return inventory; } - - public abstract BlockPos getNeighbor(); - - public abstract boolean setNeighbor(BlockPos neighbor); } diff --git a/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityScarecrow.java b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityScarecrow.java new file mode 100644 index 00000000000..7922f8d37ae --- /dev/null +++ b/src/api/java/com/minecolonies/api/tileentities/AbstractTileEntityScarecrow.java @@ -0,0 +1,34 @@ +package com.minecolonies.api.tileentities; + +import com.minecolonies.api.colony.IColony; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +/** + * The abstract implementation for farmer field tile entities. + */ +public abstract class AbstractTileEntityScarecrow extends BlockEntity +{ + /** + * Default constructor. + */ + protected AbstractTileEntityScarecrow(final BlockPos pos, final BlockState state) + { + super(MinecoloniesTileEntities.SCARECROW.get(), pos, state); + } + + /** + * Returns the type of the scarecrow (Important for the rendering). + * + * @return the enum type. + */ + public abstract ScareCrowType getScarecrowType(); + + /** + * The colony this field is located in. + * + * @return the colony instance. + */ + public abstract IColony getCurrentColony(); +} diff --git a/src/api/java/com/minecolonies/api/tileentities/MinecoloniesTileEntities.java b/src/api/java/com/minecolonies/api/tileentities/MinecoloniesTileEntities.java index abe1300ecae..4fa0a529eb2 100755 --- a/src/api/java/com/minecolonies/api/tileentities/MinecoloniesTileEntities.java +++ b/src/api/java/com/minecolonies/api/tileentities/MinecoloniesTileEntities.java @@ -6,7 +6,9 @@ public class MinecoloniesTileEntities { - public static RegistryObject> SCARECROW; + public static RegistryObject> SCARECROW; + + public static RegistryObject> PLANTATION_FIELD; public static RegistryObject> BARREL; diff --git a/src/api/java/com/minecolonies/api/tileentities/ScarecrowFieldStage.java b/src/api/java/com/minecolonies/api/tileentities/ScarecrowFieldStage.java deleted file mode 100755 index 80cc827f026..00000000000 --- a/src/api/java/com/minecolonies/api/tileentities/ScarecrowFieldStage.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.minecolonies.api.tileentities; - -/** - * Describes the stage the field is in. Like if it has been hoed, planted or is empty. - */ -public enum ScarecrowFieldStage -{ - EMPTY, - HOED, - PLANTED -} diff --git a/src/api/java/com/minecolonies/api/tileentities/TileEntityColonyBuilding.java b/src/api/java/com/minecolonies/api/tileentities/TileEntityColonyBuilding.java index 68d30ac9ed0..be8c7a70ac4 100755 --- a/src/api/java/com/minecolonies/api/tileentities/TileEntityColonyBuilding.java +++ b/src/api/java/com/minecolonies/api/tileentities/TileEntityColonyBuilding.java @@ -4,6 +4,7 @@ import com.ldtteam.structurize.storage.StructurePackMeta; import com.ldtteam.structurize.storage.StructurePacks; import com.ldtteam.structurize.util.BlockInfo; +import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.blocks.AbstractBlockHut; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; @@ -349,7 +350,7 @@ public IBuildingView getBuildingView() public void load(@NotNull final CompoundTag compound) { super.load(compound); - if (compound.getAllKeys().contains(TAG_COLONY)) + if (compound.contains(TAG_COLONY)) { colonyId = compound.getInt(TAG_COLONY); } @@ -383,7 +384,7 @@ public void load(@NotNull final CompoundTag compound) final List tags = new ArrayList<>(getPositionedTags().getOrDefault(BlockPos.ZERO, new ArrayList<>())); if (!tags.isEmpty()) { - tags.remove("deactivated"); + tags.remove(DEACTIVATED); if (!tags.isEmpty()) { packName = BlueprintMapping.getStyleMapping(tags.get(0)); @@ -417,7 +418,6 @@ else if (StructurePacks.selectedPack != null) registryName = new ResourceLocation(compound.getString(TAG_BUILDING_TYPE)); } buildingPos = worldPosition; - single = true; } @Override @@ -558,13 +558,11 @@ public String getBlueprintPath() @Override public ResourceLocation getBuildingName() { - return registryName; - } - - @Override - public boolean isMain() - { - return true; + if (registryName != null && !registryName.getPath().isEmpty()) + { + return registryName; + } + return getBlockState().getBlock() instanceof AbstractBlockHut ? ((AbstractBlockHut) getBlockState().getBlock()).getBuildingEntry().getRegistryName() : null; } @Override @@ -573,12 +571,6 @@ public void updateBlockState() // Do nothing } - @Override - public void setSingle(final boolean single) - { - // Do nothing, these are always single! - } - @NotNull @Override public LazyOptional getCapability(@NotNull final Capability capability, @Nullable final Direction side) @@ -638,7 +630,7 @@ public void reactivate() tags.remove(DEACTIVATED); if (tags.isEmpty()) { - Log.getLogger().error("Couldn't reactivate building because it's missing the essential tag data."); + this.pendingBlueprintFuture = StructurePacks.getBlueprintFuture(this.packMeta, this.path); return; } @@ -646,11 +638,11 @@ public void reactivate() String tagName = tags.get(0); final String blueprintPath; final String packName; - if (tagName.contains(":")) + if (tagName.contains("/")) { - final String[] split = tagName.split(":"); + final String[] split = tagName.split("/"); packName = split[0]; - blueprintPath = split[1]; + blueprintPath = tagName.replace(packName, ""); } else { @@ -659,6 +651,12 @@ public void reactivate() blueprintPath = BlueprintMapping.getPathMapping(tagName, this.getSchematicName().substring(0, this.getSchematicName().length() - 1)) + level + ".blueprint"; } + if (!StructurePacks.hasPack(packName)) + { + this.pendingBlueprintFuture = StructurePacks.getBlueprintFuture(this.packMeta, this.path); + return; + } + this.setStructurePack(StructurePacks.getStructurePack(packName)); this.pendingBlueprintFuture = StructurePacks.getBlueprintFuture(packName, blueprintPath); } diff --git a/src/api/java/com/minecolonies/api/tileentities/TileEntityGrave.java b/src/api/java/com/minecolonies/api/tileentities/TileEntityGrave.java index dcd7f5ac652..1a487449626 100644 --- a/src/api/java/com/minecolonies/api/tileentities/TileEntityGrave.java +++ b/src/api/java/com/minecolonies/api/tileentities/TileEntityGrave.java @@ -143,7 +143,7 @@ public void load(final CompoundTag compound) decay_timer = compound.contains(TAG_DECAY_TIMER) ? compound.getInt(TAG_DECAY_TIMER) : DEFAULT_DECAY_TIMER; decayed = compound.contains(TAG_DECAYED) ? compound.getBoolean(TAG_DECAYED) :false; - if (compound.getAllKeys().contains(TAG_GRAVE_DATA)) + if (compound.contains(TAG_GRAVE_DATA)) { graveData = new GraveData(); graveData.read(compound.getCompound(TAG_GRAVE_DATA)); diff --git a/src/api/java/com/minecolonies/api/tileentities/TileEntityRack.java b/src/api/java/com/minecolonies/api/tileentities/TileEntityRack.java index 5d05521b3a4..a5899af2c10 100755 --- a/src/api/java/com/minecolonies/api/tileentities/TileEntityRack.java +++ b/src/api/java/com/minecolonies/api/tileentities/TileEntityRack.java @@ -1,7 +1,11 @@ package com.minecolonies.api.tileentities; -import com.ldtteam.structurize.api.util.IRotatableBlockEntity; +import com.google.common.collect.ImmutableList; +import com.ldtteam.domumornamentum.client.model.data.MaterialTextureData; +import com.ldtteam.domumornamentum.client.model.properties.ModProperties; +import com.ldtteam.domumornamentum.entity.block.IMateriallyTexturedBlockEntity; import com.minecolonies.api.blocks.AbstractBlockMinecoloniesRack; +import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.blocks.types.RackType; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.inventory.api.CombinedItemHandler; @@ -16,15 +20,19 @@ import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.EmptyBlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; @@ -34,8 +42,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.function.Predicate; import static com.minecolonies.api.util.constant.Constants.*; @@ -45,7 +52,7 @@ /** * Tile entity for the warehouse shelves. */ -public class TileEntityRack extends AbstractTileEntityRack implements IRotatableBlockEntity +public class TileEntityRack extends AbstractTileEntityRack implements IMateriallyTexturedBlockEntity { /** * All Racks current version id @@ -77,6 +84,40 @@ public class TileEntityRack extends AbstractTileEntityRack implements IRotatable */ private LazyOptional lastOptional; + /** + * Static texture mappings + */ + private static final List textureMapping = ImmutableList.builder() + .add(new ResourceLocation("block/bricks")) + .add(new ResourceLocation("block/sand")) + .add(new ResourceLocation("block/orange_wool")) + .add(new ResourceLocation("block/dirt")) + .add(new ResourceLocation("block/obsidian")) + .add(new ResourceLocation("block/polished_andesite")) + .add(new ResourceLocation("block/andesite")) + .add(new ResourceLocation("block/blue_wool")).build(); + + private static final List secondarytextureMapping = ImmutableList.builder() + .add(new ResourceLocation("block/oak_log")) + .add(new ResourceLocation("block/spruce_log")) + .add(new ResourceLocation("block/birch_log")) + .add(new ResourceLocation("block/jungle_log")) + .add(new ResourceLocation("block/acacia_log")) + .add(new ResourceLocation("block/dark_oak_log")) + .add(new ResourceLocation("block/mangrove_log")) + .add(new ResourceLocation("block/crimson_stem")) + .build(); + + /** + * Cached resmap. + */ + private MaterialTextureData textureDataCache = new MaterialTextureData(); + + /** + * If we did a double check after startup. + */ + private boolean checkedAfterStartup = false; + /** * Create a new rack. * @param type the specific block entity type. @@ -138,6 +179,12 @@ public int getCount(final ItemStack stack, final boolean ignoreDamageValue, fina return getCount(checkItem); } + @Override + protected void updateBlockState() + { + + } + @Override public int getCount(final ItemStorage storage) { @@ -240,12 +287,32 @@ public void updateItemStorage() { if (level != null && !level.isClientSide) { - final boolean empty = content.isEmpty(); + final boolean beforeEmpty = content.isEmpty(); updateContent(); - - if ((empty && !content.isEmpty()) || !empty && content.isEmpty()) + if (getBlockState().getBlock() == ModBlocks.blockRack) { - updateBlockState(); + boolean afterEmpty = content.isEmpty(); + @Nullable final BlockEntity potentialNeighbor = getOtherChest(); + if (potentialNeighbor instanceof TileEntityRack && !((TileEntityRack) potentialNeighbor).isEmpty()) + { + afterEmpty = false; + } + + if ((beforeEmpty && !afterEmpty) || (!beforeEmpty && afterEmpty)) + { + level.setBlockAndUpdate(getBlockPos(), + getBlockState().setValue(AbstractBlockMinecoloniesRack.VARIANT, + getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT).getInvBasedVariant(afterEmpty))); + + + if (potentialNeighbor != null) + { + level.setBlockAndUpdate(potentialNeighbor.getBlockPos(), + potentialNeighbor.getBlockState() + .setValue(AbstractBlockMinecoloniesRack.VARIANT, + potentialNeighbor.getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT).getInvBasedVariant(afterEmpty))); + } + } } setChanged(); } @@ -279,99 +346,25 @@ private void updateContent() } @Override - public void updateBlockState() + public AbstractTileEntityRack getOtherChest() { - if (level != null && level.getBlockState(worldPosition).getBlock() instanceof AbstractBlockMinecoloniesRack) + if (level == null || getBlockState().getBlock() != ModBlocks.blockRack) { - if (!main && !single && getOtherChest() != null && !getOtherChest().isMain()) - { - setMain(true); - } - - if (main || single) - { - final BlockState typeHere; - final BlockState typeNeighbor; - if (content.isEmpty() && (getOtherChest() == null || getOtherChest().isEmpty())) - { - if (getOtherChest() != null && level.getBlockState(this.worldPosition.subtract(relativeNeighbor)).getBlock() instanceof AbstractBlockMinecoloniesRack) - { - final Direction dirToNeighbour = BlockPosUtil.getFacing(worldPosition, this.worldPosition.subtract(relativeNeighbor)); - typeHere = level.getBlockState(worldPosition) - .setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.EMPTYAIR) - .setValue(AbstractBlockMinecoloniesRack.FACING, dirToNeighbour); - typeNeighbor = level.getBlockState(this.worldPosition.subtract(relativeNeighbor)).setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.DEFAULTDOUBLE) - .setValue(AbstractBlockMinecoloniesRack.FACING, dirToNeighbour.getOpposite()); - } - else - { - typeHere = level.getBlockState(worldPosition).setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.DEFAULT); - typeNeighbor = null; - } - } - else - { - if (getOtherChest() != null && level.getBlockState(this.worldPosition.subtract(relativeNeighbor)).getBlock() instanceof AbstractBlockMinecoloniesRack) - { - final Direction dirToNeighbour = BlockPosUtil.getFacing(worldPosition, this.worldPosition.subtract(relativeNeighbor)); - typeHere = level.getBlockState(worldPosition) - .setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.EMPTYAIR) - .setValue(AbstractBlockMinecoloniesRack.FACING, dirToNeighbour); - - typeNeighbor = level.getBlockState(this.worldPosition.subtract(relativeNeighbor)).setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.FULLDOUBLE) - .setValue(AbstractBlockMinecoloniesRack.FACING, dirToNeighbour.getOpposite()); - } - else - { - typeHere = level.getBlockState(worldPosition).setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.FULL); - typeNeighbor = null; - } - } - - // This here avoids that two racks can be main at the same time. - if (this.isMain() && getOtherChest() != null && getOtherChest().isMain()) - { - getOtherChest().setMain(false); - } - - if (!level.getBlockState(worldPosition).equals(typeHere)) - { - level.setBlockAndUpdate(worldPosition, typeHere); - } - if (typeNeighbor != null) - { - if (!level.getBlockState(this.worldPosition.subtract(relativeNeighbor)).equals(typeNeighbor)) - { - level.setBlockAndUpdate(this.worldPosition.subtract(relativeNeighbor), typeNeighbor); - } - } - } - else - { - getOtherChest().updateBlockState(); - } + return null; } - } - @Override - public AbstractTileEntityRack getOtherChest() - { - if (relativeNeighbor == null || level == null) + final RackType type = getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT); + if (!type.isDoubleVariant()) { return null; } - final BlockEntity tileEntity = level.getBlockEntity(worldPosition.subtract(relativeNeighbor)); + + final BlockEntity tileEntity = level.getBlockEntity(worldPosition.relative(getBlockState().getValue(AbstractBlockMinecoloniesRack.FACING))); if (tileEntity instanceof TileEntityRack && !(tileEntity instanceof AbstractTileEntityColonyBuilding)) { - if (!this.getBlockPos().equals(((TileEntityRack) tileEntity).getNeighbor())) - { - ((AbstractTileEntityRack) tileEntity).setNeighbor(this.getBlockPos()); - } return (AbstractTileEntityRack) tileEntity; } - setSingle(true); - relativeNeighbor = null; return null; } @@ -391,29 +384,12 @@ public boolean isEmpty() public void load(final CompoundTag compound) { super.load(compound); - if (compound.getAllKeys().contains(TAG_SIZE)) + if (compound.contains(TAG_SIZE)) { size = compound.getInt(TAG_SIZE); inventory = createInventory(DEFAULT_SIZE + size * SLOT_PER_LINE); } - if (compound.getAllKeys().contains(TAG_RELATIVE_NEIGHBOR)) - { - relativeNeighbor = BlockPosUtil.read(compound, TAG_RELATIVE_NEIGHBOR); - } - - if (relativeNeighbor != null) - { - if (relativeNeighbor.getY() != 0) - { - relativeNeighbor = null; - } - else - { - setSingle(false); - } - } - final ListTag inventoryTagList = compound.getList(TAG_INVENTORY, TAG_COMPOUND); for (int i = 0; i < inventoryTagList.size(); i++) { @@ -425,7 +401,6 @@ public void load(final CompoundTag compound) } } - main = compound.getBoolean(TAG_MAIN); updateContent(); this.inWarehouse = compound.getBoolean(TAG_IN_WAREHOUSE); @@ -436,6 +411,11 @@ public void load(final CompoundTag compound) version = compound.getByte(TAG_VERSION); invalidateCap(); + + if (level != null && level.isClientSide) + { + refreshTextureCache(); + } } @Override @@ -443,11 +423,6 @@ public void saveAdditional(final CompoundTag compound) { super.saveAdditional(compound); compound.putInt(TAG_SIZE, size); - - if (relativeNeighbor != null) - { - BlockPosUtil.write(compound, TAG_RELATIVE_NEIGHBOR, relativeNeighbor); - } @NotNull final ListTag inventoryTagList = new ListTag(); for (int slot = 0; slot < inventory.getSlots(); slot++) { @@ -464,7 +439,6 @@ public void saveAdditional(final CompoundTag compound) inventoryTagList.add(inventoryCompound); } compound.put(TAG_INVENTORY, inventoryTagList); - compound.putBoolean(TAG_MAIN, main); compound.putBoolean(TAG_IN_WAREHOUSE, inWarehouse); BlockPosUtil.write(compound, TAG_POS, buildingPos); compound.putByte(TAG_VERSION, version); @@ -495,35 +469,12 @@ public void handleUpdateTag(final CompoundTag tag) this.load(tag); } - @Override - public void rotate(final Rotation rotationIn) - { - if (relativeNeighbor != null) - { - relativeNeighbor = relativeNeighbor.rotate(rotationIn); - } - } - - @Override - public void mirror(final Mirror mirror) - { - if (relativeNeighbor != null) - { - switch (mirror) - { - case LEFT_RIGHT -> relativeNeighbor = new BlockPos(relativeNeighbor.getX(), relativeNeighbor.getY(), -relativeNeighbor.getZ()); - case FRONT_BACK -> relativeNeighbor = new BlockPos(-relativeNeighbor.getX(), relativeNeighbor.getY(), relativeNeighbor.getZ()); - } - } - } - @Nonnull @Override public LazyOptional getCapability(@Nonnull final Capability capability, final Direction dir) { if (version != VERSION) { - updateBlockState(); version = VERSION; } @@ -534,7 +485,22 @@ public LazyOptional getCapability(@Nonnull final Capability capability return lastOptional.cast(); } - if (single) + if (getBlockState().getBlock() != ModBlocks.blockRack) + { + lastOptional = LazyOptional.of(() -> + { + if (this.isRemoved()) + { + return new RackInventory(0); + } + + return new CombinedItemHandler(RACK, getInventory()); + }); + return lastOptional.cast(); + } + + final RackType type = getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT); + if (!type.isDoubleVariant()) { lastOptional = LazyOptional.of(() -> { @@ -562,7 +528,7 @@ public LazyOptional getCapability(@Nonnull final Capability capability return new CombinedItemHandler(RACK, getInventory()); } - if (main) + if (type != RackType.EMPTYAIR) { return new CombinedItemHandler(RACK, getInventory(), other.getInventory()); } @@ -578,15 +544,6 @@ public LazyOptional getCapability(@Nonnull final Capability capability return super.getCapability(capability, dir); } - @Override - public BlockPos getNeighbor() - { - if (relativeNeighbor == null) - { - return null; - } - return worldPosition.subtract(relativeNeighbor); - } @Override public int getUpgradeSize() @@ -594,32 +551,13 @@ public int getUpgradeSize() return size; } - @Override - public boolean setNeighbor(final BlockPos neighbor) - { - if (neighbor == null) - { - setSingle(true); - this.relativeNeighbor = null; - setChanged(); - } - // Only allow horizontal neighbor's - else if (this.worldPosition.subtract(neighbor).getY() == 0) - { - this.relativeNeighbor = this.worldPosition.subtract(neighbor); - setSingle(false); - setChanged(); - return true; - } - return false; - } - @Override public void setChanged() { if (level != null) { WorldUtil.markChunkDirty(level, worldPosition); + super.setChanged(); } } @@ -627,6 +565,7 @@ public void setChanged() @Override public AbstractContainerMenu createMenu(final int id, @NotNull final Inventory inv, @NotNull final Player player) { + refreshTextureCache(); return new ContainerRack(id, inv, getBlockPos(), getOtherChest() == null ? BlockPos.ZERO : getOtherChest().getBlockPos()); } @@ -637,26 +576,6 @@ public Component getDisplayName() return Component.literal("Rack"); } - @Override - public void setMain(final boolean main) - { - if (main != this.main) - { - invalidateCap(); - super.setMain(main); - } - } - - @Override - public void setSingle(final boolean single) - { - if (single != this.single) - { - invalidateCap(); - super.setSingle(single); - } - } - @Override public void setRemoved() { @@ -677,12 +596,171 @@ private void invalidateCap() lastOptional = null; } + @Override + public void updateTextureDataWith(final MaterialTextureData materialTextureData) + { + // noop + } + /** - * Check if this is marked as a single rack. - * @return true if so. + * Refresh the texture mapping. */ - public boolean isSingle() + private void refreshTextureCache() + { + final Map resMap = new HashMap<>(); + final int displayPerSlots = this.getInventory().getSlots() / 4; + int index = 0; + boolean update = false; + boolean alreadyAddedItem = false; + + final HashMap mapCopy = new HashMap<>(content); + if (this.getOtherChest() instanceof TileEntityRack neighborRack) + { + for (final Map.Entry entry : neighborRack.content.entrySet()) + { + int value = entry.getValue() + mapCopy.getOrDefault(entry.getKey(), 0); + mapCopy.put(entry.getKey(), value); + } + } + final List> list = mapCopy.entrySet().stream().sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue())).toList(); + + final Queue extraBlockQueue = new ArrayDeque<>(); + final Queue itemQueue = new ArrayDeque<>(); + for (final Map.Entry entry : list) + { + // Need more solid checks! + if (index < textureMapping.size()) + { + Block block = Blocks.BARREL; + boolean isBlockItem = false; + if (entry.getKey().getItemStack().getItem() instanceof BlockItem blockItem) + { + block = blockItem.getBlock(); + isBlockItem = true; + } + + int displayRows = (int) Math.ceil((Math.max(1.0, (double) entry.getValue() / entry.getKey().getItemStack().getMaxStackSize())) / displayPerSlots); + if (displayRows > 1) + { + for (int i = 0; i < displayRows - 1; i++) + { + if (isBlockItem) + { + extraBlockQueue.add(block); + } + else + { + itemQueue.add(block); + } + } + } + + if (!isBlockItem) + { + if (alreadyAddedItem) + { + itemQueue.add(block); + continue; + } + else + { + alreadyAddedItem = true; + } + } + + if (entry.getValue() < 16 && !extraBlockQueue.isEmpty()) + { + block = extraBlockQueue.poll(); + } + + final ResourceLocation secondaryResLoc = secondarytextureMapping.get(index); + if (!block.defaultBlockState().isSolidRender(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)) + { + resMap.put(secondaryResLoc, block); + block = Blocks.BARREL; + } + else + { + resMap.put(secondaryResLoc, Blocks.AIR); + } + + final ResourceLocation resLoc = textureMapping.get(index); + resMap.put(resLoc, block); + + if (this.textureDataCache == null + || !this.textureDataCache.getTexturedComponents().getOrDefault(resLoc, Blocks.BEDROCK).equals(resMap.get(resLoc)) + || !this.textureDataCache.getTexturedComponents().getOrDefault(secondaryResLoc, Blocks.BEDROCK).equals(resMap.get(secondaryResLoc))) + { + update = true; + } + index++; + } + else + { + break; + } + } + + extraBlockQueue.addAll(itemQueue); + + for (int i = index; i < textureMapping.size(); i++) + { + Block block = Blocks.AIR; + if (!extraBlockQueue.isEmpty()) + { + block = extraBlockQueue.poll(); + } + + final ResourceLocation secondaryResLoc = secondarytextureMapping.get(i); + if (block != Blocks.AIR && !block.defaultBlockState().isSolidRender(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)) + { + resMap.put(secondaryResLoc, block); + block = Blocks.BARREL; + } + else + { + resMap.put(secondaryResLoc, Blocks.AIR); + } + + final ResourceLocation resLoc = textureMapping.get(i); + resMap.put(resLoc, block); + + if (this.textureDataCache == null + || !this.textureDataCache.getTexturedComponents().getOrDefault(resLoc, Blocks.BEDROCK).equals(resMap.get(resLoc)) + || !this.textureDataCache.getTexturedComponents().getOrDefault(secondaryResLoc, Blocks.BEDROCK).equals(resMap.get(secondaryResLoc))) + { + update = true; + } + } + + if (update) + { + this.textureDataCache = new MaterialTextureData(resMap); + this.requestModelDataUpdate(); + if (level != null) + { + level.sendBlockUpdated(getBlockPos(), Blocks.AIR.defaultBlockState(), getBlockState(), Block.UPDATE_ALL); + } + } + } + @NotNull + @Override + public ModelData getModelData() + { + if (!checkedAfterStartup && level != null) + { + checkedAfterStartup = true; + refreshTextureCache(); + } + + return ModelData.builder() + .with(ModProperties.MATERIAL_TEXTURE_PROPERTY, textureDataCache) + .build(); + } + + @Override + public @NotNull MaterialTextureData getTextureData() { - return this.single; + return textureDataCache; } } diff --git a/src/api/java/com/minecolonies/api/util/BlockPosUtil.java b/src/api/java/com/minecolonies/api/util/BlockPosUtil.java index 2073fba111b..b812d5a6cad 100755 --- a/src/api/java/com/minecolonies/api/util/BlockPosUtil.java +++ b/src/api/java/com/minecolonies/api/util/BlockPosUtil.java @@ -1,5 +1,6 @@ package com.minecolonies.api.util; +import com.minecolonies.api.colony.buildings.modules.IAltersBuildingFootprint; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -93,7 +94,7 @@ public static CompoundTag write(@NotNull final CompoundTag compound, final Strin } /** - * Writes a chunk coordinate to a CompoundNBT, but only if not null. + * Writes a chunk coordinate to a CompoundTag, but only if not null. * * @param compound Compound to write to. * @param name Name of the tag. @@ -182,7 +183,7 @@ public static BlockPos read(@NotNull final CompoundTag compound, final String na } /** - * Reads chunk coordinates from a CompoundNBT, but returns null if zero or absent. + * Reads chunk coordinates from a CompoundTag, but returns null if zero or absent. * * @param compound Compound to read data from. * @param name Tag name to read data from. @@ -701,6 +702,20 @@ public static Direction getXZFacing(final BlockPos pos, final BlockPos neighbor) return Direction.getNearest(vector.getX(), 0, vector.getZ()); } + + /** + * Get facing from x,y + * @param pos1X start-x + * @param pos1Z start-z + * @param pos2X end-x + * @param pos2Z end-z + * @return the direction. + */ + public static Direction getXZFacing(final int pos1X, final int pos1Z, final int pos2X, final int pos2Z) + { + return Direction.getNearest(pos1X - pos2X, 0, pos1Z - pos2Z); + } + /** * Calculates the direction a position is from the building. * @@ -795,14 +810,14 @@ public static Rotation getRotationFromRotations(final int rotations) * Returns the first air position near the given start. Advances vertically first then horizontally * * @param start start position - * @param vRange vertical search range - * @param hRange horizontal search range + * @param horizontalRange horizontal search range + * @param verticalRange vertical search range * @param predicate check predicate for the right block * @return position or null */ - public static BlockPos findAround(final Level world, final BlockPos start, final int vRange, final int hRange, final BiPredicate predicate) + public static BlockPos findAround(final Level world, final BlockPos start, final int verticalRange, final int horizontalRange, final BiPredicate predicate) { - if (vRange < 1 && hRange < 1) + if (horizontalRange < 1 && verticalRange < 1) { return null; } @@ -812,13 +827,21 @@ public static BlockPos findAround(final Level world, final BlockPos start, final return start; } + for (Direction direction : Direction.Plane.HORIZONTAL) + { + if (predicate.test(world, start.relative(direction))) + { + return start.relative(direction); + } + } + BlockPos temp; int y = 0; int y_offset = 1; - for (int i = 0; i < hRange + 2; i++) + for (int i = 0; i < verticalRange + 2; i++) { - for (int steps = 1; steps <= vRange; steps++) + for (int steps = 1; steps <= horizontalRange; steps++) { // Start topleft of middle point temp = start.offset(-steps, y, -steps); @@ -932,4 +955,53 @@ public static BlockPos getFurthestCorner(final BlockPos startPos, final BlockPos return new BlockPos(cornerX, cornerY, cornerZ); } + + /** + * Check if a location is within an area. + * @param cornerA the first corner. + * @param cornerB the second corner. + * @param location the location to check for. + * @return true if so. + */ + public static boolean isInArea(final BlockPos cornerA, final BlockPos cornerB, final BlockPos location) + { + int x1, x2, z1, z2, y1, y2; + + if (cornerA.getX() <= cornerB.getX()) + { + x1 = cornerA.getX(); + x2 = cornerB.getX(); + } + else + { + x2 = cornerA.getX(); + x1 = cornerB.getX(); + } + + if (cornerA.getZ() <= cornerB.getZ()) + { + z1 = cornerA.getZ(); + z2 = cornerB.getZ(); + } + else + { + z2 = cornerA.getZ(); + z1 = cornerB.getZ(); + } + + if (cornerA.getY() <= cornerB.getY()) + { + y1 = cornerA.getY(); + y2 = cornerB.getY(); + } + else + { + y2 = cornerA.getY(); + y1 = cornerB.getY(); + } + + return location.getX() >= x1 - 1 && location.getX() <= x2 + 1 + && location.getY() >= y1 - 1 && location.getY() <= y2 + 1 + && location.getZ() >= z1 - 1 && location.getZ() <= z2 + 1; + } } diff --git a/src/api/java/com/minecolonies/api/util/CraftingUtils.java b/src/api/java/com/minecolonies/api/util/CraftingUtils.java index 89413b2324d..6a1981e7c43 100755 --- a/src/api/java/com/minecolonies/api/util/CraftingUtils.java +++ b/src/api/java/com/minecolonies/api/util/CraftingUtils.java @@ -104,9 +104,30 @@ public static OptionalPredicate getProductValidatorBasedOnTags(@NotNu * @return a validator that checks the crafting ingredient tags. */ public static OptionalPredicate getIngredientValidatorBasedOnTags(@NotNull final String crafterJobName) + { + return getIngredientValidatorBasedOnTags(crafterJobName, false); + } + /** + * Generates an {@link OptionalPredicate} that reports whether a particular + * stack is allowed, banned, or undecided when used as a crafting ingredient + * by the specified job, based on the associated tags. + * + * @param crafterJobName The name of the crafting job (defines which tags to check). + * @param includeDoRules True if applying DO overrides + * @return a validator that checks the crafting ingredient tags. + */ + public static OptionalPredicate getIngredientValidatorBasedOnTags(@NotNull final String crafterJobName, boolean includeDoRules) { return stack -> { + if(includeDoRules) + { + final TagKey includedDoIngredients = ModTags.crafterDoIngredient.get(crafterJobName); + if (includedDoIngredients != null && stack.is(includedDoIngredients)) + { + return Optional.of(true); + } + } // Check against excluded ingredients final TagKey excludedIngredients = ModTags.crafterIngredientExclusions.get(crafterJobName); if (excludedIngredients != null && stack.is(excludedIngredients)) diff --git a/src/api/java/com/minecolonies/api/util/CreativeBuildingStructureHandler.java b/src/api/java/com/minecolonies/api/util/CreativeBuildingStructureHandler.java index 522c97f6f7d..f4fa5052dcc 100755 --- a/src/api/java/com/minecolonies/api/util/CreativeBuildingStructureHandler.java +++ b/src/api/java/com/minecolonies/api/util/CreativeBuildingStructureHandler.java @@ -1,8 +1,8 @@ package com.minecolonies.api.util; +import com.ldtteam.structurize.api.util.Log; import com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE; import com.ldtteam.structurize.blueprints.v1.Blueprint; -import com.ldtteam.structurize.api.util.Log; import com.ldtteam.structurize.management.Manager; import com.ldtteam.structurize.placement.StructurePlacer; import com.ldtteam.structurize.placement.structure.CreativeStructureHandler; @@ -14,29 +14,28 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; +import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.ItemTags; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.nio.file.Path; import java.util.List; import java.util.concurrent.Future; import static com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE.TAG_BLUEPRINTDATA; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_NAME; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_PACK; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * Minecolonies specific creative structure handler. Main difference related to registering blocks to colonies. @@ -101,7 +100,7 @@ public void triggerSuccess(final BlockPos pos, final List list, final if (teData != null && teData.contains(TAG_BLUEPRINTDATA)) { final BlockEntity te = getWorld().getBlockEntity(worldPos); - if (te != null) + if (te instanceof IBlueprintDataProviderBE blueprintDataProviderBE) { final CompoundTag tagData = teData.getCompound(TAG_BLUEPRINTDATA); final String schematicPath = tagData.getString(TAG_NAME); @@ -110,7 +109,12 @@ public void triggerSuccess(final BlockPos pos, final List list, final tagData.putString(TAG_NAME, location); tagData.putString(TAG_PACK, blueprint.getPackName()); - ((IBlueprintDataProviderBE) te).readSchematicDataFromNBT(teData); + if (te instanceof AbstractTileEntityColonyBuilding colonyBuilding && colonyBuilding.getBuilding() != null) + { + colonyBuilding.getBuilding().setDeconstructed(); + } + + blueprintDataProviderBE.readSchematicDataFromNBT(teData); ((ServerLevel) getWorld()).getChunkSource().blockChanged(worldPos); te.setChanged(); } diff --git a/src/api/java/com/minecolonies/api/util/EntityUtils.java b/src/api/java/com/minecolonies/api/util/EntityUtils.java index 5df5aaea628..30ab02d007c 100755 --- a/src/api/java/com/minecolonies/api/util/EntityUtils.java +++ b/src/api/java/com/minecolonies/api/util/EntityUtils.java @@ -1,7 +1,9 @@ package com.minecolonies.api.util; +import com.google.common.base.Predicates; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.entity.pathfinding.SurfaceType; import com.minecolonies.api.items.ModTags; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.state.BlockState; @@ -16,14 +18,18 @@ import net.minecraft.util.Mth; import net.minecraft.core.Vec3i; import net.minecraft.world.level.Level; +import net.minecraft.world.scores.Team; import net.minecraftforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.UUID; +import java.util.function.Predicate; import java.util.stream.Collectors; +import static net.minecraft.world.entity.EntitySelector.NO_SPECTATORS; + /** * Entity related utilities. */ @@ -192,7 +198,8 @@ private static boolean checkValidSpawn(@NotNull final BlockGetter world, final B } } - return world.getBlockState(pos.below()).getMaterial().isSolid() || world.getBlockState(pos.below(2)).getMaterial().isSolid(); + return SurfaceType.getSurfaceType(world, world.getBlockState(pos.below()), pos.below()) == SurfaceType.WALKABLE + || SurfaceType.getSurfaceType(world, world.getBlockState(pos.below(2)), pos.below(2)) == SurfaceType.WALKABLE; } @@ -333,4 +340,23 @@ public static boolean isFlying(final LivingEntity target) { return target != null && (target.hasImpulse || !target.isOnGround()) && target.fallDistance <= 0.1f && target.level.isEmptyBlock(target.blockPosition().below(2)); } + + /** + * Entity pushable by predicate. Cheaper version compared to mojank. + * @return The predicate. + */ + public static Predicate pushableBy() + { + return NO_SPECTATORS.and((localEntity) -> { + if (!localEntity.isPushable()) + { + return false; + } + else + { + return !localEntity.level.isClientSide || localEntity instanceof Player && ((Player) localEntity).isLocalPlayer(); + } + }); + } } + diff --git a/src/api/java/com/minecolonies/api/util/InventoryUtils.java b/src/api/java/com/minecolonies/api/util/InventoryUtils.java index 10bbb0d31e5..e491966e16e 100755 --- a/src/api/java/com/minecolonies/api/util/InventoryUtils.java +++ b/src/api/java/com/minecolonies/api/util/InventoryUtils.java @@ -266,8 +266,15 @@ public static int getItemCountInItemHandler(@Nullable final IItemHandler itemHan if (itemHandler == null) { Log.getLogger().error("This is not supposed to happen, please notify the developers!", new Exception("getItemCountInItemHandler got a null itemHandler")); + return 0; + } + + int count = 0; + for (final ItemStack stack : filterItemHandler(itemHandler, itemStackSelectionPredicate)) + { + count += stack.getCount(); } - return itemHandler == null ? 0 : filterItemHandler(itemHandler, itemStackSelectionPredicate).stream().mapToInt(ItemStackUtils::getSize).sum(); + return count; } public static int getItemCountInItemHandlers(@Nullable final Collection itemHandlers, @NotNull final Predicate itemStackPredicate) @@ -792,7 +799,7 @@ public static int hasBuildingEnoughElseCount(@NotNull final IBuilding provider, /** * Count the number of items of different types a building has. - * + * * @param provider the building to check. * @param stacks the stacks to check for. * @return Amount of occurrences of stacks that match the given stacks. @@ -2984,7 +2991,7 @@ public static int transferFoodUpToSaturation( if (!ItemStackUtils.isEmpty(stack) && foodPredicate.test(stack)) { // Found food - final FoodProperties itemFood = stack.getItem().getFoodProperties(); + final FoodProperties itemFood = stack.getItem().getFoodProperties(stack, null); if (itemFood == null) { continue; @@ -3171,4 +3178,25 @@ else if (entity instanceof TileEntityRack) return getItemCountInProvider(entity, itemStack -> !ItemStackUtils.isEmpty(itemStack) && ItemStackUtils.compareItemStacksIgnoreStackSize(itemStack, stack, true, true)) >= count; } + + public static List getBuildingInventory(final IBuilding building) + { + final Level world = building.getColony().getWorld(); + final List allInInv = new ArrayList<>(); + for (final BlockPos pos : building.getContainers()) + { + if (WorldUtil.isBlockLoaded(world, pos)) + { + final BlockEntity entity = world.getBlockEntity(pos); + if (entity instanceof TileEntityRack) + { + for (final ItemStorage storage : ((TileEntityRack) entity).getAllContent().keySet()) + { + allInInv.add(storage.getItemStack()); + } + } + } + } + return allInInv; + } } diff --git a/src/api/java/com/minecolonies/api/util/ItemStackUtils.java b/src/api/java/com/minecolonies/api/util/ItemStackUtils.java index 9aa4208222e..ba130d2c9e1 100755 --- a/src/api/java/com/minecolonies/api/util/ItemStackUtils.java +++ b/src/api/java/com/minecolonies/api/util/ItemStackUtils.java @@ -6,12 +6,14 @@ import com.minecolonies.api.compatibility.Compatibility; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.items.CheckedNbtKey; import com.minecolonies.api.items.ModItems; import com.minecolonies.api.util.constant.IToolType; import com.minecolonies.api.util.constant.ToolType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; @@ -35,6 +37,7 @@ import java.util.*; import java.util.function.Predicate; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.minecolonies.api.items.ModTags.fungi; @@ -45,6 +48,11 @@ */ public final class ItemStackUtils { + /** + * Pattern for {@link #parseIdTemplate}. + */ + private static final Pattern TEMPLATE_PATH_PATTERN = Pattern.compile("\\[PATH(?::([^=]*)=([^]]*))?]"); + /** * Variable representing the empty itemstack in 1.10. Used for easy updating to 1.11 */ @@ -82,12 +90,17 @@ public final class ItemStackUtils */ private static final int SILK_TOUCH_ENCHANT_ID = 33; + /** + * List of the checked nbt sets for itemstack comparisons. + */ + public static HashMap> CHECKED_NBT_KEYS = new HashMap<>(); + /** * True if this stack is a standard food item (has at least some healing and some saturation, not purely for effects). */ public static final Predicate ISFOOD = - stack -> ItemStackUtils.isNotEmpty(stack) && stack.isEdible() && stack.getItem().getFoodProperties() != null && stack.getItem().getFoodProperties().getNutrition() > 0 - && stack.getItem().getFoodProperties().getSaturationModifier() > 0; + stack -> ItemStackUtils.isNotEmpty(stack) && stack.isEdible() && stack.getFoodProperties(null) != null && stack.getFoodProperties(null).getNutrition() > 0 + && stack.getFoodProperties(null).getSaturationModifier() > 0; /** * Predicate describing things which work in the furnace. @@ -260,13 +273,12 @@ public static boolean hasToolLevel(@Nullable final ItemStack stack, final IToolT * @param stack The stack to check. * @return True when the stack is empty, false when not. */ - @NotNull - public static Boolean isEmpty(@Nullable final ItemStack stack) + public static boolean isEmpty(@Nullable final ItemStack stack) { return stack == null || stack.isEmpty(); } - public static Boolean isNotEmpty(@Nullable final ItemStack stack) + public static boolean isNotEmpty(@Nullable final ItemStack stack) { return !isEmpty(stack); } @@ -303,51 +315,33 @@ else if (Compatibility.isTinkersTool(stack, toolType)) return Compatibility.getToolLevel(stack); } - if (ToolType.HOE.equals(toolType)) + if (ToolType.HELMET.equals(toolType) + || ToolType.BOOTS.equals(toolType) + || ToolType.CHESTPLATE.equals(toolType) + || ToolType.LEGGINGS.equals(toolType)) { - if (stack.getItem() instanceof HoeItem) + if (stack.getItem() instanceof final ArmorItem armorItem) { - final HoeItem hoeItem = (HoeItem) stack.getItem(); - return hoeItem.getTier().getLevel(); + return getArmorLevel(armorItem.getMaterial()); } } - else if (ToolType.SWORD.equals(toolType)) + else if (stack.getItem() instanceof final TieredItem tieredItem) // most tools { - if (stack.getItem() instanceof SwordItem) - { - final SwordItem SwordItem = (SwordItem) stack.getItem(); - return SwordItem.getTier().getLevel(); - } - - } - else if (ToolType.HELMET.equals(toolType) - || ToolType.BOOTS.equals(toolType) - || ToolType.CHESTPLATE.equals(toolType) - || ToolType.LEGGINGS.equals(toolType)) - { - if (stack.getItem() instanceof ArmorItem) - { - final ArmorItem ArmorItem = (ArmorItem) stack.getItem(); - return getArmorLevel(ArmorItem.getMaterial()); - } + return tieredItem.getTier().getLevel(); } - else if (stack.getItem() instanceof FishingRodItem) + else if (toolType.equals(ToolType.FISHINGROD)) { return getFishingRodLevel(stack); } else if (toolType.equals(ToolType.SHEARS)) { - return stack.getItem() instanceof ShearsItem ? 0 : -1; + return 0; } else if (!toolType.hasVariableMaterials()) { //We need a hut level 1 minimum return 1; } - else if (stack.getItem() instanceof TieredItem) - { - return ((TieredItem) stack.getItem()).getTier().getLevel(); - } return -1; } @@ -405,7 +399,7 @@ public static boolean isTool(@Nullable final ItemStack itemStack, final IToolTyp { if (!itemStack.canPerformAction(action)) { - break; + return false; } } return true; @@ -418,33 +412,33 @@ public static boolean isTool(@Nullable final ItemStack itemStack, final IToolTyp { return itemStack.canPerformAction(ToolActions.SWORD_SWEEP) || Compatibility.isTinkersWeapon(itemStack); } - if (ToolType.FISHINGROD.equals(toolType)) + if (ToolType.FISHINGROD.equals(toolType) && itemStack.canPerformAction(ToolActions.FISHING_ROD_CAST)) { - return itemStack.getItem() instanceof FishingRodItem; + return true; } - if (ToolType.SHEARS.equals(toolType)) + if (ToolType.SHEARS.equals(toolType) && itemStack.canPerformAction(ToolActions.SHEARS_DIG) && itemStack.canPerformAction(ToolActions.SHEARS_HARVEST)) { - return itemStack.getItem() instanceof ShearsItem; + return true; } if (ToolType.HELMET.equals(toolType)) { - return itemStack.getItem() instanceof ArmorItem; + return itemStack.getItem() instanceof ArmorItem armor && EquipmentSlot.HEAD.equals(armor.getSlot()); } if (ToolType.LEGGINGS.equals(toolType)) { - return itemStack.getItem() instanceof ArmorItem; + return itemStack.getItem() instanceof ArmorItem armor && EquipmentSlot.LEGS.equals(armor.getSlot()); } if (ToolType.CHESTPLATE.equals(toolType)) { - return itemStack.getItem() instanceof ArmorItem; + return itemStack.getItem() instanceof ArmorItem armor && EquipmentSlot.CHEST.equals(armor.getSlot()); } if (ToolType.BOOTS.equals(toolType)) { - return itemStack.getItem() instanceof ArmorItem; + return itemStack.getItem() instanceof ArmorItem armor && EquipmentSlot.FEET.equals(armor.getSlot()); } if (ToolType.SHIELD.equals(toolType)) { - return itemStack.getItem() instanceof ShieldItem; + return itemStack.getItem() instanceof ShieldItem; //canPerformAction(ToolActions.SHIELD_BLOCK) ? } if (ToolType.FLINT_N_STEEL.equals(toolType)) { @@ -721,18 +715,13 @@ public static Boolean compareItemStacksIgnoreStackSize(final ItemStack itemStack } /** - * get the size of the stack. This is for compatibility between 1.10 and 1.11 + * get the size of the stac * * @param stack to get the size from * @return the size of the stack */ public static int getSize(@NotNull final ItemStack stack) { - if (ItemStackUtils.isEmpty(stack)) - { - return 0; - } - return stack.getCount(); } @@ -766,6 +755,21 @@ public static boolean compareItemStacksIgnoreStackSize(final ItemStack itemStack return compareItemStacksIgnoreStackSize(itemStack1, itemStack2, matchDamage, matchNBT, false); } + /** + * Method to compare to stacks, ignoring their stacksize. + * + * @param itemStack1 The left stack to compare. + * @param itemStack2 The right stack to compare. + * @param matchDamage Set to true to match damage data. + * @param matchNBT Set to true to match nbt + * @param min if the count of stack2 has to be at least the same as stack1. + * @return True when they are equal except the stacksize, false when not. + */ + public static boolean compareItemStacksIgnoreStackSize(final ItemStack itemStack1, final ItemStack itemStack2, final boolean matchDamage, final boolean matchNBT, final boolean min) + { + return compareItemStacksIgnoreStackSize(itemStack1, itemStack2, matchDamage, matchNBT, false, false); + } + /** * Method to compare to stacks, ignoring their stacksize. * @@ -781,7 +785,8 @@ public static boolean compareItemStacksIgnoreStackSize( final ItemStack itemStack2, final boolean matchDamage, final boolean matchNBT, - final boolean min) + final boolean min, + final boolean matchNBTExactly) { if (isEmpty(itemStack1) && isEmpty(itemStack2)) { @@ -806,31 +811,39 @@ public static boolean compareItemStacksIgnoreStackSize( return false; } - // Then sort on NBT - if (itemStack1.hasTag() && itemStack2.hasTag()) + if (itemStack1.hasTag() || itemStack2.hasTag()) { + if (matchNBTExactly) + { + return Objects.equals(itemStack1.getTag(), itemStack2.getTag()); + } + final Set checkedKeys = CHECKED_NBT_KEYS.getOrDefault(itemStack1.getItem(), null); + if (checkedKeys == null) + { + return itemStack1.hasTag() && itemStack2.hasTag() && itemStack1.getTag().equals(itemStack2.getTag()); + } + if (itemStack1.hasTag() != itemStack2.hasTag() && !checkedKeys.isEmpty()) + { + return false; + } + + if (checkedKeys.isEmpty()) + { + return true; + } + CompoundTag nbt1 = itemStack1.getTag(); CompoundTag nbt2 = itemStack2.getTag(); - for (String key : nbt1.getAllKeys()) + for (final CheckedNbtKey key : checkedKeys) { - if (!matchDamage && key.equals("Damage")) - { - continue; - } - if (!nbt2.contains(key) || !nbt1.get(key).equals(nbt2.get(key))) + if (!key.matches(nbt1, nbt2)) { return false; } } - - return nbt1.getAllKeys().size() == nbt2.getAllKeys().size(); - } - else - { - return (!itemStack1.hasTag() || itemStack1.getTag().isEmpty()) - && (!itemStack2.hasTag() || itemStack2.getTag().isEmpty()); } + return true; } return false; } @@ -1036,6 +1049,55 @@ public static ItemStack idToItemStack(final String itemData) return stack; } + /** + * Parses an item string (formatted for {@link #idToItemStack}) that may + * contain replaceable template components: + * + *
+     *     [NS]           => {@code baseItemId.getNamespace()}
+     *     [PATH]         => {@code baseItemId.getPath()}
+     *     [PATH:foo=bar] => {@code baseItemId.getPath()} but with "foo" replaced with "bar"
+ * + * @param value the value to parse + * @param baseItemId the base item id to use to fill in the components + * @return a tuple of (boolean, result), where the boolean is false if result didn't resolve to a valid item + */ + @NotNull + public static Tuple parseIdTemplate(@Nullable final String value, + @NotNull final ResourceLocation baseItemId) + { + if (value == null) + { + return new Tuple<>(false, null); + } + + final int nbtIndex = value.indexOf('{'); + String itemId = nbtIndex < 0 ? value : value.substring(0, nbtIndex); + + itemId = itemId.replace("[NS]", baseItemId.getNamespace()); + itemId = TEMPLATE_PATH_PATTERN.matcher(itemId).replaceAll(m -> + { + if (m.group(1) != null && m.group(2) != null) + { + return baseItemId.getPath().replace(m.group(1), m.group(2)); + } + return baseItemId.getPath(); + }); + + return new Tuple<>(ForgeRegistries.ITEMS.containsKey(new ResourceLocation(itemId)), + itemId + (nbtIndex >= 0 ? value.substring(nbtIndex) : "")); + } + + /** + * Reports if this stack has a custom Tag value that is not purely a damage value. + * @param stack the stack to inspect + * @return true if the stack has a non-damage tag value + */ + public static boolean hasTag(@NotNull final ItemStack stack) + { + return stack.getTag() != null && stack.getTag().size() > (stack.isDamageableItem() ? 1 : 0); + } + /** * Obtains a list of all basic items in the game, plus any extra items present in the player's * inventory (allowing for items with custom NBT, e.g. DO blocks or dyed armour). diff --git a/src/api/java/com/minecolonies/api/util/LookHandler.java b/src/api/java/com/minecolonies/api/util/LookHandler.java new file mode 100644 index 00000000000..c8887708380 --- /dev/null +++ b/src/api/java/com/minecolonies/api/util/LookHandler.java @@ -0,0 +1,61 @@ +package com.minecolonies.api.util; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.control.LookControl; + +public class LookHandler extends LookControl +{ + private boolean doneNavigating = true; + + public LookHandler(final Mob entity) + { + super(entity); + } + + @Override + public void tick() + { + if (mob.tickCount % 20 == 17) + { + doneNavigating = this.mob.getNavigation().isDone(); + } + + if (this.resetXRotOnTick()) + { + this.mob.setXRot(0.0F); + } + + if (this.lookAtCooldown > 0) + { + --this.lookAtCooldown; + + // Copy of super tick without needless optional and lambda wrapping + double dx = this.wantedX - this.mob.getX(); + double dz = this.wantedZ - this.mob.getZ(); + + if (Math.abs(dz) > (double) 1.0E-5F || Math.abs(dx) > (double) 1.0E-5F) + { + this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, (float) (Mth.atan2(dz, dx) * (double) (180F / (float) Math.PI)) - 90.0F, this.yMaxRotSpeed); + } + + double dEy = this.wantedY - this.mob.getEyeY(); + double xzlenght = Math.sqrt(dx * dx + dz * dz); + + if (Math.abs(dEy) > (double) 1.0E-5F || Math.abs(xzlenght) > (double) 1.0E-5F) + { + this.mob.setXRot(this.rotateTowards(this.mob.getXRot(), (float) -(Mth.atan2(dEy, xzlenght) * (double) (180F / (float) Math.PI)), this.xMaxRotAngle)); + } + } + else + { + this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, this.mob.yBodyRot, 10.0F); + } + + if (!doneNavigating) + { + // clampHeadRotationToBody + this.mob.yHeadRot = Mth.rotateIfNecessary(this.mob.yHeadRot, this.mob.yBodyRot, (float) this.mob.getMaxHeadYRot()); + } + } +} \ No newline at end of file diff --git a/src/api/java/com/minecolonies/api/util/MathUtils.java b/src/api/java/com/minecolonies/api/util/MathUtils.java index 9e26bd93c0a..6229ea561d9 100755 --- a/src/api/java/com/minecolonies/api/util/MathUtils.java +++ b/src/api/java/com/minecolonies/api/util/MathUtils.java @@ -50,4 +50,17 @@ public static double twoDimDistance(@NotNull final BlockPos position, @NotNull f //Hypot returns sqrt(x²+ y²) without intermediate overflow or underflow. return Math.hypot((double) x2 - x1, (double) z2 - z1); } + + /** + * Clamped a value between a lower and upper bound. + * + * @param value the input value to clamp. + * @param min the lower bound. + * @param max the upper bound. + * @return the value, clamped between the lower and upper bound. + */ + public static int clamp(int value, int min, int max) + { + return Math.max(min, Math.min(max, value)); + } } diff --git a/src/api/java/com/minecolonies/api/util/SoundUtils.java b/src/api/java/com/minecolonies/api/util/SoundUtils.java index 7c3b0ebbfff..479e531a957 100755 --- a/src/api/java/com/minecolonies/api/util/SoundUtils.java +++ b/src/api/java/com/minecolonies/api/util/SoundUtils.java @@ -2,6 +2,8 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.ICivilianData; +import com.minecolonies.api.colony.IVisitorData; +import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.sounds.EventType; import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundSoundPacket; @@ -10,13 +12,13 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraftforge.event.level.NoteBlockEvent.Note; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Map; import java.util.Random; import static com.minecolonies.api.sounds.ModSoundEvents.CITIZEN_SOUND_EVENTS; @@ -34,7 +36,7 @@ public final class SoundUtils /** * Standard pitch value. */ - public static final double PITCH = 0.9D; + public static final double PITCH = 1.0D; /** * Random object. @@ -110,6 +112,12 @@ public static void playRandomSound(@NotNull final Level worldIn, @NotNull final return; } + if (citizen.isAsleep()) + { + playSoundAtCitizenWith(worldIn, pos, EventType.OFF_TO_BED, citizen); + return; + } + final double v = rand.nextDouble(); if (v <= 0.1) { @@ -124,7 +132,7 @@ public static void playRandomSound(@NotNull final Level worldIn, @NotNull final } else if (v <= 0.2) { - if (citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony()) < 5) + if (citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony(), citizen) < 5) { playSoundAtCitizenWith(worldIn, pos, EventType.UNHAPPY, citizen); } @@ -149,9 +157,13 @@ else if (v <= 0.6 && worldIn.isRaining()) { playSoundAtCitizenWith(worldIn, pos, EventType.BAD_WEATHER, citizen); } - else if (v <= 1.0) + else if (v <= 0.8 && citizen.isIdleAtJob()) + { + playSoundAtCitizenWith(worldIn, pos, EventType.MISSING_EQUIPMENT, citizen); + } + else { - playSoundAtCitizenWith(worldIn, pos, EventType.NOISE, citizen); + playSoundAtCitizenWith(worldIn, pos, EventType.NOISE, citizen, EventType.NOISE.getChance(), VOLUME/2); } } @@ -190,6 +202,10 @@ public static void playSuccessSound(@NotNull final Player player, @NotNull final (float) 1.0, player.level.random.nextLong())); } + else + { + player.playNotifySound(SoundEvents.NOTE_BLOCK_BELL, SoundSource.NEUTRAL, 1.0f, 1.0f); + } } /** @@ -210,6 +226,27 @@ public static void playErrorSound(@NotNull final Player player, @NotNull final B (float) 0.3, player.level.random.nextLong())); } + else + { + player.playNotifySound(SoundEvents.NOTE_BLOCK_DIDGERIDOO, SoundSource.NEUTRAL, 1.0f, 0.3f); + } + } + + /** + * Plays a sound with a certain chance at a certain position. + * + * @param worldIn the world to play the sound in. + * @param position position to play the sound at. + * @param type sound to play. + * @param citizenData the citizen. + */ + public static void playSoundAtCitizenWith( + @NotNull final Level worldIn, + @NotNull final BlockPos position, + @Nullable final EventType type, + @Nullable final ICivilianData citizenData) + { + playSoundAtCitizenWith(worldIn, position, type, citizenData, type.getChance()); } /** @@ -224,32 +261,41 @@ public static void playSoundAtCitizenWith( @NotNull final Level worldIn, @NotNull final BlockPos position, @Nullable final EventType type, - @Nullable final ICitizenData citizenData) + @Nullable final ICivilianData citizenData, final double chance, final double volume) { if (citizenData == null) { return; } - final Map> map; - if (citizenData.getJob() != null) + // Always call job specific, we put all sounds into job specific. So, call here visitor, job, or if no job general + final String jobDesc; + if (citizenData instanceof IVisitorData) + { + jobDesc = "visitor"; + } + else if (citizenData.isChild()) + { + jobDesc = "child"; + } + else if (citizenData instanceof ICitizenData) { - map = CITIZEN_SOUND_EVENTS.get(citizenData.getJob().getJobRegistryEntry().getKey().getPath()); + final IJob job = ((ICitizenData) citizenData).getJob(); + jobDesc = job == null ? "unemployed" : job.getJobRegistryEntry().getKey().getPath(); } else { - map = CITIZEN_SOUND_EVENTS.get(citizenData.isChild() ? "child" : "citizen"); + jobDesc = "unemployed"; } - final SoundEvent event = citizenData.isFemale() ? map.get(type).getB() : map.get(type).getA(); - - if (type.getChance() > rand.nextDouble() * ONE_HUNDRED) + final SoundEvent event = citizenData.isFemale() ? CITIZEN_SOUND_EVENTS.get(jobDesc).get(type).get(citizenData.getSoundProfile()).getB() : CITIZEN_SOUND_EVENTS.get(jobDesc).get(type).get(citizenData.getSoundProfile()).getA(); + if (chance > rand.nextDouble() * ONE_HUNDRED) { worldIn.playSound(null, position, event, SoundSource.NEUTRAL, - (float) VOLUME, + (float) volume, (float) PITCH); } } @@ -257,34 +303,18 @@ public static void playSoundAtCitizenWith( /** * Plays a sound with a certain chance at a certain position. * - * @param worldIn the world to play the sound in. - * @param position position to play the sound at. - * @param type sound to play. - * @param civilianData the citizen. + * @param worldIn the world to play the sound in. + * @param position position to play the sound at. + * @param type sound to play. + * @param citizenData the citizen. */ - public static void playSoundAtCivilian( + public static void playSoundAtCitizenWith( @NotNull final Level worldIn, @NotNull final BlockPos position, @Nullable final EventType type, - @Nullable final ICivilianData civilianData) + @Nullable final ICivilianData citizenData, final double chance) { - if (civilianData == null) - { - return; - } - - final Map> map = CITIZEN_SOUND_EVENTS.get(civilianData.isChild() ? "child" : "citizen"); - final SoundEvent event = civilianData.isFemale() ? map.get(type).getB() : map.get(type).getA(); - - if (type.getChance() > rand.nextDouble() * ONE_HUNDRED) - { - worldIn.playSound(null, - position, - event, - SoundSource.NEUTRAL, - (float) VOLUME, - (float) PITCH); - } + playSoundAtCitizenWith(worldIn, position, type, citizenData, chance, VOLUME); } /** diff --git a/src/api/java/com/minecolonies/api/util/WorldUtil.java b/src/api/java/com/minecolonies/api/util/WorldUtil.java index 6a878795bde..9266ae45ed5 100644 --- a/src/api/java/com/minecolonies/api/util/WorldUtil.java +++ b/src/api/java/com/minecolonies/api/util/WorldUtil.java @@ -1,7 +1,6 @@ package com.minecolonies.api.util; import com.minecolonies.api.colony.buildings.IBuilding; -import com.mojang.datafixers.util.Either; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; @@ -13,32 +12,24 @@ import net.minecraft.util.Tuple; import net.minecraft.world.Difficulty; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.Registry; -import net.minecraft.world.*; import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; import java.util.Set; -import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import static com.minecolonies.api.util.constant.CitizenConstants.NIGHT; @@ -379,4 +370,80 @@ public static boolean isInWorldHeight(final int yBlock, final Level world) final DimensionType dimensionType = world.dimensionType(); return yBlock > getDimensionMinHeight(dimensionType) && yBlock < getDimensionMaxHeight(dimensionType); } + + /** + * Get nearest player, our own cheaper check. + * @param livingEntity the entity to check. + * @param x pos x + * @param y pos y + * @param z pos z + * @param lookDistance min distance. + * @return closest player or null. + */ + @Nullable + public static Player getNearestPlayer(Mob livingEntity, final int x, final int y, final int z, final double lookDistance) + { + return getNearestEntity(livingEntity.level.players(), livingEntity, x, y, z, lookDistance); + } + + /** + * Get the closest entity, cheaper than mojank. + * @param entityList entity list to check. + * @param livingEntity the entity they should be close to. + * @param x pos x + * @param y pos y + * @param z pos z + * @param lookDistance max distance. + * @return the entity or null. + * @param type of entity. + */ + @Nullable + public static T getNearestEntity(List entityList, @Nullable Mob livingEntity, int x, int y, int z, double lookDistance) + { + double currentEntityDistance = 100; + T closestEntity = null; + final BlockPos entityPos = new BlockPos(x, y, z); + + for (T entity : entityList) + { + if (entity == livingEntity) + { + continue; + } + else if (!entity.canBeSeenByAnyone()) + { + continue; + } + + double entityDistance = entity.blockPosition().above().distSqr(entityPos); + if (entityDistance > lookDistance) + { + continue; + } + + double invisPct = entity.getVisibilityPercent(livingEntity); + double invisPctModifier = Math.max(lookDistance * invisPct, 2.0D); + if (entityDistance > invisPctModifier * invisPctModifier) + { + continue; + } + + if (livingEntity instanceof Mob) + { + Mob mob = (Mob) livingEntity; + if (!mob.getSensing().hasLineOfSight(entity)) + { + continue; + } + } + + if (entityDistance < currentEntityDistance) + { + currentEntityDistance = entityDistance; + closestEntity = entity; + } + } + + return closestEntity; + } } diff --git a/src/api/java/com/minecolonies/api/util/constant/BuildingConstants.java b/src/api/java/com/minecolonies/api/util/constant/BuildingConstants.java index b55d6d5418c..ea7a7306c93 100755 --- a/src/api/java/com/minecolonies/api/util/constant/BuildingConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/BuildingConstants.java @@ -111,6 +111,27 @@ public final class BuildingConstants * String tag to identify a leisure decoration. */ public static final String LEISURE = "leisure"; + + /** + * Crafting module type. + */ + public static final String MODULE_CRAFTING = "crafting"; + + /** + * Smelting module type. + */ + public static final String MODULE_SMELTING = "smelting"; + + /** + * Smelting module type. + */ + public static final String MODULE_BREWING = "brewing"; + + /** + * Custom crafting module type. + */ + public static final String MODULE_CUSTOM = "custom"; + /** * Private constructor to hide implicit public one. */ diff --git a/src/api/java/com/minecolonies/api/util/constant/CitizenConstants.java b/src/api/java/com/minecolonies/api/util/constant/CitizenConstants.java index 638e0d21556..eedc5230d21 100755 --- a/src/api/java/com/minecolonies/api/util/constant/CitizenConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/CitizenConstants.java @@ -5,6 +5,31 @@ */ public final class CitizenConstants { + /** + * The default limit of citizens, if no research is done yet. + */ + public static final int CITIZEN_LIMIT_DEFAULT = 25; + + /** + * The limit of citizens if the first increase research is done. + */ + public static final int CITIZEN_LIMIT_OUTPOST = 50; + + /** + * The limit of citizens if the second increase research is done. + */ + public static final int CITIZEN_LIMIT_HAMLET = 100; + + /** + * The limit of citizens if the third increase research is done. + */ + public static final int CITIZEN_LIMIT_VILLAGE = 150; + + /** + * The limit of citizens if the last increase research is done, this is absolute limit of citizens, including config file. + */ + public static final int CITIZEN_LIMIT_MAX = 500; + /** * Base movement speed of every citizen. */ @@ -241,5 +266,5 @@ public final class CitizenConstants /** * Disabled timer. */ - public static final int DISABLED = -1; + public static final int DISABLED = -1; } diff --git a/src/api/java/com/minecolonies/api/util/constant/ColonyConstants.java b/src/api/java/com/minecolonies/api/util/constant/ColonyConstants.java index 6f7c29cc4db..e4967c0f9db 100755 --- a/src/api/java/com/minecolonies/api/util/constant/ColonyConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/ColonyConstants.java @@ -5,12 +5,18 @@ import net.minecraft.server.level.TicketType; import java.util.Comparator; +import java.util.Random; /** * Colony wide constants. */ public final class ColonyConstants { + /** + * Shared random + */ + public static final Random rand = new Random(); + /** * Constant string id of our ticket type. */ diff --git a/src/api/java/com/minecolonies/api/util/constant/Constants.java b/src/api/java/com/minecolonies/api/util/constant/Constants.java index 37864d0e3a6..7f6df243488 100755 --- a/src/api/java/com/minecolonies/api/util/constant/Constants.java +++ b/src/api/java/com/minecolonies/api/util/constant/Constants.java @@ -40,7 +40,9 @@ public final class Constants public static final int PARAMS_LOCAL_RESEARCH = 3; public static final int PARAMS_CUSTOM_RECIPE = 8; public static final int PARAMS_CUSTOM_RECIPE_MGR = 13; - public static final String DEFAULT_STYLE = "Minecolonies Original"; + public static final String DEFAULT_STYLE = "Colonial"; + public static final String STORAGE_STYLE = "Minecolonies Original"; + public static final String ORES = "ores"; public static final double HALF_BLOCK = 0.5D; public static final double SLIGHTLY_UP = 0.1D; diff --git a/src/api/java/com/minecolonies/api/util/constant/HappinessConstants.java b/src/api/java/com/minecolonies/api/util/constant/HappinessConstants.java index 78b2e4ce159..bdbd46ff93f 100755 --- a/src/api/java/com/minecolonies/api/util/constant/HappinessConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/HappinessConstants.java @@ -35,6 +35,7 @@ public final class HappinessConstants * Storage tag for the handler. */ public static final String TAG_HAPPINESS = "happinessHandler"; + public static final String TAG_NEW_HAPPINESS = "newhappinesshandler"; /** * Happiness modifiers @@ -52,6 +53,7 @@ public final class HappinessConstants public static final String DEATH = "death"; public static final String RAIDWITHOUTDEATH = "raidwithoutdeath"; public static final String SLEPTTONIGHT = "slepttonight"; + public static final String QUEST = "quest"; /** * Private constructor to hide implicit public one. diff --git a/src/api/java/com/minecolonies/api/util/constant/NbtTagConstants.java b/src/api/java/com/minecolonies/api/util/constant/NbtTagConstants.java index e48d4b86539..06762059aa1 100755 --- a/src/api/java/com/minecolonies/api/util/constant/NbtTagConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/NbtTagConstants.java @@ -5,29 +5,30 @@ */ public final class NbtTagConstants { - public static final String TAG_ID = "id"; - public static final String TAG_NAME = "name"; - public static final String TAG_SUFFIX = "suffix"; - public static final String TAG_DIMENSION = "dimension"; - public static final String TAG_CENTER = "center"; - public static final String TAG_BUILDINGS = "buildings"; - public static final String TAG_BUILDING = "building"; - public static final String TAG_BUILDINGS_CLAIM = "buildingsClaim"; - public static final String TAG_BUILDINGS_UNCLAIM = "buildingUnclaim"; - public static final String TAG_CITIZENS = "citizens"; - public static final String TAG_VISITORS = "visitors"; - public static final String TAG_WORK = "work"; - public static final String TAG_MANUAL_HIRING = "manualHiring"; - public static final String TAG_MANUAL_HOUSING = "manualHousing"; - public static final String TAG_MOVE_IN = "moveIn"; - public static final String TAG_REQUESTMANAGER = "requestManager"; - public static final String TAG_WAYPOINT = "waypoints"; - public static final String TAG_FREE_BLOCKS = "freeBlocks"; - public static final String TAG_FREE_POSITIONS = "freePositions"; - public static final String TAG_GRAVE = "graves"; - public static final String TAG_ABANDONED = "abandoned"; - public static final String TAG_PRIO = "prio"; - public static final String TAG_LAST_ONLINE = "lastOnlineTime"; + public static final String TAG_ID = "id"; + public static final String TAG_NAME = "name"; + public static final String TAG_SUFFIX = "suffix"; + public static final String TAG_DIMENSION = "dimension"; + public static final String TAG_CENTER = "center"; + public static final String TAG_BUILDINGS = "buildings"; + public static final String TAG_BUILDING = "building"; + public static final String TAG_BUILDINGS_CLAIM = "buildingsClaim"; + public static final String TAG_BUILDINGS_UNCLAIM = "buildingUnclaim"; + public static final String TAG_CITIZENS = "citizens"; + public static final String TAG_VISITORS = "visitors"; + public static final String TAG_WORK = "work"; + public static final String TAG_MANUAL_HIRING = "manualHiring"; + public static final String TAG_MANUAL_HOUSING = "manualHousing"; + public static final String TAG_MOVE_IN = "moveIn"; + public static final String TAG_REQUESTMANAGER = "requestManager"; + public static final String TAG_WAYPOINT = "waypoints"; + public static final String TAG_FREE_BLOCKS = "freeBlocks"; + public static final String TAG_FREE_POSITIONS = "freePositions"; + public static final String TAG_GRAVE = "graves"; + public static final String TAG_ABANDONED = "abandoned"; + public static final String TAG_PRIO = "prio"; + public static final String TAG_LAST_ONLINE = "lastOnlineTime"; + public static final String TAG_SOUND_PROFILE = "soundProfile"; /** * @deprecated Superseeded by request-based pickup system. @@ -37,7 +38,8 @@ public final class NbtTagConstants public static final String TAG_COLONIES = "colonies"; public static final String TAG_COLONY_MANAGER = "colonymanager"; public static final String TAG_UUID = "uuid"; - public static final String TAG_NEW_FIELDS = "newFields"; + public static final String TAG_FIELDS = "fields"; + public static final String TAG_FIELD = "field"; public static final String TAG_LEISURE = "leisureSites"; public static final String TAG_COMPATABILITY_MANAGER = "compatabilityManager"; public static final String TAG_SAP_LEAF = "tagSapLeaves"; @@ -48,6 +50,7 @@ public final class NbtTagConstants public static final String TAG_BUILDING_MANAGER = "buildingManager"; public static final String TAG_CITIZEN_MANAGER = "citizenManager"; public static final String TAG_EVENT_DESC_MANAGER = "event_desc_manager"; + public static final String TAG_QUEST_MANAGER = "quest_manager"; public static final String TAG_GRAVE_MANAGER = "graveManager"; public static final String TAG_COLONY_ID = "colony"; public static final String TAG_CITIZEN = "citizen"; @@ -55,6 +58,8 @@ public final class NbtTagConstants public static final String TAG_OFFHAND_HELD_ITEM_SLOT = "OffhandHeldItemSlot"; public static final String TAG_STATUS = "status"; public static final String TAG_DAY = "day"; + public static final String TAG_INVERTED = "inverted"; + public static final String TAG_PERIOD = "period"; public static final String TAG_IS_BUILT = "isBuilt"; public static final String TAG_CUSTOM_NAME = "customName"; public static final String TAG_OTHER_LEVEL = "otherLevel"; @@ -84,6 +89,11 @@ public final class NbtTagConstants public static final String TAG_CHILDREN = "children"; public static final String TAG_PARTNER = "partner"; + public static final String TAG_AV_QUESTS = "avquests"; + public static final String TAG_PART_QUESTS = "partquests"; + public static final String TAG_FINISHED_AV_QUESTS = "finavquests"; + public static final String TAG_FINISHED_PART_QUESTS = "finpartquests"; + /** * Event tags */ @@ -122,11 +132,6 @@ public final class NbtTagConstants */ public static final String TAG_PARENT_SCHEM = "parent"; - /** - * The tag to store a list of child positions of a building - */ - public static final String TAG_CHILD_SCHEM = "children"; - /** * The tag to store the rotation of the building. */ @@ -182,6 +187,11 @@ public final class NbtTagConstants */ public static final String TAG_NIGHTS_SINCE_LAST_RAID = "nightsRaid"; + /** + * Tag to store raid history data + */ + public static final String TAG_RAID_HISTORY = "raidhistory"; + /** * Tag on the ancient tome used to indicate if a raid will happen. */ @@ -256,6 +266,11 @@ public final class NbtTagConstants */ public static final String TAG_INVENTORY = "inventory"; + /** + * Tag to store the armor inventory to nbt. + */ + public static final String TAG_ARMOR_INVENTORY = "armorinventory"; + /** * Tag to store the content to nbt. */ @@ -405,6 +420,11 @@ public final class NbtTagConstants */ public static final String TAG_SIZE = "tagSIze"; + /** + * Tag used to store the inventory size. + */ + public static final String TAG_INV_SIZE = "invsize"; + /** * Tag used to store if the entity is the main. */ @@ -443,17 +463,17 @@ public final class NbtTagConstants /** * Citizen data Tags. */ - public static final String TAG_FEMALE = "female"; - public static final String TAG_TEXTURE = "texture"; - public static final String TAG_TEXTURE_UUID = "textureUUID"; - public static final String TAG_SKILL = "skill"; - public static final String TAG_LEVEL = "level"; - public static final String TAG_EXPERIENCE = "experience"; - public static final String TAG_NEW_SKILLS = "newSkills"; - public static final String TAG_SATURATION = "saturation"; - public static final String TAG_ASLEEP = "asleep"; - public static final String TAG_CHAT_OPTION = "chatoption"; - public static final String TAG_CHAT_OPTIONS = "chatoptions"; + public static final String TAG_FEMALE = "female"; + public static final String TAG_TEXTURE = "texture"; + public static final String TAG_TEXTURE_UUID = "textureUUID"; + public static final String TAG_SKILL = "skill"; + public static final String TAG_LEVEL = "level"; + public static final String TAG_EXPERIENCE = "experience"; + public static final String TAG_NEW_SKILLS = "newSkills"; + public static final String TAG_SATURATION = "saturation"; + public static final String TAG_ASLEEP = "asleep"; + public static final String TAG_CHAT_OPTION = "chatoption"; + public static final String TAG_CHAT_OPTIONS = "chatoptions"; /** * Tag of the colony. @@ -496,15 +516,15 @@ public final class NbtTagConstants /** * Lumberjack/Tree Tags for NBT */ - public static final String TAG_IS_SLIME_TREE = "slimeTree"; - public static final String TAG_DYNAMIC_TREE = "dynamicTree"; - public static final String TAG_SAPLING = "treesapling"; - public static final String TAG_LOGS = "Logs"; - public static final String TAG_STUMPS = "Stumps"; - public static final String TAG_TOP_LOG = "topLog"; - public static final String TAG_NETHER_TREE = "netherTree"; - public static final String TAG_LEAVES = "leaves"; - public static final String TAG_NETHER_TREE_LIST = "netherTrees"; + public static final String TAG_IS_SLIME_TREE = "slimeTree"; + public static final String TAG_DYNAMIC_TREE = "dynamicTree"; + public static final String TAG_SAPLING = "treesapling"; + public static final String TAG_LOGS = "Logs"; + public static final String TAG_STUMPS = "Stumps"; + public static final String TAG_TOP_LOG = "topLog"; + public static final String TAG_NETHER_TREE = "netherTree"; + public static final String TAG_LEAVES = "leaves"; + public static final String TAG_NETHER_TREE_LIST = "netherTrees"; /** * Archery building constants. @@ -550,12 +570,12 @@ public final class NbtTagConstants /** * Researcher tags. */ - public static final String TAG_CURR_MANA = "currentMana"; + public static final String TAG_CURR_MANA = "currentMana"; /** * Beekeeper tag */ - public static final String TAG_HIVES = "hives"; + public static final String TAG_HIVES = "hives"; /** * BannerRallyGuards tags @@ -577,6 +597,16 @@ public final class NbtTagConstants */ public static final String TAG_XP_DROPPED = "xp-dropped"; + /** + * The plantation field type stored on plantation field blocks. + */ + public static final String TAG_PLANTATION_FIELD_TYPE = "plantation-field-type"; + + /** + * The plantation field working positions. + */ + public static final String TAG_PLANTATION_FIELD_WORK_POS = "plantation-field-work-pos"; + // --------------------- Chat handling tags --------------------- // /** @@ -633,7 +663,7 @@ public final class NbtTagConstants * Tags to store the stages */ public static final String TAG_TOTAL_STAGES = "totalStages"; - public static final String TAG_CURR_STAGE = "currStage"; + public static final String TAG_CURR_STAGE = "currStage"; /** * Tags to store the needed resources to nbt. @@ -664,14 +694,14 @@ public final class NbtTagConstants * Tags to store grave information */ public static final String TAG_DECAY_TIMER = "decaytimer"; - public static final String TAG_DECAYED = "decayed"; + public static final String TAG_DECAYED = "decayed"; /** * Tags/JSON names for storing item informations */ - public static final String COUNT_PROP = "count"; - public static final String ITEM_PROP = "item"; - public static final String MATCHTYPE_PROP = "matchType"; + public static final String COUNT_PROP = "count"; + public static final String ITEM_PROP = "item"; + public static final String MATCHTYPE_PROP = "matchType"; public static final String MATCH_NBTIGNORE = "ignore"; /** @@ -679,6 +709,26 @@ public final class NbtTagConstants */ public static final String TAG_VERSION = "version"; + /** + * Quest related nbt tags. + */ + public static final String TAG_IN_PROGRESS = "inprogquests"; + public static final String TAG_AVAILABLE = "availquests"; + public static final String TAG_FINISHED = "finishedquests"; + public static final String TAG_ASSIGN_START = "assignstartquest"; + public static final String TAG_QUEST_GIVER = "questgiver"; + public static final String TAG_PARTICIPANTS = "questparticps"; + public static final String TAG_QUEST_ID = "questid"; + public static final String TAG_QUEST_INDEX = "questindex"; + public static final String TAG_OBJECTIVE = "objective"; + public static final String TAG_PLAYER = "player"; + public static final String TAG_UNLOCKED = "unlockedquests"; + public static final String TAG_REPUTATION = "questreputation"; + + public static final String TAG_MODIFIER_TYPE = "modifier"; + public static final String TAG_WEIGHT = "weight"; + public static final String TAG_SUPPLIER = "supplier"; + /** * Private constructor to hide the implicit one. */ diff --git a/src/api/java/com/minecolonies/api/util/constant/SerializationIdentifierConstants.java b/src/api/java/com/minecolonies/api/util/constant/SerializationIdentifierConstants.java index 7d0b4f19337..39dd6695513 100644 --- a/src/api/java/com/minecolonies/api/util/constant/SerializationIdentifierConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/SerializationIdentifierConstants.java @@ -5,64 +5,66 @@ */ public class SerializationIdentifierConstants { - public static short STANDARD_TOKEN_ID = 0; - public static short INITIALIZED_TOKEN_ID = 1; - public static short RANDOM_SEED_TOKEN_ID = 2; - public static short STATIC_LOCATION_ID = 3; - public static short ENTITY_LOCATION_ID = 4; - public static short ITEM_STACK_REQUEST_ID = 5; - public static short ITEM_STACK_LIST_REQUEST_ID = 6; - public static short ITEM_TAG_REQUEST_ID = 7; - public static short DELIVERY_REQUEST_ID = 8; - public static short PICKUP_REQUEST_ID = 9; - public static short TOOL_REQUEST_ID = 10; - public static short FOOD_REQUEST_ID = 11; - public static short SMELTABLE_ORE_REQUEST_ID = 12; - public static short BURNABLE_REQUEST_ID = 13; - public static short BUILDER_BASED_REQUESTER_ID = 14; - public static short DELIVERY_REQUEST_RESOLVER_ID = 15; - public static short PICKUP_REQUEST_RESOLVER_ID = 16; - public static short WAREHOUSE_REQUEST_RESOLVER_ID = 17; - public static short WAREHOUSE_CONCRETE_REQUEST_RESOLVER_ID = 18; - public static short PRIVATE_WORKER_CRAFTING_REQUEST_RESOLVER_ID = 19; - public static short PUBLIC_WORKER_CRAFTING_REQUEST_RESOLVER_ID = 20; - public static short PRIVATE_WORKER_CRAFTING_PRODUCTION_RESOLVER_ID = 21; - public static short PUBLIC_WORKER_CRAFTING_PRODUCTION_RESOLVER_ID = 22; - public static short BUILDER_BASED_RESOLVER_ID = 23; - public static short STANDARD_PLAYER_REQUEST_RESOLVER_ID = 24; - public static short STANDARD_RETRYING_REQUEST_RESOLVER_ID = 25; - public static short RECIPE_STORAGE_ID = 26; - public static short ITEM_STORAGE_ID = 27; - public static short GLOBAL_RESEARCH_ID = 28; - public static short LOCAL_RESEARCH_ID = 29; - public static short INTEGER_FACTORY_ID = 30; - public static short TYPE_TOKEN_ID = 31; - public static short STANDARD_REQUEST_IDENTITIES_DATASTORE_ID = 32; - public static short STANDARD_REQUEST_RESOLVERS_IDENTITIES_DATASTORE_ID = 33; - public static short STANDARD_PROVIDER_REQUEST_RESOLVER_ASSIGNMENT_DATASTORE_ID = 34; - public static short STANDARD_REQUEST_RESOLVER_REQUEST_ASSIGNMENT_DATASTORE_ID = 35; - public static short STANDARD_REQUESTABLE_TYPE_REQUEST_RESOLVER_ASSIGNMENT_DATASTORE_ID = 36; - public static short STANDARD_REQUEST_SYSTEM_BUILDING_DATASTORE_ID = 37; - public static short STANDARD_REQUEST_SYSTEM_DELIVERY_MAN_JOB_DATASTORE_ID = 38; - public static short STANDARD_REQUEST_SYSTEM_CRAFTER_JOB_DATASTORE_ID = 39; - public static short STANDARD_DATASTORE_MANAGER_ID = 40; - public static short PUBLIC_CRAFTING_REQUEST_ID = 41; - public static short PRIVATE_CRAFTING_REQUEST_ID = 42; - public static short BOOLEAN_SETTINGS_ID = 43; - public static short CUSTOM_RECIPE_ID = 44; - public static short IMMUTABLE_ITEM_STORAGE_ID = 45; - public static short STRING_SETTINGS_ID = 46; - public static short BLOCK_SETTINGS_ID = 47; - public static short INTEGER_SETTINGS_ID = 48; - public static short PLANTATION_SETTINGS_ID = 49; - public static short STRING_W_DESC_SETTINGS_ID = 50; - public static short PATROL_MODE_SETTINGS_ID = 51; - public static short GUARD_TASK_SETTINGS_ID = 52; - public static short FOLLOW_MODE_SETTINGS_ID = 53; - public static short BEEKEEPER_COLLECTION_SETTINGS_ID = 54; - public static short CRAFTER_RECIPE_SETTINGS_ID = 55; - public static short BUILDER_MODE_SETTINGS_ID = 56; - public static short DYNAMIC_TREES_SETTINGS_ID = 57; - public static short STATION_REQUEST_RESOLVER_ID = 58; - public static short CRAFTING_SETTINGS_ID = 59; + public static final short STANDARD_TOKEN_ID = 0; + public static final short INITIALIZED_TOKEN_ID = 1; + public static final short RANDOM_SEED_TOKEN_ID = 2; + public static final short STATIC_LOCATION_ID = 3; + public static final short ENTITY_LOCATION_ID = 4; + public static final short ITEM_STACK_REQUEST_ID = 5; + public static final short ITEM_STACK_LIST_REQUEST_ID = 6; + public static final short ITEM_TAG_REQUEST_ID = 7; + public static final short DELIVERY_REQUEST_ID = 8; + public static final short PICKUP_REQUEST_ID = 9; + public static final short TOOL_REQUEST_ID = 10; + public static final short FOOD_REQUEST_ID = 11; + public static final short SMELTABLE_ORE_REQUEST_ID = 12; + public static final short BURNABLE_REQUEST_ID = 13; + public static final short BUILDER_BASED_REQUESTER_ID = 14; + public static final short DELIVERY_REQUEST_RESOLVER_ID = 15; + public static final short PICKUP_REQUEST_RESOLVER_ID = 16; + public static final short WAREHOUSE_REQUEST_RESOLVER_ID = 17; + public static final short WAREHOUSE_CONCRETE_REQUEST_RESOLVER_ID = 18; + public static final short PRIVATE_WORKER_CRAFTING_REQUEST_RESOLVER_ID = 19; + public static final short PUBLIC_WORKER_CRAFTING_REQUEST_RESOLVER_ID = 20; + public static final short PRIVATE_WORKER_CRAFTING_PRODUCTION_RESOLVER_ID = 21; + public static final short PUBLIC_WORKER_CRAFTING_PRODUCTION_RESOLVER_ID = 22; + public static final short BUILDER_BASED_RESOLVER_ID = 23; + public static final short STANDARD_PLAYER_REQUEST_RESOLVER_ID = 24; + public static final short STANDARD_RETRYING_REQUEST_RESOLVER_ID = 25; + public static final short RECIPE_STORAGE_ID = 26; + public static final short ITEM_STORAGE_ID = 27; + public static final short GLOBAL_RESEARCH_ID = 28; + public static final short LOCAL_RESEARCH_ID = 29; + public static final short INTEGER_FACTORY_ID = 30; + public static final short TYPE_TOKEN_ID = 31; + public static final short STANDARD_REQUEST_IDENTITIES_DATASTORE_ID = 32; + public static final short STANDARD_REQUEST_RESOLVERS_IDENTITIES_DATASTORE_ID = 33; + public static final short STANDARD_PROVIDER_REQUEST_RESOLVER_ASSIGNMENT_DATASTORE_ID = 34; + public static final short STANDARD_REQUEST_RESOLVER_REQUEST_ASSIGNMENT_DATASTORE_ID = 35; + public static final short STANDARD_REQUESTABLE_TYPE_REQUEST_RESOLVER_ASSIGNMENT_DATASTORE_ID = 36; + public static final short STANDARD_REQUEST_SYSTEM_BUILDING_DATASTORE_ID = 37; + public static final short STANDARD_REQUEST_SYSTEM_DELIVERY_MAN_JOB_DATASTORE_ID = 38; + public static final short STANDARD_REQUEST_SYSTEM_CRAFTER_JOB_DATASTORE_ID = 39; + public static final short STANDARD_DATASTORE_MANAGER_ID = 40; + public static final short PUBLIC_CRAFTING_REQUEST_ID = 41; + public static final short PRIVATE_CRAFTING_REQUEST_ID = 42; + public static final short BOOLEAN_SETTINGS_ID = 43; + public static final short CUSTOM_RECIPE_ID = 44; + public static final short IMMUTABLE_ITEM_STORAGE_ID = 45; + public static final short STRING_SETTINGS_ID = 46; + public static final short BLOCK_SETTINGS_ID = 47; + public static final short INTEGER_SETTINGS_ID = 48; + public static final short FREE_TO_USE_PLACEHOLDER_1 = 49; + public static final short STRING_W_DESC_SETTINGS_ID = 50; + public static final short PATROL_MODE_SETTINGS_ID = 51; + public static final short GUARD_TASK_SETTINGS_ID = 52; + public static final short FOLLOW_MODE_SETTINGS_ID = 53; + public static final short BEEKEEPER_COLLECTION_SETTINGS_ID = 54; + public static final short CRAFTER_RECIPE_SETTINGS_ID = 55; + public static final short BUILDER_MODE_SETTINGS_ID = 56; + public static final short DYNAMIC_TREES_SETTINGS_ID = 57; + public static final short STATION_REQUEST_RESOLVER_ID = 58; + public static final short CRAFTING_SETTINGS_ID = 59; + + private SerializationIdentifierConstants() {} } diff --git a/src/api/java/com/minecolonies/api/util/constant/StatisticsConstants.java b/src/api/java/com/minecolonies/api/util/constant/StatisticsConstants.java index 6a27729866f..8ca76390aa9 100644 --- a/src/api/java/com/minecolonies/api/util/constant/StatisticsConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/StatisticsConstants.java @@ -19,5 +19,9 @@ public final class StatisticsConstants public static final String CROPS_HARVESTED = "crops_harvested"; public static final String LAND_TILLED = "land_tilled"; public static final String FISH_CAUGHT = "fish_caught"; + public static final String BUILD_BUILT = "build_built"; + public static final String BUILD_UPGRADED = "build_upgraded"; + public static final String BUILD_REPAIRED = "build_repaired"; + public static final String BUILD_REMOVED = "build_removed"; } diff --git a/src/api/java/com/minecolonies/api/util/constant/TagConstants.java b/src/api/java/com/minecolonies/api/util/constant/TagConstants.java index 49c98e29b6a..f433abd0541 100644 --- a/src/api/java/com/minecolonies/api/util/constant/TagConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/TagConstants.java @@ -6,21 +6,32 @@ import static com.minecolonies.api.util.constant.Constants.MOD_ID; -/** Constants for the block/item tags defined by Minecolonies */ +/** + * Constants for the block/item tags defined by Minecolonies + */ public final class TagConstants { - public static final ResourceLocation DECORATION_ITEMS = new ResourceLocation(MOD_ID, "decoblocks"); - public static final ResourceLocation CONCRETE_POWDER = new ResourceLocation(MOD_ID, "concrete_powder"); - public static final ResourceLocation CONCRETE_BLOCK = new ResourceLocation(MOD_ID, "concrete"); - public static final ResourceLocation PATHING_BLOCKS = new ResourceLocation(MOD_ID, "pathblocks"); - public static final ResourceLocation FLORIST_FLOWERS = new ResourceLocation(MOD_ID, "florist_flowers"); - public static final ResourceLocation EXCLUDED_FOOD = new ResourceLocation(MOD_ID, "excluded_food"); - public static final ResourceLocation ORECHANCEBLOCKS = new ResourceLocation(MOD_ID, "orechanceblocks"); - public static final ResourceLocation VALIDSPAWNBLOCKS = new ResourceLocation(MOD_ID, "validspawnblocks"); + public static final ResourceLocation DECORATION_ITEMS = new ResourceLocation(MOD_ID, "decoblocks"); + public static final ResourceLocation CONCRETE_POWDER = new ResourceLocation(MOD_ID, "concrete_powder"); + public static final ResourceLocation CONCRETE_BLOCK = new ResourceLocation(MOD_ID, "concrete"); + public static final ResourceLocation PATHING_BLOCKS = new ResourceLocation(MOD_ID, "pathblocks"); + public static final ResourceLocation TIER0_BLOCKS = new ResourceLocation(MOD_ID, "tier0blocks"); + public static final ResourceLocation TIER1_BLOCKS = new ResourceLocation(MOD_ID, "tier1blocks"); + public static final ResourceLocation TIER2_BLOCKS = new ResourceLocation(MOD_ID, "tier2blocks"); + public static final ResourceLocation TIER3_BLOCKS = new ResourceLocation(MOD_ID, "tier3blocks"); + public static final ResourceLocation TIER4_BLOCKS = new ResourceLocation(MOD_ID, "tier4blocks"); + public static final ResourceLocation TIER5_BLOCKS = new ResourceLocation(MOD_ID, "tier5blocks"); + public static final ResourceLocation TIER6_BLOCKS = new ResourceLocation(MOD_ID, "tier6blocks"); + public static final ResourceLocation MANGROVE_TREE_BLOCKS = new ResourceLocation(MOD_ID, "mangrove_tree"); + public static final ResourceLocation TREE_BLOCKS = new ResourceLocation(MOD_ID, "tree"); + public static final ResourceLocation FLORIST_FLOWERS = new ResourceLocation(MOD_ID, "florist_flowers"); + public static final ResourceLocation EXCLUDED_FOOD = new ResourceLocation(MOD_ID, "excluded_food"); + public static final ResourceLocation ORECHANCEBLOCKS = new ResourceLocation(MOD_ID, "orechanceblocks"); + public static final ResourceLocation VALIDSPAWNBLOCKS = new ResourceLocation(MOD_ID, "validspawnblocks"); public static final ResourceLocation COLONYPROTECTIONEXCEPTION = new ResourceLocation(MOD_ID, "protectionexception"); - public static final ResourceLocation FUNGI = new ResourceLocation(MOD_ID, "fungi"); - public static final ResourceLocation COMPOSTABLES = new ResourceLocation(MOD_ID, "compostables"); - public static final ResourceLocation COMPOSTABLES_POOR = new ResourceLocation(MOD_ID, "compostables_poor"); + public static final ResourceLocation FUNGI = new ResourceLocation(MOD_ID, "fungi"); + public static final ResourceLocation COMPOSTABLES = new ResourceLocation(MOD_ID, "compostables"); + public static final ResourceLocation COMPOSTABLES_POOR = new ResourceLocation(MOD_ID, "compostables_poor"); public static final ResourceLocation COMPOSTABLES_RICH = new ResourceLocation(MOD_ID, "compostables_rich"); public static final ResourceLocation INDESTRUCTIBLE = new ResourceLocation(MOD_ID, "indestructible"); public static final ResourceLocation MESHES = new ResourceLocation(MOD_ID, "meshes"); @@ -28,6 +39,8 @@ public final class TagConstants public static final ResourceLocation BREAKABLE_ORE = new ResourceLocation(MOD_ID, "breakable_ore"); public static final ResourceLocation RAW_ORE = new ResourceLocation(MOD_ID, "raw_ore"); public static final ResourceLocation MOB_ATTACK_BLACKLIST = new ResourceLocation(MOD_ID, "mob_attack_blacklist"); + public static final ResourceLocation RAIDERS = new ResourceLocation(MOD_ID, "raiders"); + public static final ResourceLocation IGNORE_NBT = new ResourceLocation(MOD_ID, "ignore_nbt"); public static final String CRAFTING_BAKER = ModJobs.BAKER_ID.getPath(); public static final String CRAFTING_BLACKSMITH = ModJobs.BLACKSMITH_ID.getPath(); diff --git a/src/api/java/com/minecolonies/api/util/constant/ToolLevelConstants.java b/src/api/java/com/minecolonies/api/util/constant/ToolLevelConstants.java index f1d1c48e51a..322a304b6e5 100755 --- a/src/api/java/com/minecolonies/api/util/constant/ToolLevelConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/ToolLevelConstants.java @@ -12,11 +12,19 @@ public final class ToolLevelConstants */ @NonNls public static final int TOOL_LEVEL_HAND = -1; + /** * Tool level for gold or wood. */ @NonNls public static final int TOOL_LEVEL_WOOD_OR_GOLD = 0; + + /** + * Tool level for stone. + */ + @NonNls + public static final int BASIC_TOOL_LEVEL = 1; + /** * Armor level for leather. */ diff --git a/src/api/java/com/minecolonies/api/util/constant/TranslationConstants.java b/src/api/java/com/minecolonies/api/util/constant/TranslationConstants.java index 3ffc44e8401..322aadb7eb6 100755 --- a/src/api/java/com/minecolonies/api/util/constant/TranslationConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/TranslationConstants.java @@ -56,7 +56,7 @@ public final class TranslationConstants @NonNls public static final String BAKER_HAS_NO_FURNACES_MESSAGE = "com.minecolonies.coremod.bakery.nofurnace"; @NonNls - public static final String COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN = "com.minecolonies.coremod.job.deliveryman"; + public static final String COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN = "com.minecolonies.job.deliveryman"; @NonNls public static final String COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF = "com.minecolonies.coremod.gui.hiring.off"; @NonNls @@ -86,6 +86,10 @@ public final class TranslationConstants @NonNls public static final String COM_MINECOLONIES_SCROLL_BUILDING_NO_WORKER = "com.minecolonies.coremod.item.scroll.no_builder"; @NonNls + public static final String COM_MINECOLONIES_QUEST_LOG_NEED_COLONY = "com.minecolonies.coremod.item.questlog.needcolony"; + @NonNls + public static final String COM_MINECOLONIES_QUEST_LOG_COLONY_SET = "com.minecolonies.coremod.item.questlog.registered"; + @NonNls public static final String COM_MINECOLONIES_BANNER_RALLY_GUARDS_SELECTED = "com.minecolonies.coremod.item.bannerrallyguards.selected"; @NonNls public static final String COM_MINECOLONIES_BANNER_RALLY_GUARDS_DESELECTED = "com.minecolonies.coremod.item.bannerrallyguards.deselected"; @@ -194,6 +198,8 @@ public final class TranslationConstants @NonNls public static final String ALL_BARBARIANS_KILLED_MESSAGE = "com.minecolonies.coremod.barbarians.killed"; @NonNls + public static final String ALL_BARBARIANS_MERCY_MESSAGE = "com.minecolonies.core.barbarians.mercy"; + @NonNls public static final String CANT_PLACE_COLONY_TOO_CLOSE_TO_SPAWN = "com.minecolonies.coremod.tooclose"; @NonNls public static final String CANT_PLACE_COLONY_TOO_FAR_FROM_SPAWN = "com.minecolonies.coremod.toofar"; @@ -288,8 +294,6 @@ public final class TranslationConstants @NonNls public static final String INVALID_MINESHAFT = "entity.miner.invalidmineshaft"; @NonNls - public static final String NO_SEED_SET = "entity.farmer.noseedset"; - @NonNls public static final String WATER_TOO_FAR = "entity.fisherman.messagewatertoofar"; @NonNls public static final String NO_HIVES = "entity.beekeeper.messagenohives"; @@ -320,6 +324,8 @@ public final class TranslationConstants @NonNls public static final String NO_COLONY_YET = "com.minecolonies.coremod.workorder.nocolonyyet"; @NonNls + public static final String DOCRAFTING_BLOCK = "com.minecolonies.coremod.gui.docrafting.block"; + @NonNls public static final String OUT_OF_COLONY = "com.minecolonies.coremod.workorder.outofcolony"; @NonNls public static final String NO = "com.minecolonies.coremod.entity.citizen.no."; @@ -376,11 +382,14 @@ public final class TranslationConstants @NonNls public static final String RANK_TYPE_NONE = "com.minecolonies.coremod.gui.townhall.ranktype.none"; @NonNls - public static final String NO_HUT_IN_INVENTORY = "com.minecolonies.coremod.gui.buildtool.nohutininventory"; + public static final String TOWNHALL_TOO_CLOSE = "com.minecolonies.coremod.placement.townhalltooclose"; @NonNls public static final String WRONG_COLONY = "com.minecolonies.coremod.gui.buildtool.wrongcolony"; @NonNls - public static final String INDESTRUCTIBLE_BLOCK_AT_POS = "com.minecolonies.coremod.buildtool.indestructible"; + public static final String BP_OUTSIDE_COLONY ="com.minecolonies.coremod.placement.outofcolony"; + + @NonNls + public static final String BP_NO_PERM = "com.minecolonies.coremod.placement.noperm"; @NonNls public static final String BUILDER_ACTION_BUILDING = "com.minecolonies.coremod.action.builder.building"; @NonNls @@ -402,9 +411,11 @@ public final class TranslationConstants @NonNls public static final String BUILDER_BUILDING_TOO_LOW = "entity.builder.messagebuildtoolow"; @NonNls - public static final String COLONIST_DIED = "block.blockhuttownhall.messagecolonistdead"; + public static final String COLONIST_DESC = "block.blockhuttownhall.messagecolonistdesc"; + @NonNls + public static final String WORKER_DESC = "block.blockhuttownhall.messageworkerdesc"; @NonNls - public static final String WORKER_DIED = "block.blockhuttownhall.messageworkerdead"; + public static final String COLONIST_GRAVE_LOCATION = "block.blockhuttownhall.messagecolonistgravelocation"; @NonNls public static final String HUT_BREAK_WARNING_CHILD_BUILDINGS = "block.minecolonies.blockhut.breakwarn.children"; @NonNls @@ -442,6 +453,8 @@ public final class TranslationConstants @NonNls public static final String HIRING_MODE_MANUAL = "com.minecolonies.coremod.gui.hiringmode.manual"; @NonNls + public static final String HIRING_MODE_LOCKED = "com.minecolonies.coremod.gui.hiringmode.locked"; + @NonNls public static final String WARNING_SUPPLY_SHIP_IN_WATER = "item.supplychestdeployer.invalid"; @NonNls public static final String WARNING_SUPPLY_BUILDING_BAD_BLOCKS = "item.supply.badblocks"; @@ -740,7 +753,12 @@ public final class TranslationConstants @NonNls public static final String NO_CUSTOM_BUILDINGS = "com.minecolonies.coremod.structures.nocustomhuts"; + @NonNls public static final String NO_CUSTOM_CAMPS = "com.minecolonies.coremod.structures.nocustomcamps"; + @NonNls + public static final String BUILDING_MISSING = "com.minecolonies.coremod.structures.buildingmissing"; + @NonNls + public static final String DETAILS = "com.minecolonies.gui.details"; // diff --git a/src/api/java/com/minecolonies/api/util/constant/WindowConstants.java b/src/api/java/com/minecolonies/api/util/constant/WindowConstants.java index 7835b0a3f38..0b5f37bc153 100755 --- a/src/api/java/com/minecolonies/api/util/constant/WindowConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/WindowConstants.java @@ -29,6 +29,11 @@ public final class WindowConstants */ public static final String BUTTON_ACTIONS = "actions"; + /** + * Id of the alliance button in the GUI. + */ + public static final String BUTTON_ALLIANCE = "alliances"; + /** * Id of the settings button in the GUI. */ @@ -69,11 +74,21 @@ public final class WindowConstants */ public static final String BUTTON_RENAME = "rename"; + /** + * Id of the patreon button in the GUI. + */ + public static final String BUTTON_PATREON = "patreon"; + /** * Id of the mercenary button in the GUI. */ public static final String BUTTON_MERCENARY = "mercenaries"; + /** + * Id of the mercenary button in the GUI. + */ + public static final String BUTTON_TOWNHALLMAP = "map"; + /** * Id of the add player button in the GUI. */ @@ -104,6 +119,16 @@ public final class WindowConstants */ public static final String BUTTON_COLONY_SWITCH_STYLE = "colonyStylePicker"; + /** + * Id of the toggle to reset texture. + */ + public static final String BUTTON_RESET_TEXTURE = "resettexture"; + + /** + * Id of the toggle to select a banner. + */ + public static final String BUTTON_BANNER_PICKER = "bannerPicker"; + /** * Id of the remove player button in the GUI. */ @@ -194,6 +219,11 @@ public final class WindowConstants */ public static final String LIST_CITIZENS = "citizenList"; + /** + * Id of the happiness list in the GUI. + */ + public static final String LIST_HAPPINESS = "happinessList"; + /** * Id of the allies list in the GUI. */ @@ -219,6 +249,11 @@ public final class WindowConstants */ public static final String NAME_LABEL = "name"; + /** + * Id of the search input. + */ + public static final String SEARCH_INPUT = "search"; + /** * Id of the pos label in the GUI. */ @@ -244,6 +279,26 @@ public final class WindowConstants */ public static final String JOB_LABEL = "job"; + /** + * The health of the citizen. + */ + public static final String HEALTH_SHORT_LABEL = "health"; + + /** + * The citizen entity. + */ + public static final String ENTITY_ICON = "entity"; + + /** + * The happiness of the citizen. + */ + public static final String HAPPINESS_SHORT_LABEL = "happinessLevel"; + + /** + * The saturation of the citizen. + */ + public static final String SATURATION_SHORT_LABEL = "saturation"; + /** * Id of the distance label in the GUI. */ @@ -433,16 +488,6 @@ public final class WindowConstants public static final String GUIDE_CONFIRM = "confirm"; public static final String GUIDE_CLOSE = "close"; - public static final String BLOCK1_ADD = "addBlock1"; - public static final String BLOCK2_ADD = "addBlock2"; - public static final String BLOCK3_ADD = "addBlock3"; - - public static final String BLOCK1 = "block1Icon"; - public static final String BLOCK2 = "block2Icon"; - public static final String BLOCK3 = "block3Icon"; - - public static final String ADD = "add"; - /** * BOWindow resource list gui file. */ @@ -525,10 +570,10 @@ public final class WindowConstants /** * Icons used to display the happiness */ - public static final String RED_ICON = "minecolonies:textures/gui/red_icon.png"; - public static final String YELLOW_ICON = "minecolonies:textures/gui/yellow_icon.png"; - public static final String GREEN_ICON = "minecolonies:textures/gui/green_icon.png"; - public static final String BLUE_ICON = "minecolonies:textures/gui/blue_icon.png"; + public static final String UNHAPPY_ICON = "minecolonies:textures/gui/unhappy_icon.png"; + public static final String UNSATISFIED_ICON = "minecolonies:textures/gui/unsatisfied_icon.png"; + public static final String HAPPY_ICON = "minecolonies:textures/gui/happy_icon.png"; + public static final String SATISFIED_ICON = "minecolonies:textures/gui/satisfied_icon.png"; public static final String LABEL_CONSTRUCTION_NAME = "constructionName"; public static final String LABEL_PROGRESS = "progress"; @@ -621,12 +666,12 @@ public final class WindowConstants * The row where the emtpy Happiness bar starts. */ - public static final int HAPPINESS_BAR_EMPTY_ROW = 74; + public static final int HAPPINESS_BAR_EMPTY_ROW = 0; /** * The row where the full happiness bar starts. */ - public static final int HAPPINESS_BAR_FULL_ROW = 79; + public static final int HAPPINESS_BAR_FULL_ROW = 0; /** * X position of the empty heart icon. @@ -850,6 +895,11 @@ public final class WindowConstants */ public static final String FEMALE_SOURCE = "minecolonies:textures/gui/citizen/colonist_wax_female_smaller.png"; + /** + * Source of the female wax location. + */ + public static final String MALE_SOURCE = "minecolonies:textures/gui/citizen/colonist_wax_male_smaller.png"; + /** * Id of the detail button */ @@ -1113,7 +1163,6 @@ public final class WindowConstants public static final String TOWNHALL_PERM_MODE_TOGGLE = "permissionsModeToggle"; public static final String TOWNHALL_BUTTON_SUBSCRIBER = "setSubscriber"; public static final String TOWNHALL_RANK_TYPE_PICKER = "rankTypePicker"; - public static final String TOWNHALL_PERMISSION_ERROR = "permissionError"; /** * Input filter id. diff --git a/src/api/java/com/minecolonies/api/util/constant/translation/CommandTranslationConstants.java b/src/api/java/com/minecolonies/api/util/constant/translation/CommandTranslationConstants.java index 9e34edcc0fb..f84c78f0bf7 100644 --- a/src/api/java/com/minecolonies/api/util/constant/translation/CommandTranslationConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/translation/CommandTranslationConstants.java @@ -90,6 +90,8 @@ public class CommandTranslationConstants @NonNls public static final String COMMAND_RAID_NOW_SUCCESS = "com.minecolonies.command.raidnow.success"; @NonNls + public static final String COMMAND_RAID_NOW_FAILURE = "com.minecolonies.command.raidnow.failure"; + @NonNls public static final String COMMAND_RAID_TONIGHT_SUCCESS = "com.minecolonies.command.raidtonight.success"; @NonNls public static final String COMMAND_REQUEST_SYSTEM_RESET_SUCCESS = "com.minecolonies.command.rsreset.success"; diff --git a/src/api/java/com/minecolonies/api/util/constant/translation/DebugTranslationConstants.java b/src/api/java/com/minecolonies/api/util/constant/translation/DebugTranslationConstants.java index 738f7b3dc68..5682cbe3b36 100644 --- a/src/api/java/com/minecolonies/api/util/constant/translation/DebugTranslationConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/translation/DebugTranslationConstants.java @@ -8,9 +8,11 @@ public class DebugTranslationConstants { @NonNls - public static final String DEBUG_NO_CLOSE_COLONY = "com.minecolonies.coremod.gui.debugscreen.noclosecolony"; + public static final String DEBUG_NO_CLOSE_COLONY = "com.minecolonies.coremod.gui.debugscreen.noclosecolony"; @NonNls - public static final String DEBUG_NEXT_COLONY = "com.minecolonies.coremod.gui.debugscreen.nextcolony"; + public static final String DEBUG_NEXT_COLONY = "com.minecolonies.coremod.gui.debugscreen.nextcolony"; @NonNls - public static final String DEBUG_BLOCKS_FROM_CENTER = "com.minecolonies.coremod.gui.debugscreen.blocksfromcenter"; + public static final String DEBUG_BLOCKS_FROM_CENTER = "com.minecolonies.coremod.gui.debugscreen.blocksfromcenter"; + @NonNls + public static final String DEBUG_WARNING_CITIZEN_LOAD_FAILURE = "com.minecolonies.coremod.debug.citizenloadfailure"; } diff --git a/src/api/java/com/minecolonies/api/util/constant/translation/GuiTranslationConstants.java b/src/api/java/com/minecolonies/api/util/constant/translation/GuiTranslationConstants.java index ea84342e937..403f5aba66d 100644 --- a/src/api/java/com/minecolonies/api/util/constant/translation/GuiTranslationConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/translation/GuiTranslationConstants.java @@ -9,4 +9,40 @@ public class GuiTranslationConstants { @NonNls public static final String LABEL_MAIN_TAB_NAME = "com.minecolonies.coremod.gui.maintab"; + + // Building tab names + @NonNls + public static final String BUILDING_TAB_FIELDS = "com.minecolonies.coremod.gui.workerhuts.fields"; + + // Field list tab values + @NonNls + public static final String FIELD_LIST_LABEL_FIELD_COUNT = "com.minecolonies.coremod.gui.workerhuts.fields.fieldcount"; + @NonNls + public static final String FIELD_LIST_LABEL_PLANT_COUNT = "com.minecolonies.coremod.gui.workerhuts.fields.plantcount"; + @NonNls + public static final String FIELD_LIST_WARN_EXCEEDS_FIELD_COUNT = "com.minecolonies.coremod.gui.workerhuts.fields.fieldcount.reached"; + @NonNls + public static final String FIELD_LIST_WARN_EXCEEDS_PLANT_COUNT = "com.minecolonies.coremod.gui.workerhuts.plantationfields.plantcount.reached"; + @NonNls + public static final String FIELD_LIST_PLANTATION_RESEARCH_REQUIRED = "com.minecolonies.coremod.gui.workerhuts.fields.plantation.research"; + @NonNls + public static final String FIELD_LIST_FARMER_NO_SEED = "com.minecolonies.coremod.gui.workerhuts.fields.farmer.noseed"; + + // Field UI + @NonNls + public static final String FIELD_GUI_ASSIGNED_FARMER = "com.minecolonies.coremod.gui.field.assignedfarmer"; + @NonNls + public static final String FIELD_GUI_NO_ASSIGNED_FARMER = "com.minecolonies.coremod.gui.field.noassignedfarmer"; + + // Quest log + @NonNls + public static final String QUEST_LOG_NAME_PREFIX = "com.minecolonies.coremod.item.questlog.gui.name_prefix"; + @NonNls + public static final String QUEST_LOG_GIVER_PREFIX = "com.minecolonies.coremod.item.questlog.gui.giver_prefix"; + @NonNls + public static final String QUEST_LOG_COMPLETED_ONCE_TEXT = "com.minecolonies.coremod.item.questlog.gui.completed"; + @NonNls + public static final String QUEST_LOG_COMPLETED_MULTIPLE_TEXT = "com.minecolonies.coremod.item.questlog.gui.completed_multiple"; + @NonNls + public static final String QUEST_LOG_TRACK_CITIZEN_TEXT = "com.minecolonies.coremod.item.questlog.gui.track_citizen"; } diff --git a/src/api/java/com/minecolonies/api/util/constant/translation/RequestSystemTranslationConstants.java b/src/api/java/com/minecolonies/api/util/constant/translation/RequestSystemTranslationConstants.java index 56823915984..e3325105182 100644 --- a/src/api/java/com/minecolonies/api/util/constant/translation/RequestSystemTranslationConstants.java +++ b/src/api/java/com/minecolonies/api/util/constant/translation/RequestSystemTranslationConstants.java @@ -38,6 +38,8 @@ public class RequestSystemTranslationConstants @NonNls public static final String REQUEST_SYSTEM_CRAFTING_DISPLAY = "com.minecolonies.coremod.request.crafting.display"; @NonNls + public static final String REQUEST_SYSTEM_CRAFTING_DISPLAY_SHORT = "com.minecolonies.coremod.request.crafting.display.short"; + @NonNls public static final String REQUEST_SYSTEM_BUILDING_LEVEL_TOO_LOW = "com.minecolonies.coremod.request.toolow"; @NonNls diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json b/src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json index 45e7ff980a7..5afb9d6f073 100644 --- a/src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json +++ b/src/datagen/generated/minecolonies/assets/minecolonies/lang/default.json @@ -215,7 +215,7 @@ "com.minecolonies.research.effects.blockhutstonesmeltery.description": "Unlocks Stone Smeltery", "com.minecolonies.research.effects.blockplacespeedmultiplier.description": "Citizen Block Place Speed +%3$s%%", "com.minecolonies.research.effects.buildermodeunlock.description": "Add the option to select different build-modes for your builders", - "com.minecolonies.research.effects.citizencapaddition.description": "Increase Max Citizens +%s", + "com.minecolonies.research.effects.citizencapaddition.description": "Max Citizens to %2$s", "com.minecolonies.research.effects.citizeninvslotsaddition.description": "Citizen Inventory +%s Slots", "com.minecolonies.research.effects.consumearrowsunlock.description": "Archers Use Arrows For +2 Damage", "com.minecolonies.research.effects.consumepotions.description": "Druids request Magic Potions to unlock new Abilities", @@ -232,6 +232,7 @@ "com.minecolonies.research.effects.healingsaturationlimitaddition.description": "Healing Saturation Min %s", "com.minecolonies.research.effects.healthaddition.description": "Citizen HP +%s", "com.minecolonies.research.effects.knighttauntmobsunlock.description": "Knights Force Mobs to Target Them", + "com.minecolonies.research.effects.knowledgeofthedepthsunlock.description": "Crusher Learns Deepslate and Tuff Recipes", "com.minecolonies.research.effects.knowledgeoftheendunlock.description": "Stonemasons Learn Endstone Recipe and Bakers Learn Chorus Bread Recipe", "com.minecolonies.research.effects.levelingmultiplier.description": "Citizen XP Growth +%3$s%%", "com.minecolonies.research.effects.masks.description": "Reduce disease transmission", @@ -244,7 +245,11 @@ "com.minecolonies.research.effects.morescrollsunlock.description": "Enchanter Learns Scroll Recipes to Locate Workers and Summon Guards", "com.minecolonies.research.effects.netherexpeditionlog.description": "Adds expedition log to Nether Mine", "com.minecolonies.research.effects.piercingarrowsunlock.description": "Archers Gain Piercing II", - "com.minecolonies.research.effects.plant2unlock.description": "Plantations Grow Two Crops at Once", + "com.minecolonies.research.effects.plantationexotic.description": "Plantations Unlock Fields For: Glowberries", + "com.minecolonies.research.effects.plantationjungle.description": "Plantations Unlock Fields For: Bamboo, Cocoa and Vines", + "com.minecolonies.research.effects.plantationlarge.description": "Plantations Unlock 1 Additional Field", + "com.minecolonies.research.effects.plantationnether.description": "Plantations Unlock Fields For: Crimson fungi and Warped fungi", + "com.minecolonies.research.effects.plantationsea.description": "Plantations Unlock Fields For: Kelp, Seagrass and Sea pickles", "com.minecolonies.research.effects.platearmorunlock.description": "Blacksmith Learns Plate Armor Recipes", "com.minecolonies.research.effects.podzolchancemultiplier.description": "Composters Get +%3$s%% More Podzol", "com.minecolonies.research.effects.railsunlock.description": "Citizens use Rails", @@ -289,21 +294,25 @@ "com.minecolonies.research.technology.cheatsheet.name": "Cheat Sheet", "com.minecolonies.research.technology.cheatsheet.subtitle": "So THAT's what I should be making!", "com.minecolonies.research.technology.compost.name": "Compost", + "com.minecolonies.research.technology.croprotation.name": "Crop Rotation", + "com.minecolonies.research.technology.croprotation.subtitle": "Bigger = better", "com.minecolonies.research.technology.deeppockets.name": "Deep Pockets", "com.minecolonies.research.technology.depthknowledge.name": "Knowledge of the Depth", "com.minecolonies.research.technology.depthknowledge.subtitle": "Gotta go deep for that one.", "com.minecolonies.research.technology.diamondcoated.name": "Diamond Coated", - "com.minecolonies.research.technology.doubletrouble.name": "Double Trouble", - "com.minecolonies.research.technology.doubletrouble.subtitle": "Double Trouble", "com.minecolonies.research.technology.dung.name": "Dung", "com.minecolonies.research.technology.dung.subtitle": "Fresh or not, here it comes!", "com.minecolonies.research.technology.enhanced_gates1.name": "Enhanced Gates I", "com.minecolonies.research.technology.enhanced_gates2.name": "Enhanced Gates II", + "com.minecolonies.research.technology.exoticfruits.name": "Exotic Fruits", + "com.minecolonies.research.technology.exoticfruits.subtitle": "Too Dark Here", "com.minecolonies.research.technology.fertilizer.name": "Fertilizer", "com.minecolonies.research.technology.fertilizer.subtitle": "Ah, that's the stuff!", "com.minecolonies.research.technology.flowerpower.name": "Flower Power", "com.minecolonies.research.technology.fullstock.name": "Full Stock!", "com.minecolonies.research.technology.fullstock.subtitle": "We might be able to squeeze in one more.", + "com.minecolonies.research.technology.gargamel.name": "Gargamel", + "com.minecolonies.research.technology.gargamel.subtitle": "The Root of all Evil", "com.minecolonies.research.technology.gildedhammer.name": "Gilded Hammer", "com.minecolonies.research.technology.gildedhammer.subtitle": "When in doubt, cover in shiny stuff.", "com.minecolonies.research.technology.goodveins.name": "Good Veins", @@ -318,6 +327,8 @@ "com.minecolonies.research.technology.hotboots.name": "Hot Boots", "com.minecolonies.research.technology.hotboots.subtitle": "Warmer on the outside.", "com.minecolonies.research.technology.isthisredstone.name": "Is This Redstone?", + "com.minecolonies.research.technology.junglemaster.name": "Jungle Master", + "com.minecolonies.research.technology.junglemaster.subtitle": "Wimoweh Wimoweh Wimoweh", "com.minecolonies.research.technology.knowtheend.name": "Know the End", "com.minecolonies.research.technology.knowtheend.subtitle": "Unlock the secrets of the most mysterious dimension.", "com.minecolonies.research.technology.letitgrow.name": "Let It Grow", @@ -371,6 +382,8 @@ "com.minecolonies.research.technology.stonecake.subtitle": "Don't break a tooth!", "com.minecolonies.research.technology.stringwork.name": "Stringwork", "com.minecolonies.research.technology.strong.name": "Strong", + "com.minecolonies.research.technology.takingdivinglessons.name": "Taking Diving Lessons", + "com.minecolonies.research.technology.takingdivinglessons.subtitle": "*Drowning Noises*", "com.minecolonies.research.technology.theflintstones.name": "The Flintstones", "com.minecolonies.research.technology.theflintstones.subtitle": "Yabba Dabba Doo!", "com.minecolonies.research.technology.thoselungs.name": "Those Lungs!", diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/lang/quests.json b/src/datagen/generated/minecolonies/assets/minecolonies/lang/quests.json new file mode 100644 index 00000000000..f5aeb9ecf7f --- /dev/null +++ b/src/datagen/generated/minecolonies/assets/minecolonies/lang/quests.json @@ -0,0 +1,94 @@ +{ + "minecolonies.quests.general.hungrycourier": "The Hungry Deliveryman", + "minecolonies.quests.general.hungrycourier.obj0": "Hey there, could I ask you a favour?", + "minecolonies.quests.general.hungrycourier.obj0.answer0": "Sure, what do you need?", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply": "I'm starving and I forgot my lunch at home. Could you bring me some food?", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0": "What kind of food do you want?", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0.reply": "A baked potato would just hit the spot!", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0.reply.answer0": "Got it. I'll be right back.", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1": "I'm sorry, I don't have any food on me.", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1.reply": "Ah, too bad. I guess I'll just have to make do until I get home.", + "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1.reply.answer0": "I'll see if I can find something for you later.", + "minecolonies.quests.general.hungrycourier.obj0.answer1": "Sorry, I'm in a rush right now!", + "minecolonies.quests.general.hungrycourier.obj2": "Oh, this was great! Thanks a lot!", + "minecolonies.quests.general.hungrycourier.obj2.answer0": "You're welcome!", + "minecolonies.quests.general.thezombiemenace": "The Zombie Menace", + "minecolonies.quests.general.thezombiemenace.obj0": "We have a problem. The Zombies in the nearby forest are causing trouble. Can you help us take care of them?", + "minecolonies.quests.general.thezombiemenace.obj0.answer0": "Sure, I'll do what I can.", + "minecolonies.quests.general.thezombiemenace.obj0.answer0.reply": "Thank you! We need you to kill 10 Zombies. We'll reward you for your efforts.", + "minecolonies.quests.general.thezombiemenace.obj0.answer0.reply.answer0": "I'm on it!", + "minecolonies.quests.general.thezombiemenace.obj0.answer1": "I'm sorry, I can't help right now.", + "minecolonies.quests.general.thezombiemenace.obj2": "You did it! We're safe for now. Here's your reward.", + "minecolonies.quests.general.thezombiemenace.obj2.answer0": "Thank you!", + "minecolonies.quests.guides.buildergoggles": "The Builder's Glasses", + "minecolonies.quests.guides.buildergoggles.obj0": "Hey there! Can I ask you for a favor? I lost my glasses the other day and I can't see very well without them. Do you think you could get me a new pair of builders goggles?", + "minecolonies.quests.guides.buildergoggles.obj0.answer0": "Of course, I'll see what I can do!", + "minecolonies.quests.guides.buildergoggles.obj0.answer1": "Sorry, I can't help you right now.", + "minecolonies.quests.guides.buildergoggles.obj2": "Ah, you found my glasses! Thank you so much. I can finally see clearly what I'm building again. You should try them out sometime, they're pretty neat.", + "minecolonies.quests.guides.buildergoggles.obj2.answer0": "You're welcome!", + "minecolonies.quests.guides.clipboard": "The Warehouse Manager", + "minecolonies.quests.guides.clipboard.obj0": "Hey there! Have you heard of the clipboard? It's a tool that can help you keep track of all the requests in our colony. If you could bring me one, I would be forever grateful!", + "minecolonies.quests.guides.clipboard.obj0.answer0": "Sure, I'll see what I can do!", + "minecolonies.quests.guides.clipboard.obj0.answer1": "Sorry, I can't help you right now.", + "minecolonies.quests.guides.clipboard.obj0.answer2": "I already know what it does!", + "minecolonies.quests.guides.clipboard.obj2": "Great, you found a clipboard! To use it, simply shift-right click it on any hut block. This will give you an overview of all the requests in the colony. It's super handy, and I am so grateful that you were able to get one for me. Thank you!", + "minecolonies.quests.guides.clipboard.obj2.answer0": "You're welcome!", + "minecolonies.quests.guides.rallybanner": "Rally the Troops", + "minecolonies.quests.guides.rallybanner.obj0": "Lately, we've been seeing a lot of skeletons wandering around at night. If you could help us out by taking care of ten of them, we'd be very grateful!", + "minecolonies.quests.guides.rallybanner.obj0.answer0": "No problem, I'll take care of it!", + "minecolonies.quests.guides.rallybanner.obj0.answer1": "Sorry, I'm too busy right now.", + "minecolonies.quests.guides.rallybanner.obj0.answer2": "Skeletons? Pfft, no problem.", + "minecolonies.quests.guides.rallybanner.obj0.answer3": "Sorry, I don't think I can help you with that.", + "minecolonies.quests.guides.rallybanner.obj2": "Thank you for taking care of those skeletons! You're very brave. Listen, I have something that might help us out. It's called a rallying banner. Could you bring it to me?", + "minecolonies.quests.guides.rallybanner.obj2.answer0": "Sorry, I don't think I can help you with that.", + "minecolonies.quests.guides.rallybanner.obj2.answer1": "A rallying banner? Sounds interesting. I'll go find it.", + "minecolonies.quests.guides.rallybanner.obj2.answer2": "Not right now, maybe later!", + "minecolonies.quests.guides.rallybanner.obj4": "Thanks for bringing me the rallying banner! To use it, simply shift-right click it on any hut block. This will allow you to assign guards to it, and you can manage it by right clicking in the air. It's a great tool for keeping the colony safe!", + "minecolonies.quests.guides.rallybanner.obj4.answer0": "Great, I'll make sure to put it to good use!", + "minecolonies.quests.guides.resourcescroll": "Best Builders Tool", + "minecolonies.quests.guides.resourcescroll.obj0": "Hello there! Have you heard about the Resource Scroll? It's a powerful tool that can help you gather resources more efficiently. I really need one, but I don't have the time to go and find it myself. Would you be willing to bring one to me?", + "minecolonies.quests.guides.resourcescroll.obj0.answer0": "Sure, I can try to find one for you!", + "minecolonies.quests.guides.resourcescroll.obj0.answer1": "I'm sorry, I don't have the time right now.", + "minecolonies.quests.guides.resourcescroll.obj0.answer2": "I already know what it does!", + "minecolonies.quests.guides.resourcescroll.obj2": "Thank you so much for bringing me the Resource Scroll! You know, all you have to do is shift-right-click it on the hut block to activate it. It will help you gather resources more quickly and efficiently. I hope you find it as useful as I do!", + "minecolonies.quests.guides.resourcescroll.obj2.answer0": "Thanks for the tip, I'll be sure to use it!", + "minecolonies.quests.romance.aromanticgesture": "A Romantic Gesture", + "minecolonies.quests.romance.aromanticgesture.obj0": "Hello there, could I ask you to help me with something?", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0": "Sure, what do you need?", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply": "I want to give a poppy to $1, but I'm too shy to do it myself. Can you deliver it for me?", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer0": "Of course, I'll be happy to help.", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1": "I'm sorry, but I can't do that for you.", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1.reply": "Oh, that's too bad. I guess I'll have to try to do it myself.", + "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1.reply.answer0": "Good luck with that!", + "minecolonies.quests.romance.aromanticgesture.obj0.answer1": "I'm sorry, I don't have time right now.", + "minecolonies.quests.romance.aromanticgesture.obj2": "Oh, this is beautiful! Thank you so much! Who is it from?", + "minecolonies.quests.romance.aromanticgesture.obj2.answer0": "It's from $0", + "minecolonies.quests.romance.aromanticgesture.obj2.answer0.reply": "Oh, I see! I'll be sure to thank them. Here, take this as a token of my gratitude.", + "minecolonies.quests.romance.aromanticgesture.obj2.answer0.reply.answer0": "Thank you, I appreciate it.", + "minecolonies.quests.romance.atokenofapp": "A Token of Appreciation", + "minecolonies.quests.romance.atokenofapp.obj0": "Hey, thank you so much for delivering that poppy to me earlier. It really made my day. I was wondering if I could ask you for another favour?", + "minecolonies.quests.romance.atokenofapp.obj0.answer0": "Of course, what do you need?", + "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply": "I have a friend who is feeling a bit down and I want to cheer them up. Could you bring $1 this gift for me?", + "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer0": "Sure, I'll be happy to help.", + "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1": "I'm sorry, but I'm a bit busy right now.", + "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1.reply": "Oh, that's too bad. Maybe another time then.", + "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1.reply.answer0": "Sure, I'll keep it in mind.", + "minecolonies.quests.romance.atokenofapp.obj0.answer1": "I'm sorry, but I can't help you right now.", + "minecolonies.quests.romance.atokenofapp.obj1": "Hi, what do you want?", + "minecolonies.quests.romance.atokenofapp.obj1.answer0": "Oh, hello! $0 told me to bring you a gift to cheer you up.", + "minecolonies.quests.romance.atokenofapp.obj1.answer0.reply": "How kind of them! Thank you so much!", + "minecolonies.quests.romance.atokenofapp.obj1.answer0.reply.answer0": "No Problem!", + "minecolonies.quests.romance.atokenofapp.obj3": "Thank you so much for delivering that gift. You're a true friend.", + "minecolonies.quests.romance.atokenofapp.obj3.answer0": "No problem, glad I could help.", + "minecolonies.quests.template.questtemplate": "Name of the Quest", + "minecolonies.quests.template.questtemplate.obj0": "Hi, how are you?", + "minecolonies.quests.template.questtemplate.obj0.answer0": "Im alright, and you?", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply": "Could you bring me an Apple? I'm really hungry!", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer0": "Sure!", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer1": "Sorry, I don't have time right now!", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer2": "We don't have any apples right now!", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3": "Could I bring you a baked potato?", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3.reply": "Sure sounds good!", + "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3.reply.answer0": "Be right back then!", + "minecolonies.quests.template.questtemplate.obj0.answer1": "I don't have time right now!" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles.json b/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles.json new file mode 100644 index 00000000000..09f29938cc2 --- /dev/null +++ b/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles.json @@ -0,0 +1,14 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecolonies:item/build_goggles_disabled", + "predicate": { + "minecraft:disabled": 1.0 + } + } + ], + "textures": { + "layer0": "minecolonies:items/build_goggles" + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles_disabled.json b/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles_disabled.json new file mode 100644 index 00000000000..bb321feeaa4 --- /dev/null +++ b/src/datagen/generated/minecolonies/assets/minecolonies/models/item/build_goggles_disabled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecolonies:items/build_goggles_disabled" + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/sounds.json b/src/datagen/generated/minecolonies/assets/minecolonies/sounds.json index cbfc66128ee..3d4cd7e9031 100644 --- a/src/datagen/generated/minecolonies/assets/minecolonies/sounds.json +++ b/src/datagen/generated/minecolonies/assets/minecolonies/sounds.json @@ -1,25742 +1,145363 @@ { - "mob.alchemist.female.bad_housing": { + "citizen.alchemist.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.bad_weather": { + "citizen.alchemist.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.danger": { + "citizen.alchemist.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.farewell": { + "citizen.alchemist.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.general": { + "citizen.alchemist.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.greeting": { + "citizen.alchemist.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.happy": { + "citizen.alchemist.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.interaction": { + "citizen.alchemist.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.missing_equipment": { + "citizen.alchemist.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.noise": { + "citizen.alchemist.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.off_to_bed": { + "citizen.alchemist.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.saturation_high": { + "citizen.alchemist.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.saturation_low": { + "citizen.alchemist.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.sickness": { + "citizen.alchemist.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.success": { + "citizen.alchemist.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.female.unhappy": { + "citizen.alchemist.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.male.bad_housing": { + "citizen.alchemist.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.alchemist.male.bad_weather": { + "citizen.alchemist.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.danger": { + "citizen.alchemist.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.farewell": { + "citizen.alchemist.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.general": { + "citizen.alchemist.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.greeting": { + "citizen.alchemist.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.happy": { + "citizen.alchemist.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.interaction": { + "citizen.alchemist.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.missing_equipment": { + "citizen.alchemist.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.noise": { + "citizen.alchemist.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.off_to_bed": { + "citizen.alchemist.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.saturation_high": { + "citizen.alchemist.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.saturation_low": { + "citizen.alchemist.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.sickness": { + "citizen.alchemist.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.success": { + "citizen.alchemist.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.alchemist.male.unhappy": { + "citizen.alchemist.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false - } - ] - }, - "mob.amazon.death": { - "category": "hostile", - "sounds": [ + }, { - "name": "minecolonies:mob/barbarian/death", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.amazon.hurt": { - "category": "hostile", + "citizen.alchemist.female1.success": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/hurt1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt3", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt4", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.amazon.say": { - "category": "hostile", + "citizen.alchemist.female1.unhappy": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/say", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false - } - ] - }, - "mob.archertraining.female.bad_housing": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.archertraining.female.bad_weather": { + "citizen.alchemist.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.danger": { + "citizen.alchemist.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.farewell": { + "citizen.alchemist.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.general": { + "citizen.alchemist.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.greeting": { + "citizen.alchemist.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.happy": { + "citizen.alchemist.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.interaction": { + "citizen.alchemist.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.missing_equipment": { + "citizen.alchemist.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.noise": { + "citizen.alchemist.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.off_to_bed": { + "citizen.alchemist.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.saturation_high": { + "citizen.alchemist.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.saturation_low": { + "citizen.alchemist.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.sickness": { + "citizen.alchemist.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.success": { + "citizen.alchemist.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.female.unhappy": { + "citizen.alchemist.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.male.bad_housing": { + "citizen.alchemist.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.male.bad_weather": { + "citizen.alchemist.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.archertraining.male.danger": { + "citizen.alchemist.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.farewell": { + "citizen.alchemist.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.general": { + "citizen.alchemist.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.greeting": { + "citizen.alchemist.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.happy": { + "citizen.alchemist.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.interaction": { + "citizen.alchemist.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.missing_equipment": { + "citizen.alchemist.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.noise": { + "citizen.alchemist.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.off_to_bed": { + "citizen.alchemist.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.saturation_high": { + "citizen.alchemist.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.saturation_low": { + "citizen.alchemist.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.sickness": { + "citizen.alchemist.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.success": { + "citizen.alchemist.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.archertraining.male.unhappy": { + "citizen.alchemist.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.baker.female.bad_housing": { + "citizen.alchemist.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.baker.female.bad_weather": { + "citizen.alchemist.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.baker.female.danger": { + "citizen.alchemist.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.baker.female.farewell": { + "citizen.alchemist.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.general": { + "citizen.alchemist.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.greeting": { + "citizen.alchemist.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.happy": { + "citizen.alchemist.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.interaction": { + "citizen.alchemist.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.missing_equipment": { + "citizen.alchemist.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.noise": { + "citizen.alchemist.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.off_to_bed": { + "citizen.alchemist.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.saturation_high": { + "citizen.alchemist.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.saturation_low": { + "citizen.alchemist.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.sickness": { + "citizen.alchemist.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.success": { + "citizen.alchemist.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.female.unhappy": { + "citizen.alchemist.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.male.bad_housing": { + "citizen.alchemist.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.male.bad_weather": { + "citizen.alchemist.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.male.danger": { + "citizen.alchemist.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.male.farewell": { + "citizen.alchemist.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.baker.male.general": { + "citizen.alchemist.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.greeting": { + "citizen.alchemist.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.happy": { + "citizen.alchemist.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.interaction": { + "citizen.alchemist.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.missing_equipment": { + "citizen.alchemist.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.noise": { + "citizen.alchemist.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.off_to_bed": { + "citizen.alchemist.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.saturation_high": { + "citizen.alchemist.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.saturation_low": { + "citizen.alchemist.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.sickness": { + "citizen.alchemist.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.success": { + "citizen.alchemist.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.baker.male.unhappy": { + "citizen.alchemist.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false - } - ] - }, - "mob.barbarian.death": { - "category": "hostile", - "sounds": [ + }, { - "name": "minecolonies:mob/barbarian/death", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.barbarian.hurt": { - "category": "hostile", + "citizen.alchemist.male1.missingequipment": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/hurt1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt3", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt4", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.barbarian.say": { - "category": "hostile", + "citizen.alchemist.male1.noise": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/say", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false - } - ] - }, - "mob.beekeeper.female.bad_housing": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.beekeeper.female.bad_weather": { + "citizen.alchemist.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.beekeeper.female.danger": { + "citizen.alchemist.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.beekeeper.female.farewell": { + "citizen.alchemist.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.beekeeper.female.general": { + "citizen.alchemist.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.greeting": { + "citizen.alchemist.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.happy": { + "citizen.alchemist.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.interaction": { + "citizen.alchemist.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.missing_equipment": { + "citizen.alchemist.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.noise": { + "citizen.alchemist.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.off_to_bed": { + "citizen.alchemist.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.saturation_high": { + "citizen.alchemist.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.saturation_low": { + "citizen.alchemist.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.sickness": { + "citizen.alchemist.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.success": { + "citizen.alchemist.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.female.unhappy": { + "citizen.alchemist.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.bad_housing": { + "citizen.alchemist.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.bad_weather": { + "citizen.alchemist.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.danger": { + "citizen.alchemist.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.farewell": { + "citizen.alchemist.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.general": { + "citizen.alchemist.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.beekeeper.male.greeting": { + "citizen.alchemist.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.happy": { + "citizen.alchemist.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.interaction": { + "citizen.alchemist.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.missing_equipment": { + "citizen.alchemist.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.noise": { + "citizen.alchemist.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.off_to_bed": { + "citizen.alchemist.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.saturation_high": { + "citizen.alchemist.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.saturation_low": { + "citizen.alchemist.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.sickness": { + "citizen.alchemist.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.success": { + "citizen.alchemist.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.beekeeper.male.unhappy": { + "citizen.alchemist.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.bad_housing": { + "citizen.alchemist.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.bad_weather": { + "citizen.alchemist.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.danger": { + "citizen.alchemist.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.farewell": { + "citizen.alchemist.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.general": { + "citizen.alchemist.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.greeting": { + "citizen.alchemist.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.blacksmith.female.happy": { + "citizen.alchemist.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.interaction": { + "citizen.alchemist.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.missing_equipment": { + "citizen.alchemist.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.noise": { + "citizen.alchemist.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.off_to_bed": { + "citizen.alchemist.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.saturation_high": { + "citizen.alchemist.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.saturation_low": { + "citizen.alchemist.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.sickness": { + "citizen.alchemist.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.success": { + "citizen.alchemist.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.female.unhappy": { + "citizen.alchemist.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.bad_housing": { + "citizen.alchemist.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.bad_weather": { + "citizen.alchemist.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.danger": { + "citizen.alchemist.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.farewell": { + "citizen.alchemist.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.general": { + "citizen.alchemist.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.greeting": { + "citizen.alchemist.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.happy": { + "citizen.alchemist.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.blacksmith.male.interaction": { + "citizen.archertraining.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.missing_equipment": { + "citizen.archertraining.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.noise": { + "citizen.archertraining.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.off_to_bed": { + "citizen.archertraining.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.saturation_high": { + "citizen.archertraining.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.saturation_low": { + "citizen.archertraining.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.sickness": { + "citizen.archertraining.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.success": { + "citizen.archertraining.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.blacksmith.male.unhappy": { + "citizen.archertraining.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.archertraining.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.builder.female.bad_housing": { + "citizen.archertraining.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.bad_weather": { + "citizen.archertraining.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.danger": { + "citizen.archertraining.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.farewell": { + "citizen.archertraining.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.general": { + "citizen.archertraining.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.greeting": { + "citizen.archertraining.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.happy": { + "citizen.archertraining.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.interaction": { + "citizen.archertraining.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.missing_equipment": { + "citizen.archertraining.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.noise": { + "citizen.archertraining.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.off_to_bed": { + "citizen.archertraining.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.saturation_high": { + "citizen.archertraining.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.saturation_low": { + "citizen.archertraining.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.sickness": { + "citizen.archertraining.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.success": { + "citizen.archertraining.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.female.unhappy": { + "citizen.archertraining.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.male.bad_housing": { + "citizen.archertraining.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.builder.male.bad_weather": { + "citizen.archertraining.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.danger": { + "citizen.archertraining.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.farewell": { + "citizen.archertraining.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.general": { + "citizen.archertraining.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.greeting": { + "citizen.archertraining.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.happy": { + "citizen.archertraining.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.interaction": { + "citizen.archertraining.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.missing_equipment": { + "citizen.archertraining.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.noise": { + "citizen.archertraining.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.off_to_bed": { + "citizen.archertraining.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.saturation_high": { + "citizen.archertraining.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.saturation_low": { + "citizen.archertraining.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.sickness": { + "citizen.archertraining.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.success": { + "citizen.archertraining.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.builder.male.unhappy": { + "citizen.archertraining.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.chickenherder.female.bad_housing": { + "citizen.archertraining.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.chickenherder.female.bad_weather": { + "citizen.archertraining.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.chickenherder.female.danger": { + "citizen.archertraining.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.farewell": { + "citizen.archertraining.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.general": { + "citizen.archertraining.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.greeting": { + "citizen.archertraining.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.happy": { + "citizen.archertraining.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.interaction": { + "citizen.archertraining.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.missing_equipment": { + "citizen.archertraining.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.noise": { + "citizen.archertraining.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.off_to_bed": { + "citizen.archertraining.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.saturation_high": { + "citizen.archertraining.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.saturation_low": { + "citizen.archertraining.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.sickness": { + "citizen.archertraining.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.success": { + "citizen.archertraining.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.female.unhappy": { + "citizen.archertraining.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.male.bad_housing": { + "citizen.archertraining.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.male.bad_weather": { + "citizen.archertraining.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.male.danger": { + "citizen.archertraining.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.chickenherder.male.farewell": { + "citizen.archertraining.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.general": { + "citizen.archertraining.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.greeting": { + "citizen.archertraining.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.happy": { + "citizen.archertraining.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.interaction": { + "citizen.archertraining.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.missing_equipment": { + "citizen.archertraining.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.noise": { + "citizen.archertraining.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.off_to_bed": { + "citizen.archertraining.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.saturation_high": { + "citizen.archertraining.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.saturation_low": { + "citizen.archertraining.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.sickness": { + "citizen.archertraining.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.success": { + "citizen.archertraining.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.chickenherder.male.unhappy": { + "citizen.archertraining.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.child.female.bad_housing": { + "citizen.archertraining.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false - } - ] - }, - "mob.child.female.bad_weather": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.child.female.danger": { + "citizen.archertraining.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false - } - ] - }, - "mob.child.female.farewell": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.child.female.general": { + "citizen.archertraining.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false - } - ] - }, - "mob.child.female.greeting": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.child.female.happy": { + "citizen.archertraining.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false - } - ] - }, - "mob.child.female.interaction": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.child.female.missing_equipment": { + "citizen.archertraining.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.female.noise": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.female.off_to_bed": { + "citizen.archertraining.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.female.saturation_high": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.female.saturation_low": { + "citizen.archertraining.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.female.sickness": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.female.success": { + "citizen.archertraining.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.female.unhappy": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.bad_housing": { + "citizen.archertraining.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.bad_weather": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.danger": { + "citizen.archertraining.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.farewell": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.general": { + "citizen.archertraining.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.greeting": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.happy": { + "citizen.archertraining.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.interaction": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.missing_equipment": { + "citizen.archertraining.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.noise": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.off_to_bed": { + "citizen.archertraining.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.saturation_high": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.saturation_low": { + "citizen.archertraining.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.sickness": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.child.male.success": { + "citizen.archertraining.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false - } - ] - }, - "mob.child.male.unhappy": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/child/laugh1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/child/laugh2", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.bad_housing": { + "citizen.archertraining.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", - "stream": false - } - ] - }, - "mob.citizen.female.bad_weather": { - "category": "neutral", - "sounds": [ - { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.danger": { + "citizen.archertraining.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.farewell": { + "citizen.archertraining.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.general": { + "citizen.archertraining.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.greeting": { + "citizen.archertraining.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.citizen.female.happy": { + "citizen.archertraining.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.interaction": { + "citizen.archertraining.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.missing_equipment": { + "citizen.archertraining.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.noise": { + "citizen.archertraining.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.off_to_bed": { + "citizen.archertraining.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.saturation_high": { + "citizen.archertraining.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.saturation_low": { + "citizen.archertraining.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.sickness": { + "citizen.archertraining.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.success": { + "citizen.archertraining.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.female.unhappy": { + "citizen.archertraining.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.bad_housing": { + "citizen.archertraining.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.bad_weather": { + "citizen.archertraining.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.danger": { + "citizen.archertraining.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.farewell": { + "citizen.archertraining.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.general": { + "citizen.archertraining.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.greeting": { + "citizen.archertraining.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.happy": { + "citizen.archertraining.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.citizen.male.interaction": { + "citizen.archertraining.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.missing_equipment": { + "citizen.archertraining.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.noise": { + "citizen.archertraining.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.off_to_bed": { + "citizen.archertraining.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.saturation_high": { + "citizen.archertraining.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.saturation_low": { + "citizen.archertraining.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.sickness": { + "citizen.archertraining.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.success": { + "citizen.archertraining.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.citizen.male.unhappy": { + "citizen.archertraining.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false - } - ] - }, - "mob.citizen.snore": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/snore", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.bad_housing": { + "citizen.archertraining.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.bad_weather": { + "citizen.archertraining.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.danger": { + "citizen.archertraining.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.farewell": { + "citizen.archertraining.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.general": { + "citizen.archertraining.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.greeting": { + "citizen.archertraining.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.happy": { + "citizen.archertraining.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.interaction": { + "citizen.archertraining.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.combattraining.female.missing_equipment": { + "citizen.archertraining.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.noise": { + "citizen.archertraining.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.off_to_bed": { + "citizen.archertraining.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.saturation_high": { + "citizen.archertraining.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.saturation_low": { + "citizen.archertraining.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.sickness": { + "citizen.archertraining.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.success": { + "citizen.archertraining.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.female.unhappy": { + "citizen.archertraining.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.bad_housing": { + "citizen.archertraining.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.bad_weather": { + "citizen.archertraining.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.danger": { + "citizen.archertraining.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.farewell": { + "citizen.archertraining.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.general": { + "citizen.archertraining.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.greeting": { + "citizen.archertraining.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.happy": { + "citizen.archertraining.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.interaction": { + "citizen.archertraining.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.missing_equipment": { + "citizen.archertraining.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.combattraining.male.noise": { + "citizen.baker.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.off_to_bed": { + "citizen.baker.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.saturation_high": { + "citizen.baker.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.saturation_low": { + "citizen.baker.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.sickness": { + "citizen.baker.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.success": { + "citizen.baker.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.combattraining.male.unhappy": { + "citizen.baker.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.bad_housing": { + "citizen.baker.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.bad_weather": { + "citizen.baker.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.danger": { + "citizen.baker.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.farewell": { + "citizen.baker.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.general": { + "citizen.baker.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.greeting": { + "citizen.baker.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.happy": { + "citizen.baker.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.interaction": { + "citizen.baker.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.missing_equipment": { + "citizen.baker.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.noise": { + "citizen.baker.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.composter.female.off_to_bed": { + "citizen.baker.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.female.saturation_high": { + "citizen.baker.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.female.saturation_low": { + "citizen.baker.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.female.sickness": { + "citizen.baker.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.female.success": { + "citizen.baker.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.female.unhappy": { + "citizen.baker.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.bad_housing": { + "citizen.baker.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.bad_weather": { + "citizen.baker.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.danger": { + "citizen.baker.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.farewell": { + "citizen.baker.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.general": { + "citizen.baker.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.greeting": { + "citizen.baker.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.happy": { + "citizen.baker.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.interaction": { + "citizen.baker.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.missing_equipment": { + "citizen.baker.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.noise": { + "citizen.baker.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.off_to_bed": { + "citizen.baker.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.composter.male.saturation_high": { + "citizen.baker.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.composter.male.saturation_low": { + "citizen.baker.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.composter.male.sickness": { + "citizen.baker.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.composter.male.success": { + "citizen.baker.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.composter.male.unhappy": { + "citizen.baker.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.bad_housing": { + "citizen.baker.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.bad_weather": { + "citizen.baker.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.danger": { + "citizen.baker.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.farewell": { + "citizen.baker.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.general": { + "citizen.baker.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.greeting": { + "citizen.baker.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.happy": { + "citizen.baker.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.interaction": { + "citizen.baker.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.missing_equipment": { + "citizen.baker.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.noise": { + "citizen.baker.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.off_to_bed": { + "citizen.baker.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.saturation_high": { + "citizen.baker.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.concretemixer.female.saturation_low": { + "citizen.baker.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.female.sickness": { + "citizen.baker.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.female.success": { + "citizen.baker.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.female.unhappy": { + "citizen.baker.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.bad_housing": { + "citizen.baker.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.bad_weather": { + "citizen.baker.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.danger": { + "citizen.baker.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.farewell": { + "citizen.baker.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.general": { + "citizen.baker.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.greeting": { + "citizen.baker.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.happy": { + "citizen.baker.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.interaction": { + "citizen.baker.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.missing_equipment": { + "citizen.baker.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.noise": { + "citizen.baker.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.off_to_bed": { + "citizen.baker.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.saturation_high": { + "citizen.baker.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.saturation_low": { + "citizen.baker.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.concretemixer.male.sickness": { + "citizen.baker.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.concretemixer.male.success": { + "citizen.baker.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.concretemixer.male.unhappy": { + "citizen.baker.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.bad_housing": { + "citizen.baker.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.bad_weather": { + "citizen.baker.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.danger": { + "citizen.baker.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.farewell": { + "citizen.baker.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.general": { + "citizen.baker.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.greeting": { + "citizen.baker.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.happy": { + "citizen.baker.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.interaction": { + "citizen.baker.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.missing_equipment": { + "citizen.baker.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.noise": { + "citizen.baker.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.off_to_bed": { + "citizen.baker.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.saturation_high": { + "citizen.baker.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.saturation_low": { + "citizen.baker.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.sickness": { + "citizen.baker.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.cook.female.success": { + "citizen.baker.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.female.unhappy": { + "citizen.baker.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.bad_housing": { + "citizen.baker.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.bad_weather": { + "citizen.baker.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.danger": { + "citizen.baker.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.farewell": { + "citizen.baker.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.general": { + "citizen.baker.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.greeting": { + "citizen.baker.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.happy": { + "citizen.baker.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.interaction": { + "citizen.baker.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.missing_equipment": { + "citizen.baker.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.noise": { + "citizen.baker.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.off_to_bed": { + "citizen.baker.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.saturation_high": { + "citizen.baker.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.saturation_low": { + "citizen.baker.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.sickness": { + "citizen.baker.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.success": { + "citizen.baker.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.cook.male.unhappy": { + "citizen.baker.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.bad_housing": { + "citizen.baker.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.bad_weather": { + "citizen.baker.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.danger": { + "citizen.baker.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.farewell": { + "citizen.baker.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.general": { + "citizen.baker.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.greeting": { + "citizen.baker.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.happy": { + "citizen.baker.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.interaction": { + "citizen.baker.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.missing_equipment": { + "citizen.baker.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.noise": { + "citizen.baker.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.off_to_bed": { + "citizen.baker.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.saturation_high": { + "citizen.baker.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.saturation_low": { + "citizen.baker.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.sickness": { + "citizen.baker.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.success": { + "citizen.baker.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.female.unhappy": { + "citizen.baker.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.cookassistant.male.bad_housing": { + "citizen.baker.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.bad_weather": { + "citizen.baker.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.danger": { + "citizen.baker.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.farewell": { + "citizen.baker.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.general": { + "citizen.baker.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.greeting": { + "citizen.baker.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.happy": { + "citizen.baker.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.interaction": { + "citizen.baker.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.missing_equipment": { + "citizen.baker.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.noise": { + "citizen.baker.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.off_to_bed": { + "citizen.baker.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.saturation_high": { + "citizen.baker.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.saturation_low": { + "citizen.baker.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.sickness": { + "citizen.baker.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.success": { + "citizen.baker.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cookassistant.male.unhappy": { + "citizen.baker.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cowboy.female.bad_housing": { + "citizen.baker.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.cowboy.female.bad_weather": { + "citizen.baker.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.danger": { + "citizen.baker.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.farewell": { + "citizen.baker.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.general": { + "citizen.baker.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.greeting": { + "citizen.baker.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.happy": { + "citizen.baker.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.interaction": { + "citizen.baker.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.missing_equipment": { + "citizen.baker.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.noise": { + "citizen.baker.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.off_to_bed": { + "citizen.baker.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.saturation_high": { + "citizen.baker.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.saturation_low": { + "citizen.baker.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.sickness": { + "citizen.baker.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.success": { + "citizen.baker.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.female.unhappy": { + "citizen.baker.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.male.bad_housing": { + "citizen.baker.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.male.bad_weather": { + "citizen.baker.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.cowboy.male.danger": { + "citizen.beekeeper.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.farewell": { + "citizen.beekeeper.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.general": { + "citizen.beekeeper.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.greeting": { + "citizen.beekeeper.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.happy": { + "citizen.beekeeper.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.interaction": { + "citizen.beekeeper.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.missing_equipment": { + "citizen.beekeeper.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.noise": { + "citizen.beekeeper.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.off_to_bed": { + "citizen.beekeeper.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.saturation_high": { + "citizen.beekeeper.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.saturation_low": { + "citizen.beekeeper.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.sickness": { + "citizen.beekeeper.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.success": { + "citizen.beekeeper.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.cowboy.male.unhappy": { + "citizen.beekeeper.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.crusher.female.bad_housing": { + "citizen.beekeeper.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.crusher.female.bad_weather": { + "citizen.beekeeper.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.crusher.female.danger": { + "citizen.beekeeper.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.crusher.female.farewell": { + "citizen.beekeeper.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.general": { + "citizen.beekeeper.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.greeting": { + "citizen.beekeeper.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.happy": { + "citizen.beekeeper.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.interaction": { + "citizen.beekeeper.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.missing_equipment": { + "citizen.beekeeper.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.noise": { + "citizen.beekeeper.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.off_to_bed": { + "citizen.beekeeper.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.saturation_high": { + "citizen.beekeeper.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.saturation_low": { + "citizen.beekeeper.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.sickness": { + "citizen.beekeeper.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.success": { + "citizen.beekeeper.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.female.unhappy": { + "citizen.beekeeper.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.male.bad_housing": { + "citizen.beekeeper.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.male.bad_weather": { + "citizen.beekeeper.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.male.danger": { + "citizen.beekeeper.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.male.farewell": { + "citizen.beekeeper.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.crusher.male.general": { + "citizen.beekeeper.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.greeting": { + "citizen.beekeeper.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.happy": { + "citizen.beekeeper.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.interaction": { + "citizen.beekeeper.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.missing_equipment": { + "citizen.beekeeper.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.noise": { + "citizen.beekeeper.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.off_to_bed": { + "citizen.beekeeper.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.saturation_high": { + "citizen.beekeeper.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.saturation_low": { + "citizen.beekeeper.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.sickness": { + "citizen.beekeeper.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.success": { + "citizen.beekeeper.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.crusher.male.unhappy": { + "citizen.beekeeper.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.bad_housing": { + "citizen.beekeeper.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.bad_weather": { + "citizen.beekeeper.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.danger": { + "citizen.beekeeper.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.farewell": { + "citizen.beekeeper.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.general": { + "citizen.beekeeper.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.deliveryman.female.greeting": { + "citizen.beekeeper.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.happy": { + "citizen.beekeeper.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.interaction": { + "citizen.beekeeper.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.missing_equipment": { + "citizen.beekeeper.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.noise": { + "citizen.beekeeper.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.off_to_bed": { + "citizen.beekeeper.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.saturation_high": { + "citizen.beekeeper.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.saturation_low": { + "citizen.beekeeper.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.sickness": { + "citizen.beekeeper.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.success": { + "citizen.beekeeper.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.female.unhappy": { + "citizen.beekeeper.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.bad_housing": { + "citizen.beekeeper.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.bad_weather": { + "citizen.beekeeper.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.danger": { + "citizen.beekeeper.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.farewell": { + "citizen.beekeeper.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.general": { + "citizen.beekeeper.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.greeting": { + "citizen.beekeeper.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.deliveryman.male.happy": { + "citizen.beekeeper.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.interaction": { + "citizen.beekeeper.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.missing_equipment": { + "citizen.beekeeper.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.noise": { + "citizen.beekeeper.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.off_to_bed": { + "citizen.beekeeper.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.saturation_high": { + "citizen.beekeeper.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.saturation_low": { + "citizen.beekeeper.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.sickness": { + "citizen.beekeeper.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.success": { + "citizen.beekeeper.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.deliveryman.male.unhappy": { + "citizen.beekeeper.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.bad_housing": { + "citizen.beekeeper.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.bad_weather": { + "citizen.beekeeper.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.danger": { + "citizen.beekeeper.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.farewell": { + "citizen.beekeeper.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.general": { + "citizen.beekeeper.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.greeting": { + "citizen.beekeeper.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.happy": { + "citizen.beekeeper.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.druid.female.interaction": { + "citizen.beekeeper.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.missing_equipment": { + "citizen.beekeeper.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.noise": { + "citizen.beekeeper.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.off_to_bed": { + "citizen.beekeeper.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.saturation_high": { + "citizen.beekeeper.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.saturation_low": { + "citizen.beekeeper.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.sickness": { + "citizen.beekeeper.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.success": { + "citizen.beekeeper.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.female.unhappy": { + "citizen.beekeeper.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.bad_housing": { + "citizen.beekeeper.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.bad_weather": { + "citizen.beekeeper.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.danger": { + "citizen.beekeeper.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.farewell": { + "citizen.beekeeper.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.general": { + "citizen.beekeeper.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.greeting": { + "citizen.beekeeper.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.happy": { + "citizen.beekeeper.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.interaction": { + "citizen.beekeeper.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.druid.male.missing_equipment": { + "citizen.beekeeper.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.noise": { + "citizen.beekeeper.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.off_to_bed": { + "citizen.beekeeper.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.saturation_high": { + "citizen.beekeeper.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.saturation_low": { + "citizen.beekeeper.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.sickness": { + "citizen.beekeeper.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.success": { + "citizen.beekeeper.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.druid.male.unhappy": { + "citizen.beekeeper.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.bad_housing": { + "citizen.beekeeper.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.bad_weather": { + "citizen.beekeeper.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.danger": { + "citizen.beekeeper.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.farewell": { + "citizen.beekeeper.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.general": { + "citizen.beekeeper.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.greeting": { + "citizen.beekeeper.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.happy": { + "citizen.beekeeper.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.interaction": { + "citizen.beekeeper.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.missing_equipment": { + "citizen.beekeeper.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.dyer.female.noise": { + "citizen.beekeeper.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.off_to_bed": { + "citizen.beekeeper.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.saturation_high": { + "citizen.beekeeper.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.saturation_low": { + "citizen.beekeeper.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.sickness": { + "citizen.beekeeper.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.success": { + "citizen.beekeeper.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.female.unhappy": { + "citizen.beekeeper.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.bad_housing": { + "citizen.beekeeper.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.bad_weather": { + "citizen.beekeeper.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.danger": { + "citizen.beekeeper.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.farewell": { + "citizen.beekeeper.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.general": { + "citizen.beekeeper.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.greeting": { + "citizen.beekeeper.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.happy": { + "citizen.beekeeper.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.interaction": { + "citizen.beekeeper.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.missing_equipment": { + "citizen.beekeeper.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.noise": { + "citizen.beekeeper.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.dyer.male.off_to_bed": { + "citizen.beekeeper.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.dyer.male.saturation_high": { + "citizen.beekeeper.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.dyer.male.saturation_low": { + "citizen.beekeeper.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.dyer.male.sickness": { + "citizen.beekeeper.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.dyer.male.success": { + "citizen.beekeeper.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.dyer.male.unhappy": { + "citizen.beekeeper.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false - } - ] - }, - "mob.egyptian.death": { - "category": "hostile", - "sounds": [ + }, { - "name": "minecolonies:mob/barbarian/death", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.egyptian.hurt": { - "category": "hostile", + "citizen.beekeeper.male4.gotobed": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/hurt1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt3", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt4", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.egyptian.say": { - "category": "hostile", + "citizen.beekeeper.male4.greeting": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/say", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false - } - ] - }, - "mob.enchanter.female.bad_housing": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.bad_weather": { + "citizen.beekeeper.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.danger": { + "citizen.beekeeper.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.farewell": { + "citizen.beekeeper.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.general": { + "citizen.beekeeper.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.greeting": { + "citizen.beekeeper.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.happy": { + "citizen.beekeeper.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.interaction": { + "citizen.beekeeper.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.missing_equipment": { + "citizen.beekeeper.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.noise": { + "citizen.beekeeper.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.enchanter.female.off_to_bed": { + "citizen.blacksmith.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.female.saturation_high": { + "citizen.blacksmith.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.female.saturation_low": { + "citizen.blacksmith.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.female.sickness": { + "citizen.blacksmith.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.female.success": { + "citizen.blacksmith.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.female.unhappy": { + "citizen.blacksmith.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.bad_housing": { + "citizen.blacksmith.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.bad_weather": { + "citizen.blacksmith.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.danger": { + "citizen.blacksmith.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.farewell": { + "citizen.blacksmith.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.general": { + "citizen.blacksmith.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.greeting": { + "citizen.blacksmith.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.happy": { + "citizen.blacksmith.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.interaction": { + "citizen.blacksmith.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.missing_equipment": { + "citizen.blacksmith.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.noise": { + "citizen.blacksmith.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.off_to_bed": { + "citizen.blacksmith.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.enchanter.male.saturation_high": { + "citizen.blacksmith.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.enchanter.male.saturation_low": { + "citizen.blacksmith.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.enchanter.male.sickness": { + "citizen.blacksmith.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.enchanter.male.success": { + "citizen.blacksmith.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.enchanter.male.unhappy": { + "citizen.blacksmith.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.bad_housing": { + "citizen.blacksmith.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.bad_weather": { + "citizen.blacksmith.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.danger": { + "citizen.blacksmith.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.farewell": { + "citizen.blacksmith.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.general": { + "citizen.blacksmith.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.greeting": { + "citizen.blacksmith.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.happy": { + "citizen.blacksmith.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.interaction": { + "citizen.blacksmith.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.missing_equipment": { + "citizen.blacksmith.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.noise": { + "citizen.blacksmith.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.off_to_bed": { + "citizen.blacksmith.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.saturation_high": { + "citizen.blacksmith.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.farmer.female.saturation_low": { + "citizen.blacksmith.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.female.sickness": { + "citizen.blacksmith.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.female.success": { + "citizen.blacksmith.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.female.unhappy": { + "citizen.blacksmith.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.bad_housing": { + "citizen.blacksmith.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.bad_weather": { + "citizen.blacksmith.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.danger": { + "citizen.blacksmith.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.farewell": { + "citizen.blacksmith.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.general": { + "citizen.blacksmith.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.greeting": { + "citizen.blacksmith.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.happy": { + "citizen.blacksmith.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.interaction": { + "citizen.blacksmith.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.missing_equipment": { + "citizen.blacksmith.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.noise": { + "citizen.blacksmith.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.off_to_bed": { + "citizen.blacksmith.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.saturation_high": { + "citizen.blacksmith.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.saturation_low": { + "citizen.blacksmith.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.farmer.male.sickness": { + "citizen.blacksmith.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.farmer.male.success": { + "citizen.blacksmith.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.farmer.male.unhappy": { + "citizen.blacksmith.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.bad_housing": { + "citizen.blacksmith.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.bad_weather": { + "citizen.blacksmith.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.danger": { + "citizen.blacksmith.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.farewell": { + "citizen.blacksmith.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.general": { + "citizen.blacksmith.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.greeting": { + "citizen.blacksmith.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.happy": { + "citizen.blacksmith.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.interaction": { + "citizen.blacksmith.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.missing_equipment": { + "citizen.blacksmith.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.noise": { + "citizen.blacksmith.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.off_to_bed": { + "citizen.blacksmith.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.saturation_high": { + "citizen.blacksmith.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.saturation_low": { + "citizen.blacksmith.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.sickness": { + "citizen.blacksmith.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.fisherman.female.success": { + "citizen.blacksmith.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.female.unhappy": { + "citizen.blacksmith.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.bad_housing": { + "citizen.blacksmith.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.bad_weather": { + "citizen.blacksmith.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.danger": { + "citizen.blacksmith.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.farewell": { + "citizen.blacksmith.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.general": { + "citizen.blacksmith.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.greeting": { + "citizen.blacksmith.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.happy": { + "citizen.blacksmith.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.interaction": { + "citizen.blacksmith.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.missing_equipment": { + "citizen.blacksmith.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.noise": { + "citizen.blacksmith.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.off_to_bed": { + "citizen.blacksmith.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.saturation_high": { + "citizen.blacksmith.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.saturation_low": { + "citizen.blacksmith.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.sickness": { + "citizen.blacksmith.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.success": { + "citizen.blacksmith.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.fisherman.male.unhappy": { + "citizen.blacksmith.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.bad_housing": { + "citizen.blacksmith.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.bad_weather": { + "citizen.blacksmith.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.danger": { + "citizen.blacksmith.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.farewell": { + "citizen.blacksmith.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.general": { + "citizen.blacksmith.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.greeting": { + "citizen.blacksmith.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.happy": { + "citizen.blacksmith.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.interaction": { + "citizen.blacksmith.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.missing_equipment": { + "citizen.blacksmith.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.noise": { + "citizen.blacksmith.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.off_to_bed": { + "citizen.blacksmith.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.saturation_high": { + "citizen.blacksmith.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.saturation_low": { + "citizen.blacksmith.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.sickness": { + "citizen.blacksmith.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.success": { + "citizen.blacksmith.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.female.unhappy": { + "citizen.blacksmith.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.fletcher.male.bad_housing": { + "citizen.blacksmith.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.bad_weather": { + "citizen.blacksmith.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.danger": { + "citizen.blacksmith.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.farewell": { + "citizen.blacksmith.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.general": { + "citizen.blacksmith.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.greeting": { + "citizen.blacksmith.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.happy": { + "citizen.blacksmith.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.interaction": { + "citizen.blacksmith.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.missing_equipment": { + "citizen.blacksmith.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.noise": { + "citizen.blacksmith.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.off_to_bed": { + "citizen.blacksmith.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.saturation_high": { + "citizen.blacksmith.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.saturation_low": { + "citizen.blacksmith.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.sickness": { + "citizen.blacksmith.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.success": { + "citizen.blacksmith.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.fletcher.male.unhappy": { + "citizen.blacksmith.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.florist.female.bad_housing": { + "citizen.blacksmith.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.florist.female.bad_weather": { + "citizen.blacksmith.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.danger": { + "citizen.blacksmith.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.farewell": { + "citizen.blacksmith.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.general": { + "citizen.blacksmith.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.greeting": { + "citizen.blacksmith.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.happy": { + "citizen.blacksmith.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.interaction": { + "citizen.blacksmith.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.missing_equipment": { + "citizen.blacksmith.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.noise": { + "citizen.blacksmith.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.off_to_bed": { + "citizen.blacksmith.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.saturation_high": { + "citizen.blacksmith.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.saturation_low": { + "citizen.blacksmith.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.sickness": { + "citizen.blacksmith.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.success": { + "citizen.blacksmith.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.female.unhappy": { + "citizen.blacksmith.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.male.bad_housing": { + "citizen.blacksmith.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.male.bad_weather": { + "citizen.blacksmith.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.florist.male.danger": { + "citizen.blacksmith.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.farewell": { + "citizen.blacksmith.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.general": { + "citizen.blacksmith.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.greeting": { + "citizen.blacksmith.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.happy": { + "citizen.blacksmith.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.interaction": { + "citizen.blacksmith.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.missing_equipment": { + "citizen.blacksmith.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.noise": { + "citizen.blacksmith.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.off_to_bed": { + "citizen.blacksmith.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.saturation_high": { + "citizen.blacksmith.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.saturation_low": { + "citizen.blacksmith.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.sickness": { + "citizen.blacksmith.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.success": { + "citizen.blacksmith.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.florist.male.unhappy": { + "citizen.blacksmith.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.glassblower.female.bad_housing": { + "citizen.blacksmith.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false - } + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } ] }, - "mob.glassblower.female.bad_weather": { + "citizen.blacksmith.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.glassblower.female.danger": { + "citizen.blacksmith.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.glassblower.female.farewell": { + "citizen.builder.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.general": { + "citizen.builder.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.greeting": { + "citizen.builder.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.happy": { + "citizen.builder.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.interaction": { + "citizen.builder.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.missing_equipment": { + "citizen.builder.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.noise": { + "citizen.builder.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.off_to_bed": { + "citizen.builder.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.saturation_high": { + "citizen.builder.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.saturation_low": { + "citizen.builder.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.sickness": { + "citizen.builder.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.success": { + "citizen.builder.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.female.unhappy": { + "citizen.builder.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.male.bad_housing": { + "citizen.builder.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.male.bad_weather": { + "citizen.builder.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.male.danger": { + "citizen.builder.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.male.farewell": { + "citizen.builder.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.glassblower.male.general": { + "citizen.builder.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.greeting": { + "citizen.builder.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.happy": { + "citizen.builder.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.interaction": { + "citizen.builder.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.missing_equipment": { + "citizen.builder.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.noise": { + "citizen.builder.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.off_to_bed": { + "citizen.builder.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.saturation_high": { + "citizen.builder.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.saturation_low": { + "citizen.builder.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.sickness": { + "citizen.builder.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.success": { + "citizen.builder.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.glassblower.male.unhappy": { + "citizen.builder.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.bad_housing": { + "citizen.builder.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.bad_weather": { + "citizen.builder.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.danger": { + "citizen.builder.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.farewell": { + "citizen.builder.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.general": { + "citizen.builder.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.healer.female.greeting": { + "citizen.builder.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.happy": { + "citizen.builder.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.interaction": { + "citizen.builder.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.missing_equipment": { + "citizen.builder.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.noise": { + "citizen.builder.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.off_to_bed": { + "citizen.builder.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.saturation_high": { + "citizen.builder.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.saturation_low": { + "citizen.builder.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.sickness": { + "citizen.builder.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.success": { + "citizen.builder.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.female.unhappy": { + "citizen.builder.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.bad_housing": { + "citizen.builder.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.bad_weather": { + "citizen.builder.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.danger": { + "citizen.builder.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.farewell": { + "citizen.builder.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.general": { + "citizen.builder.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.greeting": { + "citizen.builder.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.healer.male.happy": { + "citizen.builder.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.interaction": { + "citizen.builder.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.missing_equipment": { + "citizen.builder.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.noise": { + "citizen.builder.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.off_to_bed": { + "citizen.builder.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.saturation_high": { + "citizen.builder.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.saturation_low": { + "citizen.builder.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.sickness": { + "citizen.builder.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.success": { + "citizen.builder.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.healer.male.unhappy": { + "citizen.builder.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.bad_housing": { + "citizen.builder.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.bad_weather": { + "citizen.builder.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.danger": { + "citizen.builder.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.farewell": { + "citizen.builder.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.general": { + "citizen.builder.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.greeting": { + "citizen.builder.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.happy": { + "citizen.builder.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.knight.female.interaction": { + "citizen.builder.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.missing_equipment": { + "citizen.builder.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.noise": { + "citizen.builder.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.off_to_bed": { + "citizen.builder.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.saturation_high": { + "citizen.builder.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.saturation_low": { + "citizen.builder.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.sickness": { + "citizen.builder.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.success": { + "citizen.builder.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.female.unhappy": { + "citizen.builder.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.bad_housing": { + "citizen.builder.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.bad_weather": { + "citizen.builder.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.danger": { + "citizen.builder.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.farewell": { + "citizen.builder.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.general": { + "citizen.builder.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.greeting": { + "citizen.builder.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.happy": { + "citizen.builder.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.interaction": { + "citizen.builder.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.knight.male.missing_equipment": { + "citizen.builder.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.noise": { + "citizen.builder.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.off_to_bed": { + "citizen.builder.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.saturation_high": { + "citizen.builder.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.saturation_low": { + "citizen.builder.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.sickness": { + "citizen.builder.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.success": { + "citizen.builder.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.knight.male.unhappy": { + "citizen.builder.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.bad_housing": { + "citizen.builder.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.bad_weather": { + "citizen.builder.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.danger": { + "citizen.builder.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.farewell": { + "citizen.builder.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.general": { + "citizen.builder.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.greeting": { + "citizen.builder.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.happy": { + "citizen.builder.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.interaction": { + "citizen.builder.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.missing_equipment": { + "citizen.builder.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.lumberjack.female.noise": { + "citizen.builder.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.off_to_bed": { + "citizen.builder.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.saturation_high": { + "citizen.builder.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.saturation_low": { + "citizen.builder.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.sickness": { + "citizen.builder.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.success": { + "citizen.builder.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.female.unhappy": { + "citizen.builder.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.bad_housing": { + "citizen.builder.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.bad_weather": { + "citizen.builder.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.danger": { + "citizen.builder.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.farewell": { + "citizen.builder.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.general": { + "citizen.builder.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.greeting": { + "citizen.builder.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.happy": { + "citizen.builder.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.interaction": { + "citizen.builder.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.missing_equipment": { + "citizen.builder.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.noise": { + "citizen.builder.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.lumberjack.male.off_to_bed": { + "citizen.builder.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.lumberjack.male.saturation_high": { + "citizen.builder.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.lumberjack.male.saturation_low": { + "citizen.builder.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.lumberjack.male.sickness": { + "citizen.builder.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.lumberjack.male.success": { + "citizen.builder.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.lumberjack.male.unhappy": { + "citizen.builder.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.bad_housing": { + "citizen.builder.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.bad_weather": { + "citizen.builder.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.danger": { + "citizen.builder.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.farewell": { + "citizen.builder.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.general": { + "citizen.builder.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.greeting": { + "citizen.builder.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.happy": { + "citizen.builder.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.interaction": { + "citizen.builder.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.missing_equipment": { + "citizen.builder.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.noise": { + "citizen.builder.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.off_to_bed": { + "citizen.builder.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.mechanic.female.saturation_high": { + "citizen.builder.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.female.saturation_low": { + "citizen.builder.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.female.sickness": { + "citizen.builder.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.female.success": { + "citizen.builder.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.female.unhappy": { + "citizen.builder.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.bad_housing": { + "citizen.builder.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.bad_weather": { + "citizen.builder.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.danger": { + "citizen.builder.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.farewell": { + "citizen.builder.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.general": { + "citizen.builder.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.greeting": { + "citizen.builder.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.happy": { + "citizen.builder.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.interaction": { + "citizen.builder.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.missing_equipment": { + "citizen.builder.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.noise": { + "citizen.builder.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.off_to_bed": { + "citizen.builder.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.saturation_high": { + "citizen.builder.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.mechanic.male.saturation_low": { + "citizen.chickenherder.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mechanic.male.sickness": { + "citizen.chickenherder.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mechanic.male.success": { + "citizen.chickenherder.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mechanic.male.unhappy": { + "citizen.chickenherder.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.attack": { + "citizen.chickenherder.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/attack/attack1", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/attack/attack2", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/attack/attack3", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/mercenary/attack/attack4", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.celebrate": { + "citizen.chickenherder.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/celebrate/celebrate1", + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.die": { + "citizen.chickenherder.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/die/death1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/mercenary/die/death2", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.hurt": { + "citizen.chickenherder.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/hurt/hurt1", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/hurt/hurt2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/mercenary/hurt/hurt3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.say": { + "citizen.chickenherder.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/say/say1", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/say/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/mercenary/say/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.mercenary.step": { + "citizen.chickenherder.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/mercenary/step/step1", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/step/step2", - "stream": false - }, - { - "name": "minecolonies:mob/mercenary/step/step3", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/mercenary/step/step4", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.bad_housing": { + "citizen.chickenherder.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.bad_weather": { + "citizen.chickenherder.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.danger": { + "citizen.chickenherder.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.farewell": { + "citizen.chickenherder.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.general": { + "citizen.chickenherder.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.greeting": { + "citizen.chickenherder.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.happy": { + "citizen.chickenherder.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.miner.female.interaction": { + "citizen.chickenherder.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.missing_equipment": { + "citizen.chickenherder.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.noise": { + "citizen.chickenherder.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.off_to_bed": { + "citizen.chickenherder.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.saturation_high": { + "citizen.chickenherder.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.saturation_low": { + "citizen.chickenherder.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.sickness": { + "citizen.chickenherder.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.success": { + "citizen.chickenherder.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.female.unhappy": { + "citizen.chickenherder.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.bad_housing": { + "citizen.chickenherder.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.bad_weather": { + "citizen.chickenherder.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.danger": { + "citizen.chickenherder.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.farewell": { + "citizen.chickenherder.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.general": { + "citizen.chickenherder.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.greeting": { + "citizen.chickenherder.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.happy": { + "citizen.chickenherder.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.interaction": { + "citizen.chickenherder.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.miner.male.missing_equipment": { + "citizen.chickenherder.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.noise": { + "citizen.chickenherder.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.off_to_bed": { + "citizen.chickenherder.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.saturation_high": { + "citizen.chickenherder.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.saturation_low": { + "citizen.chickenherder.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.sickness": { + "citizen.chickenherder.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.success": { + "citizen.chickenherder.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.miner.male.unhappy": { + "citizen.chickenherder.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.bad_housing": { + "citizen.chickenherder.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.bad_weather": { + "citizen.chickenherder.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.danger": { + "citizen.chickenherder.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.farewell": { + "citizen.chickenherder.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.general": { + "citizen.chickenherder.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.greeting": { + "citizen.chickenherder.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.happy": { + "citizen.chickenherder.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.interaction": { + "citizen.chickenherder.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.missing_equipment": { + "citizen.chickenherder.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.netherworker.female.noise": { + "citizen.chickenherder.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.off_to_bed": { + "citizen.chickenherder.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.saturation_high": { + "citizen.chickenherder.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.saturation_low": { + "citizen.chickenherder.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.sickness": { + "citizen.chickenherder.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.success": { + "citizen.chickenherder.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.female.unhappy": { + "citizen.chickenherder.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.bad_housing": { + "citizen.chickenherder.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.bad_weather": { + "citizen.chickenherder.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.danger": { + "citizen.chickenherder.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.farewell": { + "citizen.chickenherder.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.general": { + "citizen.chickenherder.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.greeting": { + "citizen.chickenherder.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.happy": { + "citizen.chickenherder.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.interaction": { + "citizen.chickenherder.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.missing_equipment": { + "citizen.chickenherder.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.noise": { + "citizen.chickenherder.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.netherworker.male.off_to_bed": { + "citizen.chickenherder.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.netherworker.male.saturation_high": { + "citizen.chickenherder.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.netherworker.male.saturation_low": { + "citizen.chickenherder.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.netherworker.male.sickness": { + "citizen.chickenherder.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.netherworker.male.success": { + "citizen.chickenherder.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.netherworker.male.unhappy": { + "citizen.chickenherder.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false - } - ] - }, - "mob.norseman.death": { - "category": "hostile", - "sounds": [ + }, { - "name": "minecolonies:mob/barbarian/death", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.norseman.hurt": { - "category": "hostile", + "citizen.chickenherder.female4.gotobed": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/hurt1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt3", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt4", - "stream": false - } - ] - }, - "mob.norseman.say": { - "category": "hostile", - "sounds": [ - { - "name": "minecolonies:mob/barbarian/say", - "stream": false - } - ] - }, - "mob.pirate.death": { - "category": "hostile", - "sounds": [ - { - "name": "minecolonies:mob/barbarian/death", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.pirate.hurt": { - "category": "hostile", + "citizen.chickenherder.female4.greeting": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/hurt1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt3", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/barbarian/hurt4", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.pirate.say": { - "category": "hostile", + "citizen.chickenherder.female4.happy": { + "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/barbarian/say", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false - } - ] - }, - "mob.planter.female.bad_housing": { - "category": "neutral", - "sounds": [ + }, { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.bad_weather": { + "citizen.chickenherder.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.danger": { + "citizen.chickenherder.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.farewell": { + "citizen.chickenherder.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.general": { + "citizen.chickenherder.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.greeting": { + "citizen.chickenherder.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.happy": { + "citizen.chickenherder.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.interaction": { + "citizen.chickenherder.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.missing_equipment": { + "citizen.chickenherder.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.planter.female.noise": { + "citizen.chickenherder.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.off_to_bed": { + "citizen.chickenherder.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.saturation_high": { + "citizen.chickenherder.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.saturation_low": { + "citizen.chickenherder.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.sickness": { + "citizen.chickenherder.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.success": { + "citizen.chickenherder.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.female.unhappy": { + "citizen.chickenherder.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.bad_housing": { + "citizen.chickenherder.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.bad_weather": { + "citizen.chickenherder.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.danger": { + "citizen.chickenherder.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.farewell": { + "citizen.chickenherder.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.general": { + "citizen.chickenherder.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.greeting": { + "citizen.chickenherder.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.happy": { + "citizen.chickenherder.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.interaction": { + "citizen.chickenherder.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.missing_equipment": { + "citizen.chickenherder.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.noise": { + "citizen.chickenherder.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.planter.male.off_to_bed": { + "citizen.chickenherder.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.planter.male.saturation_high": { + "citizen.chickenherder.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.planter.male.saturation_low": { + "citizen.chickenherder.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.planter.male.sickness": { + "citizen.chickenherder.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.planter.male.success": { + "citizen.chickenherder.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.planter.male.unhappy": { + "citizen.chickenherder.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.bad_housing": { + "citizen.chickenherder.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.bad_weather": { + "citizen.chickenherder.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.danger": { + "citizen.chickenherder.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.farewell": { + "citizen.chickenherder.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.general": { + "citizen.chickenherder.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.greeting": { + "citizen.chickenherder.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.happy": { + "citizen.chickenherder.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.interaction": { + "citizen.chickenherder.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.missing_equipment": { + "citizen.chickenherder.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.noise": { + "citizen.chickenherder.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.off_to_bed": { + "citizen.chickenherder.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.pupil.female.saturation_high": { + "citizen.chickenherder.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.female.saturation_low": { + "citizen.chickenherder.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.female.sickness": { + "citizen.chickenherder.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.female.success": { + "citizen.chickenherder.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.female.unhappy": { + "citizen.chickenherder.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.bad_housing": { + "citizen.chickenherder.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.bad_weather": { + "citizen.chickenherder.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.danger": { + "citizen.chickenherder.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.farewell": { + "citizen.chickenherder.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.general": { + "citizen.chickenherder.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.greeting": { + "citizen.chickenherder.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.happy": { + "citizen.chickenherder.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.interaction": { + "citizen.chickenherder.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.missing_equipment": { + "citizen.chickenherder.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.noise": { + "citizen.chickenherder.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.off_to_bed": { + "citizen.chickenherder.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.saturation_high": { + "citizen.chickenherder.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.pupil.male.saturation_low": { + "citizen.chickenherder.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.pupil.male.sickness": { + "citizen.chickenherder.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.pupil.male.success": { + "citizen.chickenherder.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.pupil.male.unhappy": { + "citizen.chickenherder.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.bad_housing": { + "citizen.chickenherder.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.bad_weather": { + "citizen.chickenherder.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.danger": { + "citizen.chickenherder.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.farewell": { + "citizen.chickenherder.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.general": { + "citizen.chickenherder.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.greeting": { + "citizen.chickenherder.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.happy": { + "citizen.chickenherder.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.interaction": { + "citizen.chickenherder.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.missing_equipment": { + "citizen.chickenherder.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.noise": { + "citizen.chickenherder.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.off_to_bed": { + "citizen.chickenherder.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.saturation_high": { + "citizen.chickenherder.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.saturation_low": { + "citizen.chickenherder.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.quarrier.female.sickness": { + "citizen.combattraining.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.female.success": { + "citizen.combattraining.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.female.unhappy": { + "citizen.combattraining.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.bad_housing": { + "citizen.combattraining.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.bad_weather": { + "citizen.combattraining.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.danger": { + "citizen.combattraining.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.farewell": { + "citizen.combattraining.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.general": { + "citizen.combattraining.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.greeting": { + "citizen.combattraining.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.happy": { + "citizen.combattraining.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.interaction": { + "citizen.combattraining.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.missing_equipment": { + "citizen.combattraining.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.noise": { + "citizen.combattraining.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.off_to_bed": { + "citizen.combattraining.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.saturation_high": { + "citizen.combattraining.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.saturation_low": { + "citizen.combattraining.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.sickness": { + "citizen.combattraining.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.quarrier.male.success": { + "citizen.combattraining.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.quarrier.male.unhappy": { + "citizen.combattraining.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.bad_housing": { + "citizen.combattraining.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.bad_weather": { + "citizen.combattraining.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.danger": { + "citizen.combattraining.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.farewell": { + "citizen.combattraining.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.general": { + "citizen.combattraining.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.greeting": { + "citizen.combattraining.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.happy": { + "citizen.combattraining.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.interaction": { + "citizen.combattraining.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.missing_equipment": { + "citizen.combattraining.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.noise": { + "citizen.combattraining.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.off_to_bed": { + "citizen.combattraining.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.saturation_high": { + "citizen.combattraining.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.saturation_low": { + "citizen.combattraining.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.sickness": { + "citizen.combattraining.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.success": { + "citizen.combattraining.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.rabbitherder.female.unhappy": { + "citizen.combattraining.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.bad_housing": { + "citizen.combattraining.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.bad_weather": { + "citizen.combattraining.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.danger": { + "citizen.combattraining.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.farewell": { + "citizen.combattraining.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.general": { + "citizen.combattraining.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.greeting": { + "citizen.combattraining.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.happy": { + "citizen.combattraining.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.interaction": { + "citizen.combattraining.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.missing_equipment": { + "citizen.combattraining.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.noise": { + "citizen.combattraining.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.off_to_bed": { + "citizen.combattraining.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.saturation_high": { + "citizen.combattraining.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.saturation_low": { + "citizen.combattraining.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.sickness": { + "citizen.combattraining.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.success": { + "citizen.combattraining.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.rabbitherder.male.unhappy": { + "citizen.combattraining.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.ranger.female.bad_housing": { + "citizen.combattraining.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.bad_weather": { + "citizen.combattraining.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.danger": { + "citizen.combattraining.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.farewell": { + "citizen.combattraining.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.general": { + "citizen.combattraining.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.greeting": { + "citizen.combattraining.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.happy": { + "citizen.combattraining.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.interaction": { + "citizen.combattraining.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.missing_equipment": { + "citizen.combattraining.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.noise": { + "citizen.combattraining.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.off_to_bed": { + "citizen.combattraining.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.saturation_high": { + "citizen.combattraining.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.saturation_low": { + "citizen.combattraining.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.sickness": { + "citizen.combattraining.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.success": { + "citizen.combattraining.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.female.unhappy": { + "citizen.combattraining.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.male.bad_housing": { + "citizen.combattraining.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.ranger.male.bad_weather": { + "citizen.combattraining.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.danger": { + "citizen.combattraining.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.farewell": { + "citizen.combattraining.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.general": { + "citizen.combattraining.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.greeting": { + "citizen.combattraining.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.happy": { + "citizen.combattraining.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.interaction": { + "citizen.combattraining.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.missing_equipment": { + "citizen.combattraining.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.noise": { + "citizen.combattraining.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.off_to_bed": { + "citizen.combattraining.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.saturation_high": { + "citizen.combattraining.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.saturation_low": { + "citizen.combattraining.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.sickness": { + "citizen.combattraining.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.success": { + "citizen.combattraining.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.ranger.male.unhappy": { + "citizen.combattraining.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.researcher.female.bad_housing": { + "citizen.combattraining.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false - } + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } ] }, - "mob.researcher.female.bad_weather": { + "citizen.combattraining.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.researcher.female.danger": { + "citizen.combattraining.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.farewell": { + "citizen.combattraining.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.general": { + "citizen.combattraining.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.greeting": { + "citizen.combattraining.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.happy": { + "citizen.combattraining.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.interaction": { + "citizen.combattraining.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.missing_equipment": { + "citizen.combattraining.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.noise": { + "citizen.combattraining.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.off_to_bed": { + "citizen.combattraining.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.saturation_high": { + "citizen.combattraining.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.saturation_low": { + "citizen.combattraining.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.sickness": { + "citizen.combattraining.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.success": { + "citizen.combattraining.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.female.unhappy": { + "citizen.combattraining.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.male.bad_housing": { + "citizen.combattraining.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.male.bad_weather": { + "citizen.combattraining.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.male.danger": { + "citizen.combattraining.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.researcher.male.farewell": { + "citizen.combattraining.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.general": { + "citizen.combattraining.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.greeting": { + "citizen.combattraining.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.happy": { + "citizen.combattraining.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.interaction": { + "citizen.combattraining.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.missing_equipment": { + "citizen.combattraining.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.noise": { + "citizen.combattraining.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.off_to_bed": { + "citizen.combattraining.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.saturation_high": { + "citizen.combattraining.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.saturation_low": { + "citizen.combattraining.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.sickness": { + "citizen.combattraining.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.success": { + "citizen.combattraining.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.researcher.male.unhappy": { + "citizen.combattraining.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.sawmill.female.bad_housing": { + "citizen.combattraining.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.sawmill.female.bad_weather": { + "citizen.combattraining.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.sawmill.female.danger": { + "citizen.combattraining.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.sawmill.female.farewell": { + "citizen.combattraining.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.sawmill.female.general": { + "citizen.combattraining.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.greeting": { + "citizen.combattraining.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.happy": { + "citizen.combattraining.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.interaction": { + "citizen.combattraining.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.missing_equipment": { + "citizen.combattraining.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.noise": { + "citizen.combattraining.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.off_to_bed": { + "citizen.combattraining.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.saturation_high": { + "citizen.combattraining.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.saturation_low": { + "citizen.combattraining.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.sickness": { + "citizen.combattraining.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.success": { + "citizen.combattraining.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.female.unhappy": { + "citizen.combattraining.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.bad_housing": { + "citizen.combattraining.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.bad_weather": { + "citizen.combattraining.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.danger": { + "citizen.combattraining.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.farewell": { + "citizen.combattraining.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.general": { + "citizen.combattraining.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.sawmill.male.greeting": { + "citizen.combattraining.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.happy": { + "citizen.combattraining.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.interaction": { + "citizen.combattraining.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.missing_equipment": { + "citizen.combattraining.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.noise": { + "citizen.combattraining.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.off_to_bed": { + "citizen.combattraining.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.saturation_high": { + "citizen.combattraining.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.saturation_low": { + "citizen.combattraining.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.sickness": { + "citizen.combattraining.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.success": { + "citizen.combattraining.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.sawmill.male.unhappy": { + "citizen.combattraining.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.bad_housing": { + "citizen.combattraining.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.bad_weather": { + "citizen.combattraining.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.danger": { + "citizen.combattraining.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.farewell": { + "citizen.combattraining.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.general": { + "citizen.combattraining.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.greeting": { + "citizen.combattraining.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.shepherd.female.happy": { + "citizen.composter.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.interaction": { + "citizen.composter.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.missing_equipment": { + "citizen.composter.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.noise": { + "citizen.composter.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.off_to_bed": { + "citizen.composter.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.saturation_high": { + "citizen.composter.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.saturation_low": { + "citizen.composter.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.sickness": { + "citizen.composter.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.success": { + "citizen.composter.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.female.unhappy": { + "citizen.composter.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.bad_housing": { + "citizen.composter.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.bad_weather": { + "citizen.composter.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.danger": { + "citizen.composter.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.farewell": { + "citizen.composter.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.general": { + "citizen.composter.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.greeting": { + "citizen.composter.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.happy": { + "citizen.composter.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.shepherd.male.interaction": { + "citizen.composter.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.missing_equipment": { + "citizen.composter.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.noise": { + "citizen.composter.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.off_to_bed": { + "citizen.composter.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.saturation_high": { + "citizen.composter.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.saturation_low": { + "citizen.composter.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.sickness": { + "citizen.composter.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.success": { + "citizen.composter.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.shepherd.male.unhappy": { + "citizen.composter.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.bad_housing": { + "citizen.composter.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.bad_weather": { + "citizen.composter.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.danger": { + "citizen.composter.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.farewell": { + "citizen.composter.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.general": { + "citizen.composter.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.greeting": { + "citizen.composter.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.happy": { + "citizen.composter.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.interaction": { + "citizen.composter.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.sifter.female.missing_equipment": { + "citizen.composter.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.noise": { + "citizen.composter.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.off_to_bed": { + "citizen.composter.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.saturation_high": { + "citizen.composter.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.saturation_low": { + "citizen.composter.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.sickness": { + "citizen.composter.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.success": { + "citizen.composter.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.female.unhappy": { + "citizen.composter.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.bad_housing": { + "citizen.composter.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.bad_weather": { + "citizen.composter.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.danger": { + "citizen.composter.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.farewell": { + "citizen.composter.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.general": { + "citizen.composter.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.greeting": { + "citizen.composter.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.happy": { + "citizen.composter.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.interaction": { + "citizen.composter.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.missing_equipment": { + "citizen.composter.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.sifter.male.noise": { + "citizen.composter.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.off_to_bed": { + "citizen.composter.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.saturation_high": { + "citizen.composter.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.saturation_low": { + "citizen.composter.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.sickness": { + "citizen.composter.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.success": { + "citizen.composter.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.sifter.male.unhappy": { + "citizen.composter.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.bad_housing": { + "citizen.composter.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.bad_weather": { + "citizen.composter.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.danger": { + "citizen.composter.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.farewell": { + "citizen.composter.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.general": { + "citizen.composter.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.greeting": { + "citizen.composter.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.happy": { + "citizen.composter.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.interaction": { + "citizen.composter.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.missing_equipment": { + "citizen.composter.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.noise": { + "citizen.composter.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.smelter.female.off_to_bed": { + "citizen.composter.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.female.saturation_high": { + "citizen.composter.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.female.saturation_low": { + "citizen.composter.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.female.sickness": { + "citizen.composter.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.female.success": { + "citizen.composter.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.female.unhappy": { + "citizen.composter.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.bad_housing": { + "citizen.composter.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.bad_weather": { + "citizen.composter.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.danger": { + "citizen.composter.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.farewell": { + "citizen.composter.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.general": { + "citizen.composter.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.greeting": { + "citizen.composter.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.happy": { + "citizen.composter.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.interaction": { + "citizen.composter.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.missing_equipment": { + "citizen.composter.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.noise": { + "citizen.composter.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.off_to_bed": { + "citizen.composter.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.smelter.male.saturation_high": { + "citizen.composter.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.smelter.male.saturation_low": { + "citizen.composter.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.smelter.male.sickness": { + "citizen.composter.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.smelter.male.success": { + "citizen.composter.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.smelter.male.unhappy": { + "citizen.composter.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.bad_housing": { + "citizen.composter.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.bad_weather": { + "citizen.composter.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.danger": { + "citizen.composter.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.farewell": { + "citizen.composter.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.general": { + "citizen.composter.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.greeting": { + "citizen.composter.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.happy": { + "citizen.composter.male1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.interaction": { + "citizen.composter.male1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.missing_equipment": { + "citizen.composter.male1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.noise": { + "citizen.composter.male1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.off_to_bed": { + "citizen.composter.male1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.saturation_high": { + "citizen.composter.male1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.stonemason.female.saturation_low": { + "citizen.composter.male2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.female.sickness": { + "citizen.composter.male2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.female.success": { + "citizen.composter.male2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.female.unhappy": { + "citizen.composter.male2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.bad_housing": { + "citizen.composter.male2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.bad_weather": { + "citizen.composter.male2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.danger": { + "citizen.composter.male2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.farewell": { + "citizen.composter.male2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.general": { + "citizen.composter.male2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.greeting": { + "citizen.composter.male2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.happy": { + "citizen.composter.male2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.interaction": { + "citizen.composter.male2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.missing_equipment": { + "citizen.composter.male2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.noise": { + "citizen.composter.male2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.off_to_bed": { + "citizen.composter.male2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.saturation_high": { + "citizen.composter.male2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.saturation_low": { + "citizen.composter.male2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male2/illtakecareofit", "stream": false } ] }, - "mob.stonemason.male.sickness": { + "citizen.composter.male3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonemason.male.success": { + "citizen.composter.male3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonemason.male.unhappy": { + "citizen.composter.male3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.bad_housing": { + "citizen.composter.male3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.bad_weather": { + "citizen.composter.male3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.danger": { + "citizen.composter.male3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.farewell": { + "citizen.composter.male3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.general": { + "citizen.composter.male3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.greeting": { + "citizen.composter.male3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.happy": { + "citizen.composter.male3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.interaction": { + "citizen.composter.male3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.missing_equipment": { + "citizen.composter.male3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.noise": { + "citizen.composter.male3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.off_to_bed": { + "citizen.composter.male3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.saturation_high": { + "citizen.composter.male3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.saturation_low": { + "citizen.composter.male3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.sickness": { + "citizen.composter.male3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male3/rightaway02", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male3/okay02", "stream": false } ] }, - "mob.stonesmeltery.female.success": { + "citizen.composter.male4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.female.unhappy": { + "citizen.composter.male4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.bad_housing": { + "citizen.composter.male4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.bad_weather": { + "citizen.composter.male4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.danger": { + "citizen.composter.male4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.farewell": { + "citizen.composter.male4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.general": { + "citizen.composter.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.greeting": { + "citizen.composter.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.happy": { + "citizen.composter.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.interaction": { + "citizen.composter.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.missing_equipment": { + "citizen.composter.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.noise": { + "citizen.composter.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.off_to_bed": { + "citizen.composter.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.saturation_high": { + "citizen.composter.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.saturation_low": { + "citizen.composter.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.sickness": { + "citizen.composter.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.success": { + "citizen.composter.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.stonesmeltery.male.unhappy": { + "citizen.concretemixer.child.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.bad_housing": { + "citizen.concretemixer.child.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.bad_weather": { + "citizen.concretemixer.child.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.danger": { + "citizen.concretemixer.child.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.farewell": { + "citizen.concretemixer.child.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.general": { + "citizen.concretemixer.child.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.greeting": { + "citizen.concretemixer.child.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.happy": { + "citizen.concretemixer.child.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.interaction": { + "citizen.concretemixer.child.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.missing_equipment": { + "citizen.concretemixer.child.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.noise": { + "citizen.concretemixer.child.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.off_to_bed": { + "citizen.concretemixer.child.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.saturation_high": { + "citizen.concretemixer.child.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.saturation_low": { + "citizen.concretemixer.child.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.sickness": { + "citizen.concretemixer.child.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.success": { + "citizen.concretemixer.child.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.female.unhappy": { + "citizen.concretemixer.child.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", - "stream": false - }, - { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.student.male.bad_housing": { + "citizen.concretemixer.female1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.bad_weather": { + "citizen.concretemixer.female1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.danger": { + "citizen.concretemixer.female1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.farewell": { + "citizen.concretemixer.female1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.general": { + "citizen.concretemixer.female1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.greeting": { + "citizen.concretemixer.female1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.happy": { + "citizen.concretemixer.female1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.interaction": { + "citizen.concretemixer.female1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.missing_equipment": { + "citizen.concretemixer.female1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.noise": { + "citizen.concretemixer.female1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.off_to_bed": { + "citizen.concretemixer.female1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.saturation_high": { + "citizen.concretemixer.female1.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.saturation_low": { + "citizen.concretemixer.female1.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.sickness": { + "citizen.concretemixer.female1.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.success": { + "citizen.concretemixer.female1.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.student.male.unhappy": { + "citizen.concretemixer.female1.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.swineherder.female.bad_housing": { + "citizen.concretemixer.female1.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female1/okay", "stream": false } ] }, - "mob.swineherder.female.bad_weather": { + "citizen.concretemixer.female2.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.danger": { + "citizen.concretemixer.female2.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.farewell": { + "citizen.concretemixer.female2.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.general": { + "citizen.concretemixer.female2.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.greeting": { + "citizen.concretemixer.female2.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.happy": { + "citizen.concretemixer.female2.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.interaction": { + "citizen.concretemixer.female2.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.missing_equipment": { + "citizen.concretemixer.female2.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.noise": { + "citizen.concretemixer.female2.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.off_to_bed": { + "citizen.concretemixer.female2.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.saturation_high": { + "citizen.concretemixer.female2.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.saturation_low": { + "citizen.concretemixer.female2.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.sickness": { + "citizen.concretemixer.female2.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.success": { + "citizen.concretemixer.female2.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.female.unhappy": { + "citizen.concretemixer.female2.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.male.bad_housing": { + "citizen.concretemixer.female2.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.male.bad_weather": { + "citizen.concretemixer.female2.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female2/ifyousayso0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female2/canihelpyou0", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", "stream": false } ] }, - "mob.swineherder.male.danger": { + "citizen.concretemixer.female3.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.farewell": { + "citizen.concretemixer.female3.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.general": { + "citizen.concretemixer.female3.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.greeting": { + "citizen.concretemixer.female3.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.happy": { + "citizen.concretemixer.female3.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.interaction": { + "citizen.concretemixer.female3.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.missing_equipment": { + "citizen.concretemixer.female3.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.noise": { + "citizen.concretemixer.female3.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.off_to_bed": { + "citizen.concretemixer.female3.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.saturation_high": { + "citizen.concretemixer.female3.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.saturation_low": { + "citizen.concretemixer.female3.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.sickness": { + "citizen.concretemixer.female3.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.success": { + "citizen.concretemixer.female3.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.swineherder.male.unhappy": { + "citizen.concretemixer.female3.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.teacher.female.bad_housing": { + "citizen.concretemixer.female3.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.teacher.female.bad_weather": { + "citizen.concretemixer.female3.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.teacher.female.danger": { + "citizen.concretemixer.female3.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female3/greattoseeyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female3/needsomething", "stream": false } ] }, - "mob.teacher.female.farewell": { + "citizen.concretemixer.female4.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.general": { + "citizen.concretemixer.female4.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.greeting": { + "citizen.concretemixer.female4.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.happy": { + "citizen.concretemixer.female4.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.interaction": { + "citizen.concretemixer.female4.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.missing_equipment": { + "citizen.concretemixer.female4.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.noise": { + "citizen.concretemixer.female4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.off_to_bed": { + "citizen.concretemixer.female4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.saturation_high": { + "citizen.concretemixer.female4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.saturation_low": { + "citizen.concretemixer.female4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.sickness": { + "citizen.concretemixer.female4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.success": { + "citizen.concretemixer.female4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.female.unhappy": { + "citizen.concretemixer.female4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.male.bad_housing": { + "citizen.concretemixer.female4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.male.bad_weather": { + "citizen.concretemixer.female4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.male.danger": { + "citizen.concretemixer.female4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.male.farewell": { + "citizen.concretemixer.female4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/female4/yes", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/female4/canihelpyou", "stream": false } ] }, - "mob.teacher.male.general": { + "citizen.concretemixer.male1.badhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.greeting": { + "citizen.concretemixer.male1.badweather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.happy": { + "citizen.concretemixer.male1.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.interaction": { + "citizen.concretemixer.male1.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.missing_equipment": { + "citizen.concretemixer.male1.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.noise": { + "citizen.concretemixer.male1.goodhousing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.off_to_bed": { + "citizen.concretemixer.male1.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.saturation_high": { + "citizen.concretemixer.male1.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.saturation_low": { + "citizen.concretemixer.male1.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.sickness": { + "citizen.concretemixer.male1.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", "stream": false } ] }, - "mob.teacher.male.success": { + "citizen.concretemixer.male1.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male1/tisafineday", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male1/hi", "stream": false - } + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.concretemixer.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cook.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cook.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cook.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cook.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cook.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cook.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cook.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cook.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cook.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cookassistant.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.cowboy.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.cowboy.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.cowboy.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.cowboy.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.cowboy.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.cowboy.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.cowboy.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.cowboy.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.crusher.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.crusher.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.crusher.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.crusher.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.crusher.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.crusher.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.crusher.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.crusher.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.crusher.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.deliveryman.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.druid.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.druid.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.druid.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.druid.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.druid.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.druid.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.druid.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.druid.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.druid.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.dyer.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.dyer.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.dyer.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.dyer.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.dyer.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.dyer.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.dyer.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.dyer.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.dyer.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.enchanter.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.enchanter.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.enchanter.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.enchanter.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.enchanter.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.enchanter.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.enchanter.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.enchanter.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.farmer.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.farmer.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.farmer.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.farmer.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.farmer.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.farmer.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.farmer.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.farmer.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.farmer.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fisherman.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fisherman.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fisherman.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fisherman.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fisherman.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fisherman.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fisherman.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fisherman.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.fletcher.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.fletcher.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.fletcher.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.fletcher.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.fletcher.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.fletcher.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.fletcher.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.fletcher.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.florist.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.florist.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.florist.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.florist.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.florist.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.florist.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.florist.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.florist.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.florist.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.glassblower.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.glassblower.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.glassblower.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.glassblower.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.glassblower.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.glassblower.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.glassblower.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.glassblower.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.healer.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.healer.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.healer.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.healer.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.healer.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.healer.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.healer.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.healer.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.healer.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.knight.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.knight.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.knight.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.knight.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.knight.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.knight.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.knight.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.knight.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.knight.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.lumberjack.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.mechanic.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.mechanic.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.mechanic.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.mechanic.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.mechanic.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.mechanic.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.mechanic.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.mechanic.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.miner.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.miner.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.miner.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.miner.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.miner.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.miner.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.miner.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.miner.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.miner.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.netherworker.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.netherworker.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.netherworker.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.netherworker.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.netherworker.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.netherworker.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.netherworker.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.netherworker.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.planter.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.planter.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.planter.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.planter.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.planter.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.planter.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.planter.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.planter.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.planter.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.pupil.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.pupil.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.pupil.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.pupil.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.pupil.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.pupil.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.pupil.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.pupil.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.pupil.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.quarrier.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.quarrier.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.quarrier.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.quarrier.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.quarrier.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.quarrier.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.quarrier.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.quarrier.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.rabbitherder.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.ranger.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.ranger.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.ranger.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.ranger.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.ranger.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.ranger.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.ranger.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.ranger.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.ranger.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.researcher.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.researcher.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.researcher.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.researcher.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.researcher.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.researcher.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.researcher.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.researcher.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.researcher.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sawmill.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sawmill.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sawmill.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sawmill.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sawmill.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sawmill.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sawmill.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sawmill.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.shepherd.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.shepherd.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.shepherd.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.shepherd.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.shepherd.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.shepherd.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.shepherd.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.shepherd.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.sifter.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.sifter.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.sifter.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.sifter.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.sifter.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.sifter.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.sifter.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.sifter.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.sifter.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.smelter.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.smelter.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.smelter.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.smelter.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.smelter.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.smelter.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.smelter.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.smelter.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.smelter.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonemason.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonemason.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonemason.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonemason.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonemason.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonemason.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonemason.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonemason.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.stonesmeltery.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.student.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.student.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.student.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.student.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.student.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.student.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.student.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.student.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.student.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.swineherder.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.swineherder.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.swineherder.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.swineherder.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.swineherder.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.swineherder.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.swineherder.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.swineherder.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.teacher.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.teacher.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.teacher.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.teacher.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.teacher.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.teacher.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.teacher.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.teacher.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.teacher.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.undertaker.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.undertaker.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.undertaker.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.undertaker.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.undertaker.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.undertaker.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.undertaker.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.undertaker.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.unemployed.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.unemployed.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.unemployed.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.unemployed.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.unemployed.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.unemployed.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.unemployed.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.unemployed.male4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.child.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.child.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "citizen.visitor.female1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female1/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female1/okay", + "stream": false + } + ] + }, + "citizen.visitor.female2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female2/ifyousayso0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/canihelpyou0", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/illtakecareofit1", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female2/yes0", + "stream": false + } + ] + }, + "citizen.visitor.female3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female3/rightaway", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/greattoseeyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female3/needsomething", + "stream": false + } + ] + }, + "citizen.visitor.female4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.female4.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/female4/okay2", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/whatcanidoforyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/yes", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/female4/canihelpyou", + "stream": false + } + ] + }, + "citizen.visitor.male1.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male1.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male1/whatsittodaythen", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/tisafineday", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male1/okay", + "stream": false + } + ] + }, + "citizen.visitor.male2.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male2.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male2/whatisit", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/gooddaytoyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male2/illtakecareofit", + "stream": false + } + ] + }, + "citizen.visitor.male3.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.gotobed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.highsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.lowsaturation": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.missingequipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.sick": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male3.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male3/isthereaproblem01", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/ifyousayso", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/rightaway02", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male3/okay02", + "stream": false + } + ] + }, + "citizen.visitor.male4.badhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.male4.badweather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.male4.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.male4.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.male4.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "citizen.visitor.male4.goodhousing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } ] }, - "mob.teacher.male.unhappy": { + "citizen.visitor.male4.gotobed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.bad_housing": { + "citizen.visitor.male4.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.bad_weather": { + "citizen.visitor.male4.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.danger": { + "citizen.visitor.male4.highsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.farewell": { + "citizen.visitor.male4.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.general": { + "citizen.visitor.male4.lowsaturation": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.greeting": { + "citizen.visitor.male4.missingequipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.happy": { + "citizen.visitor.male4.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.interaction": { + "citizen.visitor.male4.sick": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.missing_equipment": { + "citizen.visitor.male4.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/male4/hi", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/male4/yeah", "stream": false } ] }, - "mob.undertaker.female.noise": { + "citizen.visitor.male4.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/male4/goodtoseeya", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/canihelpyou", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/hi", + "stream": false + }, + { + "name": "minecolonies:mob/citizen/male4/yeah", + "stream": false + } + ] + }, + "mob.amazon.death": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/death", + "stream": false + } + ] + }, + "mob.amazon.hurt": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/hurt1", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt2", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt3", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt4", + "stream": false + } + ] + }, + "mob.amazon.say": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/say", + "stream": false + } + ] + }, + "mob.barbarian.death": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/death", + "stream": false + } + ] + }, + "mob.barbarian.hurt": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/hurt1", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt2", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/barbarian/hurt3", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/barbarian/hurt4", + "stream": false + } + ] + }, + "mob.barbarian.say": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/say", "stream": false } ] }, - "mob.undertaker.female.off_to_bed": { + "mob.child.female.bad_housing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.bad_weather": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.female.saturation_high": { + "mob.child.female.danger": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.farewell": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.female.saturation_low": { + "mob.child.female.general": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.good_housing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.female.sickness": { + "mob.child.female.greeting": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.happy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.female.success": { + "mob.child.female.interaction": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.missing_equipment": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.female.unhappy": { + "mob.child.female.noise": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/female/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.off_to_bed": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/female/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.bad_housing": { + "mob.child.female.saturation_high": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.saturation_low": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.bad_weather": { + "mob.child.female.sickness": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.female.success": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.danger": { + "mob.child.female.unhappy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.bad_housing": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.farewell": { + "mob.child.male.bad_weather": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.danger": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.general": { + "mob.child.male.farewell": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.general": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.greeting": { + "mob.child.male.good_housing": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.greeting": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.happy": { + "mob.child.male.happy": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.interaction": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.interaction": { + "mob.child.male.missing_equipment": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.noise": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.missing_equipment": { + "mob.child.male.off_to_bed": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.saturation_high": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.noise": { + "mob.child.male.saturation_low": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.sickness": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.off_to_bed": { + "mob.child.male.success": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/citizen/child/laugh2", + "stream": false + } + ] + }, + "mob.child.male.unhappy": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/citizen/child/laugh1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/citizen/child/laugh2", "stream": false } ] }, - "mob.undertaker.male.saturation_high": { + "mob.citizen.snore": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/citizen/snore", + "stream": false + } + ] + }, + "mob.egyptian.death": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/death", + "stream": false + } + ] + }, + "mob.egyptian.hurt": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/hurt1", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/barbarian/hurt3", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/barbarian/hurt4", + "stream": false + } + ] + }, + "mob.egyptian.say": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/say", "stream": false } ] }, - "mob.undertaker.male.saturation_low": { + "mob.mercenary.attack": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/mercenary/attack/attack1", + "stream": false + }, + { + "name": "minecolonies:mob/mercenary/attack/attack2", + "stream": false + }, + { + "name": "minecolonies:mob/mercenary/attack/attack3", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/mercenary/attack/attack4", + "stream": false + } + ] + }, + "mob.mercenary.celebrate": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/mercenary/celebrate/celebrate1", + "stream": false + } + ] + }, + "mob.mercenary.die": { + "category": "neutral", + "sounds": [ + { + "name": "minecolonies:mob/mercenary/die/death1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/mercenary/die/death2", "stream": false } ] }, - "mob.undertaker.male.sickness": { + "mob.mercenary.hurt": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/mercenary/hurt/hurt1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/mercenary/hurt/hurt2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/mercenary/hurt/hurt3", "stream": false } ] }, - "mob.undertaker.male.success": { + "mob.mercenary.say": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/mercenary/say/say1", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/mercenary/say/say2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/mercenary/say/say3", "stream": false } ] }, - "mob.undertaker.male.unhappy": { + "mob.mercenary.step": { "category": "neutral", "sounds": [ { - "name": "minecolonies:mob/citizen/male/say1", + "name": "minecolonies:mob/mercenary/step/step1", + "stream": false + }, + { + "name": "minecolonies:mob/mercenary/step/step2", + "stream": false + }, + { + "name": "minecolonies:mob/mercenary/step/step3", + "stream": false + }, + { + "name": "minecolonies:mob/mercenary/step/step4", + "stream": false + } + ] + }, + "mob.norseman.death": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/death", + "stream": false + } + ] + }, + "mob.norseman.hurt": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/hurt1", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt2", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt3", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt4", + "stream": false + } + ] + }, + "mob.norseman.say": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/say", + "stream": false + } + ] + }, + "mob.pirate.death": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/death", + "stream": false + } + ] + }, + "mob.pirate.hurt": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/hurt1", + "stream": false + }, + { + "name": "minecolonies:mob/barbarian/hurt2", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say2", + "name": "minecolonies:mob/barbarian/hurt3", "stream": false }, { - "name": "minecolonies:mob/citizen/male/say3", + "name": "minecolonies:mob/barbarian/hurt4", + "stream": false + } + ] + }, + "mob.pirate.say": { + "category": "hostile", + "sounds": [ + { + "name": "minecolonies:mob/barbarian/say", "stream": false } ] diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_a.png new file mode 100644 index 00000000000..ee2539389d8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_a.png new file mode 100644 index 00000000000..57a33ca0da6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_b.png new file mode 100644 index 00000000000..cb469e56f8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_d.png new file mode 100644 index 00000000000..1d9292ea8ff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_w.png new file mode 100644 index 00000000000..2498e79de0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_a.png new file mode 100644 index 00000000000..473137fa191 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_b.png new file mode 100644 index 00000000000..dd056dd60d4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_d.png new file mode 100644 index 00000000000..91701cb64b3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_w.png new file mode 100644 index 00000000000..73bd7b502af Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_b.png new file mode 100644 index 00000000000..d364e44d909 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_w.png new file mode 100644 index 00000000000..5bb9bb92e36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archeologistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_a.png new file mode 100644 index 00000000000..76c6cbc1702 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_b.png new file mode 100644 index 00000000000..08621645269 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_d.png new file mode 100644 index 00000000000..91701cb64b3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_w.png new file mode 100644 index 00000000000..ee99b28b5e6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_a.png new file mode 100644 index 00000000000..3cb71faaa1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_b.png new file mode 100644 index 00000000000..5d32c5d14ad Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_d.png new file mode 100644 index 00000000000..5e7b13fbb67 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_w.png new file mode 100644 index 00000000000..48a1a3f4e6b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_a.png new file mode 100644 index 00000000000..d3c17f2870f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_b.png new file mode 100644 index 00000000000..6a40026663d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_d.png new file mode 100644 index 00000000000..255f3acb9cd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_w.png new file mode 100644 index 00000000000..00115e68286 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_a.png new file mode 100644 index 00000000000..a6a80de1a3e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_d.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_w.png new file mode 100644 index 00000000000..e9d8305c0c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_d.png new file mode 100644 index 00000000000..9989a417dc4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_w.png new file mode 100644 index 00000000000..d22d7b7e60d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_a.png new file mode 100644 index 00000000000..43503d1750c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/aristocratmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_w.png new file mode 100644 index 00000000000..68fcdccc926 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_a.png new file mode 100644 index 00000000000..e250e5667a0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_w.png new file mode 100644 index 00000000000..57f63feff31 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_b.png new file mode 100644 index 00000000000..5712015179d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_a.png new file mode 100644 index 00000000000..e250e5667a0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_b.png new file mode 100644 index 00000000000..d364e44d909 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_d.png new file mode 100644 index 00000000000..78b8651969e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_w.png new file mode 100644 index 00000000000..b59c812ea9d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_a.png new file mode 100644 index 00000000000..a2446fb0e18 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_b.png new file mode 100644 index 00000000000..cd53ce622e3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_d.png new file mode 100644 index 00000000000..c55906ec4be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_w.png new file mode 100644 index 00000000000..368b1109a4b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_w.png new file mode 100644 index 00000000000..b0b50f23d9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_a.png new file mode 100644 index 00000000000..9d009167d86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_w.png new file mode 100644 index 00000000000..111484ab7ce Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_a.png new file mode 100644 index 00000000000..96b8c5d0773 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_d.png new file mode 100644 index 00000000000..9f822f5c0ba Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpenterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_b.png new file mode 100644 index 00000000000..3756dea48cd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_d.png new file mode 100644 index 00000000000..5af255e7e8b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_w.png new file mode 100644 index 00000000000..415c7bd6fc2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/carpentermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..473137fa191 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..cd6347bd284 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_a.png new file mode 100644 index 00000000000..2130ec3a818 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_b.png new file mode 100644 index 00000000000..2cf6919e6bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_d.png new file mode 100644 index 00000000000..1fc47c4890d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_w.png new file mode 100644 index 00000000000..5eabfe14c95 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_a.png new file mode 100644 index 00000000000..94b96d58d1f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_b.png new file mode 100644 index 00000000000..5ab7b0cb02f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_d.png new file mode 100644 index 00000000000..fcfa37cd22c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_w.png new file mode 100644 index 00000000000..9c130fe78f3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_a.png new file mode 100644 index 00000000000..1b8d4f4e9b1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_b.png new file mode 100644 index 00000000000..454cdbc1acd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_d.png new file mode 100644 index 00000000000..d07b76d9963 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_w.png new file mode 100644 index 00000000000..e8855e16fe4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_a.png new file mode 100644 index 00000000000..4dd4beb8010 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_b.png new file mode 100644 index 00000000000..821f478b580 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_d.png new file mode 100644 index 00000000000..39bcb48f3bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_w.png new file mode 100644 index 00000000000..a8d1329fef8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_a.png new file mode 100644 index 00000000000..0dbb6c1837a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_b.png new file mode 100644 index 00000000000..201f5951440 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_d.png new file mode 100644 index 00000000000..038f0e790d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_w.png new file mode 100644 index 00000000000..0a67baeb856 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_b.png new file mode 100644 index 00000000000..05d89a084b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_d.png new file mode 100644 index 00000000000..0b2b198e28a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_w.png new file mode 100644 index 00000000000..3fd17058962 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_a.png new file mode 100644 index 00000000000..e778456c3d0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_b.png new file mode 100644 index 00000000000..d985d2cf85a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_d.png new file mode 100644 index 00000000000..488a59d1788 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_w.png new file mode 100644 index 00000000000..96e70211681 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_a.png new file mode 100644 index 00000000000..473137fa191 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_a.png new file mode 100644 index 00000000000..3a857d8fa63 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_b.png new file mode 100644 index 00000000000..afd6defb411 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_a.png new file mode 100644 index 00000000000..3a857d8fa63 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_b.png new file mode 100644 index 00000000000..5846dd6fd36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_d.png new file mode 100644 index 00000000000..488f22f7f6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_d.png new file mode 100644 index 00000000000..1fc47c4890d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_w.png new file mode 100644 index 00000000000..20d27899552 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_a.png new file mode 100644 index 00000000000..c9fe25b3e8e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_w.png new file mode 100644 index 00000000000..2b10e609c30 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_a.png new file mode 100644 index 00000000000..43503d1750c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_a.png new file mode 100644 index 00000000000..5bf017d0dd2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_b.png new file mode 100644 index 00000000000..fe4c9fd4165 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_d.png new file mode 100644 index 00000000000..e0536db1f9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_w.png new file mode 100644 index 00000000000..39b88cfc2eb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_a.png new file mode 100644 index 00000000000..111cdc4ac9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_b.png new file mode 100644 index 00000000000..096892599b9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_d.png new file mode 100644 index 00000000000..8ce0ea9e0fc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_w.png new file mode 100644 index 00000000000..ffc8180a914 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_a.png new file mode 100644 index 00000000000..5feb6deb9f1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_b.png new file mode 100644 index 00000000000..56fc5dc127d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_d.png new file mode 100644 index 00000000000..90b70a93a1c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_w.png new file mode 100644 index 00000000000..12132b564e7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_a.png new file mode 100644 index 00000000000..775aedea325 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_b.png new file mode 100644 index 00000000000..3ff863a6d79 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_d.png new file mode 100644 index 00000000000..a46edebf761 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_w.png new file mode 100644 index 00000000000..666e854ae27 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_a.png new file mode 100644 index 00000000000..41d5c8b27ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_b.png new file mode 100644 index 00000000000..e38923ef8a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_d.png new file mode 100644 index 00000000000..8cbfe7fc93b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_w.png new file mode 100644 index 00000000000..c30d5775556 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_b.png new file mode 100644 index 00000000000..6b2ce869f3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_d.png new file mode 100644 index 00000000000..51654f81d0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_w.png new file mode 100644 index 00000000000..a292a904524 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_a.png new file mode 100644 index 00000000000..9d009167d86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_b.png new file mode 100644 index 00000000000..11561875529 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_w.png new file mode 100644 index 00000000000..533ec55c205 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_a.png new file mode 100644 index 00000000000..e7b7c2a228e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_b.png new file mode 100644 index 00000000000..c93c129297e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_d.png new file mode 100644 index 00000000000..93718a2c3d5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_w.png new file mode 100644 index 00000000000..a77b5e31e62 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_a.png new file mode 100644 index 00000000000..4976d6d1e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_b.png new file mode 100644 index 00000000000..a8991f08565 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_d.png new file mode 100644 index 00000000000..1dc8c59e3f8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_w.png new file mode 100644 index 00000000000..b2ae595fd91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_a.png new file mode 100644 index 00000000000..c1b44377a0a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_b.png new file mode 100644 index 00000000000..8f291ad77a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_d.png new file mode 100644 index 00000000000..9e6ef93c02b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_w.png new file mode 100644 index 00000000000..f3969132b23 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_a.png new file mode 100644 index 00000000000..7b1c1a332ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_b.png new file mode 100644 index 00000000000..fc2a7688bb4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_d.png new file mode 100644 index 00000000000..1cb6b353a72 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_w.png new file mode 100644 index 00000000000..ea9895756ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_a.png new file mode 100644 index 00000000000..1b60bd523b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_d.png new file mode 100644 index 00000000000..93718a2c3d5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_w.png new file mode 100644 index 00000000000..f4570a55e32 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_b.png new file mode 100644 index 00000000000..a07dfa0a9bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_w.png new file mode 100644 index 00000000000..a292a904524 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_a.png new file mode 100644 index 00000000000..697a32d51c8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_b.png new file mode 100644 index 00000000000..4a13df3c6a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_d.png new file mode 100644 index 00000000000..f18080d21ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_w.png new file mode 100644 index 00000000000..2c5c837322a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_a.png new file mode 100644 index 00000000000..eeac34e71f7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_b.png new file mode 100644 index 00000000000..12bf36d4f7b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_d.png new file mode 100644 index 00000000000..947b13facf8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_w.png new file mode 100644 index 00000000000..44cfaba6495 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_b.png new file mode 100644 index 00000000000..3fdc8db4841 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_d.png new file mode 100644 index 00000000000..0b2b198e28a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_w.png new file mode 100644 index 00000000000..ff8301c34e2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_a.png new file mode 100644 index 00000000000..0bf8ad15933 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_b.png new file mode 100644 index 00000000000..d339fcf2c49 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_d.png new file mode 100644 index 00000000000..488f22f7f6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_a.png new file mode 100644 index 00000000000..50f0b5e6ed2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_b.png new file mode 100644 index 00000000000..933d431a576 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_d.png new file mode 100644 index 00000000000..bfe1a9f5d66 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_w.png new file mode 100644 index 00000000000..ba4a569c6b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_a.png new file mode 100644 index 00000000000..0bf8ad15933 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_w.png new file mode 100644 index 00000000000..8769524cf0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_a.png new file mode 100644 index 00000000000..6c07bfc8de2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_b.png new file mode 100644 index 00000000000..bd007e1412a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_d.png new file mode 100644 index 00000000000..457b7a178c8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_w.png new file mode 100644 index 00000000000..62006fe3d1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_b.png new file mode 100644 index 00000000000..8613f31a7ac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_d.png new file mode 100644 index 00000000000..c9628b1cf59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_w.png new file mode 100644 index 00000000000..2498e79de0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_w.png new file mode 100644 index 00000000000..8769524cf0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_b.png new file mode 100644 index 00000000000..bce3fa23dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_w.png new file mode 100644 index 00000000000..ae573a4b938 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_a.png new file mode 100644 index 00000000000..37d0dd0aac9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_b.png new file mode 100644 index 00000000000..9fa21187e5d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_d.png new file mode 100644 index 00000000000..4ff4517ab6c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_w.png new file mode 100644 index 00000000000..70886c058ea Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_a.png new file mode 100644 index 00000000000..37d0dd0aac9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_b.png new file mode 100644 index 00000000000..4a712e23cd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_d.png new file mode 100644 index 00000000000..32d2ef1cef8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_w.png new file mode 100644 index 00000000000..f76a7571655 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_a.png new file mode 100644 index 00000000000..5d4afee48c7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_b.png new file mode 100644 index 00000000000..df9f7725a72 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_d.png new file mode 100644 index 00000000000..0c6317968c9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_w.png new file mode 100644 index 00000000000..d79e0ba32fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_b.png new file mode 100644 index 00000000000..bce3fa23dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_w.png new file mode 100644 index 00000000000..c1c20ce8541 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_a.png new file mode 100644 index 00000000000..f37476a1a55 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_b.png new file mode 100644 index 00000000000..83c81b7e78d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_d.png new file mode 100644 index 00000000000..0db7c60d8ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_w.png new file mode 100644 index 00000000000..06590008c29 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_a.png new file mode 100644 index 00000000000..50ef5534394 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_b.png new file mode 100644 index 00000000000..ea5d45e1feb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_d.png new file mode 100644 index 00000000000..24f82bc0e9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_w.png new file mode 100644 index 00000000000..1074d85e8f7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_w.png new file mode 100644 index 00000000000..2908230946f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_a.png new file mode 100644 index 00000000000..9d009167d86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_b.png new file mode 100644 index 00000000000..bce3fa23dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_d.png new file mode 100644 index 00000000000..78b8651969e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_w.png new file mode 100644 index 00000000000..08ac9ca9fd6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherexplorermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_w.png new file mode 100644 index 00000000000..2908230946f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_a.png new file mode 100644 index 00000000000..9d009167d86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_b.png new file mode 100644 index 00000000000..bce3fa23dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_d.png new file mode 100644 index 00000000000..78b8651969e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_w.png new file mode 100644 index 00000000000..08ac9ca9fd6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/netherworkermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_d.png new file mode 100644 index 00000000000..d4ae6cbcbd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_b.png new file mode 100644 index 00000000000..8003339abdf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_d.png new file mode 100644 index 00000000000..52c6193b92c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_w.png new file mode 100644 index 00000000000..e9e662fe0db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_a.png new file mode 100644 index 00000000000..fafed53ed0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_b.png new file mode 100644 index 00000000000..3506f1f2d72 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_d.png new file mode 100644 index 00000000000..1cde8958808 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_w.png new file mode 100644 index 00000000000..b0f57431f2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_b.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_d.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_w.png new file mode 100644 index 00000000000..c15c5ba6f4f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_w.png new file mode 100644 index 00000000000..2b10e609c30 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_a.png new file mode 100644 index 00000000000..43503d1750c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_a.png new file mode 100644 index 00000000000..5490d753c3f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_b.png new file mode 100644 index 00000000000..8bfc4221998 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_w.png new file mode 100644 index 00000000000..5bd837f7c5d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_d.png new file mode 100644 index 00000000000..626d91c2c1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_w.png new file mode 100644 index 00000000000..8769524cf0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_a.png new file mode 100644 index 00000000000..5e39e292584 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_b.png new file mode 100644 index 00000000000..6b2ce869f3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_d.png new file mode 100644 index 00000000000..c31cfd5aba4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_w.png new file mode 100644 index 00000000000..d50009980d9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..b92a17ad692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..3de8e3b4837 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_b.png new file mode 100644 index 00000000000..cb469e56f8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_d.png new file mode 100644 index 00000000000..5af255e7e8b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_w.png new file mode 100644 index 00000000000..415c7bd6fc2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_a.png new file mode 100644 index 00000000000..473137fa191 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_d.png new file mode 100644 index 00000000000..66b7f0b9b90 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_w.png new file mode 100644 index 00000000000..2b33e951eb0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_a.png new file mode 100644 index 00000000000..9010921d100 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_b.png new file mode 100644 index 00000000000..6ca4ee43439 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_a.png new file mode 100644 index 00000000000..ee195257a81 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_b.png new file mode 100644 index 00000000000..5846dd6fd36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_d.png new file mode 100644 index 00000000000..488f22f7f6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_d.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_w.png new file mode 100644 index 00000000000..20d27899552 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_a.png new file mode 100644 index 00000000000..c9fe25b3e8e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_w.png new file mode 100644 index 00000000000..d4228711fed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_a.png new file mode 100644 index 00000000000..43503d1750c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..ba9568c9a57 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_b.png new file mode 100644 index 00000000000..2c6b4bad80b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_d.png new file mode 100644 index 00000000000..1d9292ea8ff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_w.png new file mode 100644 index 00000000000..c7b9b9ca73c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_a.png new file mode 100644 index 00000000000..7b8bd39d514 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_b.png new file mode 100644 index 00000000000..ecf5c7c0fc8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_d.png new file mode 100644 index 00000000000..1149cb4dc29 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_w.png new file mode 100644 index 00000000000..89f2c62baa5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_a.png new file mode 100644 index 00000000000..f5727a8b69a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_b.png new file mode 100644 index 00000000000..fe7c34bea0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_d.png new file mode 100644 index 00000000000..27e7bb4dd6e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_w.png new file mode 100644 index 00000000000..56f4ae6dc62 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_a.png new file mode 100644 index 00000000000..50073da0226 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_d.png new file mode 100644 index 00000000000..3372c1fc939 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_w.png new file mode 100644 index 00000000000..3de8e3b4837 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_a.png new file mode 100644 index 00000000000..5a57b3ce6df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_b.png new file mode 100644 index 00000000000..9b405ac7a81 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_w.png new file mode 100644 index 00000000000..6a412ee2fba Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_b.png new file mode 100644 index 00000000000..201271d3d24 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_d.png new file mode 100644 index 00000000000..0b2b198e28a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_w.png new file mode 100644 index 00000000000..08ac9ca9fd6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_a.png new file mode 100644 index 00000000000..5e39e292584 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_b.png new file mode 100644 index 00000000000..722ab59f8f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_d.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_w.png new file mode 100644 index 00000000000..4ea7acd4527 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_a.png new file mode 100644 index 00000000000..9ad54d5f22f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_b.png new file mode 100644 index 00000000000..d56cbafb42d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_d.png new file mode 100644 index 00000000000..34fb2822e7f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_w.png new file mode 100644 index 00000000000..e2b5ab358f8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_a.png new file mode 100644 index 00000000000..d4f3b17f30f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_b.png new file mode 100644 index 00000000000..53f54c039af Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_d.png new file mode 100644 index 00000000000..7e3fe544267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_w.png new file mode 100644 index 00000000000..b488eaaaaf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_b.png new file mode 100644 index 00000000000..9900c1861a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_d.png new file mode 100644 index 00000000000..93718a2c3d5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_w.png new file mode 100644 index 00000000000..daedbc3b677 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_a.png new file mode 100644 index 00000000000..09a004ee4af Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_b.png new file mode 100644 index 00000000000..11cb0af01eb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_d.png new file mode 100644 index 00000000000..7e3fe544267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_w.png new file mode 100644 index 00000000000..6b0b41f7599 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/default/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_a.png new file mode 100644 index 00000000000..15f50df53dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_b.png new file mode 100644 index 00000000000..a500c126dd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_d.png new file mode 100644 index 00000000000..5c040add8f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_w.png new file mode 100644 index 00000000000..e1900ee1193 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_a.png new file mode 100644 index 00000000000..743d3aea67f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_b.png new file mode 100644 index 00000000000..93948dae752 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_d.png new file mode 100644 index 00000000000..71bcfd5ac98 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_w.png new file mode 100644 index 00000000000..f3a34923bef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archeologistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_a.png new file mode 100644 index 00000000000..15f50df53dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_b.png new file mode 100644 index 00000000000..a500c126dd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_d.png new file mode 100644 index 00000000000..5c040add8f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_w.png new file mode 100644 index 00000000000..e1900ee1193 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/aristocratmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_a.png new file mode 100644 index 00000000000..73bc8f11586 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_b.png new file mode 100644 index 00000000000..04beea9e0a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_d.png new file mode 100644 index 00000000000..089fa1345c6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_w.png new file mode 100644 index 00000000000..9c7962aa1bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpenterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/carpentermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_a.png new file mode 100644 index 00000000000..9f51c0d1e97 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_b.png new file mode 100644 index 00000000000..5488844385d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_d.png new file mode 100644 index 00000000000..885dc3ee2c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_w.png new file mode 100644 index 00000000000..4db372857ab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_a.png new file mode 100644 index 00000000000..9f51c0d1e97 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_b.png new file mode 100644 index 00000000000..5488844385d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_d.png new file mode 100644 index 00000000000..885dc3ee2c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_w.png new file mode 100644 index 00000000000..4db372857ab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_a.png new file mode 100644 index 00000000000..9f51c0d1e97 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_b.png new file mode 100644 index 00000000000..5488844385d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_d.png new file mode 100644 index 00000000000..885dc3ee2c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_w.png new file mode 100644 index 00000000000..4db372857ab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_a.png new file mode 100644 index 00000000000..87956f7c965 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_b.png new file mode 100644 index 00000000000..72d0205838f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_d.png new file mode 100644 index 00000000000..d0a119476bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_w.png new file mode 100644 index 00000000000..c2e22061936 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_a.png new file mode 100644 index 00000000000..87956f7c965 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_b.png new file mode 100644 index 00000000000..72d0205838f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_d.png new file mode 100644 index 00000000000..d0a119476bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_w.png new file mode 100644 index 00000000000..c2e22061936 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_a.png new file mode 100644 index 00000000000..87956f7c965 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_b.png new file mode 100644 index 00000000000..72d0205838f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_d.png new file mode 100644 index 00000000000..d0a119476bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_w.png new file mode 100644 index 00000000000..c2e22061936 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_a.png new file mode 100644 index 00000000000..100ff009666 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_b.png new file mode 100644 index 00000000000..a4a979851d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_d.png new file mode 100644 index 00000000000..8713586c73e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_w.png new file mode 100644 index 00000000000..6614960e73f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_a.png new file mode 100644 index 00000000000..fbc5264cf56 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_b.png new file mode 100644 index 00000000000..84e353e76d3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_d.png new file mode 100644 index 00000000000..bfbc3ef36bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_w.png new file mode 100644 index 00000000000..a5aafe605c1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_a.png new file mode 100644 index 00000000000..16631e2cc3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_b.png new file mode 100644 index 00000000000..90d0956b250 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_d.png new file mode 100644 index 00000000000..d5414190439 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_w.png new file mode 100644 index 00000000000..025f3846832 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_a.png new file mode 100644 index 00000000000..cd244cfb1ce Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_b.png new file mode 100644 index 00000000000..2363d43679b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_d.png new file mode 100644 index 00000000000..2430edb3cbb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_w.png new file mode 100644 index 00000000000..fa14c90d0b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_a.png new file mode 100644 index 00000000000..92cd8680a12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_b.png new file mode 100644 index 00000000000..fa4562ec68f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_d.png new file mode 100644 index 00000000000..cc82b11ae9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_w.png new file mode 100644 index 00000000000..5b07db2f79c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_w.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_a.png new file mode 100644 index 00000000000..9f51c0d1e97 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_b.png new file mode 100644 index 00000000000..5488844385d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_d.png new file mode 100644 index 00000000000..885dc3ee2c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_w.png new file mode 100644 index 00000000000..4db372857ab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_a.png new file mode 100644 index 00000000000..805d14e37de Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_b.png new file mode 100644 index 00000000000..0a4818b041f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_d.png new file mode 100644 index 00000000000..f389147d4e8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_w.png new file mode 100644 index 00000000000..e379d1a324d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_a.png new file mode 100644 index 00000000000..df5cbd58bbf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_b.png new file mode 100644 index 00000000000..0ad4a645bd6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_d.png new file mode 100644 index 00000000000..7572ff7c85b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_w.png new file mode 100644 index 00000000000..445de1af5be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_a.png new file mode 100644 index 00000000000..75fcd7dcceb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_b.png new file mode 100644 index 00000000000..d5caa6d179f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_d.png new file mode 100644 index 00000000000..f853c78bfd8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_w.png new file mode 100644 index 00000000000..58928fe1bc4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_a.png new file mode 100644 index 00000000000..92cd8680a12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_b.png new file mode 100644 index 00000000000..fa4562ec68f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_d.png new file mode 100644 index 00000000000..cc82b11ae9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_w.png new file mode 100644 index 00000000000..5b07db2f79c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_a.png new file mode 100644 index 00000000000..92cd8680a12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_b.png new file mode 100644 index 00000000000..fa4562ec68f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_d.png new file mode 100644 index 00000000000..cc82b11ae9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_w.png new file mode 100644 index 00000000000..5b07db2f79c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_a.png new file mode 100644 index 00000000000..30ae9f1fc2b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_b.png new file mode 100644 index 00000000000..25bb768acbc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_d.png new file mode 100644 index 00000000000..9b0080f3bae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_w.png new file mode 100644 index 00000000000..de21c06934e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_a.png new file mode 100644 index 00000000000..1bc15261f42 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_b.png new file mode 100644 index 00000000000..0a13d09a28f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_d.png new file mode 100644 index 00000000000..236be233db8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_w.png new file mode 100644 index 00000000000..cef8596f94a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_a.png new file mode 100644 index 00000000000..15f50df53dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_b.png new file mode 100644 index 00000000000..a500c126dd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_d.png new file mode 100644 index 00000000000..5c040add8f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_w.png new file mode 100644 index 00000000000..e1900ee1193 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_a.png new file mode 100644 index 00000000000..1bc15261f42 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_b.png new file mode 100644 index 00000000000..0a13d09a28f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_d.png new file mode 100644 index 00000000000..236be233db8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_w.png new file mode 100644 index 00000000000..cef8596f94a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_a.png new file mode 100644 index 00000000000..16631e2cc3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_b.png new file mode 100644 index 00000000000..90d0956b250 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_d.png new file mode 100644 index 00000000000..d5414190439 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_w.png new file mode 100644 index 00000000000..025f3846832 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_a.png new file mode 100644 index 00000000000..43e533ae4f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_b.png new file mode 100644 index 00000000000..2363d43679b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_d.png new file mode 100644 index 00000000000..2430edb3cbb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_w.png new file mode 100644 index 00000000000..fa14c90d0b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherexplorermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/netherworkermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_a.png new file mode 100644 index 00000000000..b5e2d79e225 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_b.png new file mode 100644 index 00000000000..4c16733bb86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_d.png new file mode 100644 index 00000000000..094c5ed6dee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_a.png new file mode 100644 index 00000000000..92cd8680a12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_b.png new file mode 100644 index 00000000000..fa4562ec68f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_d.png new file mode 100644 index 00000000000..cc82b11ae9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_w.png new file mode 100644 index 00000000000..5b07db2f79c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_a.png new file mode 100644 index 00000000000..d26a5eb7e91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_b.png new file mode 100644 index 00000000000..f4fa9d0c434 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_d.png new file mode 100644 index 00000000000..4c5daebe685 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_w.png new file mode 100644 index 00000000000..a8de13f7e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_a.png new file mode 100644 index 00000000000..f609a72f53d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_b.png new file mode 100644 index 00000000000..ebf3b493013 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_d.png new file mode 100644 index 00000000000..aa226016f1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_a.png new file mode 100644 index 00000000000..c59ab73790c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_b.png new file mode 100644 index 00000000000..538b9511961 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_d.png new file mode 100644 index 00000000000..2592098ac36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_w.png new file mode 100644 index 00000000000..88a9fde1222 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_a.png new file mode 100644 index 00000000000..a82904d9a04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_b.png new file mode 100644 index 00000000000..3cc76a4fff0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_d.png new file mode 100644 index 00000000000..68f910ce457 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_w.png new file mode 100644 index 00000000000..9063fcd61d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_a.png new file mode 100644 index 00000000000..96f749d49ad Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_b.png new file mode 100644 index 00000000000..7701cade72a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_d.png new file mode 100644 index 00000000000..3f51cb65bb4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_w.png new file mode 100644 index 00000000000..32cd6b8341e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_a.png new file mode 100644 index 00000000000..2ba9d36d016 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_b.png new file mode 100644 index 00000000000..8ae1cf5d5e0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_d.png new file mode 100644 index 00000000000..c5eaefd7776 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_w.png new file mode 100644 index 00000000000..22cb7456728 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_a.png new file mode 100644 index 00000000000..680732fbacf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_b.png new file mode 100644 index 00000000000..e680f9486cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_d.png new file mode 100644 index 00000000000..7e8a31ac1df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_w.png new file mode 100644 index 00000000000..5ab53afe93e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_a.png new file mode 100644 index 00000000000..32a3be65d3f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_b.png new file mode 100644 index 00000000000..49b269933de Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_d.png new file mode 100644 index 00000000000..204f6a7c411 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_w.png new file mode 100644 index 00000000000..7668f6b1b53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/eastasian/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_a.png new file mode 100644 index 00000000000..d5217396051 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_b.png new file mode 100644 index 00000000000..d846e83d914 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_d.png new file mode 100644 index 00000000000..a42f11d9b34 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_w.png new file mode 100644 index 00000000000..18c3802e580 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_a.png new file mode 100644 index 00000000000..0c8fed68168 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_b.png new file mode 100644 index 00000000000..351af26d2a0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_d.png new file mode 100644 index 00000000000..20ee3408c07 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_w.png new file mode 100644 index 00000000000..8427dafb44d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_a.png new file mode 100644 index 00000000000..9fb6447dee5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_b.png new file mode 100644 index 00000000000..444e6cc3501 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_d.png new file mode 100644 index 00000000000..d20288b1867 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_w.png new file mode 100644 index 00000000000..4b4581363a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_a.png new file mode 100644 index 00000000000..c9241b54fe7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_b.png new file mode 100644 index 00000000000..db039b95fc7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_d.png new file mode 100644 index 00000000000..bf332d28208 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_w.png new file mode 100644 index 00000000000..d97937d8e29 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_a.png new file mode 100644 index 00000000000..147b233fdd1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_b.png new file mode 100644 index 00000000000..8fa0258f972 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_d.png new file mode 100644 index 00000000000..9f36e3ab893 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_w.png new file mode 100644 index 00000000000..2f388b6234b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_a.png new file mode 100644 index 00000000000..7878c8c27f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_b.png new file mode 100644 index 00000000000..7369e1f5e43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_d.png new file mode 100644 index 00000000000..43de48d589d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_w.png new file mode 100644 index 00000000000..1a98e4e9c40 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_a.png new file mode 100644 index 00000000000..ff3e7099f19 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_b.png new file mode 100644 index 00000000000..ba896a73faa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_d.png new file mode 100644 index 00000000000..83320a50301 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_w.png new file mode 100644 index 00000000000..e46a12752cd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_a.png new file mode 100644 index 00000000000..7ac0c79720f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_b.png new file mode 100644 index 00000000000..702c07cee74 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_d.png new file mode 100644 index 00000000000..c0d34127a47 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_w.png new file mode 100644 index 00000000000..7c8b62fe215 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_a.png new file mode 100644 index 00000000000..ce66824ecea Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_b.png new file mode 100644 index 00000000000..51cadc533f5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_d.png new file mode 100644 index 00000000000..cdd92274e70 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_w.png new file mode 100644 index 00000000000..98a7f6bc9a2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_a.png new file mode 100644 index 00000000000..30b2a25b686 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_b.png new file mode 100644 index 00000000000..2b11ab02925 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_d.png new file mode 100644 index 00000000000..633954ed373 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_w.png new file mode 100644 index 00000000000..a53f3f405d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/aristocratmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_a.png new file mode 100644 index 00000000000..40363ff3917 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_b.png new file mode 100644 index 00000000000..cc5ed745494 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_d.png new file mode 100644 index 00000000000..ed7331ac7b7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_w.png new file mode 100644 index 00000000000..74d3d469e45 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_a.png new file mode 100644 index 00000000000..59e863c3ab8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_b.png new file mode 100644 index 00000000000..5f9d9096de7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_d.png new file mode 100644 index 00000000000..3a34e5b0f3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_w.png new file mode 100644 index 00000000000..224b57bc594 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_a.png new file mode 100644 index 00000000000..9820bc2bbb7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_b.png new file mode 100644 index 00000000000..3df833fde94 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_d.png new file mode 100644 index 00000000000..1d4a77eddc3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_w.png new file mode 100644 index 00000000000..efd90e62cd1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_a.png new file mode 100644 index 00000000000..04a41c4fcbe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_b.png new file mode 100644 index 00000000000..82ed08b0f26 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_d.png new file mode 100644 index 00000000000..3f09024b2c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_w.png new file mode 100644 index 00000000000..e50065eb278 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_a.png new file mode 100644 index 00000000000..59c89652527 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_b.png new file mode 100644 index 00000000000..9e8aa012892 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_d.png new file mode 100644 index 00000000000..a85b63220bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_w.png new file mode 100644 index 00000000000..c3294543650 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_a.png new file mode 100644 index 00000000000..09b1038d845 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_b.png new file mode 100644 index 00000000000..ca58ef6b682 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_d.png new file mode 100644 index 00000000000..e8d958d008b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_w.png new file mode 100644 index 00000000000..7616c53d20f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_a.png new file mode 100644 index 00000000000..83f04482aff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_b.png new file mode 100644 index 00000000000..350a623a5ad Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_d.png new file mode 100644 index 00000000000..19b2136bc0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_w.png new file mode 100644 index 00000000000..985c167bec4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_a.png new file mode 100644 index 00000000000..527a4ca4ec7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_b.png new file mode 100644 index 00000000000..b02f020ce07 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_d.png new file mode 100644 index 00000000000..9f62063640d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_w.png new file mode 100644 index 00000000000..f4efb55d002 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..a4bc7cd71f4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..092f3669859 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..fe8d7a528d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..42dc2206b92 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_a.png new file mode 100644 index 00000000000..aaeb5e7d31f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_b.png new file mode 100644 index 00000000000..5356a2f1170 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_d.png new file mode 100644 index 00000000000..8569a249243 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_w.png new file mode 100644 index 00000000000..d560873dc21 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_a.png new file mode 100644 index 00000000000..63c63129a1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_b.png new file mode 100644 index 00000000000..94d8ff81e19 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_d.png new file mode 100644 index 00000000000..2a2c9c1fc4d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_w.png new file mode 100644 index 00000000000..822548208f1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_a.png new file mode 100644 index 00000000000..c7feea5dfe6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_b.png new file mode 100644 index 00000000000..1e894f54862 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_d.png new file mode 100644 index 00000000000..8cc3b1324cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_w.png new file mode 100644 index 00000000000..83634c2894f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_a.png new file mode 100644 index 00000000000..5a2dc7f8d41 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_b.png new file mode 100644 index 00000000000..856f91e4ba9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_d.png new file mode 100644 index 00000000000..104bf04cb87 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_w.png new file mode 100644 index 00000000000..bdbe3fdc196 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_a.png new file mode 100644 index 00000000000..360bcfe0bc6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_b.png new file mode 100644 index 00000000000..6b65bd6b595 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_d.png new file mode 100644 index 00000000000..15b24f9dfc5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_w.png new file mode 100644 index 00000000000..1fe1840b91c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_a.png new file mode 100644 index 00000000000..94a28d3d957 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_b.png new file mode 100644 index 00000000000..84405641849 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_d.png new file mode 100644 index 00000000000..5cf7dd1d159 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_w.png new file mode 100644 index 00000000000..84aa3bbb309 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_a.png new file mode 100644 index 00000000000..af41fcd4111 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_b.png new file mode 100644 index 00000000000..51d48c79d57 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_d.png new file mode 100644 index 00000000000..22601b85ad1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_w.png new file mode 100644 index 00000000000..3e3280058e7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_a.png new file mode 100644 index 00000000000..ebb192e6159 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_b.png new file mode 100644 index 00000000000..30889e6bfbd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_d.png new file mode 100644 index 00000000000..b6a3334a558 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_w.png new file mode 100644 index 00000000000..1ad088eca6d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_a.png new file mode 100644 index 00000000000..4c067f084b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_b.png new file mode 100644 index 00000000000..f2e457a0ebd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_d.png new file mode 100644 index 00000000000..c929d8682bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_w.png new file mode 100644 index 00000000000..a7107b3f496 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_a.png new file mode 100644 index 00000000000..dec1aea781f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_b.png new file mode 100644 index 00000000000..6c5a8f6ec5c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_d.png new file mode 100644 index 00000000000..e1ac97d6b0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_w.png new file mode 100644 index 00000000000..b2516f7f95a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_a.png new file mode 100644 index 00000000000..9a23e3fd297 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_b.png new file mode 100644 index 00000000000..220229a10e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_d.png new file mode 100644 index 00000000000..934714d3e66 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_w.png new file mode 100644 index 00000000000..0a6429f4fe8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_a.png new file mode 100644 index 00000000000..b183f9fdae0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_b.png new file mode 100644 index 00000000000..4d8404f3eb7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_d.png new file mode 100644 index 00000000000..8ddfc2aae48 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_w.png new file mode 100644 index 00000000000..2e867c76cec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_a.png new file mode 100644 index 00000000000..001ab6f46be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_b.png new file mode 100644 index 00000000000..620c57afa91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_d.png new file mode 100644 index 00000000000..c3bf5fb3761 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_w.png new file mode 100644 index 00000000000..8ce90100e96 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_a.png new file mode 100644 index 00000000000..1e1046140bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_b.png new file mode 100644 index 00000000000..815eb4d8d3e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_d.png new file mode 100644 index 00000000000..a00cf4e0f8d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_w.png new file mode 100644 index 00000000000..58c129b301b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_a.png new file mode 100644 index 00000000000..1875a5b3dd9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_b.png new file mode 100644 index 00000000000..8e12aeabfeb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_d.png new file mode 100644 index 00000000000..cf857204e37 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_w.png new file mode 100644 index 00000000000..aef88ff064a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_a.png new file mode 100644 index 00000000000..b310937730a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_b.png new file mode 100644 index 00000000000..d19194e5dc2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_d.png new file mode 100644 index 00000000000..5703359aad3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_w.png new file mode 100644 index 00000000000..827283b0f22 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_a.png new file mode 100644 index 00000000000..d93e9971f9b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_b.png new file mode 100644 index 00000000000..107f6b3677c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_d.png new file mode 100644 index 00000000000..be3a45328ff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_w.png new file mode 100644 index 00000000000..c7e89eb8c0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_a.png new file mode 100644 index 00000000000..e24845122e0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_b.png new file mode 100644 index 00000000000..1bf65e1b25f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_d.png new file mode 100644 index 00000000000..5183a53a602 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_w.png new file mode 100644 index 00000000000..28cad6ec232 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_a.png new file mode 100644 index 00000000000..04e926de4cd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_b.png new file mode 100644 index 00000000000..17e492802cf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_d.png new file mode 100644 index 00000000000..8562652e1bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_w.png new file mode 100644 index 00000000000..63f7b323041 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_a.png new file mode 100644 index 00000000000..338aa9eac4e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_b.png new file mode 100644 index 00000000000..1df9bad137d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_d.png new file mode 100644 index 00000000000..1bcb1f4ef15 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_w.png new file mode 100644 index 00000000000..c2b6489a670 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_a.png new file mode 100644 index 00000000000..3da5da9c152 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_b.png new file mode 100644 index 00000000000..a1f7190d9f3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_d.png new file mode 100644 index 00000000000..d564139e52e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_w.png new file mode 100644 index 00000000000..133fd74a757 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..422132b9ce4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..17df47f5a8f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..157aded69bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..0b706b723a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_a.png new file mode 100644 index 00000000000..6617499d8d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_b.png new file mode 100644 index 00000000000..761150089f7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_d.png new file mode 100644 index 00000000000..abd54e99624 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_w.png new file mode 100644 index 00000000000..a1cb0c5e0bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_a.png new file mode 100644 index 00000000000..99aac1af028 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_b.png new file mode 100644 index 00000000000..ceba05186d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_d.png new file mode 100644 index 00000000000..cf77007da2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_w.png new file mode 100644 index 00000000000..5d266853a0b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_a.png new file mode 100644 index 00000000000..22b33faa0bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_b.png new file mode 100644 index 00000000000..30743bccbf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_d.png new file mode 100644 index 00000000000..57386d7c103 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_w.png new file mode 100644 index 00000000000..4192570b376 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_a.png new file mode 100644 index 00000000000..422132b9ce4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_b.png new file mode 100644 index 00000000000..17df47f5a8f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_d.png new file mode 100644 index 00000000000..347a0007151 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_w.png new file mode 100644 index 00000000000..93ce9334b88 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_a.png new file mode 100644 index 00000000000..02c1594b948 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_b.png new file mode 100644 index 00000000000..dc95ad901d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_d.png new file mode 100644 index 00000000000..d342a1102a1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_w.png new file mode 100644 index 00000000000..f581b2f63b8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/deliverymanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_a.png new file mode 100644 index 00000000000..4a39bbc79f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_b.png new file mode 100644 index 00000000000..4b4123bb9fb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_d.png new file mode 100644 index 00000000000..538b37b084a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_w.png new file mode 100644 index 00000000000..a4e3effd973 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_a.png new file mode 100644 index 00000000000..db9b4a243ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_b.png new file mode 100644 index 00000000000..070ae46f09d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_d.png new file mode 100644 index 00000000000..bd70379af8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_w.png new file mode 100644 index 00000000000..735de0b23d8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_a.png new file mode 100644 index 00000000000..bc71429d465 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_b.png new file mode 100644 index 00000000000..bafcca622fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_d.png new file mode 100644 index 00000000000..8512176d1da Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_w.png new file mode 100644 index 00000000000..bfeb5d04d69 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_a.png new file mode 100644 index 00000000000..ff00b3bc124 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_b.png new file mode 100644 index 00000000000..dff449fff45 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_d.png new file mode 100644 index 00000000000..4677a4dfb9d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_w.png new file mode 100644 index 00000000000..81b05bb0025 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_a.png new file mode 100644 index 00000000000..4e2e2d0121d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_b.png new file mode 100644 index 00000000000..9e8aa012892 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_d.png new file mode 100644 index 00000000000..6018e1de8df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_w.png new file mode 100644 index 00000000000..f5d63c811de Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_a.png new file mode 100644 index 00000000000..139144b7a26 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_b.png new file mode 100644 index 00000000000..0ff6e6ff2ec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_d.png new file mode 100644 index 00000000000..666594c92cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_w.png new file mode 100644 index 00000000000..d5c1c357e18 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_a.png new file mode 100644 index 00000000000..40aef6719bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_b.png new file mode 100644 index 00000000000..8bb03ded279 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_d.png new file mode 100644 index 00000000000..350e2d22912 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_w.png new file mode 100644 index 00000000000..e0bace9b2d0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_a.png new file mode 100644 index 00000000000..6458d6efcb5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_b.png new file mode 100644 index 00000000000..06dbb45346a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_d.png new file mode 100644 index 00000000000..0ba805fac83 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_w.png new file mode 100644 index 00000000000..3479b925b30 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_a.png new file mode 100644 index 00000000000..b8babf2783e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_b.png new file mode 100644 index 00000000000..444a808c3d4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_d.png new file mode 100644 index 00000000000..68b4607171b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_w.png new file mode 100644 index 00000000000..7d2f23756e8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_a.png new file mode 100644 index 00000000000..c4cb569a611 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_b.png new file mode 100644 index 00000000000..5bb3f865253 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_d.png new file mode 100644 index 00000000000..de093ff10dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_w.png new file mode 100644 index 00000000000..16fdf9b98ff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_a.png new file mode 100644 index 00000000000..507a4c992e4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_b.png new file mode 100644 index 00000000000..df204af17db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_d.png new file mode 100644 index 00000000000..a587395de08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_w.png new file mode 100644 index 00000000000..d4656bbd4c9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_a.png new file mode 100644 index 00000000000..b0493bbbd25 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_b.png new file mode 100644 index 00000000000..1d8739d5e90 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_d.png new file mode 100644 index 00000000000..2bc32b1815a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_w.png new file mode 100644 index 00000000000..3881b428417 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_a.png new file mode 100644 index 00000000000..ebb192e6159 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_b.png new file mode 100644 index 00000000000..30889e6bfbd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_d.png new file mode 100644 index 00000000000..c929d8682bb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_w.png new file mode 100644 index 00000000000..b2516f7f95a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_a.png new file mode 100644 index 00000000000..b0493bbbd25 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_b.png new file mode 100644 index 00000000000..1d8739d5e90 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_d.png new file mode 100644 index 00000000000..2bc32b1815a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_w.png new file mode 100644 index 00000000000..3881b428417 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_a.png new file mode 100644 index 00000000000..d26b87a2fb6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_b.png new file mode 100644 index 00000000000..a1d78daf18a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_d.png new file mode 100644 index 00000000000..ff04ecd583d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_w.png new file mode 100644 index 00000000000..35faa78675e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_a.png new file mode 100644 index 00000000000..c37cfd115d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_b.png new file mode 100644 index 00000000000..37f1fd911d5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_d.png new file mode 100644 index 00000000000..1826a9b579d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_w.png new file mode 100644 index 00000000000..8f88ff6c7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_a.png new file mode 100644 index 00000000000..74be1d9bfd9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_b.png new file mode 100644 index 00000000000..c70ba322f4e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_d.png new file mode 100644 index 00000000000..76cf7f084c4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_w.png new file mode 100644 index 00000000000..323143e2da1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_a.png new file mode 100644 index 00000000000..5c0310986e3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_b.png new file mode 100644 index 00000000000..08dab8c32b7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_d.png new file mode 100644 index 00000000000..830e4e97146 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_w.png new file mode 100644 index 00000000000..0b20f769c1c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_a.png new file mode 100644 index 00000000000..6d547447c23 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_b.png new file mode 100644 index 00000000000..804d2b2ce41 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_d.png new file mode 100644 index 00000000000..6abbf0509dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_w.png new file mode 100644 index 00000000000..112faaa9367 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_a.png new file mode 100644 index 00000000000..87aedbf0cbd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_b.png new file mode 100644 index 00000000000..4c2fc367ab6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_d.png new file mode 100644 index 00000000000..d7d117bbf23 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_w.png new file mode 100644 index 00000000000..9bb69ae6f93 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_a.png new file mode 100644 index 00000000000..9fb6447dee5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_b.png new file mode 100644 index 00000000000..23a20a38456 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_d.png new file mode 100644 index 00000000000..8aa802eebc8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_w.png new file mode 100644 index 00000000000..babf9d0254f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_a.png new file mode 100644 index 00000000000..c9241b54fe7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_b.png new file mode 100644 index 00000000000..e15dd50b238 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_d.png new file mode 100644 index 00000000000..c481af3c5f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_w.png new file mode 100644 index 00000000000..23491adaaf8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_a.png new file mode 100644 index 00000000000..a4bc7cd71f4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_b.png new file mode 100644 index 00000000000..c4409513a98 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_d.png new file mode 100644 index 00000000000..33cd774b062 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_w.png new file mode 100644 index 00000000000..d71e2a4f016 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_a.png new file mode 100644 index 00000000000..ae9cf7ba2ea Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_b.png new file mode 100644 index 00000000000..b5bc322f995 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_d.png new file mode 100644 index 00000000000..c857310db5b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_w.png new file mode 100644 index 00000000000..ca562edbb49 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_a.png new file mode 100644 index 00000000000..a14bfa8e2be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_b.png new file mode 100644 index 00000000000..2abcd2c6f7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_d.png new file mode 100644 index 00000000000..541806e0e15 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_w.png new file mode 100644 index 00000000000..aec9e9cef6b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_a.png new file mode 100644 index 00000000000..ae9cf7ba2ea Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_b.png new file mode 100644 index 00000000000..675cea55a27 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_d.png new file mode 100644 index 00000000000..1aaa05d7745 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_w.png new file mode 100644 index 00000000000..76afab3613d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_a.png new file mode 100644 index 00000000000..81811269680 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_b.png new file mode 100644 index 00000000000..e531302e314 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_d.png new file mode 100644 index 00000000000..afcca1afbd9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_w.png new file mode 100644 index 00000000000..efb0438ef5a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_a.png new file mode 100644 index 00000000000..db9b4a243ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_b.png new file mode 100644 index 00000000000..79ddb7c5faf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_d.png new file mode 100644 index 00000000000..fc14b0105f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_w.png new file mode 100644 index 00000000000..358b4444816 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/netherworkermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_a.png new file mode 100644 index 00000000000..d21eb541f4c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_b.png new file mode 100644 index 00000000000..e0aa2866612 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_d.png new file mode 100644 index 00000000000..dfb340e3836 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_w.png new file mode 100644 index 00000000000..af081b05a9e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_a.png new file mode 100644 index 00000000000..aa3c8a1dd1c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_b.png new file mode 100644 index 00000000000..8c2faa4b86c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_d.png new file mode 100644 index 00000000000..be224247771 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_w.png new file mode 100644 index 00000000000..b5e4d66e70e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_a.png new file mode 100644 index 00000000000..721f6450f78 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_b.png new file mode 100644 index 00000000000..44faab736fa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_d.png new file mode 100644 index 00000000000..b463c7ab65f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_w.png new file mode 100644 index 00000000000..a09e12e66dd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_a.png new file mode 100644 index 00000000000..38e73b67d6d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_b.png new file mode 100644 index 00000000000..d59caf821c5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_d.png new file mode 100644 index 00000000000..1f7136809e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_w.png new file mode 100644 index 00000000000..c8c9b64b6bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_a.png new file mode 100644 index 00000000000..d1c46b00d0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_b.png new file mode 100644 index 00000000000..0c2c8dac293 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_d.png new file mode 100644 index 00000000000..385da8f9572 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_w.png new file mode 100644 index 00000000000..ae6d3e74bcf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_a.png new file mode 100644 index 00000000000..32a801300bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_b.png new file mode 100644 index 00000000000..5f069dad905 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_d.png new file mode 100644 index 00000000000..981a3581537 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_w.png new file mode 100644 index 00000000000..4529458db61 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..7459b7dafaa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..659d9f37a1a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..3a609e2f1a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..f3510edf8e7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_a.png new file mode 100644 index 00000000000..22b33faa0bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_b.png new file mode 100644 index 00000000000..675cea55a27 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_d.png new file mode 100644 index 00000000000..e54f00906b9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_w.png new file mode 100644 index 00000000000..2779770b56f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_a.png new file mode 100644 index 00000000000..17d288fb6bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_b.png new file mode 100644 index 00000000000..bec739cf195 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_d.png new file mode 100644 index 00000000000..1bcb1f4ef15 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_w.png new file mode 100644 index 00000000000..c7b4978611f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_a.png new file mode 100644 index 00000000000..22b33faa0bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_b.png new file mode 100644 index 00000000000..57a6f646996 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_d.png new file mode 100644 index 00000000000..9b57f81276c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_w.png new file mode 100644 index 00000000000..05d29760d55 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..17d288fb6bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..bec739cf195 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..9b0f8ccd721 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..0e14bf66021 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_a.png new file mode 100644 index 00000000000..0c8326a1dd0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_b.png new file mode 100644 index 00000000000..30743bccbf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_d.png new file mode 100644 index 00000000000..92fdc9035c6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_w.png new file mode 100644 index 00000000000..f9dc5dce624 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_a.png new file mode 100644 index 00000000000..ebb192e6159 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_b.png new file mode 100644 index 00000000000..b90469792b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_d.png new file mode 100644 index 00000000000..3fb5c7a722c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_w.png new file mode 100644 index 00000000000..7bcaa67bd10 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_a.png new file mode 100644 index 00000000000..4c067f084b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_b.png new file mode 100644 index 00000000000..f2e457a0ebd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_d.png new file mode 100644 index 00000000000..bee703b2896 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_w.png new file mode 100644 index 00000000000..88eb7dde6bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_a.png new file mode 100644 index 00000000000..d4daf73d377 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_b.png new file mode 100644 index 00000000000..a8249a8afd0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_d.png new file mode 100644 index 00000000000..106df67bb15 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_w.png new file mode 100644 index 00000000000..29129a357d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_a.png new file mode 100644 index 00000000000..0058e968251 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_b.png new file mode 100644 index 00000000000..220229a10e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_d.png new file mode 100644 index 00000000000..934714d3e66 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_w.png new file mode 100644 index 00000000000..0a6429f4fe8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_a.png new file mode 100644 index 00000000000..705cfdfebbf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_b.png new file mode 100644 index 00000000000..02fc14fe835 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_d.png new file mode 100644 index 00000000000..8ddfc2aae48 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_w.png new file mode 100644 index 00000000000..d7bdea0c89c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_a.png new file mode 100644 index 00000000000..001ab6f46be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_b.png new file mode 100644 index 00000000000..620c57afa91 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_d.png new file mode 100644 index 00000000000..aefeda86b7d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_w.png new file mode 100644 index 00000000000..66a209b8633 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..9d917d4cf87 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..a8bd4a33b86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..a7376222c87 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..243b150bb9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_a.png new file mode 100644 index 00000000000..9662b930caa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_b.png new file mode 100644 index 00000000000..7b86b068c78 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_d.png new file mode 100644 index 00000000000..0d5cc749850 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_w.png new file mode 100644 index 00000000000..fa6c85539b2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_a.png new file mode 100644 index 00000000000..2d37e1d6e09 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_b.png new file mode 100644 index 00000000000..6b57ea45d5e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_d.png new file mode 100644 index 00000000000..386446fd493 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_w.png new file mode 100644 index 00000000000..074f33d1cc5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_a.png new file mode 100644 index 00000000000..7d16827ae7f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_b.png new file mode 100644 index 00000000000..4d58c5b2886 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_d.png new file mode 100644 index 00000000000..f96e601f6c0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_w.png new file mode 100644 index 00000000000..32d3145e94b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_a.png new file mode 100644 index 00000000000..ff6bd4695ec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_b.png new file mode 100644 index 00000000000..52faca77db3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_d.png new file mode 100644 index 00000000000..d1ea5bbbc6b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_w.png new file mode 100644 index 00000000000..51700391601 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_a.png new file mode 100644 index 00000000000..a5ac65452cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_b.png new file mode 100644 index 00000000000..31fee2c3573 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_d.png new file mode 100644 index 00000000000..92f68ce082d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_w.png new file mode 100644 index 00000000000..faad005dfa7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_a.png new file mode 100644 index 00000000000..67c0fdd77b9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_b.png new file mode 100644 index 00000000000..af0913fc82a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_d.png new file mode 100644 index 00000000000..9b921b8298d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_w.png new file mode 100644 index 00000000000..25f059a24f6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_a.png new file mode 100644 index 00000000000..a4b2a3fb5a2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_b.png new file mode 100644 index 00000000000..6854052dbb6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_d.png new file mode 100644 index 00000000000..cb3c11667b1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_w.png new file mode 100644 index 00000000000..21347c11917 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_a.png new file mode 100644 index 00000000000..18157e2b2b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_b.png new file mode 100644 index 00000000000..db084890823 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_d.png new file mode 100644 index 00000000000..c0cd885174c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_w.png new file mode 100644 index 00000000000..74d74ea7a3e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_a.png new file mode 100644 index 00000000000..ad3700a1349 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_b.png new file mode 100644 index 00000000000..577ada0a75e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_d.png new file mode 100644 index 00000000000..a3fb4ac0a20 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_w.png new file mode 100644 index 00000000000..fd67f7dcc66 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_a.png new file mode 100644 index 00000000000..856bb29adeb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_b.png new file mode 100644 index 00000000000..2c8b12a5ecc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_d.png new file mode 100644 index 00000000000..a0eebfd3b02 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_w.png new file mode 100644 index 00000000000..226eeacdbf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_a.png new file mode 100644 index 00000000000..6b3e2ad0732 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_b.png new file mode 100644 index 00000000000..951a3e260e2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_d.png new file mode 100644 index 00000000000..3b3f545d81b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_w.png new file mode 100644 index 00000000000..58b15127b9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_a.png new file mode 100644 index 00000000000..77ee8296128 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_b.png new file mode 100644 index 00000000000..64da58cd753 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_d.png new file mode 100644 index 00000000000..31fef603171 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_w.png new file mode 100644 index 00000000000..5fff66d143a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_a.png new file mode 100644 index 00000000000..add4e481f18 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_b.png new file mode 100644 index 00000000000..8a3cbb64c4a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_d.png new file mode 100644 index 00000000000..138634a6566 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_w.png new file mode 100644 index 00000000000..0ea79d914ec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/medieval/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_a.png new file mode 100644 index 00000000000..aba114af9c9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_d.png new file mode 100644 index 00000000000..ac3ff8a14bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_w.png new file mode 100644 index 00000000000..e2d44a1a974 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_b.png new file mode 100644 index 00000000000..bfa72bffab5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_d.png new file mode 100644 index 00000000000..c9bcbcae0b2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_w.png new file mode 100644 index 00000000000..e2d44a1a974 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_w.png new file mode 100644 index 00000000000..e2d44a1a974 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_a.png new file mode 100644 index 00000000000..d3c17f2870f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_b.png new file mode 100644 index 00000000000..6a40026663d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_d.png new file mode 100644 index 00000000000..255f3acb9cd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_w.png new file mode 100644 index 00000000000..00115e68286 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_a.png new file mode 100644 index 00000000000..a6a80de1a3e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_b.png new file mode 100644 index 00000000000..c3564c118a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_d.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_w.png new file mode 100644 index 00000000000..e9d8305c0c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_a.png new file mode 100644 index 00000000000..64a3ef93c2c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_d.png new file mode 100644 index 00000000000..9989a417dc4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_w.png new file mode 100644 index 00000000000..d22d7b7e60d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/aristocratmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_w.png new file mode 100644 index 00000000000..e2d44a1a974 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale2_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/beekeepermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_a.png new file mode 100644 index 00000000000..aba114af9c9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_a.png new file mode 100644 index 00000000000..c798f12ccfb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_b.png new file mode 100644 index 00000000000..fc077865ce3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_d.png new file mode 100644 index 00000000000..ff4d67f18a9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpenterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_b.png new file mode 100644 index 00000000000..4468dc1f9b8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_d.png new file mode 100644 index 00000000000..26b20f85a10 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/carpentermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..c4b6cfad1d7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenherder1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenherder1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/chickenherder1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_a.png new file mode 100644 index 00000000000..94b96d58d1f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_b.png new file mode 100644 index 00000000000..5ab7b0cb02f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_d.png new file mode 100644 index 00000000000..fcfa37cd22c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_w.png new file mode 100644 index 00000000000..9c130fe78f3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_a.png new file mode 100644 index 00000000000..1b8d4f4e9b1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_b.png new file mode 100644 index 00000000000..454cdbc1acd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_d.png new file mode 100644 index 00000000000..d07b76d9963 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_w.png new file mode 100644 index 00000000000..e8855e16fe4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_a.png new file mode 100644 index 00000000000..4dd4beb8010 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_b.png new file mode 100644 index 00000000000..821f478b580 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_d.png new file mode 100644 index 00000000000..39bcb48f3bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_w.png new file mode 100644 index 00000000000..a8d1329fef8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_a.png new file mode 100644 index 00000000000..9093bbf8e93 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_d.png new file mode 100644 index 00000000000..f0540d63b1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_a.png new file mode 100644 index 00000000000..9093bbf8e93 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_d.png new file mode 100644 index 00000000000..f0540d63b1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_a.png new file mode 100644 index 00000000000..9093bbf8e93 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_d.png new file mode 100644 index 00000000000..f0540d63b1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_b.png new file mode 100644 index 00000000000..5846dd6fd36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_d.png new file mode 100644 index 00000000000..488f22f7f6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_a.png new file mode 100644 index 00000000000..8412be7491f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_b.png new file mode 100644 index 00000000000..53450b9956b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_d.png new file mode 100644 index 00000000000..0886983121f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_w.png new file mode 100644 index 00000000000..1d00f393bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_a.png new file mode 100644 index 00000000000..c942a43d9ba Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_b.png new file mode 100644 index 00000000000..0163663ee43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_d.png new file mode 100644 index 00000000000..41ef308cd42 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_w.png new file mode 100644 index 00000000000..79d0d44309d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_a.png new file mode 100644 index 00000000000..8412be7491f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_d.png new file mode 100644 index 00000000000..0886983121f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_w.png new file mode 100644 index 00000000000..1d00f393bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/couriermaleparcel1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_b.png new file mode 100644 index 00000000000..5bbfe121461 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_b.png new file mode 100644 index 00000000000..fc077865ce3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_b.png new file mode 100644 index 00000000000..93a82a2b629 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_d.png new file mode 100644 index 00000000000..38d4f05a3b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_a.png new file mode 100644 index 00000000000..697a32d51c8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_b.png new file mode 100644 index 00000000000..4a13df3c6a6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_d.png new file mode 100644 index 00000000000..f18080d21ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_w.png new file mode 100644 index 00000000000..2c5c837322a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_d.png new file mode 100644 index 00000000000..0173929755e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_a.png new file mode 100644 index 00000000000..ed17eecdf8c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_w.png new file mode 100644 index 00000000000..e2d44a1a974 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_d.png new file mode 100644 index 00000000000..8f609592875 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_a.png new file mode 100644 index 00000000000..c45a47432b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_d.png new file mode 100644 index 00000000000..84138223384 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_d.png new file mode 100644 index 00000000000..0d439d03083 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_w.png new file mode 100644 index 00000000000..bd68ad33e0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_d.png new file mode 100644 index 00000000000..0328ec1fa75 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_d.png new file mode 100644 index 00000000000..39d66d0d631 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/netherworkermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_a.png new file mode 100644 index 00000000000..ecc3f050571 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_b.png new file mode 100644 index 00000000000..351700e1710 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_d.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_w.png new file mode 100644 index 00000000000..f9477999cf7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_b.png new file mode 100644 index 00000000000..8003339abdf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_d.png new file mode 100644 index 00000000000..52c6193b92c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_w.png new file mode 100644 index 00000000000..e9e662fe0db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_a.png new file mode 100644 index 00000000000..fafed53ed0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_b.png new file mode 100644 index 00000000000..3506f1f2d72 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_d.png new file mode 100644 index 00000000000..1cde8958808 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_w.png new file mode 100644 index 00000000000..b0f57431f2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_w.png new file mode 100644 index 00000000000..2b10e609c30 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..f0e22df5cf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_d.png new file mode 100644 index 00000000000..f0540d63b1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_d.png new file mode 100644 index 00000000000..afce5ab9267 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_d.png new file mode 100644 index 00000000000..39d66d0d631 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..f0e22df5cf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_d.png new file mode 100644 index 00000000000..f0540d63b1e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_a.png new file mode 100644 index 00000000000..9010921d100 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_b.png new file mode 100644 index 00000000000..6ca4ee43439 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_w.png new file mode 100644 index 00000000000..abb7cc330cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_a.png new file mode 100644 index 00000000000..ee195257a81 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_b.png new file mode 100644 index 00000000000..5846dd6fd36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_d.png new file mode 100644 index 00000000000..488f22f7f6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_a.png new file mode 100644 index 00000000000..c9fe25b3e8e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_b.png new file mode 100644 index 00000000000..7257ecaec05 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_d.png new file mode 100644 index 00000000000..1a614b50adb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_w.png new file mode 100644 index 00000000000..d4228711fed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_a.png new file mode 100644 index 00000000000..43503d1750c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_b.png new file mode 100644 index 00000000000..7bd494900d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_d.png new file mode 100644 index 00000000000..e9f8fffcc0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_w.png new file mode 100644 index 00000000000..79aad8715b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..f0e22df5cf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_d.png new file mode 100644 index 00000000000..39d66d0d631 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_a.png new file mode 100644 index 00000000000..f7327d2065f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_d.png new file mode 100644 index 00000000000..f0e22df5cf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_d.png new file mode 100644 index 00000000000..ff4d67f18a9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_a.png new file mode 100644 index 00000000000..0615670caf0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_b.png new file mode 100644 index 00000000000..1b5cb11d7d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_d.png new file mode 100644 index 00000000000..552a3496e35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_w.png new file mode 100644 index 00000000000..b4456127bd4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_a.png new file mode 100644 index 00000000000..904a23fe429 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_b.png new file mode 100644 index 00000000000..1f60848ce71 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_d.png new file mode 100644 index 00000000000..6be4fd5fdf6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_w.png new file mode 100644 index 00000000000..aa2b390201c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_a.png new file mode 100644 index 00000000000..50073da0226 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_b.png new file mode 100644 index 00000000000..a2e425a7e08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_d.png new file mode 100644 index 00000000000..3372c1fc939 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_w.png new file mode 100644 index 00000000000..3de8e3b4837 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_a.png new file mode 100644 index 00000000000..5a57b3ce6df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_b.png new file mode 100644 index 00000000000..9b405ac7a81 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_d.png new file mode 100644 index 00000000000..d3c2b233b0f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_w.png new file mode 100644 index 00000000000..6a412ee2fba Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_a.png new file mode 100644 index 00000000000..58accd6d8e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_b.png new file mode 100644 index 00000000000..201271d3d24 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_d.png new file mode 100644 index 00000000000..0b2b198e28a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_w.png new file mode 100644 index 00000000000..08ac9ca9fd6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_a.png new file mode 100644 index 00000000000..5e39e292584 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_b.png new file mode 100644 index 00000000000..722ab59f8f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_d.png new file mode 100644 index 00000000000..fb82d6871c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_w.png new file mode 100644 index 00000000000..4ea7acd4527 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_a.png new file mode 100644 index 00000000000..66e112bb10c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_b.png new file mode 100644 index 00000000000..2d1a6356c53 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_d.png new file mode 100644 index 00000000000..d3162b78c2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_w.png new file mode 100644 index 00000000000..4c7aac4ed33 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_b.png new file mode 100644 index 00000000000..eb87cf2e739 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_d.png new file mode 100644 index 00000000000..a0bd70159be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_a.png new file mode 100644 index 00000000000..ddd5d083650 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_b.png new file mode 100644 index 00000000000..475f29e35b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_d.png new file mode 100644 index 00000000000..f0e22df5cf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_w.png new file mode 100644 index 00000000000..c58ca81cf43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_a.png new file mode 100644 index 00000000000..e29c6f8298c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_b.png new file mode 100644 index 00000000000..e93a2b535c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_d.png new file mode 100644 index 00000000000..ad38b9c224d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_w.png new file mode 100644 index 00000000000..e73068d38b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nether/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_a.png new file mode 100644 index 00000000000..198f1a56a59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_b.png new file mode 100644 index 00000000000..a2007f9f11e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_d.png new file mode 100644 index 00000000000..80734b19ec7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_w.png new file mode 100644 index 00000000000..018f91260b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_a.png new file mode 100644 index 00000000000..ea266399ee4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_b.png new file mode 100644 index 00000000000..3dfb1db244f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_d.png new file mode 100644 index 00000000000..0178f103faa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_w.png new file mode 100644 index 00000000000..d113a4a7c2a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_a.png new file mode 100644 index 00000000000..bea7c8d2142 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_b.png new file mode 100644 index 00000000000..1e485409982 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_d.png new file mode 100644 index 00000000000..50dc6b7c2ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_w.png new file mode 100644 index 00000000000..52dc4e7a1b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_a.png new file mode 100644 index 00000000000..a7e42c4a3fd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_b.png new file mode 100644 index 00000000000..cba6f427ee3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_d.png new file mode 100644 index 00000000000..27fc075040a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_w.png new file mode 100644 index 00000000000..7e145095e07 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_a.png new file mode 100644 index 00000000000..8ed00efcba3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_b.png new file mode 100644 index 00000000000..a56b858cb10 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_d.png new file mode 100644 index 00000000000..467b9754f0d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_w.png new file mode 100644 index 00000000000..088e51b617b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_a.png new file mode 100644 index 00000000000..ac7e45d5b2e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_b.png new file mode 100644 index 00000000000..1c467f114c2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_d.png new file mode 100644 index 00000000000..cfc64e545b1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_w.png new file mode 100644 index 00000000000..7c05140d37b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_a.png new file mode 100644 index 00000000000..3c08bb99771 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_b.png new file mode 100644 index 00000000000..6e1403851dc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_d.png new file mode 100644 index 00000000000..36b1b7f2dc8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_w.png new file mode 100644 index 00000000000..26ec43ee6d9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_b.png new file mode 100644 index 00000000000..19f11ed9f2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_d.png new file mode 100644 index 00000000000..0153a69c58e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_w.png new file mode 100644 index 00000000000..d31ebeced43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_a.png new file mode 100644 index 00000000000..26057fed897 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_b.png new file mode 100644 index 00000000000..bf0310d8779 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_d.png new file mode 100644 index 00000000000..87f9f2d2341 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_w.png new file mode 100644 index 00000000000..77f87229579 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_a.png new file mode 100644 index 00000000000..f8fba731a5b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_b.png new file mode 100644 index 00000000000..acc79284e42 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_d.png new file mode 100644 index 00000000000..c3eddc917d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_w.png new file mode 100644 index 00000000000..8775539e2b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/aristocratmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_a.png new file mode 100644 index 00000000000..a2c4289d345 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_b.png new file mode 100644 index 00000000000..a1777e2e9bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_d.png new file mode 100644 index 00000000000..1f32983b2d0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_w.png new file mode 100644 index 00000000000..1338badf5ec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_a.png new file mode 100644 index 00000000000..e67e2249ead Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_b.png new file mode 100644 index 00000000000..9cdd075cc9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_d.png new file mode 100644 index 00000000000..f356a2e6a33 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_w.png new file mode 100644 index 00000000000..f47f65e9b9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_a.png new file mode 100644 index 00000000000..6f0a3895287 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_b.png new file mode 100644 index 00000000000..de44f879b86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_d.png new file mode 100644 index 00000000000..666a3f1f188 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_w.png new file mode 100644 index 00000000000..0de2d8f4599 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_a.png new file mode 100644 index 00000000000..e855c82e061 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_b.png new file mode 100644 index 00000000000..f5a5b77f084 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_d.png new file mode 100644 index 00000000000..6d2de7f6e8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_w.png new file mode 100644 index 00000000000..5d739209d3e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_a.png new file mode 100644 index 00000000000..6ec2b01a137 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_b.png new file mode 100644 index 00000000000..c2426df5d8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_d.png new file mode 100644 index 00000000000..9044523c9a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_w.png new file mode 100644 index 00000000000..0263b2262db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_a.png new file mode 100644 index 00000000000..dbf0bdd6ebb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_b.png new file mode 100644 index 00000000000..77d86dc0e86 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_d.png new file mode 100644 index 00000000000..694800a4b04 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_w.png new file mode 100644 index 00000000000..a3b58232552 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_a.png new file mode 100644 index 00000000000..77b4df27558 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_b.png new file mode 100644 index 00000000000..139ab459276 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_d.png new file mode 100644 index 00000000000..7eb11666586 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_w.png new file mode 100644 index 00000000000..f66610af73e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_a.png new file mode 100644 index 00000000000..a6c2ffba795 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_b.png new file mode 100644 index 00000000000..8293df5b290 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_d.png new file mode 100644 index 00000000000..241055589ac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_w.png new file mode 100644 index 00000000000..073474e6470 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..2f49afa5e50 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..828788d5d1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..cafb1eb6d82 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..1ef9f12a02b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_a.png new file mode 100644 index 00000000000..e67e2249ead Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_b.png new file mode 100644 index 00000000000..9cdd075cc9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_d.png new file mode 100644 index 00000000000..923ef4242ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_w.png new file mode 100644 index 00000000000..e15c3a8c6db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_a.png new file mode 100644 index 00000000000..4e39d7851a8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_b.png new file mode 100644 index 00000000000..c63640455b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_d.png new file mode 100644 index 00000000000..eed6af40c85 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_w.png new file mode 100644 index 00000000000..cf6ce7313eb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_a.png new file mode 100644 index 00000000000..ff94c471830 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_b.png new file mode 100644 index 00000000000..b2f908163bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_d.png new file mode 100644 index 00000000000..3c697ee11a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_w.png new file mode 100644 index 00000000000..8fdbbd4eb73 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_a.png new file mode 100644 index 00000000000..f790039067c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_b.png new file mode 100644 index 00000000000..de706d66638 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_d.png new file mode 100644 index 00000000000..94ae01e57ac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_w.png new file mode 100644 index 00000000000..317922ee4da Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_a.png new file mode 100644 index 00000000000..5ca306b6882 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_b.png new file mode 100644 index 00000000000..d0cdfec2e3a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_d.png new file mode 100644 index 00000000000..1b6304d9be5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_w.png new file mode 100644 index 00000000000..dd0c475357f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_a.png new file mode 100644 index 00000000000..022c8acf9b5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_b.png new file mode 100644 index 00000000000..6ec2ebd4950 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_d.png new file mode 100644 index 00000000000..08d76d03bf3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_w.png new file mode 100644 index 00000000000..c91b9555b32 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_a.png new file mode 100644 index 00000000000..006f913ccf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_b.png new file mode 100644 index 00000000000..72a62f9aba1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_d.png new file mode 100644 index 00000000000..952f5916998 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_w.png new file mode 100644 index 00000000000..550634ad80a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_a.png new file mode 100644 index 00000000000..198f1a56a59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_b.png new file mode 100644 index 00000000000..a2007f9f11e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_d.png new file mode 100644 index 00000000000..80734b19ec7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_w.png new file mode 100644 index 00000000000..d6329fa9303 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_a.png new file mode 100644 index 00000000000..ee28d9aa49d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_b.png new file mode 100644 index 00000000000..f015ea447a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_d.png new file mode 100644 index 00000000000..9f31c9f9e39 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_w.png new file mode 100644 index 00000000000..ee3558717b8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_a.png new file mode 100644 index 00000000000..02627f100f1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_b.png new file mode 100644 index 00000000000..4200ae6d12f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_d.png new file mode 100644 index 00000000000..c6a9f7491c1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_w.png new file mode 100644 index 00000000000..018f91260b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_b.png new file mode 100644 index 00000000000..49ba341b69b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_d.png new file mode 100644 index 00000000000..0153a69c58e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_w.png new file mode 100644 index 00000000000..17caa93ea3f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_a.png new file mode 100644 index 00000000000..ca131bdec97 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_b.png new file mode 100644 index 00000000000..bf0310d8779 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_d.png new file mode 100644 index 00000000000..0dcd29d1a5a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_w.png new file mode 100644 index 00000000000..1b420a3e8d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_a.png new file mode 100644 index 00000000000..2357a989c14 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_b.png new file mode 100644 index 00000000000..9cdd075cc9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_d.png new file mode 100644 index 00000000000..2d6a5bd12bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_w.png new file mode 100644 index 00000000000..e15c3a8c6db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_a.png new file mode 100644 index 00000000000..9836f1bba35 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_b.png new file mode 100644 index 00000000000..c8092fa9701 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_d.png new file mode 100644 index 00000000000..be7abcc393c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_w.png new file mode 100644 index 00000000000..caa0dce855c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_a.png new file mode 100644 index 00000000000..32bc79991df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_b.png new file mode 100644 index 00000000000..a329b2fc521 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_d.png new file mode 100644 index 00000000000..b449c000c30 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_w.png new file mode 100644 index 00000000000..ea15a19b373 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_a.png new file mode 100644 index 00000000000..a0f58d9408b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_b.png new file mode 100644 index 00000000000..c2373c34232 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_d.png new file mode 100644 index 00000000000..3c646c1353a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_w.png new file mode 100644 index 00000000000..4d872e0f019 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_b.png new file mode 100644 index 00000000000..9aa0af6e000 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_d.png new file mode 100644 index 00000000000..923ef4242ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_w.png new file mode 100644 index 00000000000..71cee67f8fc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_a.png new file mode 100644 index 00000000000..661ad3b2f3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_b.png new file mode 100644 index 00000000000..3b3148297fc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_d.png new file mode 100644 index 00000000000..e3a3aeb33d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_w.png new file mode 100644 index 00000000000..e5c1b8883f1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_a.png new file mode 100644 index 00000000000..e67e2249ead Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_b.png new file mode 100644 index 00000000000..80f42aa07e2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_d.png new file mode 100644 index 00000000000..f356a2e6a33 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_w.png new file mode 100644 index 00000000000..17caa93ea3f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_a.png new file mode 100644 index 00000000000..6d8429b5035 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_b.png new file mode 100644 index 00000000000..778e2f1bfb9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_d.png new file mode 100644 index 00000000000..d8a8b5a9554 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_w.png new file mode 100644 index 00000000000..6b3ab88c6b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_a.png new file mode 100644 index 00000000000..5b19183ad85 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_b.png new file mode 100644 index 00000000000..7cfb18b51d8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_d.png new file mode 100644 index 00000000000..389a73bb355 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_w.png new file mode 100644 index 00000000000..21d69cbbbe9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..085d01debc7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..30d48cf4ee0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..1a5a491c0e2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..086d8859f7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_a.png new file mode 100644 index 00000000000..69c3f07270c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_b.png new file mode 100644 index 00000000000..5f327715125 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_d.png new file mode 100644 index 00000000000..d3cd46998a0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_w.png new file mode 100644 index 00000000000..2b29ffe44f4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_a.png new file mode 100644 index 00000000000..ddf5fdd45af Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_b.png new file mode 100644 index 00000000000..13de9662831 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_d.png new file mode 100644 index 00000000000..13ae947bdc3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_w.png new file mode 100644 index 00000000000..f5f321c2744 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_a.png new file mode 100644 index 00000000000..115afc0d4ad Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_b.png new file mode 100644 index 00000000000..e01de0783b3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_d.png new file mode 100644 index 00000000000..ad46e576955 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_w.png new file mode 100644 index 00000000000..548330f4c9b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_a.png new file mode 100644 index 00000000000..6d8429b5035 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_b.png new file mode 100644 index 00000000000..778e2f1bfb9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_d.png new file mode 100644 index 00000000000..d8a8b5a9554 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_w.png new file mode 100644 index 00000000000..6b3ab88c6b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_a.png new file mode 100644 index 00000000000..5b19183ad85 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_b.png new file mode 100644 index 00000000000..7cfb18b51d8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_d.png new file mode 100644 index 00000000000..389a73bb355 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_w.png new file mode 100644 index 00000000000..21d69cbbbe9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/deliverymanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_a.png new file mode 100644 index 00000000000..a9f2e4acb6c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_b.png new file mode 100644 index 00000000000..666916da080 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_d.png new file mode 100644 index 00000000000..0b8ab0e632b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_w.png new file mode 100644 index 00000000000..3006edd530d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_a.png new file mode 100644 index 00000000000..0583ab3dc89 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_b.png new file mode 100644 index 00000000000..876bb8ce5ee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_d.png new file mode 100644 index 00000000000..6dd2e30885d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_w.png new file mode 100644 index 00000000000..4fdcafea700 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_a.png new file mode 100644 index 00000000000..661ad3b2f3c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_b.png new file mode 100644 index 00000000000..e74ea9a70ba Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_d.png new file mode 100644 index 00000000000..1fd1c01181f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_w.png new file mode 100644 index 00000000000..632c3da0e44 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_b.png new file mode 100644 index 00000000000..d8398c70ce0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_d.png new file mode 100644 index 00000000000..0584f3907e3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_w.png new file mode 100644 index 00000000000..671ef2de67a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_a.png new file mode 100644 index 00000000000..b29e747a50a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_b.png new file mode 100644 index 00000000000..c2878a9e4a5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_d.png new file mode 100644 index 00000000000..9658d9cf582 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_w.png new file mode 100644 index 00000000000..e2ee6232318 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_a.png new file mode 100644 index 00000000000..0583ab3dc89 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_b.png new file mode 100644 index 00000000000..876bb8ce5ee Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_d.png new file mode 100644 index 00000000000..7786714bbca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_w.png new file mode 100644 index 00000000000..fd936a26344 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_a.png new file mode 100644 index 00000000000..728213340b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_b.png new file mode 100644 index 00000000000..d62a39d8fa6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_d.png new file mode 100644 index 00000000000..897cbf01f10 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_w.png new file mode 100644 index 00000000000..17cc58efa93 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_a.png new file mode 100644 index 00000000000..69572984cdb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_b.png new file mode 100644 index 00000000000..85f094903f5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_d.png new file mode 100644 index 00000000000..d673e28d85e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_w.png new file mode 100644 index 00000000000..96520228bce Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_a.png new file mode 100644 index 00000000000..c93fba3e5e4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_b.png new file mode 100644 index 00000000000..57c3f15343d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_d.png new file mode 100644 index 00000000000..31764b9931e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_w.png new file mode 100644 index 00000000000..1572d9f4129 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_a.png new file mode 100644 index 00000000000..e67e2249ead Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_b.png new file mode 100644 index 00000000000..759cc2db56f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_d.png new file mode 100644 index 00000000000..f356a2e6a33 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_w.png new file mode 100644 index 00000000000..e15c3a8c6db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_a.png new file mode 100644 index 00000000000..b980a48435e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_b.png new file mode 100644 index 00000000000..666916da080 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_d.png new file mode 100644 index 00000000000..c4492f90291 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_w.png new file mode 100644 index 00000000000..086d8859f7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_a.png new file mode 100644 index 00000000000..85869e1fe2a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_b.png new file mode 100644 index 00000000000..a7debf5f8bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_d.png new file mode 100644 index 00000000000..0e095f5a3fa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_w.png new file mode 100644 index 00000000000..dc0e184d4ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_a.png new file mode 100644 index 00000000000..198f1a56a59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_b.png new file mode 100644 index 00000000000..f015ea447a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_d.png new file mode 100644 index 00000000000..13ae947bdc3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_w.png new file mode 100644 index 00000000000..018f91260b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_a.png new file mode 100644 index 00000000000..85869e1fe2a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_b.png new file mode 100644 index 00000000000..a7debf5f8bf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_d.png new file mode 100644 index 00000000000..0e095f5a3fa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_w.png new file mode 100644 index 00000000000..dc0e184d4ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_a.png new file mode 100644 index 00000000000..b1e6bc0f166 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_b.png new file mode 100644 index 00000000000..c3f5fe5fc3a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_d.png new file mode 100644 index 00000000000..0b8ab0e632b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_w.png new file mode 100644 index 00000000000..586da062aa2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_a.png new file mode 100644 index 00000000000..26057fed897 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_b.png new file mode 100644 index 00000000000..3250284a2cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_d.png new file mode 100644 index 00000000000..94cf11653fd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_w.png new file mode 100644 index 00000000000..1b420a3e8d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_a.png new file mode 100644 index 00000000000..21d82fbdc0e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_b.png new file mode 100644 index 00000000000..105e7420b41 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_d.png new file mode 100644 index 00000000000..3c646c1353a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_w.png new file mode 100644 index 00000000000..06260f4ffae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_a.png new file mode 100644 index 00000000000..6bf84d7255a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_b.png new file mode 100644 index 00000000000..044d7394577 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_d.png new file mode 100644 index 00000000000..7786714bbca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_w.png new file mode 100644 index 00000000000..bd0515f6585 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_a.png new file mode 100644 index 00000000000..7a7b4087349 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_b.png new file mode 100644 index 00000000000..8802973726f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_d.png new file mode 100644 index 00000000000..66c8ab49b9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_w.png new file mode 100644 index 00000000000..afe74941271 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_a.png new file mode 100644 index 00000000000..d2e427f821a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_b.png new file mode 100644 index 00000000000..77e354874b2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_d.png new file mode 100644 index 00000000000..cadee00f23f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_w.png new file mode 100644 index 00000000000..65542703424 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_a.png new file mode 100644 index 00000000000..28047c992ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_b.png new file mode 100644 index 00000000000..496832272d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_d.png new file mode 100644 index 00000000000..99dc897230d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_w.png new file mode 100644 index 00000000000..fa3b74bf45c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_a.png new file mode 100644 index 00000000000..72b83c76b1f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_b.png new file mode 100644 index 00000000000..46cf96b4deb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_d.png new file mode 100644 index 00000000000..4a9bf062cbe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_w.png new file mode 100644 index 00000000000..7ea162e8596 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_a.png new file mode 100644 index 00000000000..ade62e39c96 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_b.png new file mode 100644 index 00000000000..96ced4757f2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_d.png new file mode 100644 index 00000000000..2f79b93bc57 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_w.png new file mode 100644 index 00000000000..d242cf3869f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_a.png new file mode 100644 index 00000000000..4a3f1d2576e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_b.png new file mode 100644 index 00000000000..e5bb3d4ad13 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_d.png new file mode 100644 index 00000000000..bf855af339b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_w.png new file mode 100644 index 00000000000..c9eeb26caf3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_a.png new file mode 100644 index 00000000000..a0f58d9408b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_b.png new file mode 100644 index 00000000000..666916da080 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_d.png new file mode 100644 index 00000000000..0b8ab0e632b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_w.png new file mode 100644 index 00000000000..5ae4cfe00c6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_a.png new file mode 100644 index 00000000000..26057fed897 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_b.png new file mode 100644 index 00000000000..d8398c70ce0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_d.png new file mode 100644 index 00000000000..fbe8d0cb91b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_w.png new file mode 100644 index 00000000000..71cee67f8fc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_a.png new file mode 100644 index 00000000000..ddf5fdd45af Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_b.png new file mode 100644 index 00000000000..666916da080 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_d.png new file mode 100644 index 00000000000..0b8ab0e632b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_w.png new file mode 100644 index 00000000000..06260f4ffae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_a.png new file mode 100644 index 00000000000..1ce495abc08 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_b.png new file mode 100644 index 00000000000..a1453d374c4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_d.png new file mode 100644 index 00000000000..3b81c3b1621 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_w.png new file mode 100644 index 00000000000..c9eeb26caf3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/netherworkermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_a.png new file mode 100644 index 00000000000..c21522887ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_b.png new file mode 100644 index 00000000000..a56b858cb10 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_d.png new file mode 100644 index 00000000000..53c6058a55c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_w.png new file mode 100644 index 00000000000..53bf01af62f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_a.png new file mode 100644 index 00000000000..5b1b607dc6c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_b.png new file mode 100644 index 00000000000..8e74d50ea22 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_d.png new file mode 100644 index 00000000000..8b935d9a274 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_w.png new file mode 100644 index 00000000000..e729059301f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_a.png new file mode 100644 index 00000000000..565bd5ed682 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_b.png new file mode 100644 index 00000000000..392a7b83cac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_d.png new file mode 100644 index 00000000000..e2de8c099c1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_w.png new file mode 100644 index 00000000000..c3906474858 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_b.png new file mode 100644 index 00000000000..19f11ed9f2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_d.png new file mode 100644 index 00000000000..0153a69c58e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_w.png new file mode 100644 index 00000000000..f47f65e9b9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_a.png new file mode 100644 index 00000000000..26057fed897 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_b.png new file mode 100644 index 00000000000..bf0310d8779 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_d.png new file mode 100644 index 00000000000..0dcd29d1a5a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_w.png new file mode 100644 index 00000000000..1b420a3e8d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_a.png new file mode 100644 index 00000000000..e67e2249ead Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_b.png new file mode 100644 index 00000000000..7e72ccf598f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_d.png new file mode 100644 index 00000000000..923ef4242ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_w.png new file mode 100644 index 00000000000..e15c3a8c6db Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..c93fba3e5e4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..3fe1dafcaf5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..70e44ebb631 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..f627bf3b4bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_a.png new file mode 100644 index 00000000000..b97e2d28364 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_b.png new file mode 100644 index 00000000000..a1453d374c4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_d.png new file mode 100644 index 00000000000..514f66211a4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_w.png new file mode 100644 index 00000000000..dfab7913e31 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_a.png new file mode 100644 index 00000000000..b22f09b7af1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_b.png new file mode 100644 index 00000000000..2ec6c55bc8a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_d.png new file mode 100644 index 00000000000..b540cc232fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_w.png new file mode 100644 index 00000000000..a93882b24f2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_a.png new file mode 100644 index 00000000000..82996054a89 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_b.png new file mode 100644 index 00000000000..0afbad06370 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_d.png new file mode 100644 index 00000000000..cdb7e769c06 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_w.png new file mode 100644 index 00000000000..d0b010441b7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..b5cc099b47a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..96a79a7ed59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..31764b9931e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..943f5aa8fad Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_a.png new file mode 100644 index 00000000000..f22fbd16686 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_b.png new file mode 100644 index 00000000000..23b6b3b36f5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_d.png new file mode 100644 index 00000000000..6de78fe13c9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_w.png new file mode 100644 index 00000000000..b6472cfa617 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_a.png new file mode 100644 index 00000000000..198f1a56a59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_b.png new file mode 100644 index 00000000000..a2007f9f11e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_d.png new file mode 100644 index 00000000000..80734b19ec7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_w.png new file mode 100644 index 00000000000..4c19f8a181e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_a.png new file mode 100644 index 00000000000..39b2e9828b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_b.png new file mode 100644 index 00000000000..f015ea447a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_d.png new file mode 100644 index 00000000000..9f31c9f9e39 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_w.png new file mode 100644 index 00000000000..ee3558717b8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_a.png new file mode 100644 index 00000000000..02627f100f1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_b.png new file mode 100644 index 00000000000..4200ae6d12f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_d.png new file mode 100644 index 00000000000..4070650f643 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_w.png new file mode 100644 index 00000000000..018f91260b6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_a.png new file mode 100644 index 00000000000..d906064b7ef Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_b.png new file mode 100644 index 00000000000..49ba341b69b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_d.png new file mode 100644 index 00000000000..0153a69c58e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_w.png new file mode 100644 index 00000000000..d285ea75d9e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_a.png new file mode 100644 index 00000000000..67968ac1547 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_b.png new file mode 100644 index 00000000000..bf0310d8779 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_d.png new file mode 100644 index 00000000000..5eabcaa243a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_w.png new file mode 100644 index 00000000000..1b420a3e8d1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_a.png new file mode 100644 index 00000000000..2357a989c14 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_b.png new file mode 100644 index 00000000000..9cdd075cc9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_d.png new file mode 100644 index 00000000000..923ef4242ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_w.png new file mode 100644 index 00000000000..4c74fee8f17 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..8e4f81380c1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..c6b3215aca9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..7734be382e4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..fd9fa601ada Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_a.png new file mode 100644 index 00000000000..5f3fdd3456a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_b.png new file mode 100644 index 00000000000..31dea39173e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_d.png new file mode 100644 index 00000000000..996cb7c1e7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_w.png new file mode 100644 index 00000000000..1e8553b97e3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_a.png new file mode 100644 index 00000000000..44a66dce279 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_b.png new file mode 100644 index 00000000000..de853b8f9ae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_d.png new file mode 100644 index 00000000000..343830a4747 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_w.png new file mode 100644 index 00000000000..6249045a0ca Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_a.png new file mode 100644 index 00000000000..027f58dcf66 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_b.png new file mode 100644 index 00000000000..dcfb782636c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_d.png new file mode 100644 index 00000000000..e20799bbb98 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_w.png new file mode 100644 index 00000000000..44ee79ea018 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_a.png new file mode 100644 index 00000000000..fa7543cbda0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_b.png new file mode 100644 index 00000000000..e195b35ca0c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_d.png new file mode 100644 index 00000000000..baec3490dff Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_w.png new file mode 100644 index 00000000000..b659d728672 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_a.png new file mode 100644 index 00000000000..bc4bd25b0fa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_b.png new file mode 100644 index 00000000000..33a5f3cf8d6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_d.png new file mode 100644 index 00000000000..864c90894ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_w.png new file mode 100644 index 00000000000..da54d4dacf2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_a.png new file mode 100644 index 00000000000..44736c6a0ae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_b.png new file mode 100644 index 00000000000..9357b1c4652 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_d.png new file mode 100644 index 00000000000..5ab294ef23a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_w.png new file mode 100644 index 00000000000..1e8105b5dbc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_a.png new file mode 100644 index 00000000000..29518963e12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_b.png new file mode 100644 index 00000000000..3dfb1db244f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_d.png new file mode 100644 index 00000000000..5cc3d38f626 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_w.png new file mode 100644 index 00000000000..2c895e9f740 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_a.png new file mode 100644 index 00000000000..2d1f464410d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_b.png new file mode 100644 index 00000000000..49297d90d44 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_d.png new file mode 100644 index 00000000000..8ba7b634394 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_w.png new file mode 100644 index 00000000000..e9808458df7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_a.png new file mode 100644 index 00000000000..ea266399ee4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_b.png new file mode 100644 index 00000000000..80c4bcb5713 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_d.png new file mode 100644 index 00000000000..0178f103faa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_w.png new file mode 100644 index 00000000000..d113a4a7c2a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_a.png new file mode 100644 index 00000000000..0f416b01a6b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_b.png new file mode 100644 index 00000000000..13de9662831 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_d.png new file mode 100644 index 00000000000..932f3865926 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_w.png new file mode 100644 index 00000000000..02898929d13 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_a.png new file mode 100644 index 00000000000..d816820d03a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_b.png new file mode 100644 index 00000000000..3f6658ce456 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_d.png new file mode 100644 index 00000000000..89794b6f762 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_w.png new file mode 100644 index 00000000000..abfcc0f3a9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_a.png new file mode 100644 index 00000000000..27eb73e00a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_b.png new file mode 100644 index 00000000000..429f57150b3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_d.png new file mode 100644 index 00000000000..f2e28955a77 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_w.png new file mode 100644 index 00000000000..83c621bba7c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_a.png new file mode 100644 index 00000000000..29518963e12 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_b.png new file mode 100644 index 00000000000..80c4bcb5713 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_d.png new file mode 100644 index 00000000000..5cc3d38f626 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_w.png new file mode 100644 index 00000000000..2c895e9f740 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/nordic/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_a.png new file mode 100644 index 00000000000..e0c7a21c0e5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_b.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_d.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_w.png new file mode 100644 index 00000000000..0b7ee23592a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_a.png new file mode 100644 index 00000000000..88c59fb5c84 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_b.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_d.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_w.png new file mode 100644 index 00000000000..7c7b05893b3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/alchemistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_a.png new file mode 100644 index 00000000000..2232d434165 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_d.png new file mode 100644 index 00000000000..e31fc872602 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_a.png new file mode 100644 index 00000000000..2fcbe775858 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_b.png new file mode 100644 index 00000000000..75a3fd6ab63 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_d.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_w.png new file mode 100644 index 00000000000..84055f99110 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archeologistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_a.png new file mode 100644 index 00000000000..f799e3a0b62 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_d.png new file mode 100644 index 00000000000..fd312571186 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_a.png new file mode 100644 index 00000000000..a023da969ab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_b.png new file mode 100644 index 00000000000..31703382bc8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_d.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_w.png new file mode 100644 index 00000000000..e6c9d6b6a31 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/archermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_d.png new file mode 100644 index 00000000000..7eb1ded5a85 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_w.png new file mode 100644 index 00000000000..05c1ce691fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_a.png new file mode 100644 index 00000000000..141426f29c5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_b.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_a.png new file mode 100644 index 00000000000..5c21738be0a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_b.png new file mode 100644 index 00000000000..a361b22f786 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_d.png new file mode 100644 index 00000000000..3bf3ac4a22c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_w.png new file mode 100644 index 00000000000..92357d38e7b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/aristocratmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_d.png new file mode 100644 index 00000000000..c44fc6ea4a4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_d.png new file mode 100644 index 00000000000..396243b0cbc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/bakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_d.png new file mode 100644 index 00000000000..242b774a2ac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeeperfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_d.png new file mode 100644 index 00000000000..ded8dc12236 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/beekeepermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_a.png new file mode 100644 index 00000000000..e7ff2317220 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_b.png new file mode 100644 index 00000000000..aa9f17f6ab6 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_d.png new file mode 100644 index 00000000000..da62583e46d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_w.png new file mode 100644 index 00000000000..0aed83a39ed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_d.png new file mode 100644 index 00000000000..6ab0eea2cab Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_w.png new file mode 100644 index 00000000000..acd8e334849 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/blacksmithmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_d.png new file mode 100644 index 00000000000..ff41bae3049 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_w.png new file mode 100644 index 00000000000..79e86cea5b1 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/builderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_d.png new file mode 100644 index 00000000000..0c9ccaee9cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/buildermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_a.png new file mode 100644 index 00000000000..cc2500d50a8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_d.png new file mode 100644 index 00000000000..28cc2643587 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpenterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_d.png new file mode 100644 index 00000000000..2343f16fcb9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/carpentermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_d.png new file mode 100644 index 00000000000..a6d67d4225f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_d.png new file mode 100644 index 00000000000..e49a515387f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/chickenfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_d.png new file mode 100644 index 00000000000..b68e8a8fe03 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_b.png new file mode 100644 index 00000000000..a6f198cf461 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_d.png new file mode 100644 index 00000000000..b68e8a8fe03 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_b.png new file mode 100644 index 00000000000..aa14d6326b0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_d.png new file mode 100644 index 00000000000..b68e8a8fe03 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_d.png new file mode 100644 index 00000000000..101b84d52cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_w.png new file mode 100644 index 00000000000..574fac84279 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_d.png new file mode 100644 index 00000000000..101b84d52cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_w.png new file mode 100644 index 00000000000..574fac84279 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_d.png new file mode 100644 index 00000000000..101b84d52cc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_w.png new file mode 100644 index 00000000000..574fac84279 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/childmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_d.png new file mode 100644 index 00000000000..9854d9836bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_d.png new file mode 100644 index 00000000000..9854d9836bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_a.png new file mode 100644 index 00000000000..94d798c80bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_d.png new file mode 100644 index 00000000000..9854d9836bd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_d.png new file mode 100644 index 00000000000..e71be951a01 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_d.png new file mode 100644 index 00000000000..e71be951a01 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_d.png new file mode 100644 index 00000000000..16466b5540b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/citizenmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_a.png new file mode 100644 index 00000000000..5fb92a4883b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_b.png new file mode 100644 index 00000000000..224d031d329 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_d.png new file mode 100644 index 00000000000..b7fa4bdc493 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_w.png new file mode 100644 index 00000000000..9e8dc73d43f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/composterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_a.png new file mode 100644 index 00000000000..957cb4c7a29 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_b.png new file mode 100644 index 00000000000..67bf9b0571e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_d.png new file mode 100644 index 00000000000..bf141e86621 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_w.png new file mode 100644 index 00000000000..46c94bf3fb0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/compostermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_a.png new file mode 100644 index 00000000000..bb7f05ffa1b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_b.png new file mode 100644 index 00000000000..224d031d329 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_d.png new file mode 100644 index 00000000000..a62ee11ad89 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_w.png new file mode 100644 index 00000000000..5a4488ebd6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_a.png new file mode 100644 index 00000000000..22ef795a7be Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_b.png new file mode 100644 index 00000000000..498451f7fed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_d.png new file mode 100644 index 00000000000..077ec5007c3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_w.png new file mode 100644 index 00000000000..46c94bf3fb0 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/concretemixermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_a.png new file mode 100644 index 00000000000..2111bebce2e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_d.png new file mode 100644 index 00000000000..355a86cfc36 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_d.png new file mode 100644 index 00000000000..09f828e1291 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cookmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_a.png new file mode 100644 index 00000000000..3d8755015fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_d.png new file mode 100644 index 00000000000..bb2bca0ffdf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/courierfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_d.png new file mode 100644 index 00000000000..0a5fafeea7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/couriermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_a.png new file mode 100644 index 00000000000..9149365d1de Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_d.png new file mode 100644 index 00000000000..f4fe2a2b42e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_d.png new file mode 100644 index 00000000000..24563425b6a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/cowfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_a.png new file mode 100644 index 00000000000..c4091fe909f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_b.png new file mode 100644 index 00000000000..41a08e66d7a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_d.png new file mode 100644 index 00000000000..2c6b2dcfdc5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_w.png new file mode 100644 index 00000000000..607c39e63ec Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/crafterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_d.png new file mode 100644 index 00000000000..5f1309ec456 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/craftermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_a.png new file mode 100644 index 00000000000..f22d1f6ca9c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_b.png new file mode 100644 index 00000000000..cdbfee0aa7e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_d.png new file mode 100644 index 00000000000..7962c97cc1d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_d.png new file mode 100644 index 00000000000..ea0e5af5c5c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/druidmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_a.png new file mode 100644 index 00000000000..f48a4f8893d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_d.png new file mode 100644 index 00000000000..1585f71f463 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_d.png new file mode 100644 index 00000000000..9f3291f7574 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/dyermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_a.png new file mode 100644 index 00000000000..806be5ad337 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_b.png new file mode 100644 index 00000000000..7fc591b4b8d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_d.png new file mode 100644 index 00000000000..c13b4338ffc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_w.png new file mode 100644 index 00000000000..e5a8db46431 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchanterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_b.png new file mode 100644 index 00000000000..972eb58ce25 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_d.png new file mode 100644 index 00000000000..7fcdc007345 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/enchantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_b.png new file mode 100644 index 00000000000..f9ba3019d59 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_d.png new file mode 100644 index 00000000000..b4e30de1e41 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_d.png new file mode 100644 index 00000000000..85b38faf95f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/farmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_a.png new file mode 100644 index 00000000000..d421c6ce0e8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_b.png new file mode 100644 index 00000000000..b0690c28a9b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_d.png new file mode 100644 index 00000000000..7b1583db467 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_d.png new file mode 100644 index 00000000000..b858ca14d1b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fishermanmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_b.png new file mode 100644 index 00000000000..e8b98d153ce Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_d.png new file mode 100644 index 00000000000..82c93464786 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletcherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_d.png new file mode 100644 index 00000000000..7e9236f63a4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/fletchermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_b.png new file mode 100644 index 00000000000..84edadc8108 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_d.png new file mode 100644 index 00000000000..e94a7c6d373 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_d.png new file mode 100644 index 00000000000..cd38906300f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/floristmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_b.png new file mode 100644 index 00000000000..146d118d719 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_d.png new file mode 100644 index 00000000000..0ec9a0f3c9f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_w.png new file mode 100644 index 00000000000..3fd29163e48 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/foresterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_d.png new file mode 100644 index 00000000000..832736ece8d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/forestermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_a.png new file mode 100644 index 00000000000..a4627ce7379 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_b.png new file mode 100644 index 00000000000..5d3b4af6a2f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_d.png new file mode 100644 index 00000000000..78ab5a868bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_d.png new file mode 100644 index 00000000000..ec8cab140d2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/glassblowermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_a.png new file mode 100644 index 00000000000..515ffd6c74c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_b.png new file mode 100644 index 00000000000..b088818062a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_d.png new file mode 100644 index 00000000000..6903e4a4f5f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_d.png new file mode 100644 index 00000000000..b9e1969b68c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/healermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_b.png new file mode 100644 index 00000000000..95a472f430f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_d.png new file mode 100644 index 00000000000..066ff4a22f9 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_d.png new file mode 100644 index 00000000000..e8430c02a2b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/knightmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_d.png new file mode 100644 index 00000000000..228905d4f3f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_a.png new file mode 100644 index 00000000000..d8026ed479c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_d.png new file mode 100644 index 00000000000..8dda626ee14 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/mechanistmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_b.png new file mode 100644 index 00000000000..532234ae2f4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_d.png new file mode 100644 index 00000000000..d77d0c33939 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_a.png new file mode 100644 index 00000000000..d7575263ab4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_b.png new file mode 100644 index 00000000000..b64a433ccb3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_d.png new file mode 100644 index 00000000000..eefa25cf6d3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_w.png new file mode 100644 index 00000000000..cefca0846ac Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/minermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_b.png new file mode 100644 index 00000000000..8bd256ca275 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_d.png new file mode 100644 index 00000000000..0bf5fcee76b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_b.png new file mode 100644 index 00000000000..8e5e06f1abf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_d.png new file mode 100644 index 00000000000..2b5071616cf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/netherexplorermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_d.png new file mode 100644 index 00000000000..25eed48936b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_b.png new file mode 100644 index 00000000000..05c1ce691fe Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_d.png new file mode 100644 index 00000000000..25eed48936b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_a.png new file mode 100644 index 00000000000..7f0b8c6ca16 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_b.png new file mode 100644 index 00000000000..91c039207b7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_d.png new file mode 100644 index 00000000000..25eed48936b Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblefemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_d.png new file mode 100644 index 00000000000..fa292efbd17 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_d.png new file mode 100644 index 00000000000..fa292efbd17 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_b.png new file mode 100644 index 00000000000..f8c167539d5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_d.png new file mode 100644 index 00000000000..fa292efbd17 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/noblemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_b.png new file mode 100644 index 00000000000..091a1232eed Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_d.png new file mode 100644 index 00000000000..e92159aa50c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_d.png new file mode 100644 index 00000000000..1dddc0e4ebf Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/pigfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_b.png new file mode 100644 index 00000000000..864f0779bae Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_d.png new file mode 100644 index 00000000000..615f666380a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/planterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_b.png new file mode 100644 index 00000000000..74e0dade124 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_d.png new file mode 100644 index 00000000000..502708856c7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/plantermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_d.png new file mode 100644 index 00000000000..fcf2ad4aff5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherderfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_d.png new file mode 100644 index 00000000000..ebd5e70a58d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/rabbitherdermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_d.png new file mode 100644 index 00000000000..c22eb18eedd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_d.png new file mode 100644 index 00000000000..c22eb18eedd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_a.png new file mode 100644 index 00000000000..11969756c9a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_b.png new file mode 100644 index 00000000000..8fd4d42ed6d Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_d.png new file mode 100644 index 00000000000..c22eb18eedd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlerfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_d.png new file mode 100644 index 00000000000..e65e983c74c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_d.png new file mode 100644 index 00000000000..e65e983c74c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_d.png new file mode 100644 index 00000000000..e65e983c74c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/settlermale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_b.png new file mode 100644 index 00000000000..9e8fa5af9b8 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_d.png new file mode 100644 index 00000000000..d45e6ac2b39 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_d.png new file mode 100644 index 00000000000..e65e983c74c Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/sheepfarmermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_b.png new file mode 100644 index 00000000000..0e6b2ed1758 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_d.png new file mode 100644 index 00000000000..8d48318b6f2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_w.png new file mode 100644 index 00000000000..ad0e8c963b7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smelterfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_d.png new file mode 100644 index 00000000000..3a0d6aef700 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/smeltermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_b.png new file mode 100644 index 00000000000..2cc1254c554 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_d.png new file mode 100644 index 00000000000..8e36202d00a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_b.png new file mode 100644 index 00000000000..2cc1254c554 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_d.png new file mode 100644 index 00000000000..8e36202d00a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_b.png new file mode 100644 index 00000000000..2cc1254c554 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_d.png new file mode 100644 index 00000000000..3749723e5aa Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentfemale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_d.png new file mode 100644 index 00000000000..c5d11c0aff7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_d.png new file mode 100644 index 00000000000..c5d11c0aff7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale2_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_d.png new file mode 100644 index 00000000000..c5d11c0aff7 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_w.png new file mode 100644 index 00000000000..92228776e06 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/studentmale3_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_a.png new file mode 100644 index 00000000000..2c004b61e43 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_b.png new file mode 100644 index 00000000000..a1f1409e071 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_d.png new file mode 100644 index 00000000000..03489b68bd2 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_w.png new file mode 100644 index 00000000000..e3c4b34cb0a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teacherfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_a.png new file mode 100644 index 00000000000..30d82b0a7b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_d.png new file mode 100644 index 00000000000..cd21daa7550 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/teachermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_b.png new file mode 100644 index 00000000000..61051c447b4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_d.png new file mode 100644 index 00000000000..321f9d8b3df Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_w.png new file mode 100644 index 00000000000..eda2f534f63 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakerfemale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_a.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_a.png new file mode 100644 index 00000000000..c093490b52a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_a.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_b.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_b.png new file mode 100644 index 00000000000..dffd4682692 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_b.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_d.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_d.png new file mode 100644 index 00000000000..9b47962d2bc Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_d.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_w.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_w.png new file mode 100644 index 00000000000..7ecbba5f880 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/citizen/undead/undertakermale1_w.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon.png new file mode 100644 index 00000000000..c349d569129 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_chief.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_chief.png new file mode 100644 index 00000000000..cf8227e349e Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_chief.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_spearman.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_spearman.png new file mode 100644 index 00000000000..46cc2865b68 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/amazon_spearman.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/archer_mummy.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/archer_mummy.png new file mode 100644 index 00000000000..75971658d88 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/archer_mummy.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarian1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarian1.png new file mode 100644 index 00000000000..cd892769737 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarian1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarianchief1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarianchief1.png new file mode 100644 index 00000000000..796752b1989 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/barbarianchief1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/mummy.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/mummy.png new file mode 100644 index 00000000000..75971658d88 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/mummy.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer1.png new file mode 100644 index 00000000000..d6b061a4d2a Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer2.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer2.png new file mode 100644 index 00000000000..08a5b17035f Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_archer2.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_chief.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_chief.png new file mode 100644 index 00000000000..7fbcd1acfdd Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_chief.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden1.png new file mode 100644 index 00000000000..0f56f35dcb4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden2.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden2.png new file mode 100644 index 00000000000..34bbe23f955 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/norsemen_shieldmaiden2.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pharao.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pharao.png new file mode 100644 index 00000000000..d2f03c64d42 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pharao.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate1.png new file mode 100644 index 00000000000..0c0ccdc3f24 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate2.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate2.png new file mode 100644 index 00000000000..0c0ccdc3f24 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate2.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate3.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate3.png new file mode 100644 index 00000000000..3281620b054 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate3.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate4.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate4.png new file mode 100644 index 00000000000..5c871b35df4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate4.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate5.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate5.png new file mode 100644 index 00000000000..43dd75776c5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate5.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate6.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate6.png new file mode 100644 index 00000000000..43dd75776c5 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate6.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate7.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate7.png new file mode 100644 index 00000000000..5c871b35df4 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate7.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate8.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate8.png new file mode 100644 index 00000000000..3281620b054 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate8.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude.png new file mode 100644 index 00000000000..87c14485938 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude1.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude1.png new file mode 100644 index 00000000000..bf71fa572ea Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude1.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude2.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude2.png new file mode 100644 index 00000000000..b58fd0a28cb Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude2.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude3.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude3.png new file mode 100644 index 00000000000..b9d15b797a3 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude3.png differ diff --git a/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude4.png b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude4.png new file mode 100644 index 00000000000..87c14485938 Binary files /dev/null and b/src/datagen/generated/minecolonies/assets/minecolonies/textures/entity_icon/raiders/pirate_nude4.png differ diff --git a/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutnetherworker.json b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutnetherworker.json new file mode 100644 index 00000000000..0edf928ca25 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutnetherworker.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_items": { + "conditions": { + "items": [ + { + "items": [ + "structurize:sceptergold" + ] + }, + { + "items": [ + "minecraft:obsidian" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecolonies:blockhutnetherworker" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_items", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecolonies:blockhutnetherworker" + ] + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutplantationfield.json b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutplantationfield.json new file mode 100644 index 00000000000..f0a3163e020 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/blockhutplantationfield.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_items": { + "conditions": { + "items": [ + { + "items": [ + "structurize:sceptergold" + ] + }, + { + "items": [ + "minecolonies:blockhutplantation" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecolonies:blockhutplantationfield" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_items", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecolonies:blockhutplantationfield" + ] + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/questlog.json b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/questlog.json new file mode 100644 index 00000000000..d65681e7c46 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/advancements/recipes/minecolonies/questlog.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_build_tool": { + "conditions": { + "items": [ + { + "items": [ + "structurize:sceptergold" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecolonies:questlog" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_build_tool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "minecolonies:questlog" + ] + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/compatibility/itemnbtmatching.json b/src/datagen/generated/minecolonies/data/minecolonies/compatibility/itemnbtmatching.json new file mode 100644 index 00000000000..2e59dbad7a7 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/compatibility/itemnbtmatching.json @@ -0,0 +1,5269 @@ +[ + { + "item": "domum_ornamentum:architectscutter" + }, + { + "item": "domum_ornamentum:beige_bricks" + }, + { + "item": "domum_ornamentum:beige_stone_bricks" + }, + { + "item": "domum_ornamentum:black_brick_extra" + }, + { + "item": "domum_ornamentum:black_floating_carpet" + }, + { + "item": "domum_ornamentum:blockbarreldeco_onside" + }, + { + "item": "domum_ornamentum:blockbarreldeco_standing" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:blockpaperwall" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:blockpillar" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:blockypillar" + }, + { + "item": "domum_ornamentum:blue_brick_extra" + }, + { + "item": "domum_ornamentum:blue_cobblestone_extra" + }, + { + "item": "domum_ornamentum:blue_floating_carpet" + }, + { + "item": "domum_ornamentum:brick_extra" + }, + { + "item": "domum_ornamentum:brown_brick_extra" + }, + { + "item": "domum_ornamentum:brown_bricks" + }, + { + "item": "domum_ornamentum:brown_floating_carpet" + }, + { + "item": "domum_ornamentum:brown_stone_bricks" + }, + { + "item": "domum_ornamentum:cactus_extra" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:center_light" + }, + { + "item": "domum_ornamentum:cobblestone_extra" + }, + { + "item": "domum_ornamentum:cream_bricks" + }, + { + "item": "domum_ornamentum:cream_stone_bricks" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:crossed_light" + }, + { + "item": "domum_ornamentum:cyan_brick_extra" + }, + { + "item": "domum_ornamentum:cyan_floating_carpet" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:dark_brick" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:double_crossed" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:down_gated" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/acacia_planks" + }, + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + }, + { + "key": "type" + } + ], + "item": "domum_ornamentum:fancy_door" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:fancy_light" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/acacia_planks" + }, + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + }, + { + "key": "type" + } + ], + "item": "domum_ornamentum:fancy_trapdoors" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:four_light" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:framed" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:framed_light" + }, + { + "item": "domum_ornamentum:gray_brick_extra" + }, + { + "item": "domum_ornamentum:gray_floating_carpet" + }, + { + "item": "domum_ornamentum:green_brick_extra" + }, + { + "item": "domum_ornamentum:green_cactus_extra" + }, + { + "item": "domum_ornamentum:green_cobblestone_extra" + }, + { + "item": "domum_ornamentum:green_floating_carpet" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:horizontal_light" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:horizontal_plain" + }, + { + "item": "domum_ornamentum:light_blue_brick_extra" + }, + { + "item": "domum_ornamentum:light_blue_floating_carpet" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:light_brick" + }, + { + "item": "domum_ornamentum:light_gray_brick_extra" + }, + { + "item": "domum_ornamentum:light_gray_floating_carpet" + }, + { + "item": "domum_ornamentum:lime_brick_extra" + }, + { + "item": "domum_ornamentum:lime_floating_carpet" + }, + { + "item": "domum_ornamentum:magenta_brick_extra" + }, + { + "item": "domum_ornamentum:magenta_floating_carpet" + }, + { + "item": "domum_ornamentum:mossy_cobblestone_extra" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:one_crossed_lr" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:one_crossed_rl" + }, + { + "item": "domum_ornamentum:orange_brick_extra" + }, + { + "item": "domum_ornamentum:orange_floating_carpet" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + }, + { + "key": "type" + } + ], + "item": "domum_ornamentum:panel" + }, + { + "item": "domum_ornamentum:paper_extra" + }, + { + "item": "domum_ornamentum:pink_brick_extra" + }, + { + "item": "domum_ornamentum:pink_floating_carpet" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:plain" + }, + { + "item": "domum_ornamentum:purple_brick_extra" + }, + { + "item": "domum_ornamentum:purple_cobblestone_extra" + }, + { + "item": "domum_ornamentum:purple_floating_carpet" + }, + { + "item": "domum_ornamentum:red_brick_extra" + }, + { + "item": "domum_ornamentum:red_floating_carpet" + }, + { + "item": "domum_ornamentum:sand_bricks" + }, + { + "item": "domum_ornamentum:sand_stone_bricks" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/clay" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:shingle" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/clay" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:shingle_flat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/clay" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:shingle_flat_lower" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:shingle_slab" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:side_framed" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:side_framed_horizontal" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:squarepillar" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/dark_oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:up_gated" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + }, + { + "key": "type" + } + ], + "item": "domum_ornamentum:vanilla_doors_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vanilla_fence_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vanilla_fence_gate_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vanilla_slab_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vanilla_stairs_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + }, + { + "key": "type" + } + ], + "item": "domum_ornamentum:vanilla_trapdoors_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vanilla_wall_compat" + }, + { + "checkednbtkeys": [ + { + "children": [ + { + "key": "minecraft:block/oak_planks" + }, + { + "key": "minecraft:block/glowstone" + } + ], + "key": "textureData" + } + ], + "item": "domum_ornamentum:vertical_light" + }, + { + "item": "domum_ornamentum:wheat_extra" + }, + { + "item": "domum_ornamentum:white_brick_extra" + }, + { + "item": "domum_ornamentum:white_floating_carpet" + }, + { + "item": "domum_ornamentum:white_paper_extra" + }, + { + "item": "domum_ornamentum:yellow_brick_extra" + }, + { + "item": "domum_ornamentum:yellow_floating_carpet" + }, + { + "item": "minecolonies:amazonchiefegg" + }, + { + "item": "minecolonies:amazonegg" + }, + { + "item": "minecolonies:amazonspearmanegg" + }, + { + "item": "minecolonies:ancienttome" + }, + { + "item": "minecolonies:banner_rally_guards" + }, + { + "item": "minecolonies:barbarcheregg" + }, + { + "item": "minecolonies:barbarianegg" + }, + { + "item": "minecolonies:barbchiefegg" + }, + { + "item": "minecolonies:barrel_block" + }, + { + "item": "minecolonies:blockconstructiontape" + }, + { + "item": "minecolonies:blockhutalchemist" + }, + { + "item": "minecolonies:blockhutarchery" + }, + { + "item": "minecolonies:blockhutbaker" + }, + { + "item": "minecolonies:blockhutbarracks" + }, + { + "item": "minecolonies:blockhutbarrackstower" + }, + { + "item": "minecolonies:blockhutbeekeeper" + }, + { + "item": "minecolonies:blockhutblacksmith" + }, + { + "item": "minecolonies:blockhutbuilder" + }, + { + "item": "minecolonies:blockhutchickenherder" + }, + { + "item": "minecolonies:blockhutcitizen" + }, + { + "item": "minecolonies:blockhutcombatacademy" + }, + { + "item": "minecolonies:blockhutcomposter" + }, + { + "item": "minecolonies:blockhutconcretemixer" + }, + { + "item": "minecolonies:blockhutcook" + }, + { + "item": "minecolonies:blockhutcowboy" + }, + { + "item": "minecolonies:blockhutcrusher" + }, + { + "item": "minecolonies:blockhutdeliveryman" + }, + { + "item": "minecolonies:blockhutdyer" + }, + { + "item": "minecolonies:blockhutenchanter" + }, + { + "item": "minecolonies:blockhutfarmer" + }, + { + "item": "minecolonies:blockhutfield" + }, + { + "item": "minecolonies:blockhutfisherman" + }, + { + "item": "minecolonies:blockhutfletcher" + }, + { + "item": "minecolonies:blockhutflorist" + }, + { + "item": "minecolonies:blockhutglassblower" + }, + { + "item": "minecolonies:blockhutgraveyard" + }, + { + "item": "minecolonies:blockhutguardtower" + }, + { + "item": "minecolonies:blockhuthospital" + }, + { + "item": "minecolonies:blockhutlibrary" + }, + { + "item": "minecolonies:blockhutlumberjack" + }, + { + "item": "minecolonies:blockhutmechanic" + }, + { + "item": "minecolonies:blockhutminer" + }, + { + "item": "minecolonies:blockhutmysticalsite" + }, + { + "item": "minecolonies:blockhutnetherworker" + }, + { + "item": "minecolonies:blockhutplantation" + }, + { + "item": "minecolonies:blockhutplantationfield" + }, + { + "item": "minecolonies:blockhutrabbithutch" + }, + { + "item": "minecolonies:blockhutsawmill" + }, + { + "item": "minecolonies:blockhutschool" + }, + { + "item": "minecolonies:blockhutshepherd" + }, + { + "item": "minecolonies:blockhutsifter" + }, + { + "item": "minecolonies:blockhutsmeltery" + }, + { + "item": "minecolonies:blockhutstonemason" + }, + { + "item": "minecolonies:blockhutstonesmeltery" + }, + { + "item": "minecolonies:blockhutswineherder" + }, + { + "item": "minecolonies:blockhuttavern" + }, + { + "item": "minecolonies:blockhuttownhall" + }, + { + "item": "minecolonies:blockhutuniversity" + }, + { + "item": "minecolonies:blockhutwarehouse" + }, + { + "item": "minecolonies:blockminecoloniesgrave" + }, + { + "item": "minecolonies:blockminecoloniesnamedgrave" + }, + { + "checkednbtkeys": [ + { + "key": "textureData" + } + ], + "item": "minecolonies:blockminecoloniesrack" + }, + { + "item": "minecolonies:blockpostbox" + }, + { + "item": "minecolonies:blockstash" + }, + { + "item": "minecolonies:blockwaypoint" + }, + { + "item": "minecolonies:bread_dough" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecolonies:build_goggles" + }, + { + "item": "minecolonies:cake_batter" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:chiefsword" + }, + { + "item": "minecolonies:chorus_bread" + }, + { + "item": "minecolonies:clipboard" + }, + { + "item": "minecolonies:colony_banner" + }, + { + "item": "minecolonies:compost" + }, + { + "item": "minecolonies:composted_dirt" + }, + { + "item": "minecolonies:cookie_dough" + }, + { + "item": "minecolonies:decorationcontroller" + }, + { + "item": "minecolonies:firearrow" + }, + { + "item": "minecolonies:gate_iron" + }, + { + "item": "minecolonies:gate_wood" + }, + { + "item": "minecolonies:golden_bread" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:iron_scimitar" + }, + { + "item": "minecolonies:magicpotion" + }, + { + "item": "minecolonies:mediumquarry" + }, + { + "item": "minecolonies:mercegg" + }, + { + "item": "minecolonies:milky_bread" + }, + { + "item": "minecolonies:mistletoe" + }, + { + "item": "minecolonies:mummyarcheregg" + }, + { + "item": "minecolonies:mummyegg" + }, + { + "item": "minecolonies:norsemenarcheregg" + }, + { + "item": "minecolonies:norsemenchiefegg" + }, + { + "item": "minecolonies:pharaoegg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pharaoscepter" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_cap" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_chest" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_hat" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_leggins" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_legs" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_shoes" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:pirate_top" + }, + { + "item": "minecolonies:piratearcheregg" + }, + { + "item": "minecolonies:piratecaptainegg" + }, + { + "item": "minecolonies:pirateegg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:plate_armor_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:plate_armor_chest" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:plate_armor_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:plate_armor_legs" + }, + { + "item": "minecolonies:questlog" + }, + { + "item": "minecolonies:raw_pumpkin_pie" + }, + { + "item": "minecolonies:resourcescroll" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:santa_hat" + }, + { + "item": "minecolonies:scan_analyzer" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:scepterpermission" + }, + { + "item": "minecolonies:scroll_area_tp" + }, + { + "item": "minecolonies:scroll_buff" + }, + { + "item": "minecolonies:scroll_guard_help" + }, + { + "item": "minecolonies:scroll_highlight" + }, + { + "item": "minecolonies:scroll_tp" + }, + { + "item": "minecolonies:shieldmaidenegg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecolonies:sifter_mesh_diamond" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecolonies:sifter_mesh_flint" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecolonies:sifter_mesh_iron" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecolonies:sifter_mesh_string" + }, + { + "item": "minecolonies:simplequarry" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecolonies:spear" + }, + { + "item": "minecolonies:sugary_bread" + }, + { + "item": "minecolonies:supplycampdeployer" + }, + { + "item": "minecolonies:supplychestdeployer" + }, + { + "item": "minecraft:acacia_boat" + }, + { + "item": "minecraft:acacia_button" + }, + { + "item": "minecraft:acacia_chest_boat" + }, + { + "item": "minecraft:acacia_door" + }, + { + "item": "minecraft:acacia_fence" + }, + { + "item": "minecraft:acacia_fence_gate" + }, + { + "item": "minecraft:acacia_leaves" + }, + { + "item": "minecraft:acacia_log" + }, + { + "item": "minecraft:acacia_planks" + }, + { + "item": "minecraft:acacia_pressure_plate" + }, + { + "item": "minecraft:acacia_sapling" + }, + { + "item": "minecraft:acacia_sign" + }, + { + "item": "minecraft:acacia_slab" + }, + { + "item": "minecraft:acacia_stairs" + }, + { + "item": "minecraft:acacia_trapdoor" + }, + { + "item": "minecraft:acacia_wood" + }, + { + "item": "minecraft:activator_rail" + }, + { + "item": "minecraft:allay_spawn_egg" + }, + { + "item": "minecraft:allium" + }, + { + "item": "minecraft:amethyst_block" + }, + { + "item": "minecraft:amethyst_cluster" + }, + { + "item": "minecraft:amethyst_shard" + }, + { + "item": "minecraft:ancient_debris" + }, + { + "item": "minecraft:andesite" + }, + { + "item": "minecraft:andesite_slab" + }, + { + "item": "minecraft:andesite_stairs" + }, + { + "item": "minecraft:andesite_wall" + }, + { + "item": "minecraft:anvil" + }, + { + "item": "minecraft:apple" + }, + { + "item": "minecraft:armor_stand" + }, + { + "item": "minecraft:arrow" + }, + { + "item": "minecraft:axolotl_bucket" + }, + { + "item": "minecraft:axolotl_spawn_egg" + }, + { + "item": "minecraft:azalea" + }, + { + "item": "minecraft:azalea_leaves" + }, + { + "item": "minecraft:azure_bluet" + }, + { + "item": "minecraft:baked_potato" + }, + { + "item": "minecraft:bamboo" + }, + { + "item": "minecraft:barrel" + }, + { + "item": "minecraft:basalt" + }, + { + "item": "minecraft:bat_spawn_egg" + }, + { + "item": "minecraft:beacon" + }, + { + "item": "minecraft:bedrock" + }, + { + "item": "minecraft:bee_nest" + }, + { + "item": "minecraft:bee_spawn_egg" + }, + { + "item": "minecraft:beef" + }, + { + "item": "minecraft:beehive" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot_seeds" + }, + { + "item": "minecraft:beetroot_soup" + }, + { + "item": "minecraft:bell" + }, + { + "item": "minecraft:big_dripleaf" + }, + { + "item": "minecraft:birch_boat" + }, + { + "item": "minecraft:birch_button" + }, + { + "item": "minecraft:birch_chest_boat" + }, + { + "item": "minecraft:birch_door" + }, + { + "item": "minecraft:birch_fence" + }, + { + "item": "minecraft:birch_fence_gate" + }, + { + "item": "minecraft:birch_leaves" + }, + { + "item": "minecraft:birch_log" + }, + { + "item": "minecraft:birch_planks" + }, + { + "item": "minecraft:birch_pressure_plate" + }, + { + "item": "minecraft:birch_sapling" + }, + { + "item": "minecraft:birch_sign" + }, + { + "item": "minecraft:birch_slab" + }, + { + "item": "minecraft:birch_stairs" + }, + { + "item": "minecraft:birch_trapdoor" + }, + { + "item": "minecraft:birch_wood" + }, + { + "item": "minecraft:black_banner" + }, + { + "item": "minecraft:black_bed" + }, + { + "item": "minecraft:black_candle" + }, + { + "item": "minecraft:black_carpet" + }, + { + "item": "minecraft:black_concrete" + }, + { + "item": "minecraft:black_concrete_powder" + }, + { + "item": "minecraft:black_dye" + }, + { + "item": "minecraft:black_glazed_terracotta" + }, + { + "item": "minecraft:black_shulker_box" + }, + { + "item": "minecraft:black_stained_glass" + }, + { + "item": "minecraft:black_stained_glass_pane" + }, + { + "item": "minecraft:black_terracotta" + }, + { + "item": "minecraft:black_wool" + }, + { + "item": "minecraft:blackstone" + }, + { + "item": "minecraft:blackstone_slab" + }, + { + "item": "minecraft:blackstone_stairs" + }, + { + "item": "minecraft:blackstone_wall" + }, + { + "item": "minecraft:blast_furnace" + }, + { + "item": "minecraft:blaze_powder" + }, + { + "item": "minecraft:blaze_rod" + }, + { + "item": "minecraft:blaze_spawn_egg" + }, + { + "item": "minecraft:blue_banner" + }, + { + "item": "minecraft:blue_bed" + }, + { + "item": "minecraft:blue_candle" + }, + { + "item": "minecraft:blue_carpet" + }, + { + "item": "minecraft:blue_concrete" + }, + { + "item": "minecraft:blue_concrete_powder" + }, + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:blue_glazed_terracotta" + }, + { + "item": "minecraft:blue_ice" + }, + { + "item": "minecraft:blue_orchid" + }, + { + "item": "minecraft:blue_shulker_box" + }, + { + "item": "minecraft:blue_stained_glass" + }, + { + "item": "minecraft:blue_stained_glass_pane" + }, + { + "item": "minecraft:blue_terracotta" + }, + { + "item": "minecraft:blue_wool" + }, + { + "item": "minecraft:bone" + }, + { + "item": "minecraft:bone_block" + }, + { + "item": "minecraft:bone_meal" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + } + ], + "item": "minecraft:book" + }, + { + "item": "minecraft:bookshelf" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:bow" + }, + { + "item": "minecraft:bowl" + }, + { + "item": "minecraft:brain_coral" + }, + { + "item": "minecraft:brain_coral_block" + }, + { + "item": "minecraft:brain_coral_fan" + }, + { + "item": "minecraft:bread" + }, + { + "item": "minecraft:brewing_stand" + }, + { + "item": "minecraft:brick" + }, + { + "item": "minecraft:brick_slab" + }, + { + "item": "minecraft:brick_stairs" + }, + { + "item": "minecraft:brick_wall" + }, + { + "item": "minecraft:bricks" + }, + { + "item": "minecraft:brown_banner" + }, + { + "item": "minecraft:brown_bed" + }, + { + "item": "minecraft:brown_candle" + }, + { + "item": "minecraft:brown_carpet" + }, + { + "item": "minecraft:brown_concrete" + }, + { + "item": "minecraft:brown_concrete_powder" + }, + { + "item": "minecraft:brown_dye" + }, + { + "item": "minecraft:brown_glazed_terracotta" + }, + { + "item": "minecraft:brown_mushroom" + }, + { + "item": "minecraft:brown_mushroom_block" + }, + { + "item": "minecraft:brown_shulker_box" + }, + { + "item": "minecraft:brown_stained_glass" + }, + { + "item": "minecraft:brown_stained_glass_pane" + }, + { + "item": "minecraft:brown_terracotta" + }, + { + "item": "minecraft:brown_wool" + }, + { + "item": "minecraft:bubble_coral" + }, + { + "item": "minecraft:bubble_coral_block" + }, + { + "item": "minecraft:bubble_coral_fan" + }, + { + "item": "minecraft:bucket" + }, + { + "item": "minecraft:budding_amethyst" + }, + { + "item": "minecraft:cactus" + }, + { + "item": "minecraft:cake" + }, + { + "item": "minecraft:calcite" + }, + { + "item": "minecraft:campfire" + }, + { + "item": "minecraft:candle" + }, + { + "item": "minecraft:carrot" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:carrot_on_a_stick" + }, + { + "item": "minecraft:cartography_table" + }, + { + "item": "minecraft:carved_pumpkin" + }, + { + "item": "minecraft:cat_spawn_egg" + }, + { + "item": "minecraft:cauldron" + }, + { + "item": "minecraft:cave_spider_spawn_egg" + }, + { + "item": "minecraft:chain" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:chainmail_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:chainmail_chestplate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:chainmail_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:chainmail_leggings" + }, + { + "item": "minecraft:charcoal" + }, + { + "item": "minecraft:chest" + }, + { + "item": "minecraft:chest_minecart" + }, + { + "item": "minecraft:chicken" + }, + { + "item": "minecraft:chicken_spawn_egg" + }, + { + "item": "minecraft:chipped_anvil" + }, + { + "item": "minecraft:chiseled_deepslate" + }, + { + "item": "minecraft:chiseled_nether_bricks" + }, + { + "item": "minecraft:chiseled_polished_blackstone" + }, + { + "item": "minecraft:chiseled_quartz_block" + }, + { + "item": "minecraft:chiseled_red_sandstone" + }, + { + "item": "minecraft:chiseled_sandstone" + }, + { + "item": "minecraft:chiseled_stone_bricks" + }, + { + "item": "minecraft:chorus_flower" + }, + { + "item": "minecraft:chorus_fruit" + }, + { + "item": "minecraft:chorus_plant" + }, + { + "item": "minecraft:clay" + }, + { + "item": "minecraft:clay_ball" + }, + { + "item": "minecraft:clock" + }, + { + "item": "minecraft:coal" + }, + { + "item": "minecraft:coal_block" + }, + { + "item": "minecraft:coal_ore" + }, + { + "item": "minecraft:coarse_dirt" + }, + { + "item": "minecraft:cobbled_deepslate" + }, + { + "item": "minecraft:cobbled_deepslate_slab" + }, + { + "item": "minecraft:cobbled_deepslate_stairs" + }, + { + "item": "minecraft:cobbled_deepslate_wall" + }, + { + "item": "minecraft:cobblestone" + }, + { + "item": "minecraft:cobblestone_slab" + }, + { + "item": "minecraft:cobblestone_stairs" + }, + { + "item": "minecraft:cobblestone_wall" + }, + { + "item": "minecraft:cobweb" + }, + { + "item": "minecraft:cocoa_beans" + }, + { + "item": "minecraft:cod" + }, + { + "item": "minecraft:cod_bucket" + }, + { + "item": "minecraft:cod_spawn_egg" + }, + { + "item": "minecraft:comparator" + }, + { + "item": "minecraft:compass" + }, + { + "item": "minecraft:composter" + }, + { + "item": "minecraft:conduit" + }, + { + "item": "minecraft:cooked_beef" + }, + { + "item": "minecraft:cooked_chicken" + }, + { + "item": "minecraft:cooked_cod" + }, + { + "item": "minecraft:cooked_mutton" + }, + { + "item": "minecraft:cooked_porkchop" + }, + { + "item": "minecraft:cooked_rabbit" + }, + { + "item": "minecraft:cooked_salmon" + }, + { + "item": "minecraft:cookie" + }, + { + "item": "minecraft:copper_block" + }, + { + "item": "minecraft:copper_ingot" + }, + { + "item": "minecraft:copper_ore" + }, + { + "item": "minecraft:cornflower" + }, + { + "item": "minecraft:cow_spawn_egg" + }, + { + "item": "minecraft:cracked_deepslate_bricks" + }, + { + "item": "minecraft:cracked_deepslate_tiles" + }, + { + "item": "minecraft:cracked_nether_bricks" + }, + { + "item": "minecraft:cracked_polished_blackstone_bricks" + }, + { + "item": "minecraft:cracked_stone_bricks" + }, + { + "item": "minecraft:crafting_table" + }, + { + "item": "minecraft:creeper_banner_pattern" + }, + { + "item": "minecraft:creeper_head" + }, + { + "item": "minecraft:creeper_spawn_egg" + }, + { + "item": "minecraft:crimson_button" + }, + { + "item": "minecraft:crimson_door" + }, + { + "item": "minecraft:crimson_fence" + }, + { + "item": "minecraft:crimson_fence_gate" + }, + { + "item": "minecraft:crimson_fungus" + }, + { + "item": "minecraft:crimson_hyphae" + }, + { + "item": "minecraft:crimson_nylium" + }, + { + "item": "minecraft:crimson_planks" + }, + { + "item": "minecraft:crimson_pressure_plate" + }, + { + "item": "minecraft:crimson_roots" + }, + { + "item": "minecraft:crimson_sign" + }, + { + "item": "minecraft:crimson_slab" + }, + { + "item": "minecraft:crimson_stairs" + }, + { + "item": "minecraft:crimson_stem" + }, + { + "item": "minecraft:crimson_trapdoor" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:crossbow" + }, + { + "item": "minecraft:crying_obsidian" + }, + { + "item": "minecraft:cut_copper" + }, + { + "item": "minecraft:cut_copper_slab" + }, + { + "item": "minecraft:cut_copper_stairs" + }, + { + "item": "minecraft:cut_red_sandstone" + }, + { + "item": "minecraft:cut_red_sandstone_slab" + }, + { + "item": "minecraft:cut_sandstone" + }, + { + "item": "minecraft:cut_sandstone_slab" + }, + { + "item": "minecraft:cyan_banner" + }, + { + "item": "minecraft:cyan_bed" + }, + { + "item": "minecraft:cyan_candle" + }, + { + "item": "minecraft:cyan_carpet" + }, + { + "item": "minecraft:cyan_concrete" + }, + { + "item": "minecraft:cyan_concrete_powder" + }, + { + "item": "minecraft:cyan_dye" + }, + { + "item": "minecraft:cyan_glazed_terracotta" + }, + { + "item": "minecraft:cyan_shulker_box" + }, + { + "item": "minecraft:cyan_stained_glass" + }, + { + "item": "minecraft:cyan_stained_glass_pane" + }, + { + "item": "minecraft:cyan_terracotta" + }, + { + "item": "minecraft:cyan_wool" + }, + { + "item": "minecraft:damaged_anvil" + }, + { + "item": "minecraft:dandelion" + }, + { + "item": "minecraft:dark_oak_boat" + }, + { + "item": "minecraft:dark_oak_button" + }, + { + "item": "minecraft:dark_oak_chest_boat" + }, + { + "item": "minecraft:dark_oak_door" + }, + { + "item": "minecraft:dark_oak_fence" + }, + { + "item": "minecraft:dark_oak_fence_gate" + }, + { + "item": "minecraft:dark_oak_leaves" + }, + { + "item": "minecraft:dark_oak_log" + }, + { + "item": "minecraft:dark_oak_planks" + }, + { + "item": "minecraft:dark_oak_pressure_plate" + }, + { + "item": "minecraft:dark_oak_sapling" + }, + { + "item": "minecraft:dark_oak_sign" + }, + { + "item": "minecraft:dark_oak_slab" + }, + { + "item": "minecraft:dark_oak_stairs" + }, + { + "item": "minecraft:dark_oak_trapdoor" + }, + { + "item": "minecraft:dark_oak_wood" + }, + { + "item": "minecraft:dark_prismarine" + }, + { + "item": "minecraft:dark_prismarine_slab" + }, + { + "item": "minecraft:dark_prismarine_stairs" + }, + { + "item": "minecraft:daylight_detector" + }, + { + "item": "minecraft:dead_brain_coral" + }, + { + "item": "minecraft:dead_brain_coral_block" + }, + { + "item": "minecraft:dead_brain_coral_fan" + }, + { + "item": "minecraft:dead_bubble_coral" + }, + { + "item": "minecraft:dead_bubble_coral_block" + }, + { + "item": "minecraft:dead_bubble_coral_fan" + }, + { + "item": "minecraft:dead_bush" + }, + { + "item": "minecraft:dead_fire_coral" + }, + { + "item": "minecraft:dead_fire_coral_block" + }, + { + "item": "minecraft:dead_fire_coral_fan" + }, + { + "item": "minecraft:dead_horn_coral" + }, + { + "item": "minecraft:dead_horn_coral_block" + }, + { + "item": "minecraft:dead_horn_coral_fan" + }, + { + "item": "minecraft:dead_tube_coral" + }, + { + "item": "minecraft:dead_tube_coral_block" + }, + { + "item": "minecraft:dead_tube_coral_fan" + }, + { + "item": "minecraft:deepslate" + }, + { + "item": "minecraft:deepslate_brick_slab" + }, + { + "item": "minecraft:deepslate_brick_stairs" + }, + { + "item": "minecraft:deepslate_brick_wall" + }, + { + "item": "minecraft:deepslate_bricks" + }, + { + "item": "minecraft:deepslate_coal_ore" + }, + { + "item": "minecraft:deepslate_copper_ore" + }, + { + "item": "minecraft:deepslate_diamond_ore" + }, + { + "item": "minecraft:deepslate_emerald_ore" + }, + { + "item": "minecraft:deepslate_gold_ore" + }, + { + "item": "minecraft:deepslate_iron_ore" + }, + { + "item": "minecraft:deepslate_lapis_ore" + }, + { + "item": "minecraft:deepslate_redstone_ore" + }, + { + "item": "minecraft:deepslate_tile_slab" + }, + { + "item": "minecraft:deepslate_tile_stairs" + }, + { + "item": "minecraft:deepslate_tile_wall" + }, + { + "item": "minecraft:deepslate_tiles" + }, + { + "item": "minecraft:detector_rail" + }, + { + "item": "minecraft:diamond" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_axe" + }, + { + "item": "minecraft:diamond_block" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_chestplate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_hoe" + }, + { + "item": "minecraft:diamond_horse_armor" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_leggings" + }, + { + "item": "minecraft:diamond_ore" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_pickaxe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_shovel" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:diamond_sword" + }, + { + "item": "minecraft:diorite" + }, + { + "item": "minecraft:diorite_slab" + }, + { + "item": "minecraft:diorite_stairs" + }, + { + "item": "minecraft:diorite_wall" + }, + { + "item": "minecraft:dirt" + }, + { + "item": "minecraft:dirt_path" + }, + { + "item": "minecraft:disc_fragment_5" + }, + { + "item": "minecraft:dispenser" + }, + { + "item": "minecraft:dolphin_spawn_egg" + }, + { + "item": "minecraft:donkey_spawn_egg" + }, + { + "item": "minecraft:dragon_breath" + }, + { + "item": "minecraft:dragon_head" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp_block" + }, + { + "item": "minecraft:dripstone_block" + }, + { + "item": "minecraft:dropper" + }, + { + "item": "minecraft:drowned_spawn_egg" + }, + { + "item": "minecraft:echo_shard" + }, + { + "item": "minecraft:egg" + }, + { + "item": "minecraft:elder_guardian_spawn_egg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:elytra" + }, + { + "item": "minecraft:emerald" + }, + { + "item": "minecraft:emerald_block" + }, + { + "item": "minecraft:emerald_ore" + }, + { + "checkednbtkeys": [ + { + "key": "StoredEnchantments" + } + ], + "item": "minecraft:enchanted_book" + }, + { + "item": "minecraft:enchanted_golden_apple" + }, + { + "item": "minecraft:enchanting_table" + }, + { + "item": "minecraft:end_crystal" + }, + { + "item": "minecraft:end_portal_frame" + }, + { + "item": "minecraft:end_rod" + }, + { + "item": "minecraft:end_stone" + }, + { + "item": "minecraft:end_stone_brick_slab" + }, + { + "item": "minecraft:end_stone_brick_stairs" + }, + { + "item": "minecraft:end_stone_brick_wall" + }, + { + "item": "minecraft:end_stone_bricks" + }, + { + "item": "minecraft:ender_chest" + }, + { + "item": "minecraft:ender_eye" + }, + { + "item": "minecraft:ender_pearl" + }, + { + "item": "minecraft:enderman_spawn_egg" + }, + { + "item": "minecraft:endermite_spawn_egg" + }, + { + "item": "minecraft:evoker_spawn_egg" + }, + { + "item": "minecraft:experience_bottle" + }, + { + "item": "minecraft:exposed_copper" + }, + { + "item": "minecraft:exposed_cut_copper" + }, + { + "item": "minecraft:exposed_cut_copper_slab" + }, + { + "item": "minecraft:exposed_cut_copper_stairs" + }, + { + "item": "minecraft:farmland" + }, + { + "item": "minecraft:feather" + }, + { + "item": "minecraft:fermented_spider_eye" + }, + { + "item": "minecraft:fern" + }, + { + "item": "minecraft:fire_charge" + }, + { + "item": "minecraft:fire_coral" + }, + { + "item": "minecraft:fire_coral_block" + }, + { + "item": "minecraft:fire_coral_fan" + }, + { + "item": "minecraft:firework_rocket" + }, + { + "item": "minecraft:firework_star" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:fishing_rod" + }, + { + "item": "minecraft:fletching_table" + }, + { + "item": "minecraft:flint" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:flint_and_steel" + }, + { + "item": "minecraft:flower_banner_pattern" + }, + { + "item": "minecraft:flower_pot" + }, + { + "item": "minecraft:flowering_azalea" + }, + { + "item": "minecraft:flowering_azalea_leaves" + }, + { + "item": "minecraft:fox_spawn_egg" + }, + { + "item": "minecraft:frog_spawn_egg" + }, + { + "item": "minecraft:frogspawn" + }, + { + "item": "minecraft:furnace" + }, + { + "item": "minecraft:furnace_minecart" + }, + { + "item": "minecraft:ghast_spawn_egg" + }, + { + "item": "minecraft:ghast_tear" + }, + { + "item": "minecraft:gilded_blackstone" + }, + { + "item": "minecraft:glass" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:glass_pane" + }, + { + "item": "minecraft:glistering_melon_slice" + }, + { + "item": "minecraft:globe_banner_pattern" + }, + { + "item": "minecraft:glow_berries" + }, + { + "item": "minecraft:glow_ink_sac" + }, + { + "item": "minecraft:glow_item_frame" + }, + { + "item": "minecraft:glow_lichen" + }, + { + "item": "minecraft:glow_squid_spawn_egg" + }, + { + "item": "minecraft:glowstone" + }, + { + "item": "minecraft:glowstone_dust" + }, + { + "item": "minecraft:goat_spawn_egg" + }, + { + "item": "minecraft:gold_block" + }, + { + "item": "minecraft:gold_ingot" + }, + { + "item": "minecraft:gold_nugget" + }, + { + "item": "minecraft:gold_ore" + }, + { + "item": "minecraft:golden_apple" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_axe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_boots" + }, + { + "item": "minecraft:golden_carrot" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_chestplate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_hoe" + }, + { + "item": "minecraft:golden_horse_armor" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_leggings" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_pickaxe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_shovel" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:golden_sword" + }, + { + "item": "minecraft:granite" + }, + { + "item": "minecraft:granite_slab" + }, + { + "item": "minecraft:granite_stairs" + }, + { + "item": "minecraft:granite_wall" + }, + { + "item": "minecraft:grass" + }, + { + "item": "minecraft:grass_block" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gray_banner" + }, + { + "item": "minecraft:gray_bed" + }, + { + "item": "minecraft:gray_candle" + }, + { + "item": "minecraft:gray_carpet" + }, + { + "item": "minecraft:gray_concrete" + }, + { + "item": "minecraft:gray_concrete_powder" + }, + { + "item": "minecraft:gray_dye" + }, + { + "item": "minecraft:gray_glazed_terracotta" + }, + { + "item": "minecraft:gray_shulker_box" + }, + { + "item": "minecraft:gray_stained_glass" + }, + { + "item": "minecraft:gray_stained_glass_pane" + }, + { + "item": "minecraft:gray_terracotta" + }, + { + "item": "minecraft:gray_wool" + }, + { + "item": "minecraft:green_banner" + }, + { + "item": "minecraft:green_bed" + }, + { + "item": "minecraft:green_candle" + }, + { + "item": "minecraft:green_carpet" + }, + { + "item": "minecraft:green_concrete" + }, + { + "item": "minecraft:green_concrete_powder" + }, + { + "item": "minecraft:green_dye" + }, + { + "item": "minecraft:green_glazed_terracotta" + }, + { + "item": "minecraft:green_shulker_box" + }, + { + "item": "minecraft:green_stained_glass" + }, + { + "item": "minecraft:green_stained_glass_pane" + }, + { + "item": "minecraft:green_terracotta" + }, + { + "item": "minecraft:green_wool" + }, + { + "item": "minecraft:grindstone" + }, + { + "item": "minecraft:guardian_spawn_egg" + }, + { + "item": "minecraft:gunpowder" + }, + { + "item": "minecraft:hanging_roots" + }, + { + "item": "minecraft:hay_block" + }, + { + "item": "minecraft:heart_of_the_sea" + }, + { + "item": "minecraft:heavy_weighted_pressure_plate" + }, + { + "item": "minecraft:hoglin_spawn_egg" + }, + { + "item": "minecraft:honey_block" + }, + { + "item": "minecraft:honey_bottle" + }, + { + "item": "minecraft:honeycomb" + }, + { + "item": "minecraft:honeycomb_block" + }, + { + "item": "minecraft:hopper" + }, + { + "item": "minecraft:hopper_minecart" + }, + { + "item": "minecraft:horn_coral" + }, + { + "item": "minecraft:horn_coral_block" + }, + { + "item": "minecraft:horn_coral_fan" + }, + { + "item": "minecraft:horse_spawn_egg" + }, + { + "item": "minecraft:husk_spawn_egg" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:infested_chiseled_stone_bricks" + }, + { + "item": "minecraft:infested_cobblestone" + }, + { + "item": "minecraft:infested_cracked_stone_bricks" + }, + { + "item": "minecraft:infested_deepslate" + }, + { + "item": "minecraft:infested_mossy_stone_bricks" + }, + { + "item": "minecraft:infested_stone" + }, + { + "item": "minecraft:infested_stone_bricks" + }, + { + "item": "minecraft:ink_sac" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_axe" + }, + { + "item": "minecraft:iron_bars" + }, + { + "item": "minecraft:iron_block" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_chestplate" + }, + { + "item": "minecraft:iron_door" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_hoe" + }, + { + "item": "minecraft:iron_horse_armor" + }, + { + "item": "minecraft:iron_ingot" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_leggings" + }, + { + "item": "minecraft:iron_nugget" + }, + { + "item": "minecraft:iron_ore" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_pickaxe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_shovel" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_trapdoor" + }, + { + "item": "minecraft:item_frame" + }, + { + "item": "minecraft:jack_o_lantern" + }, + { + "item": "minecraft:jukebox" + }, + { + "item": "minecraft:jungle_boat" + }, + { + "item": "minecraft:jungle_button" + }, + { + "item": "minecraft:jungle_chest_boat" + }, + { + "item": "minecraft:jungle_door" + }, + { + "item": "minecraft:jungle_fence" + }, + { + "item": "minecraft:jungle_fence_gate" + }, + { + "item": "minecraft:jungle_leaves" + }, + { + "item": "minecraft:jungle_log" + }, + { + "item": "minecraft:jungle_planks" + }, + { + "item": "minecraft:jungle_pressure_plate" + }, + { + "item": "minecraft:jungle_sapling" + }, + { + "item": "minecraft:jungle_sign" + }, + { + "item": "minecraft:jungle_slab" + }, + { + "item": "minecraft:jungle_stairs" + }, + { + "item": "minecraft:jungle_trapdoor" + }, + { + "item": "minecraft:jungle_wood" + }, + { + "item": "minecraft:kelp" + }, + { + "item": "minecraft:ladder" + }, + { + "item": "minecraft:lantern" + }, + { + "item": "minecraft:lapis_block" + }, + { + "item": "minecraft:lapis_lazuli" + }, + { + "item": "minecraft:lapis_ore" + }, + { + "item": "minecraft:large_amethyst_bud" + }, + { + "item": "minecraft:large_fern" + }, + { + "item": "minecraft:lava_bucket" + }, + { + "item": "minecraft:lead" + }, + { + "item": "minecraft:leather" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:leather_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:leather_chestplate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:leather_helmet" + }, + { + "item": "minecraft:leather_horse_armor" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:leather_leggings" + }, + { + "item": "minecraft:lectern" + }, + { + "item": "minecraft:lever" + }, + { + "item": "minecraft:light_blue_banner" + }, + { + "item": "minecraft:light_blue_bed" + }, + { + "item": "minecraft:light_blue_candle" + }, + { + "item": "minecraft:light_blue_carpet" + }, + { + "item": "minecraft:light_blue_concrete" + }, + { + "item": "minecraft:light_blue_concrete_powder" + }, + { + "item": "minecraft:light_blue_dye" + }, + { + "item": "minecraft:light_blue_glazed_terracotta" + }, + { + "item": "minecraft:light_blue_shulker_box" + }, + { + "item": "minecraft:light_blue_stained_glass" + }, + { + "item": "minecraft:light_blue_stained_glass_pane" + }, + { + "item": "minecraft:light_blue_terracotta" + }, + { + "item": "minecraft:light_blue_wool" + }, + { + "item": "minecraft:light_gray_banner" + }, + { + "item": "minecraft:light_gray_bed" + }, + { + "item": "minecraft:light_gray_candle" + }, + { + "item": "minecraft:light_gray_carpet" + }, + { + "item": "minecraft:light_gray_concrete" + }, + { + "item": "minecraft:light_gray_concrete_powder" + }, + { + "item": "minecraft:light_gray_dye" + }, + { + "item": "minecraft:light_gray_glazed_terracotta" + }, + { + "item": "minecraft:light_gray_shulker_box" + }, + { + "item": "minecraft:light_gray_stained_glass" + }, + { + "item": "minecraft:light_gray_stained_glass_pane" + }, + { + "item": "minecraft:light_gray_terracotta" + }, + { + "item": "minecraft:light_gray_wool" + }, + { + "item": "minecraft:light_weighted_pressure_plate" + }, + { + "item": "minecraft:lightning_rod" + }, + { + "item": "minecraft:lilac" + }, + { + "item": "minecraft:lily_of_the_valley" + }, + { + "item": "minecraft:lily_pad" + }, + { + "item": "minecraft:lime_banner" + }, + { + "item": "minecraft:lime_bed" + }, + { + "item": "minecraft:lime_candle" + }, + { + "item": "minecraft:lime_carpet" + }, + { + "item": "minecraft:lime_concrete" + }, + { + "item": "minecraft:lime_concrete_powder" + }, + { + "item": "minecraft:lime_dye" + }, + { + "item": "minecraft:lime_glazed_terracotta" + }, + { + "item": "minecraft:lime_shulker_box" + }, + { + "item": "minecraft:lime_stained_glass" + }, + { + "item": "minecraft:lime_stained_glass_pane" + }, + { + "item": "minecraft:lime_terracotta" + }, + { + "item": "minecraft:lime_wool" + }, + { + "checkednbtkeys": [ + { + "key": "Potion" + } + ], + "item": "minecraft:lingering_potion" + }, + { + "item": "minecraft:llama_spawn_egg" + }, + { + "item": "minecraft:lodestone" + }, + { + "item": "minecraft:loom" + }, + { + "item": "minecraft:magenta_banner" + }, + { + "item": "minecraft:magenta_bed" + }, + { + "item": "minecraft:magenta_candle" + }, + { + "item": "minecraft:magenta_carpet" + }, + { + "item": "minecraft:magenta_concrete" + }, + { + "item": "minecraft:magenta_concrete_powder" + }, + { + "item": "minecraft:magenta_dye" + }, + { + "item": "minecraft:magenta_glazed_terracotta" + }, + { + "item": "minecraft:magenta_shulker_box" + }, + { + "item": "minecraft:magenta_stained_glass" + }, + { + "item": "minecraft:magenta_stained_glass_pane" + }, + { + "item": "minecraft:magenta_terracotta" + }, + { + "item": "minecraft:magenta_wool" + }, + { + "item": "minecraft:magma_block" + }, + { + "item": "minecraft:magma_cream" + }, + { + "item": "minecraft:magma_cube_spawn_egg" + }, + { + "item": "minecraft:mangrove_boat" + }, + { + "item": "minecraft:mangrove_button" + }, + { + "item": "minecraft:mangrove_chest_boat" + }, + { + "item": "minecraft:mangrove_door" + }, + { + "item": "minecraft:mangrove_fence" + }, + { + "item": "minecraft:mangrove_fence_gate" + }, + { + "item": "minecraft:mangrove_leaves" + }, + { + "item": "minecraft:mangrove_log" + }, + { + "item": "minecraft:mangrove_planks" + }, + { + "item": "minecraft:mangrove_pressure_plate" + }, + { + "item": "minecraft:mangrove_propagule" + }, + { + "item": "minecraft:mangrove_roots" + }, + { + "item": "minecraft:mangrove_sign" + }, + { + "item": "minecraft:mangrove_slab" + }, + { + "item": "minecraft:mangrove_stairs" + }, + { + "item": "minecraft:mangrove_trapdoor" + }, + { + "item": "minecraft:mangrove_wood" + }, + { + "item": "minecraft:map" + }, + { + "item": "minecraft:medium_amethyst_bud" + }, + { + "item": "minecraft:melon" + }, + { + "item": "minecraft:melon_seeds" + }, + { + "item": "minecraft:melon_slice" + }, + { + "item": "minecraft:milk_bucket" + }, + { + "item": "minecraft:minecart" + }, + { + "item": "minecraft:mojang_banner_pattern" + }, + { + "item": "minecraft:mooshroom_spawn_egg" + }, + { + "item": "minecraft:moss_block" + }, + { + "item": "minecraft:moss_carpet" + }, + { + "item": "minecraft:mossy_cobblestone" + }, + { + "item": "minecraft:mossy_cobblestone_slab" + }, + { + "item": "minecraft:mossy_cobblestone_stairs" + }, + { + "item": "minecraft:mossy_cobblestone_wall" + }, + { + "item": "minecraft:mossy_stone_brick_slab" + }, + { + "item": "minecraft:mossy_stone_brick_stairs" + }, + { + "item": "minecraft:mossy_stone_brick_wall" + }, + { + "item": "minecraft:mossy_stone_bricks" + }, + { + "item": "minecraft:mud" + }, + { + "item": "minecraft:mud_brick_slab" + }, + { + "item": "minecraft:mud_brick_stairs" + }, + { + "item": "minecraft:mud_brick_wall" + }, + { + "item": "minecraft:mud_bricks" + }, + { + "item": "minecraft:muddy_mangrove_roots" + }, + { + "item": "minecraft:mule_spawn_egg" + }, + { + "item": "minecraft:mushroom_stem" + }, + { + "item": "minecraft:mushroom_stew" + }, + { + "item": "minecraft:music_disc_11" + }, + { + "item": "minecraft:music_disc_13" + }, + { + "item": "minecraft:music_disc_5" + }, + { + "item": "minecraft:music_disc_blocks" + }, + { + "item": "minecraft:music_disc_cat" + }, + { + "item": "minecraft:music_disc_chirp" + }, + { + "item": "minecraft:music_disc_far" + }, + { + "item": "minecraft:music_disc_mall" + }, + { + "item": "minecraft:music_disc_mellohi" + }, + { + "item": "minecraft:music_disc_otherside" + }, + { + "item": "minecraft:music_disc_pigstep" + }, + { + "item": "minecraft:music_disc_stal" + }, + { + "item": "minecraft:music_disc_strad" + }, + { + "item": "minecraft:music_disc_wait" + }, + { + "item": "minecraft:music_disc_ward" + }, + { + "item": "minecraft:mutton" + }, + { + "item": "minecraft:mycelium" + }, + { + "item": "minecraft:name_tag" + }, + { + "item": "minecraft:nautilus_shell" + }, + { + "item": "minecraft:nether_brick" + }, + { + "item": "minecraft:nether_brick_fence" + }, + { + "item": "minecraft:nether_brick_slab" + }, + { + "item": "minecraft:nether_brick_stairs" + }, + { + "item": "minecraft:nether_brick_wall" + }, + { + "item": "minecraft:nether_bricks" + }, + { + "item": "minecraft:nether_gold_ore" + }, + { + "item": "minecraft:nether_quartz_ore" + }, + { + "item": "minecraft:nether_sprouts" + }, + { + "item": "minecraft:nether_star" + }, + { + "item": "minecraft:nether_wart" + }, + { + "item": "minecraft:nether_wart_block" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_axe" + }, + { + "item": "minecraft:netherite_block" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_boots" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_chestplate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_helmet" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_hoe" + }, + { + "item": "minecraft:netherite_ingot" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_leggings" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_pickaxe" + }, + { + "item": "minecraft:netherite_scrap" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_shovel" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:netherite_sword" + }, + { + "item": "minecraft:netherrack" + }, + { + "item": "minecraft:note_block" + }, + { + "item": "minecraft:oak_boat" + }, + { + "item": "minecraft:oak_button" + }, + { + "item": "minecraft:oak_chest_boat" + }, + { + "item": "minecraft:oak_door" + }, + { + "item": "minecraft:oak_fence" + }, + { + "item": "minecraft:oak_fence_gate" + }, + { + "item": "minecraft:oak_leaves" + }, + { + "item": "minecraft:oak_log" + }, + { + "item": "minecraft:oak_planks" + }, + { + "item": "minecraft:oak_pressure_plate" + }, + { + "item": "minecraft:oak_sapling" + }, + { + "item": "minecraft:oak_sign" + }, + { + "item": "minecraft:oak_slab" + }, + { + "item": "minecraft:oak_stairs" + }, + { + "item": "minecraft:oak_trapdoor" + }, + { + "item": "minecraft:oak_wood" + }, + { + "item": "minecraft:observer" + }, + { + "item": "minecraft:obsidian" + }, + { + "item": "minecraft:ocelot_spawn_egg" + }, + { + "item": "minecraft:ochre_froglight" + }, + { + "item": "minecraft:orange_banner" + }, + { + "item": "minecraft:orange_bed" + }, + { + "item": "minecraft:orange_candle" + }, + { + "item": "minecraft:orange_carpet" + }, + { + "item": "minecraft:orange_concrete" + }, + { + "item": "minecraft:orange_concrete_powder" + }, + { + "item": "minecraft:orange_dye" + }, + { + "item": "minecraft:orange_glazed_terracotta" + }, + { + "item": "minecraft:orange_shulker_box" + }, + { + "item": "minecraft:orange_stained_glass" + }, + { + "item": "minecraft:orange_stained_glass_pane" + }, + { + "item": "minecraft:orange_terracotta" + }, + { + "item": "minecraft:orange_tulip" + }, + { + "item": "minecraft:orange_wool" + }, + { + "item": "minecraft:oxeye_daisy" + }, + { + "item": "minecraft:oxidized_copper" + }, + { + "item": "minecraft:oxidized_cut_copper" + }, + { + "item": "minecraft:oxidized_cut_copper_slab" + }, + { + "item": "minecraft:oxidized_cut_copper_stairs" + }, + { + "item": "minecraft:packed_ice" + }, + { + "item": "minecraft:packed_mud" + }, + { + "item": "minecraft:painting" + }, + { + "item": "minecraft:panda_spawn_egg" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:parrot_spawn_egg" + }, + { + "item": "minecraft:pearlescent_froglight" + }, + { + "item": "minecraft:peony" + }, + { + "item": "minecraft:petrified_oak_slab" + }, + { + "item": "minecraft:phantom_membrane" + }, + { + "item": "minecraft:phantom_spawn_egg" + }, + { + "item": "minecraft:pig_spawn_egg" + }, + { + "item": "minecraft:piglin_banner_pattern" + }, + { + "item": "minecraft:piglin_brute_spawn_egg" + }, + { + "item": "minecraft:piglin_spawn_egg" + }, + { + "item": "minecraft:pillager_spawn_egg" + }, + { + "item": "minecraft:pink_banner" + }, + { + "item": "minecraft:pink_bed" + }, + { + "item": "minecraft:pink_candle" + }, + { + "item": "minecraft:pink_carpet" + }, + { + "item": "minecraft:pink_concrete" + }, + { + "item": "minecraft:pink_concrete_powder" + }, + { + "item": "minecraft:pink_dye" + }, + { + "item": "minecraft:pink_glazed_terracotta" + }, + { + "item": "minecraft:pink_shulker_box" + }, + { + "item": "minecraft:pink_stained_glass" + }, + { + "item": "minecraft:pink_stained_glass_pane" + }, + { + "item": "minecraft:pink_terracotta" + }, + { + "item": "minecraft:pink_tulip" + }, + { + "item": "minecraft:pink_wool" + }, + { + "item": "minecraft:piston" + }, + { + "item": "minecraft:player_head" + }, + { + "item": "minecraft:podzol" + }, + { + "item": "minecraft:pointed_dripstone" + }, + { + "item": "minecraft:poisonous_potato" + }, + { + "item": "minecraft:polar_bear_spawn_egg" + }, + { + "item": "minecraft:polished_andesite" + }, + { + "item": "minecraft:polished_andesite_slab" + }, + { + "item": "minecraft:polished_andesite_stairs" + }, + { + "item": "minecraft:polished_basalt" + }, + { + "item": "minecraft:polished_blackstone" + }, + { + "item": "minecraft:polished_blackstone_brick_slab" + }, + { + "item": "minecraft:polished_blackstone_brick_stairs" + }, + { + "item": "minecraft:polished_blackstone_brick_wall" + }, + { + "item": "minecraft:polished_blackstone_bricks" + }, + { + "item": "minecraft:polished_blackstone_button" + }, + { + "item": "minecraft:polished_blackstone_pressure_plate" + }, + { + "item": "minecraft:polished_blackstone_slab" + }, + { + "item": "minecraft:polished_blackstone_stairs" + }, + { + "item": "minecraft:polished_blackstone_wall" + }, + { + "item": "minecraft:polished_deepslate" + }, + { + "item": "minecraft:polished_deepslate_slab" + }, + { + "item": "minecraft:polished_deepslate_stairs" + }, + { + "item": "minecraft:polished_deepslate_wall" + }, + { + "item": "minecraft:polished_diorite" + }, + { + "item": "minecraft:polished_diorite_slab" + }, + { + "item": "minecraft:polished_diorite_stairs" + }, + { + "item": "minecraft:polished_granite" + }, + { + "item": "minecraft:polished_granite_slab" + }, + { + "item": "minecraft:polished_granite_stairs" + }, + { + "item": "minecraft:popped_chorus_fruit" + }, + { + "item": "minecraft:poppy" + }, + { + "item": "minecraft:porkchop" + }, + { + "item": "minecraft:potato" + }, + { + "checkednbtkeys": [ + { + "key": "Potion" + } + ], + "item": "minecraft:potion" + }, + { + "item": "minecraft:powder_snow_bucket" + }, + { + "item": "minecraft:powered_rail" + }, + { + "item": "minecraft:prismarine" + }, + { + "item": "minecraft:prismarine_brick_slab" + }, + { + "item": "minecraft:prismarine_brick_stairs" + }, + { + "item": "minecraft:prismarine_bricks" + }, + { + "item": "minecraft:prismarine_crystals" + }, + { + "item": "minecraft:prismarine_shard" + }, + { + "item": "minecraft:prismarine_slab" + }, + { + "item": "minecraft:prismarine_stairs" + }, + { + "item": "minecraft:prismarine_wall" + }, + { + "item": "minecraft:pufferfish" + }, + { + "item": "minecraft:pufferfish_bucket" + }, + { + "item": "minecraft:pufferfish_spawn_egg" + }, + { + "item": "minecraft:pumpkin" + }, + { + "item": "minecraft:pumpkin_pie" + }, + { + "item": "minecraft:pumpkin_seeds" + }, + { + "item": "minecraft:purple_banner" + }, + { + "item": "minecraft:purple_bed" + }, + { + "item": "minecraft:purple_candle" + }, + { + "item": "minecraft:purple_carpet" + }, + { + "item": "minecraft:purple_concrete" + }, + { + "item": "minecraft:purple_concrete_powder" + }, + { + "item": "minecraft:purple_dye" + }, + { + "item": "minecraft:purple_glazed_terracotta" + }, + { + "item": "minecraft:purple_shulker_box" + }, + { + "item": "minecraft:purple_stained_glass" + }, + { + "item": "minecraft:purple_stained_glass_pane" + }, + { + "item": "minecraft:purple_terracotta" + }, + { + "item": "minecraft:purple_wool" + }, + { + "item": "minecraft:purpur_block" + }, + { + "item": "minecraft:purpur_pillar" + }, + { + "item": "minecraft:purpur_slab" + }, + { + "item": "minecraft:purpur_stairs" + }, + { + "item": "minecraft:quartz" + }, + { + "item": "minecraft:quartz_block" + }, + { + "item": "minecraft:quartz_bricks" + }, + { + "item": "minecraft:quartz_pillar" + }, + { + "item": "minecraft:quartz_slab" + }, + { + "item": "minecraft:quartz_stairs" + }, + { + "item": "minecraft:rabbit" + }, + { + "item": "minecraft:rabbit_foot" + }, + { + "item": "minecraft:rabbit_hide" + }, + { + "item": "minecraft:rabbit_spawn_egg" + }, + { + "item": "minecraft:rabbit_stew" + }, + { + "item": "minecraft:rail" + }, + { + "item": "minecraft:ravager_spawn_egg" + }, + { + "item": "minecraft:raw_copper" + }, + { + "item": "minecraft:raw_copper_block" + }, + { + "item": "minecraft:raw_gold" + }, + { + "item": "minecraft:raw_gold_block" + }, + { + "item": "minecraft:raw_iron" + }, + { + "item": "minecraft:raw_iron_block" + }, + { + "item": "minecraft:recovery_compass" + }, + { + "item": "minecraft:red_banner" + }, + { + "item": "minecraft:red_bed" + }, + { + "item": "minecraft:red_candle" + }, + { + "item": "minecraft:red_carpet" + }, + { + "item": "minecraft:red_concrete" + }, + { + "item": "minecraft:red_concrete_powder" + }, + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:red_glazed_terracotta" + }, + { + "item": "minecraft:red_mushroom" + }, + { + "item": "minecraft:red_mushroom_block" + }, + { + "item": "minecraft:red_nether_brick_slab" + }, + { + "item": "minecraft:red_nether_brick_stairs" + }, + { + "item": "minecraft:red_nether_brick_wall" + }, + { + "item": "minecraft:red_nether_bricks" + }, + { + "item": "minecraft:red_sand" + }, + { + "item": "minecraft:red_sandstone" + }, + { + "item": "minecraft:red_sandstone_slab" + }, + { + "item": "minecraft:red_sandstone_stairs" + }, + { + "item": "minecraft:red_sandstone_wall" + }, + { + "item": "minecraft:red_shulker_box" + }, + { + "item": "minecraft:red_stained_glass" + }, + { + "item": "minecraft:red_stained_glass_pane" + }, + { + "item": "minecraft:red_terracotta" + }, + { + "item": "minecraft:red_tulip" + }, + { + "item": "minecraft:red_wool" + }, + { + "item": "minecraft:redstone" + }, + { + "item": "minecraft:redstone_block" + }, + { + "item": "minecraft:redstone_lamp" + }, + { + "item": "minecraft:redstone_ore" + }, + { + "item": "minecraft:redstone_torch" + }, + { + "item": "minecraft:reinforced_deepslate" + }, + { + "item": "minecraft:repeater" + }, + { + "item": "minecraft:respawn_anchor" + }, + { + "item": "minecraft:rooted_dirt" + }, + { + "item": "minecraft:rose_bush" + }, + { + "item": "minecraft:rotten_flesh" + }, + { + "item": "minecraft:saddle" + }, + { + "item": "minecraft:salmon" + }, + { + "item": "minecraft:salmon_bucket" + }, + { + "item": "minecraft:salmon_spawn_egg" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sandstone" + }, + { + "item": "minecraft:sandstone_slab" + }, + { + "item": "minecraft:sandstone_stairs" + }, + { + "item": "minecraft:sandstone_wall" + }, + { + "item": "minecraft:scaffolding" + }, + { + "item": "minecraft:sculk" + }, + { + "item": "minecraft:sculk_catalyst" + }, + { + "item": "minecraft:sculk_sensor" + }, + { + "item": "minecraft:sculk_shrieker" + }, + { + "item": "minecraft:sculk_vein" + }, + { + "item": "minecraft:scute" + }, + { + "item": "minecraft:sea_lantern" + }, + { + "item": "minecraft:sea_pickle" + }, + { + "item": "minecraft:seagrass" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:shears" + }, + { + "item": "minecraft:sheep_spawn_egg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:shield" + }, + { + "item": "minecraft:shroomlight" + }, + { + "item": "minecraft:shulker_box" + }, + { + "item": "minecraft:shulker_shell" + }, + { + "item": "minecraft:shulker_spawn_egg" + }, + { + "item": "minecraft:silverfish_spawn_egg" + }, + { + "item": "minecraft:skeleton_horse_spawn_egg" + }, + { + "item": "minecraft:skeleton_skull" + }, + { + "item": "minecraft:skeleton_spawn_egg" + }, + { + "item": "minecraft:skull_banner_pattern" + }, + { + "item": "minecraft:slime_ball" + }, + { + "item": "minecraft:slime_block" + }, + { + "item": "minecraft:slime_spawn_egg" + }, + { + "item": "minecraft:small_amethyst_bud" + }, + { + "item": "minecraft:small_dripleaf" + }, + { + "item": "minecraft:smithing_table" + }, + { + "item": "minecraft:smoker" + }, + { + "item": "minecraft:smooth_basalt" + }, + { + "item": "minecraft:smooth_quartz" + }, + { + "item": "minecraft:smooth_quartz_slab" + }, + { + "item": "minecraft:smooth_quartz_stairs" + }, + { + "item": "minecraft:smooth_red_sandstone" + }, + { + "item": "minecraft:smooth_red_sandstone_slab" + }, + { + "item": "minecraft:smooth_red_sandstone_stairs" + }, + { + "item": "minecraft:smooth_sandstone" + }, + { + "item": "minecraft:smooth_sandstone_slab" + }, + { + "item": "minecraft:smooth_sandstone_stairs" + }, + { + "item": "minecraft:smooth_stone" + }, + { + "item": "minecraft:smooth_stone_slab" + }, + { + "item": "minecraft:snow" + }, + { + "item": "minecraft:snow_block" + }, + { + "item": "minecraft:snowball" + }, + { + "item": "minecraft:soul_campfire" + }, + { + "item": "minecraft:soul_lantern" + }, + { + "item": "minecraft:soul_sand" + }, + { + "item": "minecraft:soul_soil" + }, + { + "item": "minecraft:soul_torch" + }, + { + "item": "minecraft:spectral_arrow" + }, + { + "item": "minecraft:spider_eye" + }, + { + "item": "minecraft:spider_spawn_egg" + }, + { + "checkednbtkeys": [ + { + "key": "Potion" + } + ], + "item": "minecraft:splash_potion" + }, + { + "item": "minecraft:sponge" + }, + { + "item": "minecraft:spore_blossom" + }, + { + "item": "minecraft:spruce_boat" + }, + { + "item": "minecraft:spruce_button" + }, + { + "item": "minecraft:spruce_chest_boat" + }, + { + "item": "minecraft:spruce_door" + }, + { + "item": "minecraft:spruce_fence" + }, + { + "item": "minecraft:spruce_fence_gate" + }, + { + "item": "minecraft:spruce_leaves" + }, + { + "item": "minecraft:spruce_log" + }, + { + "item": "minecraft:spruce_planks" + }, + { + "item": "minecraft:spruce_pressure_plate" + }, + { + "item": "minecraft:spruce_sapling" + }, + { + "item": "minecraft:spruce_sign" + }, + { + "item": "minecraft:spruce_slab" + }, + { + "item": "minecraft:spruce_stairs" + }, + { + "item": "minecraft:spruce_trapdoor" + }, + { + "item": "minecraft:spruce_wood" + }, + { + "item": "minecraft:spyglass" + }, + { + "item": "minecraft:squid_spawn_egg" + }, + { + "item": "minecraft:stick" + }, + { + "item": "minecraft:sticky_piston" + }, + { + "item": "minecraft:stone" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:stone_axe" + }, + { + "item": "minecraft:stone_brick_slab" + }, + { + "item": "minecraft:stone_brick_stairs" + }, + { + "item": "minecraft:stone_brick_wall" + }, + { + "item": "minecraft:stone_bricks" + }, + { + "item": "minecraft:stone_button" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:stone_hoe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:stone_pickaxe" + }, + { + "item": "minecraft:stone_pressure_plate" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:stone_shovel" + }, + { + "item": "minecraft:stone_slab" + }, + { + "item": "minecraft:stone_stairs" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:stone_sword" + }, + { + "item": "minecraft:stonecutter" + }, + { + "item": "minecraft:stray_spawn_egg" + }, + { + "item": "minecraft:strider_spawn_egg" + }, + { + "item": "minecraft:string" + }, + { + "item": "minecraft:stripped_acacia_log" + }, + { + "item": "minecraft:stripped_acacia_wood" + }, + { + "item": "minecraft:stripped_birch_log" + }, + { + "item": "minecraft:stripped_birch_wood" + }, + { + "item": "minecraft:stripped_crimson_hyphae" + }, + { + "item": "minecraft:stripped_crimson_stem" + }, + { + "item": "minecraft:stripped_dark_oak_log" + }, + { + "item": "minecraft:stripped_dark_oak_wood" + }, + { + "item": "minecraft:stripped_jungle_log" + }, + { + "item": "minecraft:stripped_jungle_wood" + }, + { + "item": "minecraft:stripped_mangrove_log" + }, + { + "item": "minecraft:stripped_mangrove_wood" + }, + { + "item": "minecraft:stripped_oak_log" + }, + { + "item": "minecraft:stripped_oak_wood" + }, + { + "item": "minecraft:stripped_spruce_log" + }, + { + "item": "minecraft:stripped_spruce_wood" + }, + { + "item": "minecraft:stripped_warped_hyphae" + }, + { + "item": "minecraft:stripped_warped_stem" + }, + { + "item": "minecraft:sugar" + }, + { + "item": "minecraft:sugar_cane" + }, + { + "item": "minecraft:sunflower" + }, + { + "item": "minecraft:sweet_berries" + }, + { + "item": "minecraft:tadpole_bucket" + }, + { + "item": "minecraft:tadpole_spawn_egg" + }, + { + "item": "minecraft:tall_grass" + }, + { + "item": "minecraft:target" + }, + { + "item": "minecraft:terracotta" + }, + { + "item": "minecraft:tinted_glass" + }, + { + "checkednbtkeys": [ + { + "key": "Potion" + } + ], + "item": "minecraft:tipped_arrow" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt_minecart" + }, + { + "item": "minecraft:torch" + }, + { + "item": "minecraft:totem_of_undying" + }, + { + "item": "minecraft:trader_llama_spawn_egg" + }, + { + "item": "minecraft:trapped_chest" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:trident" + }, + { + "item": "minecraft:tripwire_hook" + }, + { + "item": "minecraft:tropical_fish" + }, + { + "item": "minecraft:tropical_fish_bucket" + }, + { + "item": "minecraft:tropical_fish_spawn_egg" + }, + { + "item": "minecraft:tube_coral" + }, + { + "item": "minecraft:tube_coral_block" + }, + { + "item": "minecraft:tube_coral_fan" + }, + { + "item": "minecraft:tuff" + }, + { + "item": "minecraft:turtle_egg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:turtle_helmet" + }, + { + "item": "minecraft:turtle_spawn_egg" + }, + { + "item": "minecraft:twisting_vines" + }, + { + "item": "minecraft:verdant_froglight" + }, + { + "item": "minecraft:vex_spawn_egg" + }, + { + "item": "minecraft:villager_spawn_egg" + }, + { + "item": "minecraft:vindicator_spawn_egg" + }, + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:wandering_trader_spawn_egg" + }, + { + "item": "minecraft:warden_spawn_egg" + }, + { + "item": "minecraft:warped_button" + }, + { + "item": "minecraft:warped_door" + }, + { + "item": "minecraft:warped_fence" + }, + { + "item": "minecraft:warped_fence_gate" + }, + { + "item": "minecraft:warped_fungus" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:warped_fungus_on_a_stick" + }, + { + "item": "minecraft:warped_hyphae" + }, + { + "item": "minecraft:warped_nylium" + }, + { + "item": "minecraft:warped_planks" + }, + { + "item": "minecraft:warped_pressure_plate" + }, + { + "item": "minecraft:warped_roots" + }, + { + "item": "minecraft:warped_sign" + }, + { + "item": "minecraft:warped_slab" + }, + { + "item": "minecraft:warped_stairs" + }, + { + "item": "minecraft:warped_stem" + }, + { + "item": "minecraft:warped_trapdoor" + }, + { + "item": "minecraft:warped_wart_block" + }, + { + "item": "minecraft:water_bucket" + }, + { + "item": "minecraft:waxed_copper_block" + }, + { + "item": "minecraft:waxed_cut_copper" + }, + { + "item": "minecraft:waxed_cut_copper_slab" + }, + { + "item": "minecraft:waxed_cut_copper_stairs" + }, + { + "item": "minecraft:waxed_exposed_copper" + }, + { + "item": "minecraft:waxed_exposed_cut_copper" + }, + { + "item": "minecraft:waxed_exposed_cut_copper_slab" + }, + { + "item": "minecraft:waxed_exposed_cut_copper_stairs" + }, + { + "item": "minecraft:waxed_oxidized_copper" + }, + { + "item": "minecraft:waxed_oxidized_cut_copper" + }, + { + "item": "minecraft:waxed_oxidized_cut_copper_slab" + }, + { + "item": "minecraft:waxed_oxidized_cut_copper_stairs" + }, + { + "item": "minecraft:waxed_weathered_copper" + }, + { + "item": "minecraft:waxed_weathered_cut_copper" + }, + { + "item": "minecraft:waxed_weathered_cut_copper_slab" + }, + { + "item": "minecraft:waxed_weathered_cut_copper_stairs" + }, + { + "item": "minecraft:weathered_copper" + }, + { + "item": "minecraft:weathered_cut_copper" + }, + { + "item": "minecraft:weathered_cut_copper_slab" + }, + { + "item": "minecraft:weathered_cut_copper_stairs" + }, + { + "item": "minecraft:weeping_vines" + }, + { + "item": "minecraft:wet_sponge" + }, + { + "item": "minecraft:wheat" + }, + { + "item": "minecraft:wheat_seeds" + }, + { + "item": "minecraft:white_banner" + }, + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:white_candle" + }, + { + "item": "minecraft:white_carpet" + }, + { + "item": "minecraft:white_concrete" + }, + { + "item": "minecraft:white_concrete_powder" + }, + { + "item": "minecraft:white_dye" + }, + { + "item": "minecraft:white_glazed_terracotta" + }, + { + "item": "minecraft:white_shulker_box" + }, + { + "item": "minecraft:white_stained_glass" + }, + { + "item": "minecraft:white_stained_glass_pane" + }, + { + "item": "minecraft:white_terracotta" + }, + { + "item": "minecraft:white_tulip" + }, + { + "item": "minecraft:white_wool" + }, + { + "item": "minecraft:witch_spawn_egg" + }, + { + "item": "minecraft:wither_rose" + }, + { + "item": "minecraft:wither_skeleton_skull" + }, + { + "item": "minecraft:wither_skeleton_spawn_egg" + }, + { + "item": "minecraft:wolf_spawn_egg" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:wooden_axe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:wooden_hoe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:wooden_pickaxe" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:wooden_shovel" + }, + { + "checkednbtkeys": [ + { + "key": "Enchantments" + }, + { + "key": "RepairCost" + } + ], + "item": "minecraft:wooden_sword" + }, + { + "item": "minecraft:writable_book" + }, + { + "item": "minecraft:yellow_banner" + }, + { + "item": "minecraft:yellow_bed" + }, + { + "item": "minecraft:yellow_candle" + }, + { + "item": "minecraft:yellow_carpet" + }, + { + "item": "minecraft:yellow_concrete" + }, + { + "item": "minecraft:yellow_concrete_powder" + }, + { + "item": "minecraft:yellow_dye" + }, + { + "item": "minecraft:yellow_glazed_terracotta" + }, + { + "item": "minecraft:yellow_shulker_box" + }, + { + "item": "minecraft:yellow_stained_glass" + }, + { + "item": "minecraft:yellow_stained_glass_pane" + }, + { + "item": "minecraft:yellow_terracotta" + }, + { + "item": "minecraft:yellow_wool" + }, + { + "item": "minecraft:zoglin_spawn_egg" + }, + { + "item": "minecraft:zombie_head" + }, + { + "item": "minecraft:zombie_horse_spawn_egg" + }, + { + "item": "minecraft:zombie_spawn_egg" + }, + { + "item": "minecraft:zombie_villager_spawn_egg" + }, + { + "item": "minecraft:zombified_piglin_spawn_egg" + }, + { + "item": "multipiston:multipistonblock" + }, + { + "item": "structurize:blockfluidsubstitution" + }, + { + "item": "structurize:blocksolidsubstitution" + }, + { + "item": "structurize:blocksubstitution" + }, + { + "item": "structurize:blocktagsubstitution" + }, + { + "item": "structurize:caliper" + }, + { + "item": "structurize:sceptergold" + }, + { + "item": "structurize:sceptersteel" + }, + { + "item": "structurize:sceptertag" + }, + { + "item": "structurize:shapetool" + } +] \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/alchemist/magicpotion.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/alchemist/magicpotion.json new file mode 100644 index 00000000000..2a21029a6ac --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/alchemist/magicpotion.json @@ -0,0 +1,16 @@ +{ + "type": "recipe", + "crafter": "alchemist_crafting", + "inputs": [ + { + "item": "minecolonies:mistletoe" + }, + { + "item": "minecraft:potion{Potion:\"minecraft:water\"}" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/consumepotions", + "result": "minecolonies:magicpotion", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread.json new file mode 100644 index 00000000000..6ccfe27a20a --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread.json @@ -0,0 +1,11 @@ +{ + "type": "recipe", + "crafter": "baker_smelting", + "inputs": [ + { + "item": "minecolonies:bread_dough" + } + ], + "intermediate": "minecraft:furnace", + "result": "minecraft:bread" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough.json new file mode 100644 index 00000000000..14ba65ed2ef --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "baker_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:wheat" + } + ], + "intermediate": "minecraft:air", + "max-building-level": 2, + "result": "minecolonies:bread_dough", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough3.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough3.json new file mode 100644 index 00000000000..3d9645d2d69 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/bread_dough3.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 2, + "crafter": "baker_crafting", + "inputs": [ + { + "item": "minecraft:wheat" + }, + { + "item": "minecraft:potion{Potion:\"minecraft:water\"}" + } + ], + "intermediate": "minecraft:air", + "loot-table": "minecolonies:recipes/glass_bottle", + "min-building-level": 3, + "result": "minecolonies:bread_dough", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake.json new file mode 100644 index 00000000000..f52fed04771 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "baker_smelting", + "inputs": [ + { + "item": "minecolonies:cake_batter" + } + ], + "intermediate": "minecraft:furnace", + "min-building-level": 2, + "result": "minecraft:cake" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake_batter.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake_batter.json new file mode 100644 index 00000000000..887901fffd1 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cake_batter.json @@ -0,0 +1,25 @@ +{ + "type": "recipe", + "crafter": "baker_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:wheat" + }, + { + "count": 3, + "item": "minecraft:milk_bucket" + }, + { + "count": 2, + "item": "minecraft:sugar" + }, + { + "item": "minecraft:egg" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 2, + "result": "minecolonies:cake_batter", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/chorus_bread.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/chorus_bread.json new file mode 100644 index 00000000000..cd0cf1a4da9 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/chorus_bread.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "baker_crafting", + "inputs": [ + { + "count": 8, + "item": "minecraft:wheat" + }, + { + "item": "minecraft:chorus_fruit" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/knowledgeoftheendunlock", + "result": "minecolonies:chorus_bread", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie.json new file mode 100644 index 00000000000..601d9e16c10 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "baker_smelting", + "inputs": [ + { + "item": "minecolonies:cookie_dough" + } + ], + "intermediate": "minecraft:furnace", + "min-building-level": 4, + "result": "minecraft:cookie" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie_dough.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie_dough.json new file mode 100644 index 00000000000..f8784ecb0fc --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/cookie_dough.json @@ -0,0 +1,19 @@ +{ + "type": "recipe", + "count": 8, + "crafter": "baker_crafting", + "inputs": [ + { + "count": 2, + "item": "minecraft:wheat" + }, + { + "count": 2, + "item": "minecraft:cocoa_beans" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "result": "minecolonies:cookie_dough", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/golden_bread.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/golden_bread.json new file mode 100644 index 00000000000..a8c1c8b41f0 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/golden_bread.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "baker_crafting", + "inputs": [ + { + "count": 8, + "item": "minecraft:wheat" + }, + { + "item": "minecraft:gold_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecolonies:golden_bread", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/milky_bread.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/milky_bread.json new file mode 100644 index 00000000000..9082af0d840 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/milky_bread.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "baker_crafting", + "inputs": [ + { + "count": 8, + "item": "minecraft:wheat" + }, + { + "item": "minecraft:milk_bucket" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "result": "minecolonies:milky_bread", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/pumpkin_pie.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/pumpkin_pie.json new file mode 100644 index 00000000000..61cff0e8805 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/pumpkin_pie.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "baker_smelting", + "inputs": [ + { + "item": "minecolonies:raw_pumpkin_pie" + } + ], + "intermediate": "minecraft:furnace", + "min-building-level": 3, + "result": "minecraft:pumpkin_pie" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/raw_pumpkin_pie.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/raw_pumpkin_pie.json new file mode 100644 index 00000000000..b3ab971bbbf --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/raw_pumpkin_pie.json @@ -0,0 +1,19 @@ +{ + "type": "recipe", + "crafter": "baker_crafting", + "inputs": [ + { + "item": "minecraft:pumpkin" + }, + { + "item": "minecraft:sugar" + }, + { + "item": "minecraft:egg" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecolonies:raw_pumpkin_pie", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/sugary_bread.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/sugary_bread.json new file mode 100644 index 00000000000..f3f215e0497 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/sugary_bread.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "baker_crafting", + "inputs": [ + { + "count": 8, + "item": "minecraft:wheat" + }, + { + "item": "minecraft:honey_bottle" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecolonies:sugary_bread", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/water_bottle.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/water_bottle.json new file mode 100644 index 00000000000..57d78a8efad --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/baker/water_bottle.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "baker_crafting", + "inputs": [ + { + "item": "minecraft:glass_bottle" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecraft:potion{Potion:\"minecraft:water\"}" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_axe.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_axe.json new file mode 100644 index 00000000000..e2dcdda1167 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_axe.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_axe" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_boots.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_boots.json new file mode 100644 index 00000000000..b0f4c77c17f --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_boots.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_boots" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_boots" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_chestplate.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_chestplate.json new file mode 100644 index 00000000000..752a5a2a481 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_chestplate.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_chestplate" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_chestplate" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_helmet.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_helmet.json new file mode 100644 index 00000000000..f0d3b4f6cbc --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_helmet" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_helmet" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_hoe.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_hoe.json new file mode 100644 index 00000000000..a09d0d513af --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_hoe.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_hoe" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_hoe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_leggings.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_leggings.json new file mode 100644 index 00000000000..5f30cb7dc98 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_leggings.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_leggings" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_leggings" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_pickaxe.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_pickaxe.json new file mode 100644 index 00000000000..265ed4896cf --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_pickaxe.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_pickaxe" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_pickaxe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_shovel.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_shovel.json new file mode 100644 index 00000000000..7a124b876f9 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_shovel.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_shovel" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_shovel" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_sword.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_sword.json new file mode 100644 index 00000000000..f7b781dce6d --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/netherite_sword.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:diamond_sword" + }, + { + "item": "minecraft:netherite_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 5, + "result": "minecraft:netherite_sword" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_boots.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_boots.json new file mode 100644 index 00000000000..f7c09e3ebb7 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_boots.json @@ -0,0 +1,21 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:leather" + }, + { + "item": "minecraft:coal" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "research-id": "minecolonies:effects/platearmorunlock", + "result": "minecolonies:plate_armor_boots", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_chest.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_chest.json new file mode 100644 index 00000000000..3a69fbe6359 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_chest.json @@ -0,0 +1,22 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "count": 7, + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:leather" + }, + { + "count": 3, + "item": "minecraft:coal" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "research-id": "minecolonies:effects/platearmorunlock", + "result": "minecolonies:plate_armor_chest", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_helmet.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_helmet.json new file mode 100644 index 00000000000..cb140387fb4 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_helmet.json @@ -0,0 +1,21 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "count": 4, + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:leather" + }, + { + "item": "minecraft:coal" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "research-id": "minecolonies:effects/platearmorunlock", + "result": "minecolonies:plate_armor_helmet", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_legs.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_legs.json new file mode 100644 index 00000000000..7e0db84bbcd --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/plate_armor_legs.json @@ -0,0 +1,22 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "count": 6, + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:leather" + }, + { + "count": 4, + "item": "minecraft:coal" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 4, + "research-id": "minecolonies:effects/platearmorunlock", + "result": "minecolonies:plate_armor_legs", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/sifter_mesh_iron.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/sifter_mesh_iron.json new file mode 100644 index 00000000000..d1798d801ce --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/blacksmith/sifter_mesh_iron.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "blacksmith_crafting", + "inputs": [ + { + "item": "minecraft:iron_ingot" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/sifterironunlock", + "result": "minecolonies:sifter_mesh_iron", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/black_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/black_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/black_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/black_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/black_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/black_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/black_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/black_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/blue_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/blue_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/blue_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/blue_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/blue_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/blue_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/blue_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/blue_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/brown_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/brown_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/brown_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/brown_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/brown_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/brown_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/brown_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/brown_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/cyan_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/cyan_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/cyan_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/cyan_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/cyan_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/cyan_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/cyan_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/cyan_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/gray_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/gray_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/gray_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/gray_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/gray_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/gray_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/gray_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/gray_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/green_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/green_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/green_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/green_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/green_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/green_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/green_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/green_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_blue_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_blue_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_blue_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_blue_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_blue_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_blue_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_blue_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_blue_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_gray_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_gray_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_gray_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_gray_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_gray_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_gray_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/light_gray_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/light_gray_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/lime_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/lime_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/lime_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/lime_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/lime_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/lime_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/lime_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/lime_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/magenta_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/magenta_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/magenta_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/magenta_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/magenta_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/magenta_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/magenta_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/magenta_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/orange_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/orange_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/orange_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/orange_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/orange_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/orange_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/orange_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/orange_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/pink_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/pink_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/pink_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/pink_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/pink_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/pink_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/pink_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/pink_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/purple_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/purple_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/purple_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/purple_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/purple_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/purple_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/purple_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/purple_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/red_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/red_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/red_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/red_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/red_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/red_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/red_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/red_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/white_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/white_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/white_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/white_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/white_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/white_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/white_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/white_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/yellow_concrete.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/yellow_concrete.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/yellow_concrete.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/yellow_concrete.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/yellow_concrete_powder.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/yellow_concrete_powder.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer_custom/yellow_concrete_powder.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/concretemixer/yellow_concrete_powder.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal1.json new file mode 100644 index 00000000000..1f6d58dc1fc --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal1.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "count": 3, + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:bone" + } + ], + "intermediate": "minecraft:air", + "not-research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:bone_meal" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal2.json new file mode 100644 index 00000000000..1cedf0a40cd --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal2.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "count": 5, + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:bone" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:bone_meal" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal3.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal3.json new file mode 100644 index 00000000000..df919b96e60 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/bonemeal3.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "count": 9, + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:bone_block" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:bone_meal" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay1.json new file mode 100644 index 00000000000..46992acd115 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay1.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "count": 2, + "item": "minecraft:sand" + } + ], + "intermediate": "minecraft:air", + "not-research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:clay" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay2.json new file mode 100644 index 00000000000..56b54e69ba8 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay2.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:sand" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:clay" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay_ball.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay_ball.json new file mode 100644 index 00000000000..d0d6b2a4d69 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/clay_ball.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:clay" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:clay_ball" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/cobble.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/cobble.json new file mode 100644 index 00000000000..ffc305e5e18 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/cobble.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "count": 2, + "item": "minecraft:tuff" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/knowledgeofthedepthsunlock", + "result": "minecraft:cobblestone" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel1.json new file mode 100644 index 00000000000..36308134cc0 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel1.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "count": 2, + "item": "minecraft:cobblestone" + } + ], + "intermediate": "minecraft:air", + "loot-table": "minecolonies:recipes/gravel", + "not-research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:gravel" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel2.json new file mode 100644 index 00000000000..4ce734d8c6c --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/gravel2.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:cobblestone" + } + ], + "intermediate": "minecraft:air", + "loot-table": "minecolonies:recipes/gravel", + "research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:gravel" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand1.json new file mode 100644 index 00000000000..05c8a76fe29 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand1.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "count": 2, + "item": "minecraft:gravel" + } + ], + "intermediate": "minecraft:air", + "not-research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:sand" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand2.json new file mode 100644 index 00000000000..4492072c0ab --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/sand2.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "item": "minecraft:gravel" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/crushing11unlock", + "result": "minecraft:sand" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/tuff.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/tuff.json new file mode 100644 index 00000000000..49c0cc96656 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/crusher/tuff.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "crusher_custom", + "inputs": [ + { + "count": 2, + "item": "minecraft:cobbled_deepslate" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/knowledgeofthedepthsunlock", + "result": "minecraft:tuff" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/black_dye.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/black_dye.json new file mode 100644 index 00000000000..10cff88c613 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/black_dye.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "dyer_crafting", + "inputs": [ + { + "item": "minecraft:charcoal" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 2, + "result": "minecraft:black_dye" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/dark_prismarine.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/dark_prismarine.json new file mode 100644 index 00000000000..313d99395c0 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/dark_prismarine.json @@ -0,0 +1,17 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "dyer_crafting", + "inputs": [ + { + "count": 4, + "item": "minecraft:prismarine" + }, + { + "item": "minecraft:black_dye" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecraft:dark_prismarine" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/red_sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/red_sand.json new file mode 100644 index 00000000000..e866641f6a4 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/dyer/red_sand.json @@ -0,0 +1,16 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "dyer_crafting", + "inputs": [ + { + "count": 4, + "item": "minecraft:sand" + }, + { + "item": "minecraft:red_dye" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:red_sand" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_area_tp.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_area_tp.json new file mode 100644 index 00000000000..266cec277f3 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_area_tp.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "enchanter_custom", + "inputs": [ + { + "count": 3, + "item": "minecolonies:scroll_tp" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 2, + "result": "minecolonies:scroll_area_tp", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_guard_help.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_guard_help.json new file mode 100644 index 00000000000..b15759e4d40 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_guard_help.json @@ -0,0 +1,25 @@ +{ + "type": "recipe", + "count": 2, + "crafter": "enchanter_custom", + "inputs": [ + { + "item": "minecolonies:scroll_tp" + }, + { + "count": 5, + "item": "minecraft:lapis_lazuli" + }, + { + "item": "minecraft:ender_pearl" + }, + { + "item": "minecraft:paper" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "research-id": "minecolonies:effects/morescrollsunlock", + "result": "minecolonies:scroll_guard_help", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_highlight.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_highlight.json new file mode 100644 index 00000000000..d7c154a7bb0 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_highlight.json @@ -0,0 +1,24 @@ +{ + "type": "recipe", + "count": 5, + "crafter": "enchanter_custom", + "inputs": [ + { + "count": 3, + "item": "minecolonies:scroll_tp" + }, + { + "count": 6, + "item": "minecraft:glowstone_dust" + }, + { + "count": 2, + "item": "minecraft:paper" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "research-id": "minecolonies:effects/morescrollsunlock", + "result": "minecolonies:scroll_highlight", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_tp.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_tp.json new file mode 100644 index 00000000000..eec68fd914a --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/scroll_tp.json @@ -0,0 +1,20 @@ +{ + "type": "recipe", + "count": 3, + "crafter": "enchanter_custom", + "inputs": [ + { + "count": 3, + "item": "minecraft:paper" + }, + { + "item": "minecraft:compass" + }, + { + "item": "structurize:sceptergold" + } + ], + "intermediate": "minecraft:air", + "result": "minecolonies:scroll_tp", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome1.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome1.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome1.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome2.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome2.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome2.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome3.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome3.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome3.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome3.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome4.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome4.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome4.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome4.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome5.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome5.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter_custom/tome5.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/enchanter/tome5.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/carved_pumpkin.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/carved_pumpkin.json new file mode 100644 index 00000000000..73cdeacf169 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/carved_pumpkin.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "farmer_crafting", + "inputs": [ + { + "item": "minecraft:pumpkin" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:carved_pumpkin", + "tool": "shears" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/mud.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/mud.json new file mode 100644 index 00000000000..3664e819ed2 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/farmer/mud.json @@ -0,0 +1,15 @@ +{ + "type": "recipe", + "crafter": "farmer_crafting", + "inputs": [ + { + "item": "minecraft:dirt" + }, + { + "item": "minecraft:potion{Potion:\"minecraft:water\"}" + } + ], + "intermediate": "minecraft:air", + "loot-table": "minecolonies:recipes/glass_bottle", + "result": "minecraft:mud" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/flint.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/flint.json new file mode 100644 index 00000000000..b4efe1e49cc --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/flint.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "fletcher_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:gravel" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:flint" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/sifter_mesh_string.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/sifter_mesh_string.json new file mode 100644 index 00000000000..a36acca8c3b --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/sifter_mesh_string.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "fletcher_crafting", + "inputs": [ + { + "item": "minecraft:string" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/sifterstringunlock", + "result": "minecolonies:sifter_mesh_string", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/string.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/string.json new file mode 100644 index 00000000000..5803157d87c --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/fletcher/string.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "count": 4, + "crafter": "fletcher_crafting", + "inputs": [ + { + "item": "minecraft:white_wool" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:string" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_copper.json new file mode 100644 index 00000000000..d6f990c8cdd --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:exposed_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:copper_block", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_cut_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_cut_copper.json new file mode 100644 index 00000000000..1cafc51e1ee --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_exposed_cut_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:exposed_cut_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:cut_copper", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_copper.json new file mode 100644 index 00000000000..466e48f3d20 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:oxidized_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:weathered_copper", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_cut_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_cut_copper.json new file mode 100644 index 00000000000..6839eab10d7 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_oxidized_cut_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:oxidized_cut_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:weathered_cut_copper", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_copper.json new file mode 100644 index 00000000000..9a745a1a2b6 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:weathered_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:exposed_copper", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_cut_copper.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_cut_copper.json new file mode 100644 index 00000000000..85b6a53169b --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/deoxidize_weathered_cut_copper.json @@ -0,0 +1,12 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:weathered_cut_copper" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:exposed_cut_copper", + "tool": "axe" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_iron.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_iron.json new file mode 100644 index 00000000000..ca00c57de37 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_iron.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "count": 5, + "item": "minecraft:iron_nugget" + } + ], + "intermediate": "minecraft:air", + "result": "minecolonies:gate_iron", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_wood.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_wood.json new file mode 100644 index 00000000000..c117fe1e0eb --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/gate_wood.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "count": 5, + "item": "minecraft:oak_log" + } + ], + "intermediate": "minecraft:air", + "result": "minecolonies:gate_wood", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/lantern.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/lantern.json new file mode 100644 index 00000000000..7a8cbb3e3fd --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/lantern.json @@ -0,0 +1,19 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:iron_nugget" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:torch" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecraft:lantern" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/rails.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/rails.json new file mode 100644 index 00000000000..64892a46faf --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/rails.json @@ -0,0 +1,18 @@ +{ + "type": "recipe", + "count": 16, + "crafter": "mechanic_crafting", + "inputs": [ + { + "count": 5, + "item": "minecraft:stick" + }, + { + "count": 2, + "item": "minecraft:iron_ingot" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecraft:rail" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/sifter_mesh_diamond.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/sifter_mesh_diamond.json new file mode 100644 index 00000000000..e82daecff31 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/sifter_mesh_diamond.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "item": "minecraft:diamond" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/sifterdiamondunlock", + "result": "minecolonies:sifter_mesh_diamond", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/soul_lantern.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/soul_lantern.json new file mode 100644 index 00000000000..14498ca2b54 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/mechanic/soul_lantern.json @@ -0,0 +1,19 @@ +{ + "type": "recipe", + "crafter": "mechanic_crafting", + "inputs": [ + { + "count": 3, + "item": "minecraft:iron_nugget" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:soul_torch" + } + ], + "intermediate": "minecraft:air", + "min-building-level": 3, + "result": "minecraft:soul_lantern" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/lava.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/lava.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/lava.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/lava.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip1.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip1.json similarity index 87% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip1.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip1.json index e89ef351356..bc7350fdf4b 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip1.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip1.json @@ -5,16 +5,16 @@ "item": "minecraft:gold_ingot" }, { - "item": "minecraft:rotten_flesh" + "item": "minecraft:netherrack" }, { - "item": "minecraft:gold_nugget" + "item": "minecraft:nether_quartz_ore" }, { - "item": "minecraft:netherrack" + "item": "minecraft:rotten_flesh" }, { - "item": "minecraft:nether_quartz_ore" + "item": "minecraft:gold_nugget" }, { "item": "minecraft:soul_sand" @@ -43,15 +43,6 @@ { "item": "minecraft:magma_cream" }, - { - "item": "minecraft:pearlescent_froglight" - }, - { - "item": "minecraft:verdant_froglight" - }, - { - "item": "minecraft:ochre_froglight" - }, { "item": "minecraft:blaze_rod" } diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip2.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip2.json similarity index 90% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip2.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip2.json index 008efb3b5ac..a8888413c66 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip2.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip2.json @@ -31,9 +31,6 @@ { "item": "minecraft:soul_soil" }, - { - "item": "minecraft:porkchop" - }, { "item": "minecraft:glowstone" }, @@ -47,31 +44,25 @@ "item": "minecraft:crimson_stem" }, { - "item": "minecraft:leather" - }, - { - "item": "minecraft:gunpowder" + "item": "minecraft:porkchop" }, { "item": "minecraft:nether_wart" }, { - "item": "minecraft:ghast_tear" - }, - { - "item": "minecraft:ender_pearl" + "item": "minecraft:leather" }, { - "item": "minecraft:magma_cream" + "item": "minecraft:gunpowder" }, { - "item": "minecraft:pearlescent_froglight" + "item": "minecraft:ghast_tear" }, { - "item": "minecraft:verdant_froglight" + "item": "minecraft:ender_pearl" }, { - "item": "minecraft:ochre_froglight" + "item": "minecraft:magma_cream" }, { "item": "minecraft:blaze_rod" diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip3.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip3.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip3.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip3.json index 243b5f6abe4..b6fff3e15d5 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip3.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip3.json @@ -29,10 +29,10 @@ "item": "minecraft:red_mushroom" }, { - "item": "minecraft:porkchop" + "item": "minecraft:soul_soil" }, { - "item": "minecraft:soul_soil" + "item": "minecraft:porkchop" }, { "item": "minecraft:glowstone" @@ -61,11 +61,14 @@ { "item": "minecraft:leather" }, + { + "item": "minecraft:nether_wart" + }, { "item": "minecraft:gunpowder" }, { - "item": "minecraft:nether_wart" + "item": "minecraft:ochre_froglight" }, { "item": "minecraft:ghast_tear" @@ -73,9 +76,6 @@ { "item": "minecraft:ender_pearl" }, - { - "item": "minecraft:magma_cream" - }, { "item": "minecraft:pearlescent_froglight" }, @@ -83,7 +83,7 @@ "item": "minecraft:verdant_froglight" }, { - "item": "minecraft:ochre_froglight" + "item": "minecraft:magma_cream" }, { "item": "minecraft:blaze_rod" diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip4.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip4.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip4.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip4.json index 5d3cd626d9f..7d8ad17cf0b 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip4.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip4.json @@ -16,9 +16,6 @@ { "item": "minecraft:nether_quartz_ore" }, - { - "item": "minecraft:porkchop" - }, { "item": "minecraft:soul_sand" }, @@ -35,7 +32,7 @@ "item": "minecraft:soul_soil" }, { - "item": "minecraft:leather" + "item": "minecraft:porkchop" }, { "item": "minecraft:glowstone" @@ -68,19 +65,22 @@ "item": "minecraft:blackstone" }, { - "item": "minecraft:gunpowder" + "item": "minecraft:leather" }, { - "item": "minecraft:ghast_tear" + "item": "minecraft:nether_wart" }, { - "item": "minecraft:ender_pearl" + "item": "minecraft:gunpowder" }, { - "item": "minecraft:nether_wart" + "item": "minecraft:ochre_froglight" }, { - "item": "minecraft:magma_cream" + "item": "minecraft:ghast_tear" + }, + { + "item": "minecraft:ender_pearl" }, { "item": "minecraft:pearlescent_froglight" @@ -89,7 +89,7 @@ "item": "minecraft:verdant_froglight" }, { - "item": "minecraft:ochre_froglight" + "item": "minecraft:magma_cream" }, { "item": "minecraft:blaze_rod" diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip5.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip5.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip5.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip5.json index b58406f76a4..82cdbd1fde5 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker_custom/trip5.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/netherworker/trip5.json @@ -16,9 +16,6 @@ { "item": "minecraft:nether_quartz_ore" }, - { - "item": "minecraft:porkchop" - }, { "item": "minecraft:soul_sand" }, @@ -35,7 +32,7 @@ "item": "minecraft:soul_soil" }, { - "item": "minecraft:leather" + "item": "minecraft:porkchop" }, { "item": "minecraft:glowstone" @@ -68,19 +65,22 @@ "item": "minecraft:blackstone" }, { - "item": "minecraft:gunpowder" + "item": "minecraft:leather" }, { - "item": "minecraft:ghast_tear" + "item": "minecraft:nether_wart" }, { - "item": "minecraft:ender_pearl" + "item": "minecraft:gunpowder" }, { - "item": "minecraft:nether_wart" + "item": "minecraft:ochre_froglight" }, { - "item": "minecraft:magma_cream" + "item": "minecraft:ghast_tear" + }, + { + "item": "minecraft:ender_pearl" }, { "item": "minecraft:pearlescent_froglight" @@ -89,13 +89,13 @@ "item": "minecraft:verdant_froglight" }, { - "item": "minecraft:ochre_froglight" + "item": "minecraft:ancient_debris" }, { - "item": "minecraft:blaze_rod" + "item": "minecraft:magma_cream" }, { - "item": "minecraft:ancient_debris" + "item": "minecraft:blaze_rod" } ], "crafter": "netherworker_custom", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/dirt.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/dirt.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/dirt.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/dirt.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/gravel.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/gravel.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/gravel.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/gravel.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/soul_sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/soul_sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/diamond/soul_sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/diamond/soul_sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/dirt.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/dirt.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/dirt.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/dirt.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/gravel.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/gravel.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/gravel.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/gravel.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/soul_sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/soul_sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/flint/soul_sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/flint/soul_sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/dirt.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/dirt.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/dirt.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/dirt.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/gravel.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/gravel.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/gravel.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/gravel.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/soul_sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/soul_sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/iron/soul_sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/iron/soul_sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/dirt.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/dirt.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/dirt.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/dirt.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/gravel.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/gravel.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/gravel.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/gravel.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/soul_sand.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/soul_sand.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter_custom/string/soul_sand.json rename to src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/sifter/string/soul_sand.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/end_stone.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/end_stone.json new file mode 100644 index 00000000000..d8da5136e95 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/end_stone.json @@ -0,0 +1,17 @@ +{ + "type": "recipe", + "count": 8, + "crafter": "stonemason_crafting", + "inputs": [ + { + "count": 8, + "item": "minecraft:sandstone" + }, + { + "item": "minecraft:ender_pearl" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/knowledgeoftheendunlock", + "result": "minecraft:end_stone" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine.json new file mode 100644 index 00000000000..ed6e906474d --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "stonemason_crafting", + "inputs": [ + { + "item": "minecraft:cobblestone" + }, + { + "item": "minecraft:prismarine_shard" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:prismarine" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine_bricks.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine_bricks.json new file mode 100644 index 00000000000..780e3bf70ee --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/prismarine_bricks.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "stonemason_crafting", + "inputs": [ + { + "item": "minecraft:stone_bricks" + }, + { + "item": "minecraft:prismarine_shard" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:prismarine_bricks" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/red_sandstone.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/red_sandstone.json new file mode 100644 index 00000000000..49cd9975233 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/red_sandstone.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "stonemason_crafting", + "inputs": [ + { + "item": "minecraft:cobblestone" + }, + { + "item": "minecraft:red_sand" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:red_sandstone" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sandstone.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sandstone.json new file mode 100644 index 00000000000..5c952e77773 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sandstone.json @@ -0,0 +1,14 @@ +{ + "type": "recipe", + "crafter": "stonemason_crafting", + "inputs": [ + { + "item": "minecraft:cobblestone" + }, + { + "item": "minecraft:sand" + } + ], + "intermediate": "minecraft:air", + "result": "minecraft:sandstone" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sifter_mesh_flint.json b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sifter_mesh_flint.json new file mode 100644 index 00000000000..bb527b6a9ca --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/crafterrecipes/stonemason/sifter_mesh_flint.json @@ -0,0 +1,13 @@ +{ + "type": "recipe", + "crafter": "stonemason_crafting", + "inputs": [ + { + "item": "minecraft:flint" + } + ], + "intermediate": "minecraft:air", + "research-id": "minecolonies:effects/sifterflintunlock", + "result": "minecolonies:sifter_mesh_flint", + "show-tooltip": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/blockhutplantationfield.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/blockhutplantationfield.json new file mode 100644 index 00000000000..be9d244a792 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/blockhutplantationfield.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecolonies:blockhutplantationfield" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecolonies/loot_tables/blocks/colony_wall_banner.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/colony_wall_banner.json similarity index 84% rename from src/main/resources/data/minecolonies/loot_tables/blocks/colony_wall_banner.json rename to src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/colony_wall_banner.json index 69b6adfb146..921e3af751c 100644 --- a/src/main/resources/data/minecolonies/loot_tables/blocks/colony_wall_banner.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/blocks/colony_wall_banner.json @@ -2,18 +2,19 @@ "type": "minecraft:block", "pools": [ { + "bonus_rolls": 0.0, "conditions": [ { "condition": "minecraft:survives_explosion" } ], - "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecolonies:colony_banner" } - ] + ], + "rolls": 1.0 } ] } \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplycamp.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplycamp.json new file mode 100644 index 00000000000..9ce109a9ada --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplycamp.json @@ -0,0 +1,55 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chance": 0.1, + "condition": "minecraft:random_chance" + } + ], + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Placement:\"instant\"}" + }, + { + "function": "minecraft:set_name", + "name": { + "translate": "item.minecolonies.supply.free", + "with": [ + { + "translate": "item.minecolonies.supplycampdeployer" + } + ] + } + } + ], + "name": "minecolonies:supplycampdeployer" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chance": 0.2, + "condition": "minecraft:random_chance" + } + ], + "functions": [ + { + "add": false, + "count": 8.0, + "function": "minecraft:set_count" + } + ], + "name": "minecolonies:scroll_buff" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplyship.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplyship.json new file mode 100644 index 00000000000..1d1f328c3d4 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/chests/supplyship.json @@ -0,0 +1,55 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chance": 0.1, + "condition": "minecraft:random_chance" + } + ], + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Placement:\"instant\"}" + }, + { + "function": "minecraft:set_name", + "name": { + "translate": "item.minecolonies.supply.free", + "with": [ + { + "translate": "item.minecolonies.supplychestdeployer" + } + ] + } + } + ], + "name": "minecolonies:supplychestdeployer" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chance": 0.2, + "condition": "minecraft:random_chance" + } + ], + "functions": [ + { + "add": false, + "count": 8.0, + "function": "minecraft:set_count" + } + ], + "name": "minecolonies:scroll_buff" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazon.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazon.json new file mode 100644 index 00000000000..fa9917fbe4c --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazon.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 15 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:amazon", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonchief.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonchief.json new file mode 100644 index 00000000000..bb3237d0c78 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonchief.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 30 + } + ], + "name": "minecolonies:amazonchief", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonspearman.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonspearman.json new file mode 100644 index 00000000000..4454d22ea15 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/amazonspearman.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecolonies:spear", + "weight": 15 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:amazonspearman", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerbarbarian.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerbarbarian.json new file mode 100644 index 00000000000..ce6068c1eb7 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerbarbarian.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:archerbarbarian", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archermummy.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archermummy.json new file mode 100644 index 00000000000..c092a226938 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archermummy.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:archermummy", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerpirate.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerpirate.json new file mode 100644 index 00000000000..73769a8fbf2 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/archerpirate.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:archerpirate", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/barbarian.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/barbarian.json new file mode 100644 index 00000000000..8d962ff3c5d --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/barbarian.json @@ -0,0 +1,39 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond_axe" + }, + { + "type": "minecraft:item", + "name": "minecraft:golden_axe", + "weight": 2 + }, + { + "type": "minecraft:item", + "name": "minecraft:iron_axe", + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecraft:stone_axe", + "weight": 6 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 3 + } + ], + "name": "minecolonies:barbarian", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefbarbarian.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefbarbarian.json new file mode 100644 index 00000000000..6f4e493e6e6 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefbarbarian.json @@ -0,0 +1,45 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 50 + }, + { + "type": "minecraft:item", + "name": "minecolonies:chiefsword", + "quality": 1 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond_sword", + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecraft:golden_sword", + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecraft:iron_sword", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecraft:stone_sword", + "weight": 20 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 30 + } + ], + "name": "minecolonies:chiefbarbarian", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefpirate.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefpirate.json new file mode 100644 index 00000000000..821fb3c569e --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/chiefpirate.json @@ -0,0 +1,74 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 50 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_hat", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_leggins", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_boots", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_top", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_cap", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_legs", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_shoes", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pirate_chest", + "quality": 1, + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecolonies:iron_scimitar", + "quality": 1, + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 30 + } + ], + "name": "minecolonies:chiefpirate", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/mummy.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/mummy.json new file mode 100644 index 00000000000..c56d52490fc --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/mummy.json @@ -0,0 +1,20 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 15 + } + ], + "name": "minecolonies:mummy", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenarcher.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenarcher.json new file mode 100644 index 00000000000..95257d88c9c --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenarcher.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:norsemenarcher", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenchief.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenchief.json new file mode 100644 index 00000000000..9913dea59f9 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/norsemenchief.json @@ -0,0 +1,32 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 50 + }, + { + "type": "minecraft:item", + "name": "minecraft:leather", + "quality": 5, + "weight": 15 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond_axe", + "quality": 1, + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 50 + } + ], + "name": "minecolonies:norsemenchief", + "rolls": 2.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pharao.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pharao.json new file mode 100644 index 00000000000..5bc69cf3440 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pharao.json @@ -0,0 +1,74 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 50 + }, + { + "type": "minecraft:item", + "name": "minecolonies:pharaoscepter", + "quality": 1, + "weight": 3 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 16.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 32.0, + "min": 1.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:arrow", + "weight": 20 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 16.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 32.0, + "min": 1.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecolonies:firearrow", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 30 + } + ], + "name": "minecolonies:pharao", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pirate.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pirate.json new file mode 100644 index 00000000000..9394350a47d --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/pirate.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecolonies:iron_scimitar", + "weight": 6 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 4 + } + ], + "name": "minecolonies:pirate", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/shieldmaiden.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/shieldmaiden.json new file mode 100644 index 00000000000..5bbc88ddbbf --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/entities/shieldmaiden.json @@ -0,0 +1,25 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 80 + }, + { + "type": "minecraft:item", + "name": "minecraft:shield", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecolonies:ancienttome", + "weight": 5 + } + ], + "name": "minecolonies:shieldmaiden", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter1.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter1.json index 827fa236e97..817778e5e8c 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter1.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter1.json @@ -107,7 +107,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -118,7 +118,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -129,7 +129,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -140,7 +140,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -151,7 +151,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -162,7 +162,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -244,6 +244,26 @@ ], "name": "minecraft:enchanted_book", "weight": 50 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" } ], "rolls": 1.0 diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter2.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter2.json index 3755fa249e3..652e2bee604 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter2.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter2.json @@ -107,7 +107,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -118,7 +118,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -129,7 +129,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -140,7 +140,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -151,7 +151,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -162,7 +162,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -250,40 +250,57 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -294,7 +311,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -305,7 +322,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -316,7 +333,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -327,7 +344,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -338,7 +355,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -349,7 +366,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -410,6 +427,17 @@ "name": "minecraft:enchanted_book", "weight": 25 }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, { "type": "minecraft:item", "functions": [ @@ -486,6 +514,26 @@ ], "name": "minecraft:enchanted_book", "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" } ], "rolls": 1.0 diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter3.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter3.json index 4f965553cf7..0a846637de6 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter3.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter3.json @@ -107,7 +107,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -118,7 +118,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -129,7 +129,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -140,7 +140,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -151,7 +151,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -162,7 +162,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", @@ -250,40 +250,97 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:channeling\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -294,7 +351,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -305,7 +362,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -316,7 +373,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -327,7 +384,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -338,7 +395,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -349,7 +406,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -410,6 +467,17 @@ "name": "minecraft:enchanted_book", "weight": 25 }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, { "type": "minecraft:item", "functions": [ @@ -492,40 +560,57 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -536,7 +621,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -547,7 +632,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -558,7 +643,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -569,7 +654,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -580,7 +665,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -591,7 +676,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -652,6 +737,17 @@ "name": "minecraft:enchanted_book", "weight": 15 }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:3s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 15 + }, { "type": "minecraft:item", "functions": [ @@ -734,7 +830,17 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:3s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book" diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter4.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter4.json index 8d1cb824c3c..f7c097a48b3 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter4.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter4.json @@ -8,40 +8,109 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 25 + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 25 + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 25 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:channeling\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:infinity\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -52,7 +121,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -63,7 +132,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -74,7 +143,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -85,7 +154,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -96,7 +165,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -107,7 +176,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:2s}]}" } ], "name": "minecraft:enchanted_book", @@ -168,6 +237,17 @@ "name": "minecraft:enchanted_book", "weight": 25 }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, { "type": "minecraft:item", "functions": [ @@ -250,73 +330,87 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -327,7 +421,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -338,7 +432,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -349,7 +443,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -360,7 +454,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -371,7 +465,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -382,7 +476,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -393,7 +487,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -404,7 +498,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -415,7 +509,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -426,7 +520,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -437,7 +531,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -448,7 +542,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -459,7 +553,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -470,7 +564,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -481,7 +575,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -492,17 +586,18 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecolonies:raider_damage_enchant\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -513,84 +608,79 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -601,7 +691,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -612,7 +702,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -623,7 +713,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:infinity\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -634,7 +724,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -678,7 +768,18 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:4s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 5 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -755,10 +856,31 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:4s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecolonies:raider_damage_enchant\",lvl:1s}]}" + } + ], + "name": "minecraft:enchanted_book", + "weight": 15 } ], "rolls": 1.0 diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter5.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter5.json index d5d2ebfc08a..5785e035cd2 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter5.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/enchanter5.json @@ -8,150 +8,169 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 15 + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:1s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 15 + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:channeling\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:infinity\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:silk_touch\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:mending\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:multishot\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:2s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 15 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:2s}]}" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -162,7 +181,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -173,7 +192,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -184,7 +203,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -195,7 +214,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -206,7 +225,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -217,7 +236,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -228,7 +247,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -239,7 +258,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -250,7 +269,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecolonies:raider_damage_enchant\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", @@ -261,204 +280,197 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:3s}]}" } ], "name": "minecraft:enchanted_book", - "weight": 5 + "weight": 15 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:infinity\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:swift_sneak\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:soul_speed\",lvl:3s}]}" } ], - "name": "minecraft:enchanted_book", - "weight": 5 + "name": "minecraft:enchanted_book" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -469,7 +481,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -480,7 +492,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -491,7 +503,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -502,7 +514,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:4s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book", @@ -513,117 +525,128 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:2s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:aqua_affinity\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:depth_strider\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_aspect\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:flame\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:frost_walker\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:4s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 5 }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:infinity\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book" @@ -633,7 +656,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:knockback\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:riptide\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book" @@ -643,7 +666,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:looting\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:loyalty\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book" @@ -653,7 +676,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:mending\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:thorns\",lvl:4s}]}" } ], "name": "minecraft:enchanted_book" @@ -663,7 +686,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:multishot\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -673,7 +696,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:blast_protection\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -683,7 +706,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:efficiency\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -693,7 +716,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:feather_falling\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -703,7 +726,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:punch\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:fire_protection\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -713,7 +736,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:quick_charge\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:power\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -723,7 +746,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:respiration\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:projectile_protection\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -733,7 +756,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:protection\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -743,7 +766,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:silk_touch\",lvl:1s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:piercing\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -753,7 +776,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:sharpness\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -763,7 +786,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:sweeping\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:smite\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -773,7 +796,7 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:unbreaking\",lvl:5s}]}" + "tag": "{StoredEnchantments:[{id:\"minecraft:impaling\",lvl:5s}]}" } ], "name": "minecraft:enchanted_book" @@ -783,10 +806,11 @@ "functions": [ { "function": "minecraft:set_nbt", - "tag": "{StoredEnchantments:[{id:\"minecraft:fortune\",lvl:3s}]}" + "tag": "{StoredEnchantments:[{id:\"minecolonies:raider_damage_enchant\",lvl:1s}]}" } ], - "name": "minecraft:enchanted_book" + "name": "minecraft:enchanted_book", + "weight": 15 }, { "type": "minecraft:item", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/glass_bottle.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/glass_bottle.json new file mode 100644 index 00000000000..8900cd00819 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/glass_bottle.json @@ -0,0 +1,22 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "quality": -1, + "weight": 100 + }, + { + "type": "minecraft:item", + "name": "minecraft:glass_bottle", + "quality": 1, + "weight": 0 + } + ], + "name": "minecolonies:recipes/glass_bottle", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/gravel.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/gravel.json new file mode 100644 index 00000000000..51dc7872fa8 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/gravel.json @@ -0,0 +1,20 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:empty", + "weight": 90 + }, + { + "type": "minecraft:item", + "name": "minecraft:flint", + "weight": 10 + } + ], + "name": "minecolonies:recipes/gravel", + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip3.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip3.json index 96a44ab38f9..d38d4480782 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip3.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip3.json @@ -262,6 +262,19 @@ ], "name": "minecraft:warped_stem", "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecraft:ochre_froglight", + "weight": 2 + }, + { + "type": "minecraft:item", + "name": "minecraft:pearlescent_froglight" + }, + { + "type": "minecraft:item", + "name": "minecraft:verdant_froglight" } ], "name": "blocks", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip4.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip4.json index ca11a78b507..5283f7836af 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip4.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip4.json @@ -263,6 +263,19 @@ "name": "minecraft:warped_stem", "weight": 5 }, + { + "type": "minecraft:item", + "name": "minecraft:ochre_froglight", + "weight": 2 + }, + { + "type": "minecraft:item", + "name": "minecraft:pearlescent_froglight" + }, + { + "type": "minecraft:item", + "name": "minecraft:verdant_froglight" + }, { "type": "minecraft:item", "functions": [ diff --git a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip5.json b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip5.json index 9c50ac202da..b1800b8c551 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip5.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/loot_tables/recipes/netherworker/trip5.json @@ -263,6 +263,19 @@ "name": "minecraft:warped_stem", "weight": 5 }, + { + "type": "minecraft:item", + "name": "minecraft:ochre_froglight", + "weight": 2 + }, + { + "type": "minecraft:item", + "name": "minecraft:pearlescent_froglight" + }, + { + "type": "minecraft:item", + "name": "minecraft:verdant_froglight" + }, { "type": "minecraft:item", "functions": [ diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/general/hungrycourier.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/general/hungrycourier.json new file mode 100644 index 00000000000..7a920666875 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/general/hungrycourier.json @@ -0,0 +1,130 @@ +{ + "max-occurrences": 10, + "name": "minecolonies.quests.general.hungrycourier", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + } + ], + "text": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1.reply.answer0", + "result": { + "type": "minecolonies:return" + } + } + ], + "text": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply.answer1.reply" + } + } + ], + "text": "minecolonies.quests.general.hungrycourier.obj0.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.general.hungrycourier.obj0.answer1", + "result": { + "type": "minecolonies:cancel" + } + } + ], + "target": 0, + "text": "minecolonies.quests.general.hungrycourier.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecraft:baked_potato", + "next-objective": 2, + "qty": 1, + "target": 0 + }, + "unlocks-rewards": [ + 0, + 1 + ] + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.hungrycourier.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "target": 0, + "text": "minecolonies.quests.general.hungrycourier.obj2" + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecraft:gold_ingot", + "qty": 1 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 1, + "target": 0 + } + } + ], + "triggers": [ + { + "type": "minecolonies:random", + "rarity": 1000 + }, + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:warehouse", + "level": 3 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:deliveryman" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/general/thezombiemenace.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/general/thezombiemenace.json new file mode 100644 index 00000000000..dd8eea0382e --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/general/thezombiemenace.json @@ -0,0 +1,106 @@ +{ + "max-occurrences": 5, + "name": "minecolonies.quests.general.thezombiemenace", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.thezombiemenace.obj0.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.thezombiemenace.obj0.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + } + ], + "text": "minecolonies.quests.general.thezombiemenace.obj0.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.general.thezombiemenace.obj0.answer1", + "result": { + "type": "minecolonies:cancel" + } + } + ], + "target": 0, + "text": "minecolonies.quests.general.thezombiemenace.obj0" + }, + { + "type": "minecolonies:killentity", + "details": { + "entity-type": "minecraft:zombie", + "next-objective": 2, + "qty": 10, + "target": 0 + }, + "unlocks-rewards": [ + 0, + 1 + ] + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.general.thezombiemenace.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "target": 0, + "text": "minecolonies.quests.general.thezombiemenace.obj2" + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecraft:diamond", + "qty": 1 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 1, + "target": 0 + } + } + ], + "triggers": [ + { + "type": "minecolonies:random", + "rarity": 500 + }, + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:guardtower", + "level": 2 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:knight" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/buildergoggles.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/buildergoggles.json new file mode 100644 index 00000000000..bb8f6e23f45 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/buildergoggles.json @@ -0,0 +1,84 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.guides.buildergoggles", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.buildergoggles.obj0.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.guides.buildergoggles.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.buildergoggles.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecolonies:build_goggles", + "next-objective": 2, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.buildergoggles.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.buildergoggles.obj2", + "unlocks-rewards": [ + 0 + ] + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecolonies:build_goggles", + "qty": 1 + } + } + ], + "triggers": [ + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:builder", + "level": 2 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:builder" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/clipboard.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/clipboard.json new file mode 100644 index 00000000000..9f3249c0e2d --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/clipboard.json @@ -0,0 +1,91 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.guides.clipboard", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.clipboard.obj0.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.guides.clipboard.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + }, + { + "answer": "minecolonies.quests.guides.clipboard.obj0.answer2", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": -1 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.clipboard.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecolonies:clipboard", + "next-objective": 2, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.clipboard.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.clipboard.obj2", + "unlocks-rewards": [ + 0 + ] + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecolonies:clipboard", + "qty": 1 + } + } + ], + "triggers": [ + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:warehouse", + "level": 1 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:deliveryman" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/rallybanner.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/rallybanner.json new file mode 100644 index 00000000000..8ec3e53fde2 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/rallybanner.json @@ -0,0 +1,135 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.guides.rallybanner", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.rallybanner.obj0.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.guides.rallybanner.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + }, + { + "answer": "minecolonies.quests.guides.rallybanner.obj0.answer2", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.guides.rallybanner.obj0.answer3", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": -1 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.rallybanner.obj0" + }, + { + "type": "minecolonies:killentity", + "details": { + "entity-type": "minecraft:skeleton", + "next-objective": 2, + "qty": 10, + "target": 0 + } + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.rallybanner.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": -1 + } + }, + { + "answer": "minecolonies.quests.guides.rallybanner.obj2.answer1", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + }, + { + "answer": "minecolonies.quests.guides.rallybanner.obj2.answer2", + "result": { + "type": "minecolonies:return" + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.rallybanner.obj2" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecolonies:banner_rally_guards", + "nbt-mode": "any", + "next-objective": 4, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.rallybanner.obj4.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 5 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.rallybanner.obj4", + "unlocks-rewards": [ + 0 + ] + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecolonies:banner_rally_guards", + "qty": 1 + } + } + ], + "triggers": [ + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:barracks", + "level": 1 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:ranger" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/resourcescroll.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/resourcescroll.json new file mode 100644 index 00000000000..f146d51f1bb --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/guides/resourcescroll.json @@ -0,0 +1,91 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.guides.resourcescroll", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.resourcescroll.obj0.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.guides.resourcescroll.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + }, + { + "answer": "minecolonies.quests.guides.resourcescroll.obj0.answer2", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": -1 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.resourcescroll.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecolonies:resourcescroll", + "next-objective": 2, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.guides.resourcescroll.obj2.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "target": 0, + "text": "minecolonies.quests.guides.resourcescroll.obj2", + "unlocks-rewards": [ + 0 + ] + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecolonies:resourcescroll", + "qty": 1 + } + } + ], + "triggers": [ + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:builder", + "level": 1 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:builder" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/aromanticgesture.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/aromanticgesture.json new file mode 100644 index 00000000000..b6d2e377911 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/aromanticgesture.json @@ -0,0 +1,139 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.romance.aromanticgesture", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj0.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1.reply.answer0", + "result": { + "type": "minecolonies:cancel" + } + } + ], + "text": "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply.answer1.reply" + } + } + ], + "text": "minecolonies.quests.romance.aromanticgesture.obj0.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + } + ], + "target": 0, + "text": "minecolonies.quests.romance.aromanticgesture.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecraft:poppy", + "next-objective": 2, + "qty": 1, + "target": 1 + }, + "unlocks-rewards": [ + 0, + 1, + 2 + ] + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj2.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.aromanticgesture.obj2.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 3 + } + } + ], + "text": "minecolonies.quests.romance.aromanticgesture.obj2.answer0.reply" + } + } + ], + "target": 1, + "text": "minecolonies.quests.romance.aromanticgesture.obj2" + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecraft:diamond", + "qty": 1 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 2, + "target": 0 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 2, + "target": 1 + } + } + ], + "triggers": [ + { + "type": "minecolonies:random", + "rarity": 1 + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:deliveryman" + } + } + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:baker" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/atokenofapp.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/atokenofapp.json new file mode 100644 index 00000000000..9b56fa57833 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/romance/atokenofapp.json @@ -0,0 +1,146 @@ +{ + "max-occurrences": 1, + "name": "minecolonies.quests.romance.atokenofapp", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj0.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1.reply.answer0", + "result": { + "type": "minecolonies:return" + } + } + ], + "text": "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply.answer1.reply" + } + } + ], + "text": "minecolonies.quests.romance.atokenofapp.obj0.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.romance.atokenofapp.obj0.answer1", + "result": { + "type": "minecolonies:cancel" + } + } + ], + "target": 0, + "text": "minecolonies.quests.romance.atokenofapp.obj0" + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj1.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj1.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 2 + } + } + ], + "text": "minecolonies.quests.romance.atokenofapp.obj1.answer0.reply" + } + } + ], + "target": 1, + "text": "minecolonies.quests.romance.atokenofapp.obj1" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecraft:dandelion", + "next-objective": 3, + "qty": 1, + "target": 1 + }, + "unlocks-rewards": [ + 0, + 1 + ] + }, + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.romance.atokenofapp.obj3.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 4 + } + } + ], + "target": 0, + "text": "minecolonies.quests.romance.atokenofapp.obj3" + } + ], + "parents": [ + "minecolonies:aromanticgesture" + ], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecraft:emerald", + "qty": 1 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 2, + "target": 0 + } + } + ], + "triggers": [ + { + "type": "minecolonies:random", + "rarity": 1 + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "finpartquests": [ + "aromanticgesture" + ] + } + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "job": { + "type": "minecolonies:knight" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/quests/template/questtemplate.json b/src/datagen/generated/minecolonies/data/minecolonies/quests/template/questtemplate.json new file mode 100644 index 00000000000..f7339d8d004 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/quests/template/questtemplate.json @@ -0,0 +1,230 @@ +{ + "max-occurrences": 20, + "name": "minecolonies.quests.template.questtemplate", + "objectives": [ + { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 1 + } + }, + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer1", + "result": { + "type": "minecolonies:return" + } + }, + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer2", + "result": { + "type": "minecolonies:cancel" + } + }, + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3", + "result": { + "type": "minecolonies:dialogue", + "options": [ + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3.reply.answer0", + "result": { + "type": "minecolonies:advanceobjective", + "go-to": 2 + } + } + ], + "text": "minecolonies.quests.template.questtemplate.obj0.answer0.reply.answer3.reply" + } + } + ], + "text": "minecolonies.quests.template.questtemplate.obj0.answer0.reply" + } + }, + { + "answer": "minecolonies.quests.template.questtemplate.obj0.answer1", + "result": { + "type": "minecolonies:return" + } + } + ], + "target": 0, + "text": "minecolonies.quests.template.questtemplate.obj0" + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecraft:apple", + "next-objective": 3, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:delivery", + "details": { + "item": "minecraft:baked_potato", + "next-objective": 3, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:breakblock", + "details": { + "block": "minecraft:dirt", + "next-objective": 4, + "qty": 10, + "target": 0 + } + }, + { + "type": "minecolonies:placeblock", + "details": { + "block": "minecraft:dirt", + "next-objective": 5, + "qty": 10, + "target": 0 + }, + "unlocks-rewards": [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + }, + { + "type": "minecolonies:killentity", + "details": { + "entity-type": "minecraft:skeleton", + "next-objective": 6, + "qty": 10, + "target": 0 + } + }, + { + "type": "minecolonies:buildbuilding", + "details": { + "type": "minecolonies:builder", + "count-existing": false, + "lvl": 3, + "qty": 1, + "target": 0 + } + } + ], + "parents": [], + "rewards": [ + { + "type": "minecolonies:item", + "details": { + "item": "minecraft:gold_ingot", + "qty": 1 + } + }, + { + "type": "minecolonies:skill", + "details": { + "qty": 1, + "skill": "Strength", + "target": 0 + } + }, + { + "type": "minecolonies:research", + "details": { + "id": "this" + } + }, + { + "type": "minecolonies:raid", + "details": { + "change": -1 + } + }, + { + "type": "minecolonies:relationship", + "details": { + "type": "couple", + "target1": 0, + "target2": 1 + } + }, + { + "type": "minecolonies:happiness", + "details": { + "days": 7, + "qty": 1, + "target": 0 + } + }, + { + "type": "minecolonies:questreputation", + "details": { + "qty": 0.5 + } + }, + { + "type": "minecolonies:unlockquest", + "details": { + "id": "minecolonies:questtemplate" + } + } + ], + "triggerOrder": "6 && ((1 && 4) || (2 && 4 && 1) || (1 && 3 && 4)) && 5", + "triggers": [ + { + "type": "minecolonies:random", + "rarity": 0 + }, + { + "type": "minecolonies:state", + "state": { + "match": { + "type": "minecolonies:townhall", + "level": 3 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:state", + "state": { + "count": 3, + "match": { + "type": "minecolonies:guardtower", + "level": 3 + }, + "path": "buildingManager/buildings" + } + }, + { + "type": "minecolonies:citizen", + "state": { + "match": { + "female": true, + "job": { + "type": "minecolonies:knight" + } + } + } + }, + { + "type": "minecolonies:questreputation", + "qty": 0.5 + }, + { + "type": "minecolonies:unlock" + } + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutnetherworker.json b/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutnetherworker.json new file mode 100644 index 00000000000..af85ce3eeef --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutnetherworker.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "B": { + "item": "minecraft:obsidian" + }, + "T": { + "item": "structurize:sceptergold" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "pattern": [ + "XTX", + "XBX", + "XXX" + ], + "result": { + "item": "minecolonies:blockhutnetherworker" + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutplantationfield.json b/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutplantationfield.json new file mode 100644 index 00000000000..7be9a12c893 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/recipes/blockhutplantationfield.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "I": { + "item": "minecraft:iron_ingot" + }, + "P": { + "tag": "minecraft:planks" + }, + "S": { + "item": "minecraft:stick" + }, + "T": { + "item": "structurize:sceptergold" + } + }, + "pattern": [ + " T ", + "SIS", + "PPP" + ], + "result": { + "item": "minecolonies:blockhutplantationfield" + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/recipes/questlog.json b/src/datagen/generated/minecolonies/data/minecolonies/recipes/questlog.json new file mode 100644 index 00000000000..cae30dd27f1 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/recipes/questlog.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "L": { + "item": "minecraft:leather" + }, + "P": { + "item": "minecraft:paper" + }, + "T": { + "item": "structurize:sceptergold" + }, + "X": { + "item": "minecraft:stick" + } + }, + "pattern": [ + "XTX", + "LPL", + "XPX" + ], + "result": { + "item": "minecolonies:questlog" + } +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/city.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/city.json index f91dc48b54e..4f66730e3bf 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/city.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/city.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/citizencapaddition": 4 + "minecolonies:effects/citizencapaddition": 5 } ], "icon": "minecolonies:blockhutcitizen:200", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/hamlet.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/hamlet.json index 0d392686e1d..e6eb3e244bf 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/hamlet.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/hamlet.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/citizencapaddition": 2 + "minecolonies:effects/citizencapaddition": 3 } ], "icon": "minecolonies:blockhutcitizen:75", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/masks.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/masks.json index a69fe889971..51d979c897a 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/masks.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/masks.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/masks": 3 + "minecolonies:effects/masks": 1 } ], "icon": "minecolonies:textures/icons/research/hp4.png", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/outpost.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/outpost.json index 7ef5da90723..24c68f78e4f 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/outpost.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/outpost.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/citizencapaddition": 1 + "minecolonies:effects/citizencapaddition": 2 } ], "icon": "minecolonies:blockhutcitizen:50", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/vaccines.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/vaccines.json index 5f8bd1b1a51..2bc4ae25971 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/vaccines.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/vaccines.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/vaccines": 3 + "minecolonies:effects/vaccines": 1 } ], "icon": "minecolonies:textures/icons/research/hp5.png", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/village.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/village.json index e9c630cd373..253b375e359 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/village.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/civilian/village.json @@ -2,7 +2,7 @@ "branch": "minecolonies:civilian", "effects": [ { - "minecolonies:effects/citizencapaddition": 3 + "minecolonies:effects/citizencapaddition": 4 } ], "icon": "minecolonies:blockhutcitizen:100", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/standard.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/standard.json index b1f29ee40ae..0c2ec956957 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/standard.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/standard.json @@ -2,7 +2,7 @@ "branch": "minecolonies:combat", "effects": [ { - "minecolonies:effects/standard": 3 + "minecolonies:effects/standard": 1 } ], "icon": "minecolonies:banner_rally_guards", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/telescope.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/telescope.json index 0100bd8c949..08342d5f519 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/telescope.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/combat/telescope.json @@ -2,7 +2,7 @@ "branch": "minecolonies:combat", "effects": [ { - "minecolonies:effects/telescope": 3 + "minecolonies:effects/telescope": 1 } ], "icon": "minecolonies:banner_rally_guards", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/citizencapaddition.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/citizencapaddition.json index 915c343b69f..5ebc6210e46 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/citizencapaddition.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/citizencapaddition.json @@ -2,8 +2,9 @@ "effect": true, "levels": [ 25.0, - 75.0, - 125.0, - 1000.0 + 50.0, + 100.0, + 150.0, + 500.0 ] } \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/fleeingdamagemultiplier.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/fleeingdamagemultiplier.json index f3b1745d5d0..e34f2e275f9 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/fleeingdamagemultiplier.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/fleeingdamagemultiplier.json @@ -4,6 +4,6 @@ 0.2, 0.3, 0.4, - 1.0 + 0.75 ] } \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plant2unlock.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/knowledgeofthedepthsunlock.json similarity index 100% rename from src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plant2unlock.json rename to src/datagen/generated/minecolonies/data/minecolonies/researches/effects/knowledgeofthedepthsunlock.json diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationexotic.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationexotic.json new file mode 100644 index 00000000000..6126424df24 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationexotic.json @@ -0,0 +1,3 @@ +{ + "effect": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationjungle.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationjungle.json new file mode 100644 index 00000000000..6126424df24 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationjungle.json @@ -0,0 +1,3 @@ +{ + "effect": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationlarge.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationlarge.json new file mode 100644 index 00000000000..6126424df24 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationlarge.json @@ -0,0 +1,3 @@ +{ + "effect": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationnether.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationnether.json new file mode 100644 index 00000000000..6126424df24 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationnether.json @@ -0,0 +1,3 @@ +{ + "effect": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationsea.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationsea.json new file mode 100644 index 00000000000..6126424df24 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/effects/plantationsea.json @@ -0,0 +1,3 @@ +{ + "effect": true +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/croprotation.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/croprotation.json new file mode 100644 index 00000000000..0356d80b674 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/croprotation.json @@ -0,0 +1,26 @@ +{ + "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/plantationlarge": 1 + } + ], + "icon": "minecraft:green_dye", + "parentResearch": "minecolonies:technology/letitgrow", + "requirements": [ + { + "building": "plantation", + "level": 3 + }, + { + "item": "minecraft:sugar_cane", + "quantity": 32 + }, + { + "item": "minecraft:cactus", + "quantity": 32 + } + ], + "researchLevel": 3, + "subtitle": "com.minecolonies.research.technology.croprotation.subtitle" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/depthknowledge.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/depthknowledge.json index 3a016ce7031..81e8ab22472 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/depthknowledge.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/depthknowledge.json @@ -1,5 +1,10 @@ { "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/knowledgeofthedepthsunlock": 1 + } + ], "icon": "minecraft:cobbled_deepslate", "parentResearch": "minecolonies:technology/rockingroll", "requirements": [ diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/doubletrouble.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/doubletrouble.json deleted file mode 100644 index 3f2d495bb06..00000000000 --- a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/doubletrouble.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "branch": "minecolonies:technology", - "effects": [ - { - "minecolonies:effects/plant2unlock": 1 - } - ], - "icon": "minecraft:green_dye", - "parentResearch": "minecolonies:technology/letitgrow", - "requirements": [ - { - "building": "plantation", - "level": 3 - }, - { - "item": "minecraft:bamboo", - "quantity": 64 - }, - { - "item": "minecraft:sugar_cane", - "quantity": 64 - }, - { - "item": "minecraft:cactus", - "quantity": 64 - } - ], - "researchLevel": 3, - "subtitle": "com.minecolonies.research.technology.doubletrouble.subtitle" -} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/exoticfruits.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/exoticfruits.json new file mode 100644 index 00000000000..e578088d856 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/exoticfruits.json @@ -0,0 +1,22 @@ +{ + "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/plantationexotic": 1 + } + ], + "icon": "minecraft:glow_berries", + "parentResearch": "minecolonies:technology/letitgrow", + "requirements": [ + { + "building": "plantation", + "level": 3 + }, + { + "item": "minecraft:glow_berries", + "quantity": 32 + } + ], + "researchLevel": 3, + "subtitle": "com.minecolonies.research.technology.exoticfruits.subtitle" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/gargamel.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/gargamel.json new file mode 100644 index 00000000000..c27abd00103 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/gargamel.json @@ -0,0 +1,30 @@ +{ + "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/plantationnether": 1 + } + ], + "icon": "minecraft:crimson_fungus", + "parentResearch": "minecolonies:technology/croprotation", + "requirements": [ + { + "building": "plantation", + "level": 3 + }, + { + "building": "netherworker", + "level": 3 + }, + { + "item": "minecraft:crimson_fungus", + "quantity": 16 + }, + { + "item": "minecraft:warped_fungus", + "quantity": 16 + } + ], + "researchLevel": 4, + "subtitle": "com.minecolonies.research.technology.gargamel.subtitle" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/junglemaster.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/junglemaster.json new file mode 100644 index 00000000000..11697de65ae --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/junglemaster.json @@ -0,0 +1,30 @@ +{ + "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/plantationjungle": 1 + } + ], + "icon": "minecraft:vine", + "parentResearch": "minecolonies:technology/letitgrow", + "requirements": [ + { + "building": "plantation", + "level": 2 + }, + { + "item": "minecraft:bamboo", + "quantity": 16 + }, + { + "item": "minecraft:cocoa_beans", + "quantity": 16 + }, + { + "item": "minecraft:vine", + "quantity": 16 + } + ], + "researchLevel": 3, + "subtitle": "com.minecolonies.research.technology.junglemaster.subtitle" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/takingdivinglessons.json b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/takingdivinglessons.json new file mode 100644 index 00000000000..ca692c4f8a9 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/researches/technology/takingdivinglessons.json @@ -0,0 +1,30 @@ +{ + "branch": "minecolonies:technology", + "effects": [ + { + "minecolonies:effects/plantationsea": 1 + } + ], + "icon": "minecraft:kelp", + "parentResearch": "minecolonies:technology/letitgrow", + "requirements": [ + { + "building": "plantation", + "level": 2 + }, + { + "item": "minecraft:kelp", + "quantity": 16 + }, + { + "item": "minecraft:seagrass", + "quantity": 16 + }, + { + "item": "minecraft:sea_pickle", + "quantity": 16 + } + ], + "researchLevel": 3, + "subtitle": "com.minecolonies.research.technology.takingdivinglessons.subtitle" +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/mangrove_tree.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/mangrove_tree.json new file mode 100644 index 00000000000..d0c2d3a985a --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/mangrove_tree.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:mangrove_log", + "minecraft:mangrove_roots" + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/pathblocks.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/pathblocks.json index 184303f906c..55d98a0b218 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/pathblocks.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/pathblocks.json @@ -28,6 +28,9 @@ "minecraft:chiseled_nether_bricks", "minecraft:gravel", "minecraft:dirt_path", + "minecraft:mud_bricks", + "minecraft:mud_brick_slab", + "minecraft:mud_brick_stairs", "minecraft:smooth_stone", "minecraft:smooth_stone_slab", "minecraft:smooth_sandstone", diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/tree.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/tree.json new file mode 100644 index 00000000000..6bea0466019 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/blocks/tree.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#minecraft:logs", + "#minecolonies:mangrove_tree" + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/entity_types/raiders.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/entity_types/raiders.json new file mode 100644 index 00000000000..9c4e933a6a2 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/entity_types/raiders.json @@ -0,0 +1,19 @@ +{ + "values": [ + "minecolonies:barbarian", + "minecolonies:archerbarbarian", + "minecolonies:chiefbarbarian", + "minecolonies:amazon", + "minecolonies:amazonspearman", + "minecolonies:amazonchief", + "minecolonies:mummy", + "minecolonies:archermummy", + "minecolonies:pharao", + "minecolonies:pirate", + "minecolonies:archerpirate", + "minecolonies:chiefpirate", + "minecolonies:shieldmaiden", + "minecolonies:norsemenarcher", + "minecolonies:norsemenchief" + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/farmer_ingredient.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/farmer_ingredient.json index ea92d03cb4d..b69bf52df65 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/farmer_ingredient.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/farmer_ingredient.json @@ -1,5 +1,7 @@ { "values": [ - "minecraft:hay_block" + "minecraft:hay_block", + "minecraft:grass", + "minecraft:fern" ] } \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/ignore_nbt.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/ignore_nbt.json new file mode 100644 index 00000000000..c778ace29c3 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/ignore_nbt.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#minecraft:banners" + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_do_ingredient.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_do_ingredient.json new file mode 100644 index 00000000000..fe432724a71 --- /dev/null +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_do_ingredient.json @@ -0,0 +1,8 @@ +{ + "values": [ + "minecraft:stone", + "minecraft:netherrack", + "minecraft:prismarine", + "minecraft:dark_prismarine" + ] +} \ No newline at end of file diff --git a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_product_excluded.json b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_product_excluded.json index 8f7d626665c..76522de47e7 100644 --- a/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_product_excluded.json +++ b/src/datagen/generated/minecolonies/data/minecolonies/tags/items/stonemason_product_excluded.json @@ -5,6 +5,8 @@ "#minecraft:wooden_stairs", "minecraft:lectern", "minecraft:piston", + "minecraft:prismarine", + "minecraft:prismarine_bricks", "domum_ornamentum:paper_extra", "domum_ornamentum:white_paper_extra" ] diff --git a/src/datagen/generated/minecolonies/data/minecraft/tags/blocks/mineable/axe.json b/src/datagen/generated/minecolonies/data/minecraft/tags/blocks/mineable/axe.json index 842ab9efff6..e5de8485c99 100644 --- a/src/datagen/generated/minecolonies/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/datagen/generated/minecolonies/data/minecraft/tags/blocks/mineable/axe.json @@ -4,6 +4,7 @@ "minecolonies:blockminecoloniesrack", "minecolonies:gate_wood", "minecolonies:blockhutfield", + "minecolonies:blockhutplantationfield", "minecolonies:decorationcontroller", "minecolonies:colony_banner", "minecolonies:colony_wall_banner", diff --git a/src/main/java/com/minecolonies/apiimp/CommonMinecoloniesAPIImpl.java b/src/main/java/com/minecolonies/apiimp/CommonMinecoloniesAPIImpl.java index 7401c7b29c9..aa303619e16 100755 --- a/src/main/java/com/minecolonies/apiimp/CommonMinecoloniesAPIImpl.java +++ b/src/main/java/com/minecolonies/apiimp/CommonMinecoloniesAPIImpl.java @@ -8,6 +8,7 @@ import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventDescriptionTypeRegistryEntry; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventTypeRegistryEntry; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.colony.guardtype.GuardType; import com.minecolonies.api.colony.guardtype.registry.IGuardTypeDataManager; import com.minecolonies.api.colony.guardtype.registry.ModGuardTypes; @@ -20,7 +21,9 @@ import com.minecolonies.api.crafting.registry.CraftingType; import com.minecolonies.api.crafting.registry.RecipeTypeEntry; import com.minecolonies.api.entity.ai.registry.IMobAIRegistry; +import com.minecolonies.api.entity.citizen.happiness.HappinessRegistry; import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry; +import com.minecolonies.api.quests.registries.QuestRegistries; import com.minecolonies.api.research.IGlobalResearchTree; import com.minecolonies.api.research.effects.registry.ResearchEffectEntry; import com.minecolonies.api.research.registry.ResearchRequirementEntry; @@ -51,6 +54,7 @@ public class CommonMinecoloniesAPIImpl implements IMinecoloniesAPI private final IMobAIRegistry mobAIRegistry = new MobAIRegistry(); private final IPathNavigateRegistry pathNavigateRegistry = new PathNavigateRegistry(); private IForgeRegistry buildingRegistry; + private IForgeRegistry fieldRegistry; private final IBuildingDataManager buildingDataManager = new BuildingDataManager(); private final IJobDataManager jobDataManager = new JobDataManager(); private final IGuardTypeDataManager guardTypeDataManager = new com.minecolonies.coremod.colony.buildings.registry.GuardTypeDataManager(); @@ -65,6 +69,12 @@ public class CommonMinecoloniesAPIImpl implements IMinecoloniesAPI private IForgeRegistry researchEffectRegistry; private IForgeRegistry recipeTypeEntryRegistry; private IForgeRegistry craftingTypeRegistry; + private IForgeRegistry questObjectiveRegistry; + private IForgeRegistry questRewardRegistry; + private IForgeRegistry questTriggerRegistry; + private IForgeRegistry questDialogueAnswerRegistry; + private IForgeRegistry happinessFactorTypeRegistry; + private IForgeRegistry happinessFunctionRegistry; @Override @NotNull @@ -108,6 +118,13 @@ public IForgeRegistry getBuildingRegistry() return buildingRegistry; } + @Override + @NotNull + public IForgeRegistry getFieldRegistry() + { + return fieldRegistry; + } + @Override public IJobDataManager getJobDataManager() { @@ -169,77 +186,121 @@ public IGlobalResearchTree getGlobalResearchTree() } @Override - public IForgeRegistry getResearchRequirementRegistry() { return researchRequirementRegistry;} + public IForgeRegistry getResearchRequirementRegistry() {return researchRequirementRegistry;} @Override - public IForgeRegistry getResearchEffectRegistry() { return researchEffectRegistry;} + public IForgeRegistry getResearchEffectRegistry() {return researchEffectRegistry;} public void onRegistryNewRegistry(final NewRegistryEvent event) { event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "buildings")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving() - .allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> buildingRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "buildings")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving() + .allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> buildingRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "fields")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving() + .allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> fieldRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "jobs")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving() - .allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> jobRegistry = b); - - event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "guardtypes")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving() - .allowModification() - .setDefaultKey(ModGuardTypes.KNIGHT_ID) - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> guardTypeRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "jobs")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving() + .allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> jobRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "guardtypes")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving() + .allowModification() + .setDefaultKey(ModGuardTypes.KNIGHT_ID) + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> guardTypeRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "interactionresponsehandlers")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving() - .allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> interactionHandlerRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "interactionresponsehandlers")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving() + .allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> interactionHandlerRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "colonyeventtypes")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> colonyEventRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "colonyeventtypes")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> colonyEventRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "colonyeventdesctypes")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> colonyEventDescriptionRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "colonyeventdesctypes")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> colonyEventDescriptionRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "craftingtypes")) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> craftingTypeRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "craftingtypes")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> craftingTypeRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "recipetypeentries")) - .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "classic")) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> recipeTypeEntryRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "recipetypeentries")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "classic")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> recipeTypeEntryRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "researchrequirementtypes")) - .setDefaultKey(RESEARCH_RESEARCH_REQ_ID) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> researchRequirementRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "researchrequirementtypes")) + .setDefaultKey(RESEARCH_RESEARCH_REQ_ID) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> researchRequirementRegistry = b); event.create(new RegistryBuilder() - .setName(new ResourceLocation(Constants.MOD_ID, "researcheffecttypes")) - .setDefaultKey(GLOBAL_EFFECT_ID) - .disableSaving().allowModification() - .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> researchEffectRegistry = b); + .setName(new ResourceLocation(Constants.MOD_ID, "researcheffecttypes")) + .setDefaultKey(GLOBAL_EFFECT_ID) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> researchEffectRegistry = b); + + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "questobjectives")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> questObjectiveRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "questrewards")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> questRewardRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "questtriggers")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> questTriggerRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "questanswerresults")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> questDialogueAnswerRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "happinessfactortypes")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> happinessFactorTypeRegistry = b); + + event.create(new RegistryBuilder() + .setName(new ResourceLocation(Constants.MOD_ID, "happinessfunction")) + .setDefaultKey(new ResourceLocation(Constants.MOD_ID, "null")) + .disableSaving().allowModification() + .setIDRange(0, Integer.MAX_VALUE - 1), (b) -> happinessFunctionRegistry = b); } @Override @@ -265,5 +326,41 @@ public IForgeRegistry getCraftingTypeRegistry() { return craftingTypeRegistry; } + + @Override + public IForgeRegistry getQuestRewardRegistry() + { + return questRewardRegistry; + } + + @Override + public IForgeRegistry getQuestObjectiveRegistry() + { + return questObjectiveRegistry; + } + + @Override + public IForgeRegistry getQuestTriggerRegistry() + { + return questTriggerRegistry; + } + + @Override + public IForgeRegistry getQuestDialogueAnswerRegistry() + { + return questDialogueAnswerRegistry; + } + + @Override + public IForgeRegistry getHappinessTypeRegistry() + { + return happinessFactorTypeRegistry; + } + + @Override + public IForgeRegistry getHappinessFunctionRegistry() + { + return happinessFunctionRegistry; + } } diff --git a/src/main/java/com/minecolonies/apiimp/initializer/EntityInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/EntityInitializer.java index e305e10d36b..4a62c9abd42 100644 --- a/src/main/java/com/minecolonies/apiimp/initializer/EntityInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/EntityInitializer.java @@ -2,7 +2,6 @@ import com.minecolonies.api.entity.MinecoloniesMinecart; import com.minecolonies.api.entity.ModEntities; -import com.minecolonies.api.entity.SpearEntity; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.entity.*; import com.minecolonies.coremod.entity.citizen.EntityCitizen; @@ -25,8 +24,8 @@ import com.minecolonies.coremod.entity.mobs.pirates.EntityPirate; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; @@ -45,7 +44,8 @@ public static void setupEntities(RegisterEvent event) { if (event.getRegistryKey().equals(ForgeRegistries.Keys.ENTITY_TYPES)) { - final @Nullable IForgeRegistry registry = event.getForgeRegistry(); + final @Nullable IForgeRegistry> registry = event.getForgeRegistry(); + ModEntities.CITIZEN = build(registry, "citizen", EntityType.Builder.of(EntityCitizen::new, MobCategory.CREATURE) .setTrackingRange(ENTITY_TRACKING_RANGE) @@ -205,7 +205,7 @@ public static void setupEntities(RegisterEvent event) } } - private static EntityType build(IForgeRegistry registry, final String key, final EntityType.Builder builder) + private static EntityType build(IForgeRegistry> registry, final String key, final EntityType.Builder builder) { EntityType entity = builder.build(Constants.MOD_ID + ":" + key); registry.register(new ResourceLocation(Constants.MOD_ID + ":" + key), entity); diff --git a/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java index f401b4503e5..32a73428727 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java @@ -7,6 +7,7 @@ import com.minecolonies.api.colony.interactionhandling.InteractionValidatorRegistry; import com.minecolonies.api.colony.requestsystem.request.RequestUtils; import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.entity.citizen.happiness.ITimeBasedHappinessModifier; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; @@ -15,11 +16,10 @@ import com.minecolonies.coremod.colony.buildings.workerbuildings.*; import com.minecolonies.coremod.colony.jobs.*; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIBasic; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; import com.minecolonies.coremod.util.WorkerUtil; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; import java.util.List; @@ -36,7 +36,6 @@ import static com.minecolonies.coremod.entity.ai.citizen.smelter.EntityAIWorkSmelter.ORE_LIST; import static com.minecolonies.coremod.util.WorkerUtil.getLastLadder; import static com.minecolonies.coremod.util.WorkerUtil.isThereCompostedLand; -import net.minecraftforge.common.capabilities.ForgeCapabilities; /** * Class containing initializer for all the validator predicates. @@ -101,33 +100,11 @@ public static void init() }); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO_FREE_FIELDS), - citizen -> citizen.getWorkBuilding() instanceof BuildingFarmer && ((BuildingFarmer) citizen.getWorkBuilding()).getFirstModuleOccurance(FarmerFieldModule.class).hasNoFields()); + citizen -> citizen.getWorkBuilding() instanceof BuildingFarmer && citizen.getWorkBuilding().getFirstModuleOccurance(FieldsModule.class).hasNoFields()); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(INVALID_MINESHAFT), citizen -> citizen.getWorkBuilding() instanceof BuildingMiner && citizen.getJob() instanceof JobMiner && (((BuildingMiner) citizen.getWorkBuilding()).getCobbleLocation() == null || ((BuildingMiner) citizen.getWorkBuilding()).getLadderLocation() == null)); - InteractionValidatorRegistry.registerPosBasedPredicate(Component.translatable(NO_SEED_SET), - (citizen, pos) -> - { - if (citizen.getJob() instanceof JobFarmer) - { - final IColony colony = citizen.getColony(); - if (colony != null) - { - final Level world = colony.getWorld(); - if (world != null) - { - final BlockEntity tileEntity = world.getBlockEntity(pos); - if (tileEntity instanceof ScarecrowTileEntity) - { - return ((ScarecrowTileEntity) tileEntity).getSeed() == null; - } - } - } - } - return false; - }); - InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_WORKER_INVENTORYFULLCHEST), citizen -> citizen.getWorkBuilding() != null && InventoryUtils.isProviderFull(citizen.getWorkBuilding())); InteractionValidatorRegistry.registerPosBasedPredicate( @@ -261,26 +238,26 @@ public static void init() citizen -> citizen.getJob() != null && ((AbstractEntityAIBasic) citizen.getJob().getWorkerAI()).getExceptionTimer() > 1); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(DEMANDS + HOMELESSNESS), - citizen -> (citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS).getDays() > DEMANDS_DAYS_WITHOUT_HOUSE && citizen.getHomeBuilding() == null); + citizen -> ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS)).getDays() > DEMANDS_DAYS_WITHOUT_HOUSE && citizen.getHomeBuilding() == null); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO + HOMELESSNESS), - citizen -> (citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS).getDays() > COMPLAIN_DAYS_WITHOUT_HOUSE - && (citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS).getDays() <= DEMANDS_DAYS_WITHOUT_HOUSE && citizen.getHomeBuilding() == null); + citizen -> ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS)).getDays() > COMPLAIN_DAYS_WITHOUT_HOUSE + && ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(HOMELESSNESS)).getDays() <= DEMANDS_DAYS_WITHOUT_HOUSE && citizen.getHomeBuilding() == null); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(DEMANDS + UNEMPLOYMENT), - citizen -> (citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT).getDays() > DEMANDS_DAYS_WITHOUT_JOB && citizen.getJob() == null); + citizen -> ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT)).getDays() > DEMANDS_DAYS_WITHOUT_JOB && citizen.getJob() == null); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO + UNEMPLOYMENT), - citizen -> (citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT).getDays() > COMPLAIN_DAYS_WITHOUT_JOB - && (citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT).getDays() <= DEMANDS_DAYS_WITHOUT_JOB && citizen.getJob() == null); + citizen -> ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT)).getDays() > COMPLAIN_DAYS_WITHOUT_JOB + && ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(UNEMPLOYMENT)).getDays() <= DEMANDS_DAYS_WITHOUT_JOB && citizen.getJob() == null); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(DEMANDS + IDLEATJOB), - citizen -> citizen.getJob() != null && (citizen.getCitizenHappinessHandler()).getModifier(IDLEATJOB).getDays() > citizen.getJob().getIdleSeverity(true)); + citizen -> citizen.getJob() != null && ((ITimeBasedHappinessModifier)(citizen.getCitizenHappinessHandler()).getModifier(IDLEATJOB)).getDays() > citizen.getJob().getIdleSeverity(true)); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO + IDLEATJOB), - citizen -> citizen.getJob() != null && citizen.getCitizenHappinessHandler().getModifier(IDLEATJOB).getDays() > citizen.getJob().getIdleSeverity(false) - && citizen.getCitizenHappinessHandler().getModifier(IDLEATJOB).getDays() <= citizen.getJob().getIdleSeverity(true)); + citizen -> citizen.getJob() != null && ((ITimeBasedHappinessModifier)citizen.getCitizenHappinessHandler().getModifier(IDLEATJOB)).getDays() > citizen.getJob().getIdleSeverity(false) + && ((ITimeBasedHappinessModifier)citizen.getCitizenHappinessHandler().getModifier(IDLEATJOB)).getDays() <= citizen.getJob().getIdleSeverity(true)); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO + SLEPTTONIGHT), - citizen -> !(citizen.getJob() instanceof AbstractJobGuard) && citizen.getCitizenHappinessHandler().getModifier(SLEPTTONIGHT).getDays() <= 0); + citizen -> !(citizen.getJob() instanceof AbstractJobGuard) && ((ITimeBasedHappinessModifier)citizen.getCitizenHappinessHandler().getModifier(SLEPTTONIGHT)).getDays() <= 0); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(COM_MINECOLONIES_COREMOD_BEEKEEPER_NOFLOWERS), citizen -> citizen.getWorkBuilding() instanceof BuildingBeekeeper diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModBlocksInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModBlocksInitializer.java index 3d0d5cb6b08..3fe557e78e0 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModBlocksInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModBlocksInitializer.java @@ -91,6 +91,7 @@ public static void init(final IForgeRegistry registry) ModBlocks.blockHutMechanic = new BlockHutMechanic().registerBlock(registry); ModBlocks.blockHutTavern = new BlockHutTavern().registerBlock(registry); ModBlocks.blockHutPlantation = new BlockHutPlantation().registerBlock(registry); + ModBlocks.blockPlantationField = new BlockPlantationField().registerBlock(registry); ModBlocks.blockHutRabbitHutch = new BlockHutRabbitHutch().registerBlock(registry); ModBlocks.blockHutConcreteMixer = new BlockHutConcreteMixer().registerBlock(registry); ModBlocks.blockHutBeekeeper = new BlockHutBeekeeper().registerBlock(registry); @@ -177,6 +178,7 @@ public static void registerBlockItem(final IForgeRegistry registry) ModBlocks.blockHutMechanic.registerBlockItem(registry, properties); ModBlocks.blockHutTavern.registerBlockItem(registry, properties); ModBlocks.blockHutPlantation.registerBlockItem(registry, properties); + ModBlocks.blockPlantationField.registerBlockItem(registry, properties); ModBlocks.blockHutRabbitHutch.registerBlockItem(registry, properties); ModBlocks.blockHutConcreteMixer.registerBlockItem(registry, properties); ModBlocks.blockHutBeekeeper.registerBlockItem(registry, properties); diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModBuildingsInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModBuildingsInitializer.java index aba971f8f26..7441659a017 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModBuildingsInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModBuildingsInitializer.java @@ -7,7 +7,6 @@ import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.guardtype.registry.ModGuardTypes; import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.compatibility.CompatibilityManager; import com.minecolonies.api.entity.citizen.Skill; import com.minecolonies.api.items.ModItems; import com.minecolonies.api.research.util.ResearchConstants; @@ -23,7 +22,8 @@ import com.minecolonies.coremod.colony.buildings.views.EmptyView; import com.minecolonies.coremod.colony.buildings.workerbuildings.*; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.entity.animal.Rabbit; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -31,7 +31,7 @@ import static com.minecolonies.api.util.constant.BuildingConstants.BUILDING_FLOWER_LIST; import static com.minecolonies.api.util.constant.BuildingConstants.FUEL_LIST; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_HOSTILES; import static com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards.HOSTILE_LIST; import static com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingCook.FOOD_EXCLUSION_LIST; import static com.minecolonies.coremod.entity.ai.citizen.composter.EntityAIWorkComposter.COMPOSTABLE_LIST; @@ -55,7 +55,7 @@ private ModBuildingsInitializer() .setBuildingViewProducer(() -> EmptyView::new) .setRegistryName(new ResourceLocation(Constants.MOD_ID, ModBuildings.ARCHERY_ID)) .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) - .addBuildingModuleProducer(() -> new WorkAtHomeBuildingModule(ModJobs.archer.get(), Skill.Agility, Skill.Adaptability, false, ISchematicProvider::getBuildingLevel), () -> ArcherSquireModuleView::new) + .addBuildingModuleProducer(() -> new WorkAtHomeBuildingModule(ModJobs.archerInTraining.get(), Skill.Agility, Skill.Adaptability, false, ISchematicProvider::getBuildingLevel), () -> ArcherSquireModuleView::new) .addBuildingModuleProducer(BedHandlingModule::new) .createBuildingEntry()); @@ -97,10 +97,10 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(() -> new EntityListModule(HOSTILE_LIST), () -> () -> new EntityListModuleView(HOSTILE_LIST, COM_MINECOLONIES_HOSTILES, true)) .addBuildingModuleProducer(() -> new SettingsModule() .with(AbstractBuildingGuards.GUARD_TASK, new GuardTaskSetting(GuardTaskSetting.PATROL, GuardTaskSetting.GUARD, GuardTaskSetting.FOLLOW)) + .with(AbstractBuildingGuards.PATROL_MODE, new GuardPatrolModeSetting()) + .with(AbstractBuildingGuards.FOLLOW_MODE, new GuardFollowModeSetting()) .with(AbstractBuildingGuards.RETREAT, new BoolSetting(true)) - .with(AbstractBuildingGuards.HIRE_TRAINEE, new BoolSetting(true)) - .with(AbstractBuildingGuards.PATROL_MODE, new PatrolModeSetting()) - .with(AbstractBuildingGuards.FOLLOW_MODE, new FollowModeSetting()), () -> SettingsModuleView::new) + .with(AbstractBuildingGuards.HIRE_TRAINEE, new BoolSetting(true)), () -> SettingsModuleView::new) .createBuildingEntry()); ModBuildings.blacksmith = DEFERRED_REGISTER.register(ModBuildings.BLACKSMITH_ID, () -> new BuildingEntry.Builder() @@ -149,7 +149,7 @@ private ModBuildingsInitializer() .setBuildingProducer(BuildingCombatAcademy::new) .setBuildingViewProducer(() -> EmptyView::new) .setRegistryName(new ResourceLocation(Constants.MOD_ID, ModBuildings.COMBAT_ACADEMY_ID)) - .addBuildingModuleProducer(() -> new WorkAtHomeBuildingModule(ModJobs.combat.get(), Skill.Adaptability, Skill.Stamina, false, ISchematicProvider::getBuildingLevel), () -> KnightSquireBuildingModuleView::new) + .addBuildingModuleProducer(() -> new WorkAtHomeBuildingModule(ModJobs.knightInTraining.get(), Skill.Adaptability, Skill.Stamina, false, ISchematicProvider::getBuildingLevel), () -> KnightSquireBuildingModuleView::new) .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .addBuildingModuleProducer(BedHandlingModule::new) .createBuildingEntry()); @@ -193,9 +193,10 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .addBuildingModuleProducer(() -> new SettingsModule().with(AbstractBuilding.BREEDING, new BoolSetting(true)) .with(AbstractBuilding.FEEDING, new BoolSetting(true)) - .with(BuildingCowboy.MILKING, new BoolSetting(false)), () -> SettingsModuleView::new) - .addBuildingModuleProducer(() -> new AnimalHerdingModule(ModJobs.cowboy.get(), EntityType.COW, new ItemStack(Items.WHEAT, 2))) - .addBuildingModuleProducer(BuildingCowboy.MilkingModule::new) + .with(BuildingCowboy.MILKING_AMOUNT, new IntSetting(1)) + .with(BuildingCowboy.STEWING_AMOUNT, new IntSetting(1)) + .with(BuildingCowboy.MILKING_DAYS, new IntSetting(1)), () -> SettingsModuleView::new) + .addBuildingModuleProducer(BuildingCowboy.HerdingModule::new) .createBuildingEntry()); ModBuildings.crusher = DEFERRED_REGISTER.register(ModBuildings.CRUSHER_ID, () -> new BuildingEntry.Builder() @@ -225,13 +226,13 @@ private ModBuildingsInitializer() .setBuildingProducer(BuildingFarmer::new) .setBuildingViewProducer(() -> EmptyView::new) .setRegistryName(new ResourceLocation(Constants.MOD_ID, ModBuildings.FARMER_ID)) + .addBuildingModuleProducer(() -> new CraftingWorkerBuildingModule(ModJobs.farmer.get(), Skill.Stamina, Skill.Athletics, false, b -> 1), () -> WorkerBuildingModuleView::new) .addBuildingModuleProducer(() -> new BuildingFarmer.CraftingModule(ModJobs.farmer.get()), () -> CraftingModuleView::new) - .addBuildingModuleProducer(() -> new FarmerAssignmentModule(ModJobs.farmer.get(), Skill.Stamina, Skill.Athletics, false, (b) -> 1), () -> WorkerBuildingModuleView::new) .addBuildingModuleViewProducer(() -> CrafterTaskModuleView::new) + .addBuildingModuleProducer(BuildingFarmer.FarmerFieldsModule::new, () -> BuildingFarmer.FarmerFieldsModuleView::new) .addBuildingModuleProducer(() -> new SettingsModule() .with(BuildingFarmer.FERTILIZE, new BoolSetting(true)) .with(AbstractCraftingBuildingModule.RECIPE_MODE, new CrafterRecipeSetting()), () -> SettingsModuleView::new) - .addBuildingModuleProducer(FarmerFieldModule::new, () -> FarmerFieldModuleView::new) .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .createBuildingEntry()); @@ -258,10 +259,10 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(() -> new EntityListModule(HOSTILE_LIST), () -> () -> new EntityListModuleView(HOSTILE_LIST, COM_MINECOLONIES_HOSTILES, true)) .addBuildingModuleProducer(() -> new SettingsModule() .with(AbstractBuildingGuards.GUARD_TASK, new GuardTaskSetting()) + .with(AbstractBuildingGuards.PATROL_MODE, new GuardPatrolModeSetting()) + .with(AbstractBuildingGuards.FOLLOW_MODE, new GuardFollowModeSetting()) .with(AbstractBuildingGuards.RETREAT, new BoolSetting(true)) - .with(AbstractBuildingGuards.HIRE_TRAINEE, new BoolSetting(true)) - .with(AbstractBuildingGuards.PATROL_MODE, new PatrolModeSetting()) - .with(AbstractBuildingGuards.FOLLOW_MODE, new FollowModeSetting()), () -> SettingsModuleView::new) + .with(AbstractBuildingGuards.HIRE_TRAINEE, new BoolSetting(true)), () -> SettingsModuleView::new) .createBuildingEntry()); ModBuildings.home = DEFERRED_REGISTER.register(ModBuildings.HOME_ID, () -> new BuildingEntry.Builder() @@ -286,7 +287,7 @@ private ModBuildingsInitializer() ModBuildings.lumberjack = DEFERRED_REGISTER.register(ModBuildings.LUMBERJACK_ID, () -> new BuildingEntry.Builder() .setBuildingBlock(ModBlocks.blockHutLumberjack) .setBuildingProducer(BuildingLumberjack::new) - .setBuildingViewProducer(() -> EmptyView::new) + .setBuildingViewProducer(() -> BuildingLumberjack.View::new) .setRegistryName(new ResourceLocation(Constants.MOD_ID, ModBuildings.LUMBERJACK_ID)) .addBuildingModuleProducer(() -> new BuildingLumberjack.CraftingModule(ModJobs.lumberjack.get()), () -> CraftingModuleView::new) .addBuildingModuleProducer(() -> new ItemListModule(SAPLINGS_LIST), () -> () -> new ItemListModuleView(SAPLINGS_LIST, RequestSystemTranslationConstants.REQUESTS_TYPE_SAPLINGS, true, @@ -411,7 +412,7 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .addBuildingModuleProducer(() -> new SettingsModule().with(AbstractBuilding.BREEDING, new BoolSetting(true)) .with(AbstractBuilding.FEEDING, new BoolSetting(true)), () -> SettingsModuleView::new) - .addBuildingModuleProducer(() -> new AnimalHerdingModule(ModJobs.swineHerder.get(), EntityType.PIG, new ItemStack(Items.CARROT, 2))) + .addBuildingModuleProducer(() -> new AnimalHerdingModule(ModJobs.swineHerder.get(), a -> a instanceof Pig, new ItemStack(Items.CARROT, 2))) .createBuildingEntry()); ModBuildings.townHall = DEFERRED_REGISTER.register(ModBuildings.TOWNHALL_ID, () -> new BuildingEntry.Builder() @@ -567,14 +568,8 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(() -> new CraftingWorkerBuildingModule(ModJobs.planter.get(), Skill.Agility, Skill.Dexterity, false, (b) -> 1), () -> WorkerBuildingModuleView::new) .addBuildingModuleProducer(() -> new BuildingPlantation.CraftingModule(ModJobs.planter.get()), () -> CraftingModuleView::new) .addBuildingModuleViewProducer(() -> CrafterTaskModuleView::new) + .addBuildingModuleProducer(BuildingPlantation.PlantationFieldsModule::new, () -> BuildingPlantation.PlantationFieldsModuleView::new) .addBuildingModuleProducer(() -> new SettingsModule() - .with(BuildingPlantation.MODE, new PlantationSetting( - Items.SUGAR_CANE.getDescriptionId(), - Items.CACTUS.getDescriptionId(), - Items.BAMBOO.getDescriptionId(), - PlantationSetting.SUGAR_CANE_AND_CACTUS, - PlantationSetting.CACTUS_AND_BAMBOO, - PlantationSetting.BAMBOO_AND_SUGAR_CANE)) .with(AbstractCraftingBuildingModule.RECIPE_MODE, new CrafterRecipeSetting()), () -> SettingsModuleView::new) .createBuildingEntry()); @@ -587,7 +582,7 @@ private ModBuildingsInitializer() .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .addBuildingModuleProducer(() -> new SettingsModule().with(AbstractBuilding.BREEDING, new BoolSetting(true)) .with(AbstractBuilding.FEEDING, new BoolSetting(true)), () -> SettingsModuleView::new) - .addBuildingModuleProducer(() -> new AnimalHerdingModule(ModJobs.rabbitHerder.get(), EntityType.RABBIT, new ItemStack(Items.CARROT, 2))) + .addBuildingModuleProducer(() -> new AnimalHerdingModule(ModJobs.rabbitHerder.get(), a -> a instanceof Rabbit, new ItemStack(Items.CARROT, 2))) .createBuildingEntry()); //todo we want two here, one custom for the concrete placement, and one crafting for the normal crafting of the powder. @@ -605,7 +600,7 @@ private ModBuildingsInitializer() ModBuildings.beekeeper = DEFERRED_REGISTER.register(ModBuildings.BEEKEEPER_ID, () -> new BuildingEntry.Builder() .setBuildingBlock(ModBlocks.blockHutBeekeeper) .setBuildingProducer(BuildingBeekeeper::new) - .setBuildingViewProducer(() -> EmptyView::new) + .setBuildingViewProducer(() -> BuildingBeekeeper.View::new) .setRegistryName(new ResourceLocation(Constants.MOD_ID, ModBuildings.BEEKEEPER_ID)) .addBuildingModuleProducer(MinimumStockModule::new, () -> MinimumStockModuleView::new) .addBuildingModuleProducer(() -> new WorkerBuildingModule(ModJobs.beekeeper.get(), Skill.Dexterity, Skill.Adaptability, false, (b) -> 1), () -> WorkerBuildingModuleView::new) @@ -613,7 +608,7 @@ private ModBuildingsInitializer() .with(AbstractBuilding.BREEDING, new BoolSetting(true)) .with(BuildingBeekeeper.MODE, new BeekeeperCollectionSetting(BuildingBeekeeper.HONEYCOMB, BuildingBeekeeper.HONEY, BuildingBeekeeper.BOTH)), () -> SettingsModuleView::new) .addBuildingModuleProducer(() -> new ItemListModule(BUILDING_FLOWER_LIST), () -> () -> new ItemListModuleView(BUILDING_FLOWER_LIST, RequestSystemTranslationConstants.REQUEST_TYPE_FLOWERS, false, - (buildingView) -> CompatibilityManager.getAllBeekeeperFlowers())) + (buildingView) -> IColonyManager.getInstance().getCompatibilityManager().getImmutableFlowers())) .addBuildingModuleViewProducer(() -> () -> new ToolModuleView(ModItems.scepterBeekeeper)) .addBuildingModuleProducer(BuildingBeekeeper.HerdingModule::new) .createBuildingEntry()); diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModContainerInitializers.java b/src/main/java/com/minecolonies/apiimp/initializer/ModContainerInitializers.java index c6dcec26536..4ba6a84ad38 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModContainerInitializers.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModContainerInitializers.java @@ -16,8 +16,7 @@ @Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ModContainerInitializers { - public final static DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, Constants.MOD_ID); - + public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, Constants.MOD_ID); static { ModContainers.craftingFurnace = CONTAINERS.register("crafting_furnace", () -> IForgeMenuType.create(ContainerCraftingFurnace::fromFriendlyByteBuf)); @@ -26,10 +25,8 @@ public class ModContainerInitializers ModContainers.craftingGrid = CONTAINERS.register("crafting_building", () -> IForgeMenuType.create(ContainerCrafting::fromFriendlyByteBuf)); ModContainers.rackInv = CONTAINERS.register("rack_inv", () -> IForgeMenuType.create(ContainerRack::fromFriendlyByteBuf)); ModContainers.graveInv = CONTAINERS.register("grave_inv", () -> IForgeMenuType.create(ContainerGrave::fromFriendlyByteBuf)); - ModContainers.field = CONTAINERS.register("field", () -> IForgeMenuType.create(ContainerField::fromFriendlyByteBuf)); ModContainers.craftingBrewingstand = CONTAINERS.register("crafting_brewingstand", () -> IForgeMenuType.create(ContainerCraftingBrewingstand::fromFriendlyByteBuf)); - } - + } @SubscribeEvent public static void doClientStuff(final FMLClientSetupEvent event) { @@ -41,6 +38,5 @@ public static void doClientStuff(final FMLClientSetupEvent event) MenuScreens.register(ModContainers.citizenInv.get(), WindowCitizenInventory::new); MenuScreens.register(ModContainers.rackInv.get(), WindowRack::new); MenuScreens.register(ModContainers.graveInv.get(), WindowGrave::new); - MenuScreens.register(ModContainers.field.get(), WindowField::new); } } diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModFieldsInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModFieldsInitializer.java new file mode 100644 index 00000000000..110dd8b68eb --- /dev/null +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModFieldsInitializer.java @@ -0,0 +1,88 @@ +package com.minecolonies.apiimp.initializer; + +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific.*; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.colony.fields.PlantationField; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Consumer; + +public final class ModFieldsInitializer +{ + public static final DeferredRegister DEFERRED_REGISTER = + DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "fields"), Constants.MOD_ID); + static + { + FieldRegistries.farmField = createEntry(FieldRegistries.FARM_FIELD_ID, + builder -> builder.setFieldProducer(FarmField::new)); + + FieldRegistries.plantationSugarCaneField = createEntry(FieldRegistries.PLANTATION_SUGAR_CANE_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new SugarCanePlantModule(field, "sugar_field", "sugar", Items.SUGAR_CANE))); + + FieldRegistries.plantationCactusField = createEntry(FieldRegistries.PLANTATION_CACTUS_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new CactusPlantModule(field, "cactus_field", "cactus", Items.CACTUS))); + + FieldRegistries.plantationBambooField = createEntry(FieldRegistries.PLANTATION_BAMBOO_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new BambooPlantModule(field, "bamboo_field", "bamboo", Items.BAMBOO))); + + FieldRegistries.plantationCocoaBeansField = createEntry(FieldRegistries.PLANTATION_COCOA_BEANS_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new CocoaPlantModule(field, "cocoa_field", "cocoa", Items.COCOA_BEANS))); + + FieldRegistries.plantationVinesField = createEntry(FieldRegistries.PLANTATION_VINES_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new VinePlantModule(field, "vine_field", "vine", Items.VINE))); + + FieldRegistries.plantationKelpField = createEntry(FieldRegistries.PLANTATION_KELP_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new KelpPlantModule(field, "kelp_field", "kelp", Items.KELP))); + + FieldRegistries.plantationSeagrassField = createEntry(FieldRegistries.PLANTATION_SEAGRASS_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new SeagrassPlantModule(field, "seagrass_field", "seagrass", Items.SEAGRASS))); + + FieldRegistries.plantationSeaPicklesField = createEntry(FieldRegistries.PLANTATION_SEA_PICKLES_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new SeapicklePlantModule(field, "seapickle_field", "seapickle", Items.SEA_PICKLE))); + + FieldRegistries.plantationGlowberriesField = createEntry(FieldRegistries.PLANTATION_GLOWBERRIES_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new GlowBerriesPlantModule(field, "glowb_field", "glowb_vine", Items.GLOW_BERRIES))); + + FieldRegistries.plantationWeepingVinesField = createEntry(FieldRegistries.PLANTATION_WEEPING_VINES_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new WeepingVinesPlantModule(field, "weepv_field", "weepv_vine", Items.WEEPING_VINES))); + + FieldRegistries.plantationTwistingVinesField = createEntry(FieldRegistries.PLANTATION_TWISTING_VINES_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new TwistingVinesPlantModule(field, "twistv_field", "twistv_vine", Items.TWISTING_VINES))); + + FieldRegistries.plantationCrimsonPlantsField = createEntry(FieldRegistries.PLANTATION_CRIMSON_PLANTS_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new CrimsonPlantsPlantModule(field, "crimsonp_field", "crimsonp_ground", Items.CRIMSON_FUNGUS))); + + FieldRegistries.plantationWarpedPlantsField = createEntry(FieldRegistries.PLANTATION_WARPED_PLANTS_FIELD_ID, + builder -> builder.setFieldProducer(PlantationField::new) + .addFieldModuleProducer(field -> new WarpedPlantsPlantModule(field, "warpedp_field", "warpedp_ground", Items.WARPED_FUNGUS))); + } + private ModFieldsInitializer() + { + throw new IllegalStateException("Tried to initialize: ModFieldsInitializer but this is a Utility class."); + } + + private static RegistryObject createEntry(ResourceLocation registryName, Consumer builder) + { + FieldRegistries.FieldEntry.Builder field = new FieldRegistries.FieldEntry.Builder() + .setRegistryName(registryName); + builder.accept(field); + return DEFERRED_REGISTER.register(registryName.getPath(), field::createFieldEntry); + } +} diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModGuardTypesInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModGuardTypesInitializer.java index 86d008d39cc..b43a55534dd 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModGuardTypesInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModGuardTypesInitializer.java @@ -1,6 +1,5 @@ package com.minecolonies.apiimp.initializer; -import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.guardtype.GuardType; import com.minecolonies.api.colony.guardtype.registry.ModGuardTypes; import com.minecolonies.api.colony.jobs.ModJobs; @@ -11,8 +10,6 @@ import com.minecolonies.coremod.colony.jobs.JobDruid; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.IForgeRegistry; -import net.minecraftforge.registries.RegisterEvent; import static com.minecolonies.api.util.constant.translation.JobTranslationConstants.*; @@ -44,7 +41,7 @@ private ModGuardTypesInitializer() .setPrimarySkill(Skill.Agility) .setSecondarySkill(Skill.Adaptability) .setWorkerSoundName("archer") - .setJobEntry(() -> ModJobs.ranger.get()) + .setJobEntry(() -> ModJobs.archer.get()) .setRegistryName(ModGuardTypes.RANGER_ID) .setClazz(JobRanger.class) .createGuardType()); diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java new file mode 100755 index 00000000000..087a310b9b6 --- /dev/null +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java @@ -0,0 +1,54 @@ +package com.minecolonies.apiimp.initializer; + +import com.minecolonies.api.entity.citizen.happiness.ExpirationBasedHappinessModifier; +import com.minecolonies.api.entity.citizen.happiness.HappinessRegistry; +import com.minecolonies.api.entity.citizen.happiness.StaticHappinessModifier; +import com.minecolonies.api.entity.citizen.happiness.TimeBasedHappinessModifier; +import com.minecolonies.api.util.Tuple; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; +import com.minecolonies.coremod.colony.jobs.JobPupil; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.DeferredRegister; + +import static com.minecolonies.api.entity.citizen.happiness.HappinessRegistry.*; +import static com.minecolonies.api.util.constant.HappinessConstants.*; +import static com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenHappinessHandler.*; + +/** + * Happiness factory initializer of the values. + */ +public final class ModHappinessFactorTypeInitializer +{ + public final static DeferredRegister DEFERRED_REGISTER_HAPPINESS_FACTOR = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "happinessfactortypes"), Constants.MOD_ID); + public final static DeferredRegister DEFERRED_REGISTER_HAPPINESS_FUNCTION = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "happinessfunction"), Constants.MOD_ID); + + private ModHappinessFactorTypeInitializer() + { + throw new IllegalStateException("Tried to initialize: ModHappinessFactorTypeInitializer but this is a Utility class."); + } + + static + { + HappinessRegistry.staticHappinessModifier = DEFERRED_REGISTER_HAPPINESS_FACTOR.register(STATIC_MODIFIER.getPath(), () -> new HappinessFactorTypeEntry(StaticHappinessModifier::new)); + + HappinessRegistry.expirationBasedHappinessModifier = DEFERRED_REGISTER_HAPPINESS_FACTOR.register(EXPIRATION_MODIFIER.getPath(), () -> new HappinessFactorTypeEntry(ExpirationBasedHappinessModifier::new)); + + HappinessRegistry.timeBasedHappinessModifier = DEFERRED_REGISTER_HAPPINESS_FACTOR.register(TIME_PERIOD_MODIFIER.getPath(), () -> new HappinessFactorTypeEntry(TimeBasedHappinessModifier::new)); + + + HappinessRegistry.schoolFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SCHOOL_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.isChild() ? data.getJob() instanceof JobPupil ? 2.0 : 0.0 : 1.0)); + HappinessRegistry.securityFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SECURITY_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> getGuardFactor(data.getColony()))); + HappinessRegistry.socialFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SOCIAL_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> getSocialModifier(data.getColony()))); + HappinessRegistry.saturationFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SATURATION_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> (data.getSaturation() + 5.0) / 10.0)); + HappinessRegistry.mysticalSiteFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(MYSTICAL_SITE_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> getMysticalSiteFactor(data.getColony()))); + + HappinessRegistry.housingFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(HOUSING_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getHomeBuilding() == null ? 0.0 : data.getHomeBuilding().getBuildingLevel() / 3.0)); + HappinessRegistry.unemploymentFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(UNEMPLOYMENT_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.isChild() ? 1.0 : (data.getWorkBuilding() == null ? 0.5 : data.getWorkBuilding().getBuildingLevel() > 3 ? 2.0 : 1.0))); + HappinessRegistry.healthFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(HEALTH_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getEntity().isPresent() ? (data.getEntity().get().getCitizenDiseaseHandler().isSick() ? 0.5 : 1.0) : 1.0)); + HappinessRegistry.idleatjobFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(IDLEATJOB_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.isIdleAtJob() ? 0.5 : 1.0)); + + HappinessRegistry.sleptTonightFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SLEPTTONIGHT_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getJob() instanceof AbstractJobGuard ? 1 : 0.0)); + + } +} diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModInteractionsInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModInteractionsInitializer.java index 7502743b154..d022d61b82b 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModInteractionsInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModInteractionsInitializer.java @@ -3,10 +3,7 @@ import com.minecolonies.api.colony.interactionhandling.ModInteractionResponseHandlers; import com.minecolonies.api.colony.interactionhandling.registry.InteractionResponseHandlerEntry; import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.coremod.colony.interactionhandling.PosBasedInteraction; -import com.minecolonies.coremod.colony.interactionhandling.RecruitmentInteraction; -import com.minecolonies.coremod.colony.interactionhandling.RequestBasedInteraction; -import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; +import com.minecolonies.coremod.colony.interactionhandling.*; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.DeferredRegister; @@ -45,5 +42,15 @@ private ModInteractionsInitializer() .setResponseHandlerProducer(RecruitmentInteraction::new) .setRegistryName(ModInteractionResponseHandlers.RECRUITMENT) .createEntry()); + + ModInteractionResponseHandlers.quest = DEFERRED_REGISTER.register(ModInteractionResponseHandlers.QUEST.getPath(), () -> new InteractionResponseHandlerEntry.Builder() + .setResponseHandlerProducer(QuestDialogueInteraction::new) + .setRegistryName(ModInteractionResponseHandlers.QUEST) + .createEntry()); + + ModInteractionResponseHandlers.questAction = DEFERRED_REGISTER.register(ModInteractionResponseHandlers.QUEST_ACTION.getPath(), () -> new InteractionResponseHandlerEntry.Builder() + .setResponseHandlerProducer(QuestDeliveryInteraction::new) + .setRegistryName(ModInteractionResponseHandlers.QUEST_ACTION) + .createEntry()); } } diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModItemsInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModItemsInitializer.java index 76de060b278..1f2c94c908d 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModItemsInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModItemsInitializer.java @@ -75,6 +75,7 @@ public static void init(final IForgeRegistry registry) ModItems.scepterBeekeeper = new ItemScepterBeekeeper(new Item.Properties()); ModItems.mistletoe = new ItemMistletoe(new Item.Properties()); ModItems.spear = new ItemSpear(new Item.Properties()); + ModItems.questLog = new ItemQuestLog(new Item.Properties()); ModItems.breadDough = new ItemBreadDough(new Item.Properties()); ModItems.cookieDough = new ItemCookieDough(new Item.Properties()); @@ -130,8 +131,10 @@ public static void init(final IForgeRegistry registry) ModItems.magicpotion = new ItemMagicPotion("magicpotion", ModCreativeTabs.MINECOLONIES, new Item.Properties()); ModItems.buildGoggles = new ItemBuildGoggles("build_goggles", ModCreativeTabs.MINECOLONIES, new Item.Properties()); + ModItems.scanAnalyzer = new ItemScanAnalyzer("scan_analyzer", ModCreativeTabs.MINECOLONIES, new Item.Properties()); registry.register(new ResourceLocation(Constants.MOD_ID, "supplychestdeployer"), ModItems.supplyChest); + registry.register(new ResourceLocation(Constants.MOD_ID, "scan_analyzer"), ModItems.scanAnalyzer); registry.register(new ResourceLocation(Constants.MOD_ID, "scepterpermission"), ModItems.permTool); registry.register(new ResourceLocation(Constants.MOD_ID, "scepterguard"), ModItems.scepterGuard); registry.register(new ResourceLocation(Constants.MOD_ID, "banner_rally_guards"), ModItems.bannerRallyGuards); @@ -148,6 +151,7 @@ public static void init(final IForgeRegistry registry) registry.register(new ResourceLocation(Constants.MOD_ID, "scepterbeekeeper"), ModItems.scepterBeekeeper); registry.register(new ResourceLocation(Constants.MOD_ID, "mistletoe"), ModItems.mistletoe); registry.register(new ResourceLocation(Constants.MOD_ID, "spear"), ModItems.spear); + registry.register(new ResourceLocation(Constants.MOD_ID, "questlog"), ModItems.questLog); registry.register(new ResourceLocation(Constants.MOD_ID, "bread_dough"), ModItems.breadDough); registry.register(new ResourceLocation(Constants.MOD_ID, "cookie_dough"), ModItems.cookieDough); diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModJobsInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModJobsInitializer.java index 07d8928982b..9b536e66242 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModJobsInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModJobsInitializer.java @@ -114,10 +114,10 @@ private ModJobsInitializer() .setRegistryName(ModJobs.SMELTER_ID) .createJobEntry()); - ModJobs.ranger = register(DEFERRED_REGISTER, ModJobs.RANGER_ID.getPath(), () -> new JobEntry.Builder() + ModJobs.archer = register(DEFERRED_REGISTER, ModJobs.ARCHER_ID.getPath(), () -> new JobEntry.Builder() .setJobProducer(JobRanger::new) .setJobViewProducer(() -> DefaultJobView::new) - .setRegistryName(ModJobs.RANGER_ID) + .setRegistryName(ModJobs.ARCHER_ID) .createJobEntry()); ModJobs.knight = register(DEFERRED_REGISTER, ModJobs.KNIGHT_ID.getPath(), () -> new JobEntry.Builder() @@ -138,16 +138,16 @@ private ModJobsInitializer() .setRegistryName(ModJobs.STUDENT_ID) .createJobEntry()); - ModJobs.archer = register(DEFERRED_REGISTER, ModJobs.ARCHER_ID.getPath(), () -> new JobEntry.Builder() + ModJobs.archerInTraining = register(DEFERRED_REGISTER, ModJobs.ARCHER_TRAINING_ID.getPath(), () -> new JobEntry.Builder() .setJobProducer(JobArcherTraining::new) .setJobViewProducer(() -> DefaultJobView::new) - .setRegistryName(ModJobs.ARCHER_ID) + .setRegistryName(ModJobs.ARCHER_TRAINING_ID) .createJobEntry()); - ModJobs.combat = register(DEFERRED_REGISTER, ModJobs.COMBAT_ID.getPath(), () -> new JobEntry.Builder() + ModJobs.knightInTraining = register(DEFERRED_REGISTER, ModJobs.KNIGHT_TRAINING_ID.getPath(), () -> new JobEntry.Builder() .setJobProducer(JobCombatTraining::new) .setJobViewProducer(() -> DefaultJobView::new) - .setRegistryName(ModJobs.COMBAT_ID) + .setRegistryName(ModJobs.KNIGHT_TRAINING_ID) .createJobEntry()); ModJobs.sawmill = register(DEFERRED_REGISTER, ModJobs.SAWMILL_ID.getPath(), () -> new JobEntry.Builder() diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModQuestInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModQuestInitializer.java new file mode 100755 index 00000000000..414adb8804e --- /dev/null +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModQuestInitializer.java @@ -0,0 +1,72 @@ +package com.minecolonies.apiimp.initializer; + +import com.minecolonies.api.quests.IDialogueObjectiveTemplate; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.registries.QuestRegistries; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.quests.objectives.*; +import com.minecolonies.coremod.quests.objectives.DialogueObjectiveTemplateTemplate; +import com.minecolonies.coremod.quests.objectives.KillEntityObjectiveTemplateTemplate; +import com.minecolonies.coremod.quests.rewards.*; +import com.minecolonies.coremod.quests.triggers.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.DeferredRegister; + +import static com.minecolonies.api.quests.registries.QuestRegistries.*; + +public final class ModQuestInitializer +{ + public final static DeferredRegister + DEFERRED_REGISTER_OBJECTIVE = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "questobjectives"), Constants.MOD_ID); + + public final static DeferredRegister + DEFERRED_REGISTER_TRIGGER = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "questtriggers"), Constants.MOD_ID); + + public final static DeferredRegister + DEFERRED_REGISTER_REWARD = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "questrewards"), Constants.MOD_ID); + + public final static DeferredRegister + DEFERRED_REGISTER_ANSWER_RESULT = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "questanswerresults"), Constants.MOD_ID); + + + private ModQuestInitializer() + { + throw new IllegalStateException("Tried to initialize: ModQuestInitializer but this is a Utility class."); + } + + static + { + QuestRegistries.deliveryObjective = DEFERRED_REGISTER_OBJECTIVE.register(DELIVERY_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + DeliveryObjectiveTemplateTemplate::createObjective)); + QuestRegistries.dialogueObjective = DEFERRED_REGISTER_OBJECTIVE.register(DIALOGUE_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + DialogueObjectiveTemplateTemplate::createObjective)); + QuestRegistries.killEntityObjective = DEFERRED_REGISTER_OBJECTIVE.register(KILLENTITY_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + KillEntityObjectiveTemplateTemplate::createObjective)); + QuestRegistries.breakBlockObjective = DEFERRED_REGISTER_OBJECTIVE.register(BREAKBLOCK_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + BreakBlockObjectiveTemplate::createObjective)); + QuestRegistries.placeBlockObjective = DEFERRED_REGISTER_OBJECTIVE.register(PLACEBLOCK_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + PlaceBlockObjectiveTemplate::createObjective)); + QuestRegistries.buildBuildingObjective = DEFERRED_REGISTER_OBJECTIVE.register(BUILD_BUILDING_OBJECTIVE_ID.getPath(), () -> new QuestRegistries.ObjectiveEntry( + BuildBuildingObjectiveTemplate::createObjective)); + + QuestRegistries.randomTrigger = DEFERRED_REGISTER_TRIGGER.register(RANDOM_TRIGGER_ID.getPath(), () -> new QuestRegistries.TriggerEntry(RandomQuestTriggerTemplate::createStateTrigger)); + QuestRegistries.stateTrigger = DEFERRED_REGISTER_TRIGGER.register(STATE_TRIGGER_ID.getPath(), () -> new QuestRegistries.TriggerEntry(StateQuestTriggerTemplate::createStateTrigger)); + QuestRegistries.citizenTrigger = DEFERRED_REGISTER_TRIGGER.register(CITIZEN_TRIGGER_ID.getPath(), () -> new QuestRegistries.TriggerEntry(CitizenQuestTriggerTemplate::createStateTrigger)); + QuestRegistries.unlockTrigger = DEFERRED_REGISTER_TRIGGER.register(UNLOCK_TRIGGER_ID.getPath(), () -> new QuestRegistries.TriggerEntry(UnlockQuestTriggerTemplate::createUnlockTrigger)); + QuestRegistries.questReputationTrigger = DEFERRED_REGISTER_TRIGGER.register(QUEST_REPUTATION_TRIGGER_ID.getPath(), () -> new QuestRegistries.TriggerEntry(QuestReputationTriggerTemplate::createQuestReputationTrigger)); + + QuestRegistries.itemReward = DEFERRED_REGISTER_REWARD.register(ITEM_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(ItemRewardTemplate::createReward)); + QuestRegistries.skillReward = DEFERRED_REGISTER_REWARD.register(SKILL_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(SkillRewardTemplate::createReward)); + QuestRegistries.researchReward = DEFERRED_REGISTER_REWARD.register(RESEARCH_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(ResearchCompleteRewardTemplate::createReward)); + QuestRegistries.raidReward = DEFERRED_REGISTER_REWARD.register(RAID_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(RaidAdjustmentRewardTemplate::createReward)); + QuestRegistries.relationshipReward = DEFERRED_REGISTER_REWARD.register(RELATIONSHIP_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(RelationshipRewardTemplate::createReward)); + QuestRegistries.happinessReward = DEFERRED_REGISTER_REWARD.register(HAPPINESS_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(HappinessRewardTemplate::createReward)); + QuestRegistries.unlockQuestReward = DEFERRED_REGISTER_REWARD.register(UNLOCK_QUEST_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(UnlockQuestRewardTemplate::createReward)); + QuestRegistries.questReputationReward = DEFERRED_REGISTER_REWARD.register(QUEST_REPUTATION_REWARD_ID.getPath(), () -> new QuestRegistries.RewardEntry(QuestReputationRewardTemplate::createReward)); + + QuestRegistries.dialogueAnswerResult = DEFERRED_REGISTER_ANSWER_RESULT.register(DIALOGUE_ANSWER_ID.getPath(), () -> new QuestRegistries.DialogueAnswerEntry(IDialogueObjectiveTemplate.DialogueElement::parse)); + QuestRegistries.returnAnswerResult = DEFERRED_REGISTER_ANSWER_RESULT.register(RETURN_ANSWER_ID.getPath(), () -> new QuestRegistries.DialogueAnswerEntry(json -> new IQuestDialogueAnswer.CloseUIDialogueAnswer())); + QuestRegistries.gotoAnswerResult = DEFERRED_REGISTER_ANSWER_RESULT.register(GOTO_ANSWER_ID.getPath(), () -> new QuestRegistries.DialogueAnswerEntry(IQuestDialogueAnswer.NextObjectiveDialogueAnswer::new)); + QuestRegistries.cancelAnswerResult = DEFERRED_REGISTER_ANSWER_RESULT.register(CANCEL_ANSWER_ID.getPath(), () -> new QuestRegistries.DialogueAnswerEntry(json -> new IQuestDialogueAnswer.QuestCancellationDialogueAnswer())); + } +} diff --git a/src/main/java/com/minecolonies/apiimp/initializer/TileEntityInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/TileEntityInitializer.java index b21b719bfa8..c5c86eaa490 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/TileEntityInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/TileEntityInitializer.java @@ -14,7 +14,9 @@ public class TileEntityInitializer static { - MinecoloniesTileEntities.SCARECROW = BLOCK_ENTITIES.register("scarecrow", () -> BlockEntityType.Builder.of(ScarecrowTileEntity::new, ModBlocks.blockScarecrow).build(null)); + MinecoloniesTileEntities.SCARECROW = BLOCK_ENTITIES.register("scarecrow", () -> BlockEntityType.Builder.of(TileEntityScarecrow::new, ModBlocks.blockScarecrow).build(null)); + + MinecoloniesTileEntities.PLANTATION_FIELD = BLOCK_ENTITIES.register("plantationfield", () -> BlockEntityType.Builder.of(TileEntityPlantationField::new, ModBlocks.blockPlantationField).build(null)); MinecoloniesTileEntities.BARREL = BLOCK_ENTITIES.register("barrel", () -> BlockEntityType.Builder.of(TileEntityBarrel::new, ModBlocks.blockBarrel).build(null)); diff --git a/src/main/java/com/minecolonies/coremod/MineColonies.java b/src/main/java/com/minecolonies/coremod/MineColonies.java index 72e7cbb234e..1f055e2da5d 100755 --- a/src/main/java/com/minecolonies/coremod/MineColonies.java +++ b/src/main/java/com/minecolonies/coremod/MineColonies.java @@ -9,8 +9,9 @@ import com.minecolonies.api.enchants.ModEnchants; import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderMobUtils; +import com.minecolonies.api.items.ModBannerPatterns; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.loot.ModLootConditions; import com.minecolonies.api.sounds.ModSoundEvents; @@ -31,7 +32,6 @@ import com.minecolonies.coremod.structures.MineColoniesStructures; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.TextureStitchEvent; @@ -78,6 +78,7 @@ public MineColonies() ModEnchants.ENCHANTMENTS.register(FMLJavaModLoadingContext.get().getModEventBus()); ModContainerInitializers.CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus()); ModBuildingsInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModFieldsInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); ModGuardTypesInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); ModColonyEventDescriptionTypeInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); ModResearchRequirementInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); @@ -91,6 +92,15 @@ public MineColonies() ModSoundEvents.SOUND_EVENTS.register(FMLJavaModLoadingContext.get().getModEventBus()); ModInteractionsInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); ModResearchEffectInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModBannerPatterns.BANNER_PATTERNS.register(FMLJavaModLoadingContext.get().getModEventBus()); + + ModQuestInitializer.DEFERRED_REGISTER_OBJECTIVE.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModQuestInitializer.DEFERRED_REGISTER_TRIGGER.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModQuestInitializer.DEFERRED_REGISTER_REWARD.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModQuestInitializer.DEFERRED_REGISTER_ANSWER_RESULT.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModHappinessFactorTypeInitializer.DEFERRED_REGISTER_HAPPINESS_FACTOR.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModHappinessFactorTypeInitializer.DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(FMLJavaModLoadingContext.get().getModEventBus()); + ModEnchantInitializer.init(); @@ -168,21 +178,21 @@ public static void createEntityAttribute(final EntityAttributeCreationEvent even event.put(ModEntities.CITIZEN, AbstractEntityCitizen.getDefaultAttributes().build()); event.put(ModEntities.VISITOR, AbstractEntityCitizen.getDefaultAttributes().build()); event.put(ModEntities.MERCENARY, EntityMercenary.getDefaultAttributes().build()); - event.put(ModEntities.BARBARIAN, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.ARCHERBARBARIAN, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.CHIEFBARBARIAN, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.PHARAO, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.MUMMY, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.ARCHERMUMMY, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.PIRATE, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.ARCHERPIRATE, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.CHIEFPIRATE, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.AMAZON, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.AMAZONSPEARMAN, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.AMAZONCHIEF, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.NORSEMEN_ARCHER, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.NORSEMEN_CHIEF, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); - event.put(ModEntities.SHIELDMAIDEN, AbstractEntityMinecoloniesMob.getDefaultAttributes().build()); + event.put(ModEntities.BARBARIAN, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.ARCHERBARBARIAN, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.CHIEFBARBARIAN, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.PHARAO, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.MUMMY, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.ARCHERMUMMY, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.PIRATE, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.ARCHERPIRATE, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.CHIEFPIRATE, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.AMAZON, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.AMAZONSPEARMAN, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.AMAZONCHIEF, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.NORSEMEN_ARCHER, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.NORSEMEN_CHIEF, AbstractEntityRaiderMob.getDefaultAttributes().build()); + event.put(ModEntities.SHIELDMAIDEN, AbstractEntityRaiderMob.getDefaultAttributes().build()); } /** @@ -205,7 +215,18 @@ public static void onLoadComplete(final FMLLoadCompleteEvent event) @SubscribeEvent public static void onConfigReload(final ModConfigEvent.Reloading event) { - if (event.getConfig().getType() == ModConfig.Type.SERVER) + if (event.getConfig().getType() == ModConfig.Type.COMMON) + { + // ModConfig fires for each of server, client, and common. + // Request Systems logging only really needs to be changed on the server, and this reduced log spam. + RequestSystemInitializer.reconfigureLogging(); + } + } + + @SubscribeEvent + public static void onConfigLoaded(final ModConfigEvent.Loading event) + { + if (event.getConfig().getType() == ModConfig.Type.COMMON) { // ModConfig fires for each of server, client, and common. // Request Systems logging only really needs to be changed on the server, and this reduced log spam. diff --git a/src/main/java/com/minecolonies/coremod/blocks/BlockDecorationController.java b/src/main/java/com/minecolonies/coremod/blocks/BlockDecorationController.java index 26ed5a2772b..094c687c72d 100755 --- a/src/main/java/com/minecolonies/coremod/blocks/BlockDecorationController.java +++ b/src/main/java/com/minecolonies/coremod/blocks/BlockDecorationController.java @@ -2,11 +2,10 @@ import com.ldtteam.structurize.blocks.interfaces.IAnchorBlock; import com.ldtteam.structurize.blocks.interfaces.ILeveledBlueprintAnchorBlock; -import com.minecolonies.api.blocks.AbstractBlockMinecoloniesHorizontal; +import com.minecolonies.api.blocks.AbstractBlockMinecoloniesDirectional; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.entity.ai.citizen.builder.IBuilderUndestroyable; -import com.minecolonies.api.tileentities.TileEntityColonyBuilding; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.tileentities.TileEntityDecorationController; @@ -16,6 +15,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.entity.player.Player; @@ -24,6 +25,9 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -41,16 +45,17 @@ import net.minecraft.world.level.block.Rotation; import java.util.ArrayList; +import java.util.List; import static com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE.TAG_BLUEPRINTDATA; import static com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE.TAG_SCHEMATIC_NAME; +import static com.minecolonies.api.blocks.decorative.AbstractBlockMinecoloniesConstructionTape.WATERLOGGED; import static com.minecolonies.api.util.constant.BuildingConstants.LEISURE; /** * Creates a decoration controller block. */ -public class BlockDecorationController extends AbstractBlockMinecoloniesHorizontal implements IBuilderUndestroyable, IAnchorBlock, EntityBlock, - ILeveledBlueprintAnchorBlock +public class BlockDecorationController extends AbstractBlockMinecoloniesDirectional implements IBuilderUndestroyable, IAnchorBlock, EntityBlock, ILeveledBlueprintAnchorBlock, SimpleWaterloggedBlock { /** * The hardness this block has. @@ -75,18 +80,25 @@ public class BlockDecorationController extends AbstractBlockMinecoloniesHorizont /** * The bounding boxes. */ - protected static final VoxelShape AABB_SOUTH = Shapes.box(0.25D, 0.314D, 0.97D, 0.75D, 0.86D, 1.0D); + protected static final VoxelShape AABB_SOUTH = Shapes.box(0.25D, 0.314D, 0.7D, 0.75D, 0.86D, 1.0D); protected static final VoxelShape AABB_NORTH = Shapes.box(0.25D, 0.314D, 0.0D, 0.75D, 0.86D, 0.3D); - protected static final VoxelShape AABB_EAST = Shapes.box(0.97D, 0.314D, 0.25D, 1.0D, 0.86D, 0.75D); + + + protected static final VoxelShape AABB_EAST = Shapes.box(0.7D, 0.314D, 0.25D, 1.0D, 0.86D, 0.75D); protected static final VoxelShape AABB_WEST = Shapes.box(0.0D, 0.314D, 0.25D, 0.3D, 0.86D, 0.75D); + + + protected static final VoxelShape AABB_UP = Shapes.box(0.25D, 0.7D, 0.14D, 0.75D, 1.0D, 0.686D); + protected static final VoxelShape AABB_DOWN = Shapes.box(0.25D, 0.0D, 0.314D, 0.75D, 0.3D, 0.86D); + /** * Constructor for the deco controller. */ public BlockDecorationController() { super(Properties.of(Material.WOOD).strength(BLOCK_HARDNESS, RESISTANCE).noCollission()); - this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(MIRROR, false)); + this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(MIRROR, false).setValue(WATERLOGGED, false)); } @Override @@ -96,21 +108,53 @@ public ResourceLocation getRegistryName() } @Override - public VoxelShape getShape(final BlockState state, final BlockGetter worldIn, final BlockPos pos, final CollisionContext context) + public VoxelShape getShape(final BlockState decoController, final BlockGetter level, final BlockPos pos, final CollisionContext context) { - Direction Direction = state.getValue(FACING); - switch (Direction) + final Direction direction = decoController.getValue(BlockDecorationController.FACING); + final BlockPos offsetPos = pos.relative(direction); + final BlockState state = level.getBlockState(offsetPos); + final VoxelShape shape = state.getShape(level, offsetPos); + if (shape.isEmpty() || Block.isShapeFullBlock(shape)) { - case EAST: - return AABB_EAST; - case WEST: - return AABB_WEST; - case SOUTH: - return AABB_SOUTH; - case NORTH: - default: - return AABB_NORTH; + return switch (direction) + { + case EAST -> AABB_EAST; + case WEST -> AABB_WEST; + case SOUTH -> AABB_SOUTH; + case NORTH -> AABB_NORTH; + case UP -> AABB_UP; + case DOWN -> AABB_DOWN; + }; } + + return switch (direction) + { + case UP -> AABB_UP.move(0, shape.min(Direction.Axis.Y), 0); + case DOWN -> AABB_DOWN.move(0, shape.max(Direction.Axis.Y) - 1, 0); + case NORTH -> AABB_NORTH.move(0, 0, shape.max(Direction.Axis.Z) - 1); + case SOUTH -> AABB_SOUTH.move(0, 0, shape.min(Direction.Axis.Z)); + case EAST -> AABB_EAST.move(shape.min(Direction.Axis.X), 0, 0); + case WEST -> AABB_WEST.move(shape.max(Direction.Axis.X) - 1, 0, 0); + }; + } + + @NotNull + @Override + public BlockState updateShape( + @NotNull final BlockState stateIn, + final Direction dir, + final BlockState state, + final LevelAccessor worldIn, + @NotNull final BlockPos currentPos, + final BlockPos pos) + { + if (stateIn.getValue(WATERLOGGED)) + { + worldIn.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(worldIn)); + } + + + return super.updateShape(stateIn, dir, state, worldIn, currentPos, pos); } @Override @@ -133,6 +177,12 @@ public InteractionResult use( return InteractionResult.SUCCESS; } + @Override + public RenderShape getRenderShape(final BlockState state) + { + return RenderShape.INVISIBLE; + } + @Override public void setPlacedBy(@NotNull final Level worldIn, @NotNull final BlockPos pos, final BlockState state, final LivingEntity placer, final ItemStack stack) { @@ -160,7 +210,7 @@ public void setPlacedBy(@NotNull final Level worldIn, @NotNull final BlockPos po @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING, MIRROR); + builder.add(FACING, MIRROR, WATERLOGGED); } @Nullable @@ -174,7 +224,14 @@ public BlockEntity newBlockEntity(@NotNull final BlockPos blockPos, @NotNull fin @Override public BlockState getStateForPlacement(final BlockPlaceContext context) { - return super.getStateForPlacement(context).setValue(FACING, context.getHorizontalDirection()); + Fluid fluid = context.getLevel().getFluidState(context.getClickedPos()).getType(); + return super.getStateForPlacement(context).setValue(FACING, context.getClickedFace().getOpposite()).setValue(WATERLOGGED, fluid == Fluids.WATER); + } + + @Override + public FluidState getFluidState(final BlockState state) + { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @NotNull diff --git a/src/main/java/com/minecolonies/coremod/blocks/BlockMinecoloniesRack.java b/src/main/java/com/minecolonies/coremod/blocks/BlockMinecoloniesRack.java index e2b3bef1327..cb3f6499992 100755 --- a/src/main/java/com/minecolonies/coremod/blocks/BlockMinecoloniesRack.java +++ b/src/main/java/com/minecolonies/coremod/blocks/BlockMinecoloniesRack.java @@ -1,6 +1,9 @@ package com.minecolonies.coremod.blocks; +import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlock; +import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlockComponent; import com.minecolonies.api.blocks.AbstractBlockMinecoloniesRack; +import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.blocks.types.RackType; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; @@ -12,6 +15,7 @@ import com.minecolonies.api.util.constant.Constants; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.entity.LivingEntity; @@ -36,8 +40,8 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; @@ -50,7 +54,7 @@ /** * Block for the shelves of the warehouse. */ -public class BlockMinecoloniesRack extends AbstractBlockMinecoloniesRack +public class BlockMinecoloniesRack extends AbstractBlockMinecoloniesRack implements IMateriallyTexturedBlock { /** @@ -109,70 +113,30 @@ public VoxelShape getCollisionShape(final BlockState state, final BlockGetter le @Override public BlockState getStateForPlacement(final BlockPlaceContext context) { - final Level worldIn = context.getLevel(); final BlockPos pos = context.getClickedPos(); final BlockState state = defaultBlockState(); - final BlockEntity entity = worldIn.getBlockEntity(pos); - if (!(entity instanceof TileEntityRack)) + for(Direction direction : UPDATE_SHAPE_ORDER) { - return super.getStateForPlacement(context); - } - - return getPlacementState(state, entity, pos); - } - - /** - * Get the statement ready. - * - * @param state the state to place. - * @param entity the tileEntity. - * @param pos the position. - * @return the next state. - */ - public static BlockState getPlacementState(final BlockState state, final BlockEntity entity, final BlockPos pos) - { - final AbstractTileEntityRack rack = (AbstractTileEntityRack) entity; - if (rack.isEmpty() && (rack.getOtherChest() == null || rack.getOtherChest().isEmpty())) - { - if (rack.getOtherChest() != null) + if (direction != Direction.DOWN && direction != Direction.UP) { - state.setValue(FACING, BlockPosUtil.getFacing(pos, rack.getNeighbor())); - if (rack.isMain()) + final BlockState relativeState = context.getLevel().getBlockState(pos.relative(direction)); + if (relativeState.getBlock() == ModBlocks.blockRack && !relativeState.getValue(VARIANT).isDoubleVariant()) { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.DEFAULTDOUBLE); - } - else - { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.EMPTYAIR); + return state.setValue(VARIANT, RackType.EMPTYAIR).setValue(FACING, direction); } } - else - { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.DEFAULT); - } } - else + + if (context.getPlayer() != null) { - if (rack.getOtherChest() != null) - { - state.setValue(FACING, BlockPosUtil.getFacing(pos, rack.getNeighbor())); - if (rack.isMain()) - { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.FULLDOUBLE); - } - else - { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.EMPTYAIR); - } - } - else - { - return state.setValue(AbstractBlockMinecoloniesRack.VARIANT, RackType.FULL); - } + return defaultBlockState().setValue(FACING, context.getPlayer().getDirection().getOpposite()); } + return super.getStateForPlacement(context); } + + /** * Convert the BlockState into the correct metadata value. * @@ -197,30 +161,39 @@ public BlockState mirror(@NotNull final BlockState state, final Mirror mirrorIn) return state.rotate(mirrorIn.getRotation(state.getValue(FACING))); } - @NotNull @Override + @NotNull public BlockState updateShape( - @NotNull final BlockState stateIn, - final Direction facing, - final BlockState state, - final LevelAccessor worldIn, - final BlockPos currentPos, - final BlockPos pos) + @NotNull final BlockState state, + @NotNull final Direction dir, + final BlockState state2, + @NotNull final LevelAccessor level, + @NotNull final BlockPos pos1, + @NotNull final BlockPos pos2) { - if (state.getBlock() instanceof BlockMinecoloniesRack || stateIn.getBlock() instanceof BlockMinecoloniesRack) + final BlockEntity bEntity1 = level.getBlockEntity(pos1); + final BlockEntity bEntity2 = level.getBlockEntity(pos2); + + if (pos1.subtract(pos2).getY() != 0) + { + return super.updateShape(state, dir, state2, level, pos1, pos2); + } + + // Is this a double chest and our connection is being removed. + if (bEntity1 instanceof TileEntityRack) { - final BlockEntity rack = worldIn.getBlockEntity(pos); - if (rack instanceof TileEntityRack) + if (bEntity2 == null && state.getValue(VARIANT).isDoubleVariant() && pos1.relative(state.getValue(FACING)).equals(pos2)) { - ((AbstractTileEntityRack) rack).neighborChanged(currentPos); + // Reset to single + return state.setValue(VARIANT, ((TileEntityRack) bEntity1).isEmpty() ? RackType.DEFAULT : RackType.FULL); } - final BlockEntity rack2 = worldIn.getBlockEntity(currentPos); - if (rack2 instanceof TileEntityRack) + // If its not a double variant and the new neighbor is neither, then connect. + else if (bEntity2 instanceof TileEntityRack && !state.getValue(VARIANT).isDoubleVariant() && state2.hasProperty(VARIANT) && state2.getValue(VARIANT).isDoubleVariant() && state2.getValue(FACING).equals(Direction.fromNormal(pos2.subtract(pos1)).getOpposite())) { - ((AbstractTileEntityRack) rack2).neighborChanged(pos); + return state.setValue(VARIANT, ((TileEntityRack) bEntity1).isEmpty() ? RackType.DEFAULTDOUBLE : RackType.FULLDOUBLE).setValue(FACING, Direction.fromNormal(pos2.subtract(pos1))); } } - return super.updateShape(stateIn, facing, state, worldIn, currentPos, pos); + return super.updateShape(state, dir, state2, level, pos1, pos2); } @Override @@ -262,19 +235,6 @@ public InteractionResult use( return InteractionResult.FAIL; } - @Override - public void setPlacedBy(final Level worldIn, final BlockPos pos, final BlockState state, @Nullable final LivingEntity placer, final ItemStack stack) - { - BlockState tempState = state; - tempState = tempState.setValue(VARIANT, RackType.DEFAULT); - if (placer != null) - { - tempState = tempState.setValue(FACING, placer.getDirection().getOpposite()); - } - - worldIn.setBlock(pos, tempState, 2); - } - @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -316,4 +276,16 @@ public void onRemove(BlockState state, @NotNull Level worldIn, @NotNull BlockPos super.onRemove(state, worldIn, pos, newState, isMoving); } } + + @Override + public @NotNull Block getBlock() + { + return this; + } + + @Override + public @NotNull Collection getComponents() + { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/minecolonies/coremod/blocks/BlockPlantationField.java b/src/main/java/com/minecolonies/coremod/blocks/BlockPlantationField.java new file mode 100644 index 00000000000..91fa912a961 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/blocks/BlockPlantationField.java @@ -0,0 +1,244 @@ +package com.minecolonies.coremod.blocks; + +import com.ldtteam.structurize.blocks.interfaces.IAnchorBlock; +import com.minecolonies.api.blocks.AbstractBlockMinecoloniesHorizontal; +import com.minecolonies.api.blocks.interfaces.IBuildingBrowsableBlock; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.entity.ai.citizen.builder.IBuilderUndestroyable; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.client.gui.WindowPlantationField; +import com.minecolonies.coremod.colony.fields.PlantationField; +import com.minecolonies.coremod.tileentities.TileEntityPlantationField; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * Block class for the plantation field block. + */ +public class BlockPlantationField extends AbstractBlockMinecoloniesHorizontal implements IBuilderUndestroyable, IAnchorBlock, IBuildingBrowsableBlock, EntityBlock +{ + /** + * If the block is mirrored. + */ + public static final BooleanProperty MIRROR = BooleanProperty.create("mirror"); + + /** + * The hardness this block has. + */ + private static final float BLOCK_HARDNESS = 5F; + + /** + * This blocks name. + */ + private static final String BLOCK_NAME = "blockhutplantationfield"; + + /** + * The resistance this block has. + */ + private static final float RESISTANCE = 1F; + + /** + * Cached list of shapes + */ + private static final Map SHAPES = new EnumMap<>(Direction.class); + + /** + * Default constructor. + */ + public BlockPlantationField() + { + super(Properties.of(Material.WOOD).strength(BLOCK_HARDNESS, RESISTANCE)); + this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(MIRROR, false)); + } + + @Override + public ResourceLocation getRegistryName() + { + return new ResourceLocation(Constants.MOD_ID, BLOCK_NAME); + } + + @Override + public BlockEntity newBlockEntity(@NotNull final BlockPos blockPos, @NotNull final BlockState blockState) + { + return new TileEntityPlantationField(blockPos, blockState); + } + + @NotNull + @Override + public BlockState rotate(@NotNull BlockState state, Rotation rot) + { + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); + } + + @NotNull + @Override + public BlockState mirror(@NotNull BlockState state, Mirror mirrorIn) + { + return state.setValue(MIRROR, mirrorIn != Mirror.NONE); + } + + @Override + public InteractionResult use( + final BlockState state, + final Level worldIn, + final BlockPos pos, + final Player player, + final InteractionHand hand, + final BlockHitResult ray) + { + // If this is the client side, open the plantation field GUI + if (worldIn.isClientSide) + { + if (hand == InteractionHand.OFF_HAND) + { + return InteractionResult.FAIL; + } + + final BlockEntity tileEntity = worldIn.getBlockEntity(pos); + if (tileEntity instanceof TileEntityPlantationField plantationField) + { + new WindowPlantationField(plantationField).open(); + return InteractionResult.SUCCESS; + } + + return InteractionResult.FAIL; + } + + return InteractionResult.SUCCESS; + } + + @Override + public VoxelShape getShape(final BlockState state, final BlockGetter worldIn, final BlockPos pos, final CollisionContext context) + { + Direction dir = state.getValue(FACING); + if (SHAPES.containsKey(dir)) + { + return SHAPES.get(dir); + } + VoxelShape shape = Shapes.box( + 0D + (dir.getStepX() > 0 ? 0.5 : 0), + 0D, + 0D + (dir.getStepZ() > 0 ? 0.5 : 0), + 1D - (dir.getStepX() < 0 ? 0.5 : 0), + 0.625D, + 1D - (dir.getStepZ() < 0 ? 0.5 : 0) + ); + SHAPES.put(dir, shape); + return shape; + } + + @Override + public void wasExploded(final Level worldIn, final BlockPos pos, final Explosion explosionIn) + { + notifyColonyAboutDestruction(worldIn, pos); + super.wasExploded(worldIn, pos, explosionIn); + } + + @Override + public BlockState getStateForPlacement(final BlockPlaceContext context) + { + return super.getStateForPlacement(context).setValue(FACING, context.getHorizontalDirection()); + } + + @Override + public void setPlacedBy(@NotNull final Level worldIn, @NotNull final BlockPos pos, final BlockState state, final LivingEntity placer, final ItemStack stack) + { + super.setPlacedBy(worldIn, pos, state, placer, stack); + + if (worldIn.isClientSide) + { + return; + } + + final BlockEntity tileEntity = worldIn.getBlockEntity(pos); + if (tileEntity instanceof TileEntityPlantationField tileEntityPlantationField) + { + final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(worldIn, pos); + if (colony != null) + { + for (FieldRegistries.FieldEntry plantationFieldType : tileEntityPlantationField.getPlantationFieldTypes()) + { + final PlantationField plantationField = PlantationField.create(plantationFieldType, pos); + + final List workingPositions = tileEntityPlantationField.getWorkingPositions(plantationField.getModule().getWorkTag()); + final List validPositions = plantationField.getModule().getValidWorkingPositions(worldIn, workingPositions); + if (!validPositions.isEmpty()) + { + plantationField.setWorkingPositions(validPositions); + colony.getBuildingManager().addField(plantationField); + colony.getBuildingManager().addLeisureSite(pos); + } + } + } + } + } + + @Override + public void playerWillDestroy(final Level worldIn, @NotNull final BlockPos pos, final BlockState state, @NotNull final Player player) + { + notifyColonyAboutDestruction(worldIn, pos); + super.playerWillDestroy(worldIn, pos, state, player); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) + { + builder.add(FACING, MIRROR); + } + + /** + * Notify the colony about the destruction of the field. + * + * @param worldIn the world. + * @param pos the position of the block. + */ + private void notifyColonyAboutDestruction(final Level worldIn, final BlockPos pos) + { + if (!worldIn.isClientSide()) + { + final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(worldIn, pos); + if (colony != null) + { + final BlockEntity blockEntity = worldIn.getBlockEntity(pos); + if (blockEntity instanceof TileEntityPlantationField plantationField) + { + for (FieldRegistries.FieldEntry plantationFieldType : plantationField.getPlantationFieldTypes()) + { + colony.getBuildingManager().removeField(field -> field.getFieldType().equals(plantationFieldType) && field.getPosition().equals(pos)); + colony.getBuildingManager().removeLeisureSite(pos); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/blocks/BlockScarecrow.java b/src/main/java/com/minecolonies/coremod/blocks/BlockScarecrow.java index 81bd6c35fc4..2e9ee86296f 100755 --- a/src/main/java/com/minecolonies/coremod/blocks/BlockScarecrow.java +++ b/src/main/java/com/minecolonies/coremod/blocks/BlockScarecrow.java @@ -4,19 +4,24 @@ import com.minecolonies.api.blocks.interfaces.IBuildingBrowsableBlock; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; +import com.minecolonies.coremod.client.gui.containers.WindowField; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.tileentities.TileEntityScarecrow; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.*; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; @@ -32,12 +37,11 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** - * The cnet.minecraft.core.Directions, placement and activation. + * The net.minecraft.core.Directions, placement and activation. */ @SuppressWarnings("PMD.ExcessiveImports") public class BlockScarecrow extends AbstractBlockMinecoloniesDefault implements EntityBlock, IBuildingBrowsableBlock @@ -53,27 +57,10 @@ public BlockScarecrow() this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(HALF, DoubleBlockHalf.LOWER)); } - @NotNull - @Override - public RenderShape getRenderShape(final BlockState state) - { - return RenderShape.INVISIBLE; - } - @Override - public VoxelShape getShape( - final BlockState state, final BlockGetter worldIn, final BlockPos pos, final CollisionContext context) + public ResourceLocation getRegistryName() { - // Force the different halves to share the same collision space; - // the user will think it is one big block - return Shapes.box( - (float) START_COLLISION, - (float) (BOTTOM_COLLISION - (state.getValue(HALF) == DoubleBlockHalf.UPPER ? 1 : 0)), - (float) START_COLLISION, - (float) END_COLLISION, - (float) (HEIGHT_COLLISION - (state.getValue(HALF) == DoubleBlockHalf.UPPER ? 1 : 0)), - (float) END_COLLISION - ); + return new ResourceLocation(Constants.MOD_ID, REGISTRY_NAME); } @Nullable @@ -84,7 +71,7 @@ public BlockEntity newBlockEntity(@NotNull final BlockPos blockPos, @NotNull fin { return null; } - return new ScarecrowTileEntity(blockPos, blockState); + return new TileEntityScarecrow(blockPos, blockState); } @Override @@ -96,18 +83,17 @@ public InteractionResult use( final InteractionHand hand, final BlockHitResult ray) { - //If the world is server, open the inventory of the field. - if (!worldIn.isClientSide) + // If the world is client, open the inventory of the field. + if (worldIn.isClientSide) { // Get the entity of the bottom half DoubleBlockHalf half = state.getValue(HALF); - final BlockEntity entity = worldIn.getBlockEntity( - half == DoubleBlockHalf.UPPER ? pos.below() : pos - ); + final BlockEntity entity = worldIn.getBlockEntity(half == DoubleBlockHalf.UPPER ? pos.below() : pos); - if (entity instanceof ScarecrowTileEntity) + if (entity instanceof TileEntityScarecrow scarecrow) { - NetworkHooks.openScreen((ServerPlayer) player, (ScarecrowTileEntity) entity, pos); + new WindowField(scarecrow).open(); + return InteractionResult.SUCCESS; } else { @@ -119,20 +105,11 @@ public InteractionResult use( return InteractionResult.SUCCESS; } - @Nullable + @NotNull @Override - public BlockState getStateForPlacement(final BlockPlaceContext context) + public RenderShape getRenderShape(final BlockState state) { - @NotNull final Direction dir = (context.getPlayer() == null) ? Direction.NORTH : Direction.fromYRot(context.getPlayer().getYRot() + 180); - - if (context.getClickedPos().getY() < 255 && context.getLevel().getBlockState(context.getClickedPos().above()).canBeReplaced(context)) - { - return this.defaultBlockState().setValue(FACING, dir).setValue(HALF, DoubleBlockHalf.LOWER); - } - else - { - return null; - } + return RenderShape.INVISIBLE; } @Override @@ -151,36 +128,60 @@ public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) } @Override - public void onPlace(final BlockState state, final Level worldIn, final BlockPos pos, final BlockState oldState, final boolean isMoving) + public VoxelShape getShape( + final BlockState state, final BlockGetter worldIn, final BlockPos pos, final CollisionContext context) { - super.onPlace(state, worldIn, pos, oldState, isMoving); - if (worldIn.isClientSide) + // Force the different halves to share the same collision space; + // the user will think it is one big block + return Shapes.box( + (float) START_COLLISION, + (float) (BOTTOM_COLLISION - (state.getValue(HALF) == DoubleBlockHalf.UPPER ? 1 : 0)), + (float) START_COLLISION, + (float) END_COLLISION, + (float) (HEIGHT_COLLISION - (state.getValue(HALF) == DoubleBlockHalf.UPPER ? 1 : 0)), + (float) END_COLLISION + ); + } + + @Override + public void wasExploded(final Level worldIn, final BlockPos pos, final Explosion explosionIn) + { + notifyColonyAboutDestruction(worldIn, pos); + super.wasExploded(worldIn, pos, explosionIn); + } + + @Nullable + @Override + public BlockState getStateForPlacement(final BlockPlaceContext context) + { + @NotNull final Direction dir = (context.getPlayer() == null) ? Direction.NORTH : Direction.fromYRot(context.getPlayer().getYRot() + 180); + + if (context.getClickedPos().getY() < 255 && context.getLevel().getBlockState(context.getClickedPos().above()).canBeReplaced(context)) { - return; + return this.defaultBlockState().setValue(FACING, dir).setValue(HALF, DoubleBlockHalf.LOWER); } - - @Nullable final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(worldIn, pos); - if (colony != null) + else { - final ScarecrowTileEntity scareCrow = (ScarecrowTileEntity) worldIn.getBlockEntity(pos); - if (scareCrow != null) - { - colony.getBuildingManager().addNewField(scareCrow, pos, worldIn); - } + return null; } } @Override public void setPlacedBy(Level worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + super.setPlacedBy(worldIn, pos, state, placer, stack); worldIn.setBlock(pos.above(), state.setValue(HALF, DoubleBlockHalf.UPPER), 3); - } - @Override - public void wasExploded(final Level worldIn, final BlockPos pos, final Explosion explosionIn) - { - notifyColonyAboutDestruction(worldIn, pos); - super.wasExploded(worldIn, pos, explosionIn); + if (worldIn.isClientSide) + { + return; + } + + final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(worldIn, pos); + if (colony != null) + { + colony.getBuildingManager().addField(FarmField.create(pos)); + } } @Override @@ -190,7 +191,7 @@ public void playerWillDestroy(final Level worldIn, @NotNull final BlockPos pos, BlockPos otherpos = half == DoubleBlockHalf.LOWER ? pos.above() : pos.below(); BlockState otherstate = worldIn.getBlockState(otherpos); - // just double check the other block is also the scarecrow and not the same half, + // just double-check the other block is also the scarecrow and not the same half, // then destroy it (make it air) if (otherstate.getBlock() == this && otherstate.getValue(HALF) != half) { @@ -201,33 +202,27 @@ public void playerWillDestroy(final Level worldIn, @NotNull final BlockPos pos, super.playerWillDestroy(worldIn, pos, state, player); } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) + { + builder.add(HALF, FACING); + } + /** * Notify the colony about the destruction of the field. * * @param worldIn the world. - * @param pos the position. + * @param pos the position of the block. */ - private static void notifyColonyAboutDestruction(final LevelAccessor worldIn, final BlockPos pos) + private void notifyColonyAboutDestruction(final Level worldIn, final BlockPos pos) { if (!worldIn.isClientSide()) { - @Nullable final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld((Level) worldIn, pos); + final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(worldIn, pos); if (colony != null) { - colony.getBuildingManager().removeField(pos); + colony.getBuildingManager().removeField(field -> field.getFieldType().equals(FieldRegistries.farmField.get()) && field.getPosition().equals(pos)); } } } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) - { - builder.add(HALF, FACING); - } - - @Override - public ResourceLocation getRegistryName() - { - return new ResourceLocation(Constants.MOD_ID, REGISTRY_NAME); - } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/AbstractModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/AbstractModuleWindow.java index 9fbd031a0c5..c9dc6cc4ecf 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/AbstractModuleWindow.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/AbstractModuleWindow.java @@ -6,8 +6,10 @@ import com.minecolonies.api.colony.buildings.modules.IModuleWindow; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; import java.util.Locale; import java.util.Random; @@ -69,7 +71,10 @@ public AbstractModuleWindow(final IBuildingView building, final String res) image.setImage(new ResourceLocation("minecolonies:textures/gui/modules/tab_side" + (random.nextInt(3) + 1) + ".png"), false); image.setPosition(-20, 10 + offset); image.setSize(32, 26); - image.setHandler(button -> view.getWindow().open()); + image.setHandler(button -> { + mc.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); + view.getWindow().open(); + }); final String icon = view.getIcon(); final ButtonImage iconImage = new ButtonImage(); @@ -77,7 +82,10 @@ public AbstractModuleWindow(final IBuildingView building, final String res) iconImage.setSize(20, 20); iconImage.setID(icon); iconImage.setPosition(-15, 13 + offset); - iconImage.setHandler(button -> view.getWindow().open()); + iconImage.setHandler(button -> { + mc.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); + view.getWindow().open(); + }); offset += image.getHeight() + 2; diff --git a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowModuleBuilding.java b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowModuleBuilding.java index 595c99455f0..d551e7b8727 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowModuleBuilding.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowModuleBuilding.java @@ -8,10 +8,12 @@ import com.minecolonies.coremod.network.messages.server.colony.OpenInventoryMessage; import com.minecolonies.coremod.network.messages.server.colony.building.BuildRequestMessage; import net.minecraft.client.resources.language.I18n; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.sounds.SoundEvents; import org.jetbrains.annotations.NotNull; import static com.minecolonies.api.util.constant.TranslationConstants.*; @@ -57,6 +59,13 @@ public AbstractWindowModuleBuilding(final B building, final String resource) } } + @Override + public void setPage(final boolean relative, final int page) + { + super.setPage(relative, page); + mc.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); + } + /** * Edit custom name action. */ @@ -179,19 +188,9 @@ public void onOpened() super.onOpened(); setPage(false, 0); - final MutableComponent component = - building.getCustomName().isEmpty() ? Component.translatable(getBuildingName()) : Component.literal(building.getCustomName()); - if (switchView != null && switchView.getID().equals(GUI_LIST_BUTTON_SWITCH + PAGE_ACTIONS)) - { - // Town hall does not need level in colony name - title.setText(component); - - final Component levelComponent = Component.translatable(CMC_GUI_TOWNHALL_BUILDING_LEVEL) - .append(": " + buildingView.getBuildingLevel()); - findPaneOfTypeByID(LEVEL_LABEL, Text.class).setText(levelComponent); - } - else if (title != null) + if (title != null) { + final MutableComponent component = building.getCustomName().isEmpty() ? Component.translatable(getBuildingName()) : Component.literal(building.getCustomName()); final MutableComponent componentWithLevel = component.append(" ").append(String.valueOf(buildingView.getBuildingLevel())); title.setText(componentWithLevel); } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowRequestTree.java b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowRequestTree.java index 2f28ef4c54f..726472c2a38 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowRequestTree.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowRequestTree.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.client.gui; import com.google.common.collect.ImmutableList; +import com.minecolonies.api.colony.requestsystem.requestable.IStackBasedTask; import com.minecolonies.api.util.Log; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.PaneBuilders; @@ -20,6 +21,7 @@ import com.minecolonies.coremod.colony.requestsystem.requesters.IBuildingBasedRequester; import com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests; import com.minecolonies.coremod.network.messages.server.colony.UpdateRequestStateMessage; +import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -32,8 +34,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.function.Predicate; +import static com.minecolonies.api.util.constant.TranslationConstants.DETAILS; import static com.minecolonies.api.util.constant.WindowConstants.*; import static com.minecolonies.coremod.colony.requestsystem.requests.AbstractRequest.MISSING; @@ -340,8 +344,18 @@ public void updateElement(final int index, final Pane rowPane) } } - if(request instanceof StandardRequests.ItemTagRequest) + if (request instanceof IStackBasedTask) { + final ItemIcon icon = rowPane.findPaneOfTypeByID("detailIcon", ItemIcon.class); + final ItemStack copyStack = ((IStackBasedTask) request).getTaskStack().copy(); + copyStack.setCount(((IStackBasedTask) request).getDisplayCount()); + icon.setItem(copyStack); + icon.setVisible(true); + rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(((IStackBasedTask) request).getDisplayPrefix().withStyle(ChatFormatting.BLACK)); + } + else if(request instanceof StandardRequests.ItemTagRequest) + { + rowPane.findPaneOfTypeByID("detailIcon", ItemIcon.class).setVisible(false); if(!displayStacks.isEmpty()) { rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText( @@ -350,9 +364,11 @@ public void updateElement(final int index, final Pane rowPane) } else { - rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(Component.literal(request.getShortDisplayString().getString().replace("§f", ""))); + rowPane.findPaneOfTypeByID("detailIcon", ItemIcon.class).setVisible(false); + rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(Component.literal(request.getShortDisplayString().getString().replace("§f", "")).withStyle(ChatFormatting.BLACK)); } + PaneBuilders.tooltipBuilder().hoverPane(findPaneByID(REQUEST_DETAIL)).build().setText(Component.translatable(DETAILS)); if (!cancellable(request)) { rowPane.findPaneOfTypeByID(REQUEST_CANCEL, ButtonImage.class).hide(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowSkeleton.java b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowSkeleton.java index 4d722bf625a..cf9a343bd72 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowSkeleton.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/AbstractWindowSkeleton.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.client.gui; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.ButtonHandler; import com.ldtteam.blockui.controls.Text; @@ -73,6 +74,9 @@ public AbstractWindowSkeleton(final String resource, @Nullable final BOWindow pa { buttonNextPage = findPaneOfTypeByID(BUTTON_NEXTPAGE, Button.class); buttonPrevPage = findPaneOfTypeByID(BUTTON_PREVPAGE, Button.class); + PaneBuilders.singleLineTooltip(Component.translatable("com.minecolonies.core.gui.nextpage"), buttonNextPage); + PaneBuilders.singleLineTooltip(Component.translatable("com.minecolonies.core.gui.prevpage"), buttonPrevPage); + pageNum = findPaneOfTypeByID(LABEL_PAGE_NUMBER, Text.class); registerButton(BUTTON_NEXTPAGE, () -> setPage(true, 1)); registerButton(BUTTON_PREVPAGE, () -> setPage(true, -1)); @@ -95,7 +99,7 @@ public AbstractWindowSkeleton(final String resource, @Nullable final BOWindow pa */ public final void registerButton(final String id, final Runnable action) { - registerButton(id, (button) -> action.run()); + registerButton(id, button -> action.run()); } /** @@ -163,15 +167,18 @@ public void setPage(final boolean relative, final int page) buttonNextPage.on(); buttonPrevPage.on(); - if (curPage == 1) + if (curPage == 1 && !switchView.isEndlessScrollingEnabled()) { buttonPrevPage.off(); } - if (curPage == switchPagesSize) + if (curPage == switchPagesSize && !switchView.isEndlessScrollingEnabled()) { buttonNextPage.off(); } - pageNum.setText(Component.literal(curPage + "/" + switchPagesSize)); + if (pageNum != null) + { + pageNum.setText(Component.literal(curPage + "/" + switchPagesSize)); + } } @Override diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowAssignCitizen.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowAssignCitizen.java index 2b5faf9e154..65fa5a8938a 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowAssignCitizen.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowAssignCitizen.java @@ -292,7 +292,7 @@ public void updateElement(final int index, @NotNull final Pane rowPane) currentLivingLabel.setText(Component.translatable("com.minecolonies.coremod.gui.home.liveshere")); } - if ((colony.isManualHousing() || building.getHiringMode() == HiringMode.MANUAL) + if ((colony.isManualHousing() || building.getHiringMode() != HiringMode.DEFAULT) && !(building.getHiringMode() == HiringMode.AUTO) && (!assign || building.getResidents().size() < building.getMax())) { diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowBannerPicker.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowBannerPicker.java index e2b708f2d76..e973cde483a 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowBannerPicker.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowBannerPicker.java @@ -2,6 +2,7 @@ import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.gui.townhall.AbstractWindowTownHall; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.datafixers.util.Pair; @@ -32,6 +33,7 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import static com.minecolonies.api.util.constant.translation.BaseGameTranslationConstants.BASE_GUI_DONE; @@ -117,10 +119,11 @@ public class WindowBannerPicker extends Screen private int scrollRow = 0; /** - * @param colony the colony to make the flag for - * @param hallWindow the calling town hall window to return to + * @param colony the colony to make the flag for + * @param hallWindow the calling town hall window to return to + * @param isFeatureUnlocked */ - public WindowBannerPicker(IColonyView colony, AbstractWindowTownHall hallWindow) + public WindowBannerPicker(IColonyView colony, AbstractWindowTownHall hallWindow, final AtomicBoolean isFeatureUnlocked) { super(Component.literal("Flag")); @@ -139,6 +142,10 @@ public WindowBannerPicker(IColonyView colony, AbstractWindowTownHall hallWindow) } this.patterns = new LinkedList<>(Registry.BANNER_PATTERN.holders().collect(Collectors.toList())); this.patterns.removeAll(exclusion); + if (!isFeatureUnlocked.get()) + { + this.patterns.removeIf(key -> key.unwrapKey().get().location().getNamespace().equals(Constants.MOD_ID)); + } // Fetch the patterns as a List and not ListNBT this.layers = BannerBlockEntity.createPatterns(DyeColor.WHITE, colony.getColonyFlag()); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildBuilding.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildBuilding.java index a5e2f294a3a..e7c8a13abd4 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildBuilding.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildBuilding.java @@ -144,7 +144,7 @@ public WindowBuildBuilding(final IColonyView c, final IBuildingView building) findPaneOfTypeByID(BUTTON_DECONSTRUCT_BUILDING, Button.class).hide(); findPaneOfTypeByID(BUTTON_PICKUP_BUILDING, Button.class).show(); } - else if (building.getBuildingLevel() == building.getBuildingMaxLevel() || (parentBuilding != null && building.getBuildingLevel() >= parentBuilding.getBuildingLevel())) + else if (!canBeUpgraded()) { buttonBuild.hide(); } @@ -160,6 +160,16 @@ else if (building.getBuildingLevel() == building.getBuildingMaxLevel() || (paren } } + /** + * Check if this one can be upgraded. + * @return true if so. + */ + public boolean canBeUpgraded() + { + final IBuildingView parentBuilding = building.getColony().getBuilding(building.getParent()); + return building.getBuildingLevel() < building.getBuildingMaxLevel() && (parentBuilding == null || building.getBuildingLevel() < parentBuilding.getBuildingLevel() || parentBuilding.getBuildingLevel() >= parentBuilding.getBuildingMaxLevel()); + } + /** * When the pickup building button was clicked. */ @@ -281,15 +291,18 @@ private void updateResources() } final Level world = Minecraft.getInstance().level; - - final IBuildingView parentBuilding = building.getColony().getBuilding(building.getParent()); int nextLevel = building.getBuildingLevel(); - if (building.getBuildingLevel() < building.getBuildingMaxLevel() && (parentBuilding == null || building.getBuildingLevel() < parentBuilding.getBuildingLevel())) + if (canBeUpgraded()) { nextLevel = building.getBuildingLevel() + 1; } String name = building.getStructurePath().replace(".blueprint", ""); + if (name.isEmpty()) + { + return; + } + name = name.substring(0, name.length() - 1) + nextLevel + ".blueprint"; ClientFutureProcessor.queueBlueprint(new ClientFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(styles.get(stylesDropDownList.getSelectedIndex()), name), (blueprint -> { resources.clear(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildDecoration.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildDecoration.java index 05dbe8d5085..cc1090f3a3b 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildDecoration.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowBuildDecoration.java @@ -17,15 +17,14 @@ import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.ModBuildings; import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.colony.workorders.WorkOrderType; import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.network.IMessage; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.LoadOnlyStructureHandler; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingBuilderView; -import com.minecolonies.coremod.network.messages.server.DecorationBuildRequestMessage; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -40,10 +39,12 @@ import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.function.Function; import java.util.stream.Collectors; import static com.ldtteam.structurize.placement.AbstractBlueprintIterator.NULL_POS; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.ACTION_BUILD; +import static com.minecolonies.api.util.constant.TranslationConstants.OUT_OF_COLONY; import static com.minecolonies.api.util.constant.WindowConstants.*; public class WindowBuildDecoration extends AbstractWindowSkeleton @@ -84,6 +85,11 @@ public class WindowBuildDecoration extends AbstractWindowSkeleton */ private final boolean mirror; + /** + * A function that will supply the message, given the position of the requested builder, if any. + */ + private final Function buildRequestMessage; + /** * Drop down list for builders. */ @@ -107,7 +113,13 @@ public class WindowBuildDecoration extends AbstractWindowSkeleton /** * Constructs the decoration build confirmation dialog */ - public WindowBuildDecoration(final BlockPos pos, final String packMeta, final String path, final Rotation rotation, final boolean mirror) + public WindowBuildDecoration( + final BlockPos pos, + final String packMeta, + final String path, + final Rotation rotation, + final boolean mirror, + Function buildRequestMessage) { super(Constants.MOD_ID + BUILDING_NAME_RESOURCE_SUFFIX); this.packMeta = packMeta; @@ -130,6 +142,7 @@ public WindowBuildDecoration(final BlockPos pos, final String packMeta, final St blueprintFuture = StructurePacks.getBlueprintFuture(cleanedPackName, path); this.rotation = rotation; this.mirror = mirror; + this.buildRequestMessage = buildRequestMessage; } @Override @@ -153,7 +166,7 @@ public void onUpdate() private void updateBuilders() { IColonyView colony = (IColonyView) IColonyManager.getInstance() - .getIColony(Minecraft.getInstance().level, structurePos); + .getIColony(Minecraft.getInstance().level, structurePos); if (colony == null) { @@ -165,11 +178,11 @@ private void updateBuilders() builders.clear(); builders.add(new Tuple<>(Component.translatable(ModJobs.builder.get().getTranslationKey()).getString() + ":", BlockPos.ZERO)); builders.addAll(colony.getBuildings().stream() - .filter(build -> build instanceof AbstractBuildingBuilderView && !((AbstractBuildingBuilderView) build).getWorkerName().isEmpty() - && build.getBuildingType() != ModBuildings.miner.get()) - .map(build -> new Tuple<>(((AbstractBuildingBuilderView) build).getWorkerName(), build.getPosition())) - .sorted(Comparator.comparing(item -> item.getB().distSqr(structurePos))) - .collect(Collectors.toList())); + .filter(build -> build instanceof AbstractBuildingBuilderView && !((AbstractBuildingBuilderView) build).getWorkerName().isEmpty() + && build.getBuildingType() != ModBuildings.miner.get()) + .map(build -> new Tuple<>(((AbstractBuildingBuilderView) build).getWorkerName(), build.getPosition())) + .sorted(Comparator.comparing(item -> item.getB().distSqr(structurePos))) + .collect(Collectors.toList())); initBuilderNavigation(); } @@ -329,10 +342,10 @@ public void updateElement(final int index, @NotNull final Pane rowPane) private void confirmedBuild() { final BlockPos builder = buildersDropDownList.getSelectedIndex() == 0 - ? BlockPos.ZERO - : builders.get(buildersDropDownList.getSelectedIndex()).getB(); + ? BlockPos.ZERO + : builders.get(buildersDropDownList.getSelectedIndex()).getB(); - Network.getNetwork().sendToServer(new DecorationBuildRequestMessage(WorkOrderType.BUILD, structurePos, packMeta, path, Minecraft.getInstance().level.dimension(), rotation, mirror, builder)); + Network.getNetwork().sendToServer(buildRequestMessage.apply(builder)); close(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowDecorationController.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowDecorationController.java index 0c04b2829b9..a540a75c856 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowDecorationController.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowDecorationController.java @@ -13,6 +13,7 @@ import com.minecolonies.api.util.Utils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; +import com.minecolonies.coremod.network.messages.server.DecorationBuildRequestMessage; import com.minecolonies.coremod.tileentities.TileEntityDecorationController; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -58,7 +59,7 @@ public WindowDecorationController(final BlockPos b) registerButton(BUTTON_REPAIR, this::repairClicked); registerButton(BUTTON_CANCEL, this::cancelClicked); - findPaneOfTypeByID(LABEL_NAME, Text.class).setText(Component.literal(controller.getSchematicPath())); + findPaneOfTypeByID(LABEL_NAME, Text.class).setText(Component.literal(controller.getBlueprintPath())); final IColonyView view = IColonyManager.getInstance().getClosestColonyView(world, controller.getBlockPos()); @@ -70,7 +71,7 @@ public WindowDecorationController(final BlockPos b) { final Optional wo = view.getWorkOrders().stream().filter(w -> w.getLocation().equals(this.controller.getBlockPos())).findFirst(); - int level = Utils.getBlueprintLevel(controller.getSchematicPath()); + int level = Utils.getBlueprintLevel(controller.getBlueprintPath()); if (wo.isPresent()) { findPaneByID(BUTTON_BUILD).show(); @@ -89,7 +90,7 @@ public WindowDecorationController(final BlockPos b) { final String cleanedPackName = this.controller.getPackName().replace(Minecraft.getInstance().player.getUUID().toString(), ""); ClientFutureProcessor.queueBlueprint(new ClientFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(cleanedPackName, - StructurePacks.getStructurePack(cleanedPackName).getPath().resolve(this.controller.getSchematicPath())), (blueprint -> { + StructurePacks.getStructurePack(cleanedPackName).getPath().resolve(this.controller.getBlueprintPath())), (blueprint -> { if (blueprint != null) { final BlockState blockState = blueprint.getBlockState(blueprint.getPrimaryBlockOffset()); @@ -102,7 +103,7 @@ public WindowDecorationController(final BlockPos b) if (level != -1) { - final String path = this.controller.getSchematicPath().replace(level + ".blueprint", (level + 1) + ".blueprint"); + final String path = this.controller.getBlueprintPath().replace(level + ".blueprint", (level + 1) + ".blueprint"); ClientFutureProcessor.queueBlueprint(new ClientFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(cleanedPackName, StructurePacks.getStructurePack(cleanedPackName).getPath().resolve(path)), (blueprint -> { @@ -138,12 +139,24 @@ private void cancelClicked() */ private void buildClicked() { - final int level = Utils.getBlueprintLevel(this.controller.getSchematicPath()); + final int level = Utils.getBlueprintLevel(this.controller.getBlueprintPath()); + + final String path = controller.getBlueprintPath().replace(level + ".blueprint", (level + 1) + ".blueprint"); close(); - new WindowBuildDecoration(controller.getBlockPos(), controller.getPackName(), - controller.getSchematicPath().replace(level + ".blueprint", (level + 1) + ".blueprint"), - controller.getRotation(), controller.getMirror()).open(); + new WindowBuildDecoration(controller.getBlockPos(), + controller.getPackName(), + path, + controller.getRotation(), + controller.getMirror(), + builder -> new DecorationBuildRequestMessage(WorkOrderType.BUILD, + controller.getBlockPos(), + controller.getPackName(), + path, + Minecraft.getInstance().level.dimension(), + controller.getRotation(), + controller.getMirror(), + builder)).open(); } /** @@ -152,8 +165,18 @@ private void buildClicked() private void repairClicked() { close(); - new WindowBuildDecoration(controller.getBlockPos(), controller.getPackName(), - controller.getSchematicPath(), - controller.getRotation(), controller.getMirror()).open(); + new WindowBuildDecoration(controller.getBlockPos(), + controller.getPackName(), + controller.getBlueprintPath(), + controller.getRotation(), + controller.getMirror(), + builder -> new DecorationBuildRequestMessage(WorkOrderType.REPAIR, + controller.getBlockPos(), + controller.getPackName(), + controller.getBlueprintPath(), + Minecraft.getInstance().level.dimension(), + controller.getRotation(), + controller.getMirror(), + builder)).open(); } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowHireWorker.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowHireWorker.java index b0507dc7437..7e0065db9ee 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowHireWorker.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowHireWorker.java @@ -5,7 +5,6 @@ import com.ldtteam.blockui.controls.AbstractTextBuilder.TextBuilder; import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.controls.ToggleButton; import com.ldtteam.blockui.views.ScrollingList; import com.minecolonies.api.colony.ICitizenDataView; import com.minecolonies.api.colony.IColonyView; @@ -22,12 +21,12 @@ import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import com.minecolonies.coremod.network.messages.server.colony.citizen.PauseCitizenMessage; import com.minecolonies.coremod.network.messages.server.colony.citizen.RestartCitizenMessage; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Tuple; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Style; -import net.minecraft.ChatFormatting; +import net.minecraft.util.Tuple; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -144,6 +143,7 @@ private void modeClicked(@NotNull final Button button) private void switchHiringMode(final Button settingsButton) { int index = selectedModule.getHiringMode().ordinal() + 1; + if (index == HiringMode.LOCKED.ordinal()) { ++index; } // only homes can be locked, not workplaces if (index >= HiringMode.values().length) { diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowHutAllInventory.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowHutAllInventory.java index a60bbf9fac0..8ae867503b5 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowHutAllInventory.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowHutAllInventory.java @@ -2,8 +2,8 @@ import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.*; -import com.ldtteam.blockui.views.ScrollingList; import com.ldtteam.blockui.views.BOWindow; +import com.ldtteam.blockui.views.ScrollingList; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.tileentities.TileEntityRack; @@ -11,21 +11,22 @@ import com.minecolonies.api.util.Utils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.render.worldevent.HighlightManager; +import com.minecolonies.coremod.client.render.worldevent.highlightmanager.TimedBoxRenderData; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; +import java.time.Duration; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -117,7 +118,7 @@ private void locate(final Button button) final ItemStorage storage = allItems.get(row); final Set containerList = new HashSet<>(building.getContainerList()); containerList.add(building.getID()); - HighlightManager.clearCategory("inventoryHighlight"); + HighlightManager.clearHighlightsForKey("inventoryHighlight"); MessageUtils.format(MESSAGE_LOCATING_ITEMS).sendTo(Minecraft.getInstance().player); close(); @@ -134,9 +135,9 @@ private void locate(final Button button) // mixing equation: alpha | red part | green part final int color = 0x40000000 | (Mth.clamp((int) (0xff * (2.0f - count / 32.0f)), 0, 255) << 16) | (Mth.clamp((int) (0xff * count / 32.0f), 0, 255) << 8); - HighlightManager.addRenderBox("inventoryHighlight", - new HighlightManager.TimedBoxRenderData().setPos(blockPos) - .setRemovalTimePoint(Minecraft.getInstance().level.getGameTime() + 60 * 20) + HighlightManager.addHighlight("inventoryHighlight" + blockPos, + new TimedBoxRenderData(blockPos) + .setDuration(Duration.ofSeconds(60)) .addText("" + count) .setColor(color)); } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowInteraction.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowInteraction.java index b7276a52adf..d3ad1a20bd5 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowInteraction.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowInteraction.java @@ -7,13 +7,17 @@ import com.ldtteam.blockui.views.Box; import com.minecolonies.api.colony.ICitizenDataView; import com.minecolonies.api.colony.interactionhandling.IInteractionResponseHandler; +import com.minecolonies.api.util.Log; import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.Network; import com.minecolonies.coremod.client.gui.citizen.MainWindowCitizen; +import com.minecolonies.coremod.network.messages.server.colony.InteractionClose; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; import static com.minecolonies.api.util.constant.WindowConstants.*; @@ -52,7 +56,7 @@ public WindowInteraction(final ICitizenDataView citizen) { super(Constants.MOD_ID + INTERACTION_RESOURCE_SUFFIX, new MainWindowCitizen(citizen)); this.citizen = citizen; - this.interactions = citizen.getOrderedInteractions(); + this.interactions = new ArrayList<>(citizen.getOrderedInteractions()); } /** @@ -62,6 +66,7 @@ public WindowInteraction(final ICitizenDataView citizen) public void onOpened() { super.onOpened(); + interactions.removeIf(interaction -> !interaction.isVisible(Minecraft.getInstance().level)); setupInteraction(); } @@ -77,13 +82,15 @@ private void setupInteraction() } final IInteractionResponseHandler handler = interactions.get(currentInteraction); + handler.onOpened(Minecraft.getInstance().player); final Box group = findPaneOfTypeByID(RESPONSE_BOX_ID, Box.class); + group.getChildren().clear(); int y = 0; int x = 0; final Text chatText = findPaneOfTypeByID(CHAT_LABEL_ID, Text.class); chatText.setTextAlignment(Alignment.TOP_LEFT); chatText.setAlignment(Alignment.TOP_LEFT); - chatText.setText(Component.literal(citizen.getName() + ": " + handler.getInquiry().getString())); + chatText.setText(Component.literal(citizen.getName() + ": " + handler.getInquiry(Minecraft.getInstance().player).getString())); int responseIndex = 1; for (final Component component : handler.getPossibleResponses()) { @@ -97,6 +104,7 @@ private void setupInteraction() button.setTextAlignment(Alignment.MIDDLE); button.setText(component); group.addChild(button); + button.setTextScale(Math.min(1, 20.0 / component.getString().length())); y += button.getHeight(); if (y + button.getHeight() >= group.getHeight()) @@ -110,6 +118,17 @@ private void setupInteraction() handler.onWindowOpened(this, citizen); } + @Override + public void onClosed() + { + super.onClosed(); + if (currentInteraction < interactions.size()) + { + interactions.get(currentInteraction).onClosed(); + Network.getNetwork().sendToServer(new InteractionClose(citizen.getColonyId(), citizen.getId(), mc.level.dimension(), interactions.get(currentInteraction).getInquiry())); + } + } + /** * Called when a button in the citizen has been clicked. * @@ -121,17 +140,19 @@ public void onButtonClicked(@NotNull final Button button) if (!interactions.isEmpty()) { final IInteractionResponseHandler handler = interactions.get(currentInteraction); - for (final Component component : handler.getPossibleResponses()) + try { - if (component.getString().equals(button.getTextAsString())) + if (handler.onClientResponseTriggered(Integer.parseInt(button.getID().replace("response_", "")) - 1, Minecraft.getInstance().player, citizen, this)) { - if (handler.onClientResponseTriggered(component, Minecraft.getInstance().player, citizen, this)) - { - currentInteraction++; - setupInteraction(); - return; - } + currentInteraction++; + setupInteraction(); + return; } + setupInteraction(); + } + catch (final Exception ex) + { + Log.getLogger().warn("Wrong button id of interaction.", ex); } } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowPlantationField.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowPlantationField.java new file mode 100644 index 00000000000..8c2fbd507fa --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowPlantationField.java @@ -0,0 +1,178 @@ +package com.minecolonies.coremod.client.gui; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.controls.ButtonImage; +import com.ldtteam.blockui.controls.ItemIcon; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.Box; +import com.ldtteam.blockui.views.ScrollingList; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.colony.workorders.WorkOrderType; +import com.minecolonies.api.tileentities.AbstractTileEntityPlantationField; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.network.messages.server.PlantationFieldBuildRequestMessage; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * The window shown when clicking on plantation fields blocks. + */ +public class WindowPlantationField extends AbstractWindowSkeleton +{ + /** + * Link to the xml file of the window. + */ + private static final String WINDOW_RESOURCE = ":gui/windowplantationfield.xml"; + + /** + * The ID for the "not in colony" text. + */ + private static final String NOT_IN_COLONY_TEXT_ID = "not-in-colony"; + + /** + * The ID of the select seed button. + */ + private static final String PLANTS_HEADER_TEXT_ID = "plants-header"; + + /** + * ID of the plants list inside the GUI. + */ + private static final String LIST_PLANTS_ID = "plants"; + + /** + * ID of the plants list icon items inside the GUI. + */ + private static final String LIST_PLANTS_ICON_ID = "icon"; + + /** + * ID of the button to repair the schematic. + */ + private static final String BUTTON_REPAIR_ID = "repair"; + + /** + * The amount of columns every row in the list of plants has. + */ + private static final double LIST_PLANTS_COLUMN_COUNT = 4; + + /** + * The plantation field tile entity which is at this location. + */ + private final AbstractTileEntityPlantationField tileEntityPlantationField; + + /** + * All the plants configured on the plantation field. + */ + private final List plants; + + /** + * Constructor for the plantation field window. + * + * @param tileEntityPlantationField the tile entity which is at this location. + */ + public WindowPlantationField(AbstractTileEntityPlantationField tileEntityPlantationField) + { + super(Constants.MOD_ID + WINDOW_RESOURCE); + this.tileEntityPlantationField = tileEntityPlantationField; + this.plants = tileEntityPlantationField.getPlantationFieldTypes().stream() + .flatMap(f -> f.getFieldModuleProducers().stream().map(m -> m.apply(null)).filter(IPlantationModule.class::isInstance).map(m -> (IPlantationModule) m)) + .map(fieldType -> new ItemStack(fieldType.getItem())) + .toList(); + + registerButton(BUTTON_REPAIR_ID, this::repairField); + + updateElementStates(); + } + + private void repairField() + { + close(); + new WindowBuildDecoration(tileEntityPlantationField.getBlockPos(), + tileEntityPlantationField.getPackName(), + tileEntityPlantationField.getBlueprintPath(), + tileEntityPlantationField.getRotation(), + tileEntityPlantationField.getMirror(), + builder -> new PlantationFieldBuildRequestMessage(WorkOrderType.REPAIR, + tileEntityPlantationField.getBlockPos(), + tileEntityPlantationField.getPackName(), + tileEntityPlantationField.getBlueprintPath(), + Minecraft.getInstance().level.dimension(), + tileEntityPlantationField.getRotation(), + tileEntityPlantationField.getMirror(), + builder)).open(); + } + + /** + * Updates the states of certain additional elements, determining whether they should be enabled/visible. + */ + private void updateElementStates() + { + IColonyView colonyView = getCurrentColony(); + + findPaneOfTypeByID(NOT_IN_COLONY_TEXT_ID, Text.class).setVisible(colonyView == null); + findPaneOfTypeByID(PLANTS_HEADER_TEXT_ID, Text.class).setVisible(colonyView != null); + findPaneOfTypeByID(LIST_PLANTS_ID, ScrollingList.class).setVisible(colonyView != null); + findPaneOfTypeByID(BUTTON_REPAIR_ID, ButtonImage.class).setVisible(colonyView != null); + } + + /** + * Get the current colony, if any, from the tile entity. + * + * @return the colony view, if exists. + */ + @Nullable + private IColonyView getCurrentColony() + { + if (tileEntityPlantationField.getCurrentColony() instanceof IColonyView colonyView) + { + return colonyView; + } + return null; + } + + @Override + public void onUpdate() + { + super.onUpdate(); + updateElementStates(); + } + + @Override + public void onOpened() + { + super.onOpened(); + + ScrollingList fieldList = findPaneOfTypeByID(LIST_PLANTS_ID, ScrollingList.class); + fieldList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return (int) Math.ceil(plants.size() / LIST_PLANTS_COLUMN_COUNT); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + for (int id = 1; id <= LIST_PLANTS_COLUMN_COUNT; id++) + { + ItemIcon pane = rowPane.findPaneOfTypeByID(LIST_PLANTS_ICON_ID + id, ItemIcon.class); + final Box parent = (Box) pane.getParent(); + parent.setLineWidth(0); + + // Row index + item index + int itemIndex = ((index + 1) * id) - 1; + if (itemIndex < plants.size()) + { + pane.setItem(plants.get(itemIndex)); + parent.setLineWidth(1); + } + } + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowRequestDetail.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowRequestDetail.java index a9026f57aa9..a51ed8f3212 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowRequestDetail.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowRequestDetail.java @@ -8,12 +8,14 @@ import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IStackBasedTask; import com.minecolonies.api.colony.requestsystem.resolver.IRequestResolver; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.client.gui.citizen.RequestWindowCitizen; +import com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests; import com.minecolonies.coremod.network.messages.server.ClickGuiButtonTriggerMessage; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -28,6 +30,7 @@ import static com.minecolonies.api.util.constant.Suppression.EXCEPTION_HANDLERS_SHOULD_PRESERVE_THE_ORIGINAL_EXCEPTIONS; import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.api.util.constant.WindowConstants.LIFE_COUNT_DIVIDER; import static com.minecolonies.coremod.colony.requestsystem.requests.AbstractRequest.MISSING; /** @@ -131,18 +134,20 @@ public void onUpdate() @Override public void onOpened() { - final Box box = findPaneOfTypeByID(BOX_ID_REQUEST, Box.class); - final Text description = PaneBuilders.textBuilder() - .style(ChatFormatting.getByCode('r')) - .style(ChatFormatting.getByCode('0')) - .append(request.getLongDisplayString()) - .build(); - description.setPosition(1, 1); - description.setSize(box.getWidth() - 2, AbstractTextElement.SIZE_FOR_UNLIMITED_ELEMENTS); - - box.addChild(description); - box.setSize(box.getWidth(), description.getRenderedTextHeight() + 2); - description.setSize(box.getWidth() - 2, box.getHeight()); + if (request instanceof IStackBasedTask) + { + final ItemIcon icon = findPaneOfTypeByID("detailIcon", ItemIcon.class); + final ItemStack copyStack = ((IStackBasedTask) request).getTaskStack().copy(); + copyStack.setCount(((IStackBasedTask) request).getDisplayCount()); + icon.setItem(copyStack); + icon.setVisible(true); + findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(((IStackBasedTask) request).getDisplayPrefix().withStyle(ChatFormatting.BLACK)); + } + else + { + findPaneOfTypeByID("detailIcon", ItemIcon.class).setVisible(false); + findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(Component.literal(request.getLongDisplayString().getString().replace("§f", "")).withStyle(ChatFormatting.BLACK)); + } final Image logo = findPaneOfTypeByID(DELIVERY_IMAGE, Image.class); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowResearchTree.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowResearchTree.java index db260fc2582..87fb3496c56 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowResearchTree.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowResearchTree.java @@ -8,6 +8,7 @@ import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.research.*; +import com.minecolonies.api.research.effects.IResearchEffect; import com.minecolonies.api.research.util.ResearchState; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; @@ -15,28 +16,28 @@ import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.client.gui.modules.UniversityModuleWindow; -import com.minecolonies.coremod.colony.buildings.views.EmptyView; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingUniversity; import com.minecolonies.coremod.network.messages.server.colony.building.university.TryResearchMessage; import com.minecolonies.coremod.research.AlternateBuildingResearchRequirement; import com.minecolonies.coremod.research.BuildingResearchRequirement; import com.minecolonies.coremod.research.GlobalResearchEffect; import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.resources.ResourceLocation; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import static com.minecolonies.api.research.util.ResearchConstants.*; import static com.minecolonies.api.util.constant.WindowConstants.*; -import net.minecraft.network.chat.Component; - /** * BOWindow to display a particular branch of the tree. */ @@ -375,7 +376,7 @@ private void drawTreeBackground(final ZoomDragView view, final int maxHeight) // Draw the last gradient beyond the edge of the displayed area, to avoid blank spot on the right. gradient.setSize(i == MAX_DEPTH ? 400 : GRADIENT_WIDTH + X_SPACING, (maxHeight + 4) * (GRADIENT_HEIGHT + Y_SPACING) + Y_SPACING + TIMELABEL_Y_POSITION); gradient.setPosition((i - 1) * (GRADIENT_WIDTH + X_SPACING), 0); - view.getChildren().add(0, gradient); + view.addChild(gradient, 0); timeLabel.setColors(COLOR_TEXT_NEGATIVE); } else @@ -629,22 +630,27 @@ private void generateResearchTooltips(final Button tipItem, final IGlobalResearc } for (int txt = 0; txt < research.getEffects().size(); txt++) { + final IResearchEffect researchEffect = research.getEffects().get(txt); // CITIZEN_CAP's meaningful effect range is controlled by configuration file settings. Very low values will necessarily make their researches a little weird, but we should at least handle 'sane' ranges. // Only change the effect description, rather than removing the effect, as someone may plausibly use the research as a parent research. // I'd rather make these modifications during ResearchListener.apply, but that's called before config files can be loaded, and the other workarounds are even uglier. - if(research.getEffects().get(txt).getId().equals(CITIZEN_CAP) - && (((GlobalResearchEffect)research.getEffects().get(txt)).getEffect() + 25) > IMinecoloniesAPI.getInstance().getConfig().getServer().maxCitizenPerColony.get()) + if (researchEffect instanceof GlobalResearchEffect globalResearchEffect && researchEffect.getId().equals(CITIZEN_CAP) + && globalResearchEffect.getEffect() > IMinecoloniesAPI.getInstance().getConfig().getServer().maxCitizenPerColony.get()) { - hoverPaneBuilder.paragraphBreak().append(Component.translatable("com.minecolonies.research.effects.citizencapaddition.description", Component.translatable( - "com.minecolonies.coremod.research.limit.maxeffect"))); + final MutableComponent mainText = + Component.translatable(researchEffect.getDesc().getKey(), 0, IMinecoloniesAPI.getInstance().getConfig().getServer().maxCitizenPerColony.get()); + // This call to `Math.round` doesn't serve any purpose, it's only meant to convert the double into a long, so that it will display correctly without any trailing zeroes. + final MutableComponent finishText = Component.translatable(researchEffect.getDesc().getKey() + ".over", Math.round(globalResearchEffect.getEffect())); + hoverPaneBuilder.paragraphBreak().append(mainText).append(Component.literal(" ")).append(finishText); } else { - hoverPaneBuilder.paragraphBreak().append(MutableComponent.create(research.getEffects().get(txt).getDesc())); + hoverPaneBuilder.paragraphBreak().append(MutableComponent.create(researchEffect.getDesc())); } - if (!research.getEffects().get(txt).getSubtitle().getKey().isEmpty()) + + if (!researchEffect.getSubtitle().getKey().isEmpty()) { - hoverPaneBuilder.paragraphBreak().append(Component.literal("-")).append(MutableComponent.create(research.getEffects().get(txt).getSubtitle())).italic().colorName("GRAY"); + hoverPaneBuilder.paragraphBreak().append(Component.literal("-")).append(MutableComponent.create(researchEffect.getSubtitle())).italic().colorName("GRAY"); } } if (state != ResearchButtonState.FINISHED && state != ResearchButtonState.IN_PROGRESS) @@ -860,79 +866,45 @@ private void drawResearchReqsAndCosts( } int storageXOffset = ICON_WIDTH; - for (final IResearchRequirement requirement : research.getResearchRequirement()) - { - if (requirement instanceof AlternateBuildingResearchRequirement) - { - for (Map.Entry building : ((AlternateBuildingResearchRequirement) requirement).getBuildings().entrySet()) - { - final Item item; - if (IMinecoloniesAPI.getInstance().getBuildingRegistry().containsKey( - new ResourceLocation(Constants.MOD_ID, building.getKey()))) - { - item = IMinecoloniesAPI.getInstance().getBuildingRegistry().getValue( - new ResourceLocation(Constants.MOD_ID, building.getKey())).getBuildingBlock().asItem(); - } - else - { - item = Items.AIR.asItem(); - } - final ItemStack stack = new ItemStack(item); - stack.setCount(building.getValue()); - final ItemIcon icon = new ItemIcon(); - icon.setItem(stack); - icon.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT); - icon.setSize(DEFAULT_COST_SIZE, DEFAULT_COST_SIZE); - view.addChild(icon); - if(requirement.isFulfilled(this.building.getColony())) - { - PaneBuilders.tooltipBuilder().hoverPane(icon).paragraphBreak().append(requirement.getDesc()).color(COLOR_TEXT_FULFILLED).build(); - } - else - { - PaneBuilders.tooltipBuilder().hoverPane(icon).paragraphBreak().append(requirement.getDesc()).color(COLOR_TEXT_UNFULFILLED).build(); - } + final List alternateBuildingRequirements = new ArrayList<>(); + final List buildingRequirements = new ArrayList<>(); + final List itemRequirements = research.getCostList(); - storageXOffset += COST_OFFSET; - } - // There will only ever be one AlternateBuildingRequirement per research, under the current implementation. - break; + research.getResearchRequirement().forEach(requirement -> { + // There will only ever be one AlternateBuildingRequirement per research, under the current implementation. + if (requirement instanceof AlternateBuildingResearchRequirement alternateBuildingRequirement && alternateBuildingRequirements.isEmpty()) + { + alternateBuildingRequirements.add(alternateBuildingRequirement); } - } - // If there are more than one requirement, we want a clear divider before normal building research requirements. - if (storageXOffset > ICON_WIDTH + COST_OFFSET) - { - final Image divider = new Image(); - divider.setImage(new ResourceLocation(Constants.MOD_ID, "textures/gui/research/research_button_large_stitches.png"), false); - divider.setSize(ICON_X_OFFSET, Y_SPACING); - divider.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT + 4); - view.addChild(divider); - storageXOffset += ICON_X_OFFSET; - } + else if (requirement instanceof BuildingResearchRequirement buildingRequirement) + { + buildingRequirements.add(buildingRequirement); + } + }); - for (final IResearchRequirement requirement : research.getResearchRequirement()) + for (final AlternateBuildingResearchRequirement requirement : alternateBuildingRequirements) { - if (requirement instanceof BuildingResearchRequirement) + for (Map.Entry building : requirement.getBuildings().entrySet()) { final Item item; if (IMinecoloniesAPI.getInstance().getBuildingRegistry().containsKey( - new ResourceLocation(Constants.MOD_ID, ((BuildingResearchRequirement) requirement).getBuilding()))) + new ResourceLocation(Constants.MOD_ID, building.getKey()))) { item = IMinecoloniesAPI.getInstance().getBuildingRegistry().getValue( - new ResourceLocation(Constants.MOD_ID, ((BuildingResearchRequirement) requirement).getBuilding())).getBuildingBlock().asItem(); + new ResourceLocation(Constants.MOD_ID, building.getKey())).getBuildingBlock().asItem(); } else { item = Items.AIR.asItem(); } final ItemStack stack = new ItemStack(item); - stack.setCount(((BuildingResearchRequirement) requirement).getBuildingLevel()); + stack.setCount(building.getValue()); final ItemIcon icon = new ItemIcon(); icon.setItem(stack); - icon.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT + TEXT_Y_OFFSET); + icon.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT); icon.setSize(DEFAULT_COST_SIZE, DEFAULT_COST_SIZE); view.addChild(icon); - if(requirement.isFulfilled(this.building.getColony())) + if (requirement.isFulfilled(this.building.getColony())) { PaneBuilders.tooltipBuilder().hoverPane(icon).paragraphBreak().append(requirement.getDesc()).color(COLOR_TEXT_FULFILLED).build(); } @@ -944,19 +916,52 @@ private void drawResearchReqsAndCosts( storageXOffset += COST_OFFSET; } } - // If there are two or more research requirements, we want a clear divider before the cost side. - // Again, there can only be one alternate-building requirement, so this would indicate at least two of building or research requirements. - if (research.getResearchRequirement().size() >= 2) + + // If there are more than one requirement, we want a clear divider before normal building research requirements. + if (!alternateBuildingRequirements.isEmpty() && !buildingRequirements.isEmpty()) { final Image divider = new Image(); divider.setImage(new ResourceLocation(Constants.MOD_ID, "textures/gui/research/research_button_large_stitches.png"), false); divider.setSize(ICON_X_OFFSET, Y_SPACING); divider.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT + 4); view.addChild(divider); + storageXOffset += ICON_X_OFFSET; + } + + for (final BuildingResearchRequirement requirement : buildingRequirements) + { + final Item item; + if (IMinecoloniesAPI.getInstance().getBuildingRegistry().containsKey( + new ResourceLocation(Constants.MOD_ID, requirement.getBuilding()))) + { + item = IMinecoloniesAPI.getInstance().getBuildingRegistry().getValue( + new ResourceLocation(Constants.MOD_ID, requirement.getBuilding())).getBuildingBlock().asItem(); + } + else + { + item = Items.AIR.asItem(); + } + final ItemStack stack = new ItemStack(item); + stack.setCount(requirement.getBuildingLevel()); + final ItemIcon icon = new ItemIcon(); + icon.setItem(stack); + icon.setPosition(offsetX + storageXOffset, offsetY + NAME_LABEL_HEIGHT + TEXT_Y_OFFSET); + icon.setSize(DEFAULT_COST_SIZE, DEFAULT_COST_SIZE); + view.addChild(icon); + if (requirement.isFulfilled(this.building.getColony())) + { + PaneBuilders.tooltipBuilder().hoverPane(icon).paragraphBreak().append(requirement.getDesc()).color(COLOR_TEXT_FULFILLED).build(); + } + else + { + PaneBuilders.tooltipBuilder().hoverPane(icon).paragraphBreak().append(requirement.getDesc()).color(COLOR_TEXT_UNFULFILLED).build(); + } + + storageXOffset += COST_OFFSET; } storageXOffset = COST_OFFSET; - for (final ItemStorage storage : research.getCostList()) + for (final ItemStorage storage : itemRequirements) { // This must be a copy, to avoid potential serialization issues with large item stack counts. final ItemStack is = storage.getItemStack().copy(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowSchematicAnalyzer.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowSchematicAnalyzer.java new file mode 100644 index 00000000000..52401d43a5b --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowSchematicAnalyzer.java @@ -0,0 +1,390 @@ +package com.minecolonies.coremod.client.gui; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.*; +import com.ldtteam.blockui.views.Box; +import com.ldtteam.blockui.views.ScrollingList; +import com.ldtteam.structurize.api.util.ItemStorage; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.client.gui.AbstractWindowSkeleton; +import com.ldtteam.structurize.client.gui.WindowExtendedBuildTool; +import com.ldtteam.structurize.storage.rendering.RenderingCache; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.items.ItemScanAnalyzer; +import com.minecolonies.coremod.util.SchemAnalyzerUtil; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import java.util.*; + +import static com.minecolonies.coremod.items.ItemScanAnalyzer.TEMP_SCAN; + +/** + * Window for finishing a scan. + */ +public class WindowSchematicAnalyzer extends AbstractWindowSkeleton +{ + /** + * Link to the xml file of the window. + */ + private static final String ID = "minecolonies:gui/analyzer/windowanalyze.xml"; + + /** + * Xml ID's for analyzer/analyzedisplay.xml + */ + private static final String BUTTON_SELECTION_LEFT = "selectleft"; + private static final String BUTTON_SELECTION_RIGHT = "selectright"; + private static final String BUTTON_SELECT_SCHEMATIC = "selectschematic"; + private static final String BUTTON_VIEW_CURRENT = "viewschem"; + private static final String BOX_RESULTS = "results"; + private static final String BOX_LEFT = "left"; + private static final String BOX_RIGHT = "right"; + private static final String LABEL_SCORE = "score"; + private static final String LABEL_SIZE = "size"; + private static final String LABEL_BUILDINGS = "buildings"; + private static final String BUTTON_SHOW_RES = "showresources"; + private static final String BUTTON_CANCEL = "cancel"; + private static final String LIST_RES = "resources"; + private static final String LIST_ENTRY_ITEMICON = "resourceIcon"; + private static final String LIST_ENTRY_LABEL = "resourceName"; + private static final String LIST_ENTRY_COUNT = "resourceCount"; + + /** + * Cached analyzed blueprints + */ + public static Map analyzationResults = new LinkedHashMap<>(); + + /** + * Sorted list of the analyzation results, for UI purposes to scroll through + */ + private static List sortedAnalyzationResults = new ArrayList<>(); + + /** + * Current selection for left/right schematic result display + */ + private static SchemAnalyzerUtil.SchematicAnalyzationResult selectedLeft = null; + private static SchemAnalyzerUtil.SchematicAnalyzationResult selectedRight = null; + + public WindowSchematicAnalyzer() + { + super(ID); + registerButton(BUTTON_CANCEL, b -> { + close(); + }); + registerButton(BUTTON_SELECT_SCHEMATIC, b -> { + new WindowExtendedBuildTool( + new BlockPos(Minecraft.getInstance().player.position().add(Minecraft.getInstance().player.getLookAngle().multiply(10, 10, 10))), + 1, + (window, blueprint) -> { + Minecraft.getInstance().setScreen(this.getScreen()); + final SchemAnalyzerUtil.SchematicAnalyzationResult result = analyzationResults.computeIfAbsent(blueprint, SchemAnalyzerUtil::analyzeSchematic); + sortAnalyzationResults(); + switchSelectionTo(getBoxForSide(b), result); + }, + (a) -> true + ).open(); + }); + + registerButton(BUTTON_SELECTION_LEFT, b -> { + switchSelection(b, false); + }); + + registerButton(BUTTON_SELECTION_RIGHT, b -> { + switchSelection(b, true); + }); + + registerButton(BUTTON_SHOW_RES, this::showResourcesFor); + + if (ItemScanAnalyzer.blueprint != null) + { + analyzationResults.keySet().removeIf(blueprint -> blueprint.getName().equals(TEMP_SCAN)); + analyzationResults.put(ItemScanAnalyzer.blueprint, SchemAnalyzerUtil.analyzeSchematic(ItemScanAnalyzer.blueprint)); + } + + sortAnalyzationResults(); + + for (SchemAnalyzerUtil.SchematicAnalyzationResult sortedAnalyzationResult : sortedAnalyzationResults) + { + if (sortedAnalyzationResult.blueprint.equals(ItemScanAnalyzer.blueprint)) + { + selectedRight = sortedAnalyzationResult; + ItemScanAnalyzer.blueprint = null; + break; + } + } + + selectedLeft = getPrevFor(getNextFor(selectedLeft)); + + switchSelectionTo(getLeftSide(), selectedLeft); + switchSelectionTo(getRightSide(), selectedRight); + } + + /** + * Displays the resources list for a blueprint + * + * @param b + */ + private void showResourcesFor(final Button b) + { + final ScrollingList resourceList = b.getParent().findPaneOfTypeByID(LIST_RES, ScrollingList.class); + resourceList.setVisible(true); + b.setVisible(false); + SchemAnalyzerUtil.SchematicAnalyzationResult selected = getCurrentSelectionData(b); + final List resources = new ArrayList<>(selected.differentBlocks); + resources.sort(Comparator.comparingInt(ItemStorage::getAmount).reversed()); + + resourceList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return resources.size(); + } + + @Override + public void updateElement(final int index, final Pane rowPane) + { + final ItemStorage storage = resources.get(index); + final Text resourceLabel = rowPane.findPaneOfTypeByID(LIST_ENTRY_LABEL, Text.class); + final Text countLabel = rowPane.findPaneOfTypeByID(LIST_ENTRY_COUNT, Text.class); + countLabel.setText(Component.literal(Integer.toString(storage.getAmount())).withStyle(ChatFormatting.YELLOW)); + PaneBuilders.tooltipBuilder().hoverPane(countLabel) + .append(Component.translatable("com.minecolonies.coremod.gui.analyzer.score", + storage.getItemStack().getCount(), + storage.getItemStack().getCount() * storage.getAmount())) + .build(); + resourceLabel.setText(storage.getItemStack().getHoverName()); + final ItemStack copy = storage.getItemStack().copy(); + copy.setCount(1); + rowPane.findPaneOfTypeByID(LIST_ENTRY_ITEMICON, ItemIcon.class).setItem(copy); + } + }); + } + + /** + * Get the left result display box + * + * @return + */ + private Box getLeftSide() + { + return findPaneOfTypeByID(BOX_LEFT, Box.class); + } + + /** + * Get the right result display box + * + * @return + */ + private Box getRightSide() + { + return findPaneOfTypeByID(BOX_RIGHT, Box.class); + } + + /** + * Find the right/left side result display box for the given pane + * + * @param context + * @return + */ + private Box getBoxForSide(final Pane context) + { + if (isLeft(context)) + { + return getLeftSide(); + } + return getRightSide(); + } + + /** + * Check on which side the current element is + * + * @param current + * @return + */ + private boolean isLeft(final Pane current) + { + if (current.getID().equals(BOX_LEFT)) + { + return true; + } + if (current.getParent() != null && current.getParent().getID().equals(BOX_LEFT)) + { + return true; + } + + if (current.getParent().getParent() != null && current.getParent().getParent().getID().equals(BOX_LEFT)) + { + return true; + } + + return false; + } + + /** + * Get the current selection data depending on side + * + * @param context + * @return + */ + private SchemAnalyzerUtil.SchematicAnalyzationResult getCurrentSelectionData(Pane context) + { + + SchemAnalyzerUtil.SchematicAnalyzationResult selection; + if (isLeft(context)) + { + selection = selectedLeft; + } + else + + { + selection = selectedRight; + } + + return selection; + } + + /** + * Gets the next entry in the list + * + * @param current + * @return + */ + private SchemAnalyzerUtil.SchematicAnalyzationResult getNextFor(SchemAnalyzerUtil.SchematicAnalyzationResult current) + { + final int currentIndex = sortedAnalyzationResults.indexOf(current); + if (current != null && currentIndex == -1 && !sortedAnalyzationResults.isEmpty()) + { + return sortedAnalyzationResults.get(0); + } + + if (currentIndex != -1 && currentIndex + 1 < sortedAnalyzationResults.size()) + { + return sortedAnalyzationResults.get(currentIndex + 1); + } + + return current; + } + + /** + * Gets the previous entry in the list + * + * @param current + * @return + */ + private SchemAnalyzerUtil.SchematicAnalyzationResult getPrevFor(SchemAnalyzerUtil.SchematicAnalyzationResult current) + { + final int currentIndex = sortedAnalyzationResults.indexOf(current); + if (current != null && currentIndex == -1 && !sortedAnalyzationResults.isEmpty()) + { + return sortedAnalyzationResults.get(0); + } + + if (currentIndex - 1 >= 0 && currentIndex - 1 < sortedAnalyzationResults.size()) + { + return sortedAnalyzationResults.get(currentIndex - 1); + } + + return current; + } + + /** + * Sorts the results in the saved list + */ + private void sortAnalyzationResults() + { + sortedAnalyzationResults = new ArrayList<>(analyzationResults.values()); + sortedAnalyzationResults.sort((o1, o2) -> o1.blueprint.getName().compareToIgnoreCase(o2.blueprint.getName())); + } + + /** + * Switches the selection to the next schematic + * + * @param buttonClicked + * @param next + */ + private void switchSelection(final Button buttonClicked, boolean next) + { + SchemAnalyzerUtil.SchematicAnalyzationResult result; + if (next) + { + result = getNextFor(getCurrentSelectionData(buttonClicked)); + } + else + { + result = getPrevFor(getCurrentSelectionData(buttonClicked)); + } + + switchSelectionTo(getBoxForSide(buttonClicked), result); + } + + /** + * Switches the selection to the given schematic + * + * @param next + */ + private void switchSelectionTo(final Box parent, SchemAnalyzerUtil.SchematicAnalyzationResult next) + { + if (isLeft(parent)) + { + selectedLeft = next; + } + else + { + selectedRight = next; + } + + final Box box = parent.findPaneOfTypeByID(BOX_RESULTS, Box.class); + if (box == null) + { + Log.getLogger().warn("Nonexisting pane"); + return; + } + + if (next == null) + { + parent.findPaneOfTypeByID(BUTTON_VIEW_CURRENT, ButtonVanilla.class).setText(Component.literal("none")); + box.hide(); + box.findPaneOfTypeByID(BUTTON_SHOW_RES, ButtonImage.class).setVisible(false); + return; + } + + box.show(); + + String name = next.blueprint.getName(); + if (next.blueprint.getFileName() != null && next.blueprint.getFilePath() != null) + { + final String[] split = next.blueprint.getFileName().split("/"); + name = next.blueprint.getFilePath().toString().replace("blueprints/minecolonies/", "") + "/" + split[split.length - 1]; + } + name = name.replace(".blueprint", ""); + parent.findPaneOfTypeByID(BUTTON_VIEW_CURRENT, ButtonVanilla.class).setText(Component.literal(name)); + + box.findPaneOfTypeByID(LABEL_SCORE, Text.class) + .setText(Component.translatable("com.minecolonies.coremod.gui.analyzer.complexity", Component.literal("" + next.costScore).withStyle( + ChatFormatting.RED))); + + box.findPaneOfTypeByID(LABEL_SIZE, Text.class) + .setText(Component.translatable("com.minecolonies.coremod.gui.analyzer.size", Component.literal("[" + next.blueprint.getSizeX() + " " + next.blueprint.getSizeY() + " " + + next.blueprint.getSizeZ() + "]").withStyle(ChatFormatting.YELLOW))); + + box.findPaneOfTypeByID(LABEL_BUILDINGS, Text.class) + .setText(Component.translatable("com.minecolonies.coremod.gui.analyzer.buildings", Component.literal("" + next.containedBuildings).withStyle(ChatFormatting.GOLD))); + + final ScrollingList resourceList = box.findPaneOfTypeByID(LIST_RES, ScrollingList.class); + resourceList.setVisible(false); + box.findPaneOfTypeByID(BUTTON_SHOW_RES, ButtonImage.class).setText(Component.translatable("com.ldtteam.structurize.gui.scantool.showres")); + box.findPaneOfTypeByID(BUTTON_SHOW_RES, ButtonImage.class).setVisible(true); + } + + @Override + public void onClosed() + { + RenderingCache.removeBox("analyzer"); + super.onClosed(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowSelectRes.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowSelectRes.java index 032fe4000d4..b6ca61f281e 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowSelectRes.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowSelectRes.java @@ -1,21 +1,18 @@ package com.minecolonies.coremod.client.gui; -import com.google.common.collect.ImmutableList; import com.ldtteam.blockui.Color; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.ItemIcon; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.controls.TextField; -import com.ldtteam.blockui.views.ScrollingList; import com.ldtteam.blockui.views.BOWindow; -import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.ldtteam.blockui.views.ScrollingList; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; -import net.minecraft.world.item.ItemStack; import net.minecraft.client.Minecraft; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; @@ -25,8 +22,6 @@ import java.util.Locale; import java.util.function.BiConsumer; import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; import static com.minecolonies.api.util.constant.WindowConstants.BUTTON_SELECT; import static com.minecolonies.api.util.constant.WindowConstants.NAME_LABEL; @@ -74,11 +69,10 @@ public class WindowSelectRes extends AbstractWindowSkeleton /** * Create a selection window with the origin window as input. * - * @param origin the origin. - * @param building the building. - * @param test the testing predicate for the selector. + * @param origin the origin. + * @param test the testing predicate for the selector. */ - public WindowSelectRes(final BOWindow origin, final IBuildingView building, final Predicate test, final BiConsumer consumer, final boolean displayQty) + public WindowSelectRes(final BOWindow origin, final Predicate test, final BiConsumer consumer, final boolean displayQty) { super("minecolonies:gui/windowselectres.xml", origin); this.resourceList = this.findPaneOfTypeByID("resources", ScrollingList.class); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/WindowSupplies.java b/src/main/java/com/minecolonies/coremod/client/gui/WindowSupplies.java index db58a450171..cb25f9e819a 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/WindowSupplies.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/WindowSupplies.java @@ -14,6 +14,7 @@ import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.render.worldevent.HighlightManager; +import com.minecolonies.coremod.client.render.worldevent.highlightmanager.TimedBoxRenderData; import com.minecolonies.coremod.items.ItemSupplyCampDeployer; import com.minecolonies.coremod.items.ItemSupplyChestDeployer; import com.minecolonies.coremod.placementhandlers.main.SuppliesHandler; @@ -23,6 +24,7 @@ import org.jetbrains.annotations.Nullable; import java.nio.file.Files; +import java.time.Duration; import java.util.ArrayList; import java.util.List; @@ -65,7 +67,7 @@ public WindowSupplies(@Nullable final BlockPos pos, final String type) if (!type.equals(WindowSupplies.type)) { - HighlightManager.clearCategory(RENDER_BOX_CATEGORY); + HighlightManager.clearHighlightsForKey(RENDER_BOX_CATEGORY); RenderingCache.removeBlueprint("supplies"); } else if (RenderingCache.getOrCreateBlueprintPreviewData("supplies").getBlueprint() == null) @@ -105,6 +107,11 @@ private void loadBlueprint() ClientFutureProcessor.queueBlueprint(new ClientFutureProcessor.BlueprintProcessingData( StructurePacks.getBlueprintFuture(structurePack.getName(), "decorations/supplies/" + type + ".blueprint"), blueprint -> { + if (blueprint == null) + { + cancelClicked(); + return; + } RenderingCache.getOrCreateBlueprintPreviewData("supplies").setBlueprint(blueprint); adjustToGroundOffset(); findPaneOfTypeByID("tip", Text.class).setVisible(false); @@ -114,7 +121,7 @@ private void loadBlueprint() @Override protected void cancelClicked() { - HighlightManager.clearCategory(RENDER_BOX_CATEGORY); + HighlightManager.clearHighlightsForKey(RENDER_BOX_CATEGORY); RenderingCache.removeBlueprint("supplies"); close(); } @@ -171,18 +178,18 @@ protected void handlePlacement(final BuildToolPlacementMessage.HandlerType handl } } - HighlightManager.clearCategory(RENDER_BOX_CATEGORY); + HighlightManager.clearHighlightsForKey(RENDER_BOX_CATEGORY); if (!placementErrorList.isEmpty()) { MessageUtils.format(WARNING_SUPPLY_BUILDING_BAD_BLOCKS).sendTo(Minecraft.getInstance().player); + int i = 0; for (final PlacementError error : placementErrorList) { - HighlightManager.addRenderBox(RENDER_BOX_CATEGORY, new HighlightManager.TimedBoxRenderData() - .setPos(error.getPos()) - .setRemovalTimePoint(Minecraft.getInstance().level.getGameTime() + 120 * 20 * 60) + HighlightManager.addHighlight(RENDER_BOX_CATEGORY + i++, new TimedBoxRenderData(error.getPos()) .addText(Component.translatable(PARTIAL_WARNING_SUPPLY_BUILDING_ERROR + error.getType().toString().toLowerCase()).getString()) - .setColor(0xFF0000)); + .setColor(0x80FF0000) + .setDuration(Duration.ofSeconds(60))); } } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/citizen/CitizenWindowUtils.java b/src/main/java/com/minecolonies/coremod/client/gui/citizen/CitizenWindowUtils.java index ecfa0ce6648..91dc25e1010 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/citizen/CitizenWindowUtils.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/citizen/CitizenWindowUtils.java @@ -6,14 +6,13 @@ import com.ldtteam.blockui.controls.Image; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.View; -import com.ldtteam.structurize.util.LanguageHandler; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.ICitizenDataView; import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.ModBuildings; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.entity.citizen.Skill; -import com.minecolonies.api.util.constant.HappinessConstants; +import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.gui.AbstractWindowSkeleton; import com.minecolonies.coremod.colony.buildings.moduleviews.WorkerBuildingModuleView; import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; @@ -41,6 +40,8 @@ */ public class CitizenWindowUtils { + public static final ResourceLocation HAPPINESS_ICONS_LOCATION = new ResourceLocation(Constants.MOD_ID, "textures/gui/citizen/icons.png"); + /** * Private con to hide public. */ @@ -49,6 +50,40 @@ private CitizenWindowUtils() // Intentionally left empty. } + /** + * Enum for the available smileys. + */ + private enum SmileyEnum + { + EMPTY(HAPPINESS_ICONS_LOCATION, EMPTY_HEART_ICON_X, HEART_ICON_MC_Y, EMPTY_HEART_VALUE, null, null), + HALF_RED(HAPPINESS_ICONS_LOCATION, HALF_RED_HEART_ICON_X, HEART_ICON_MC_Y, RED_HEART_VALUE - 1, null, EMPTY), + RED(HAPPINESS_ICONS_LOCATION, RED_HEART_ICON_X, HEART_ICON_MC_Y, RED_HEART_VALUE, HALF_RED, EMPTY); + + public final int X; + public final int Y; + public final int happinessValue; + public final SmileyEnum prevSmiley; + public final SmileyEnum halfSmiley; + public boolean isHalfSmiley = false; + public final ResourceLocation Image; + + SmileyEnum( + final ResourceLocation heartImage, final int x, final int y, final int happinessValue, + final SmileyEnum halfSmiley, final SmileyEnum prevSmiley) + { + this.Image = heartImage; + this.X = x; + this.Y = y; + this.happinessValue = happinessValue; + this.halfSmiley = halfSmiley; + if (halfSmiley == null) + { + isHalfSmiley = true; + } + this.prevSmiley = prevSmiley; + } + } + /** * Enum for the available hearts */ @@ -260,44 +295,90 @@ public static void createSaturationBar(final double curSaturation, final View vi } /** - * Creates an Happiness bar according to the citizen maxHappiness and currentHappiness. + * Creates a Happiness bar according to the citizen maxHappiness and currentHappiness. * * @param citizen pointer to the citizen data view - * @param window pointer to the current window + * @param happinessParView pointer to the current bar view. */ - public static void createHappinessBar(final ICitizenDataView citizen, final AbstractWindowSkeleton window) + public static void createHappinessBar(final ICitizenDataView citizen, final View happinessParView) { - //Calculates how much percent of the next level has been completed. - final double experienceRatio = (citizen.getHappiness() / HappinessConstants.MAX_HAPPINESS) * XP_BAR_WIDTH; - window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class).setAlignment(Alignment.MIDDLE_RIGHT); - window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS, Text.class).setText(Component.literal(Integer.toString((int) citizen.getHappiness()))); - - @NotNull final Image xpBar = new Image(); - xpBar.setImage(Screen.GUI_ICONS_LOCATION, XP_BAR_ICON_COLUMN, HAPPINESS_BAR_EMPTY_ROW, XP_BAR_WIDTH, XP_HEIGHT); - xpBar.setMapDimensions(256, 256); - xpBar.setSize(XP_BAR_WIDTH, XP_HEIGHT); - xpBar.setPosition(LEFT_BORDER_X, LEFT_BORDER_Y); + int happiness = (int) citizen.getHappiness() * 2; + // Add Empty Smiley background + for (int i = 0; i < MAX_HEART_ICONS; i++) + { + addSmiley(happinessParView, i, SmileyEnum.EMPTY); + } - @NotNull final Image xpBar2 = new Image(); - xpBar2.setImage(Screen.GUI_ICONS_LOCATION, XP_BAR_ICON_COLUMN_END, HAPPINESS_BAR_EMPTY_ROW, XP_BAR_ICON_COLUMN_END_WIDTH, XP_HEIGHT); - xpBar2.setMapDimensions(256, 256); - xpBar2.setSize(XP_BAR_ICON_COLUMN_END_WIDTH, XP_HEIGHT); - xpBar2.setPosition(XP_BAR_ICON_END_OFFSET + LEFT_BORDER_X, LEFT_BORDER_Y); + // Current Smiley we're filling + int smileyPos = 0; - window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class).addChild(xpBar); - window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class).addChild(xpBar2); + // Order we're filling the smileys with from high to low + final List heartList = new ArrayList<>(); + heartList.add(SmileyEnum.RED); - if (experienceRatio > 0) + // Iterate through hearts + for (final SmileyEnum smiley : heartList) { - @NotNull final Image xpBarFull = new Image(); - xpBarFull.setImage(Screen.GUI_ICONS_LOCATION, XP_BAR_ICON_COLUMN, HAPPINESS_BAR_FULL_ROW, (int) experienceRatio, XP_HEIGHT); - xpBarFull.setMapDimensions(256, 256); - xpBarFull.setSize((int) experienceRatio, XP_HEIGHT); - xpBarFull.setPosition(LEFT_BORDER_X, LEFT_BORDER_Y); - window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class).addChild(xpBarFull); + if (smiley.isHalfSmiley || smiley.prevSmiley == null) + { + continue; + } + + // Add full Smiley + for (int i = smileyPos; i < MAX_HEART_ICONS && happiness > (smiley.prevSmiley.happinessValue * MAX_HEART_ICONS + 1); i++) + { + addSmiley(happinessParView, smileyPos, smiley); + happiness -= (smiley.happinessValue - smiley.prevSmiley.happinessValue); + smileyPos++; + } + + // Add half Smiley + if (happiness % 2 == 1 && smileyPos < MAX_HEART_ICONS && smiley.halfSmiley != null && happiness > smiley.prevSmiley.happinessValue * MAX_HEART_ICONS) + { + addSmiley(happinessParView, smileyPos, smiley.prevSmiley); + addSmiley(happinessParView, smileyPos, smiley.halfSmiley); + + happiness -= (smiley.halfSmiley.happinessValue - smiley.prevSmiley.happinessValue); + smileyPos++; + } + // Finished + if (smileyPos >= MAX_HEART_ICONS) + { + return; + } } } + /** + * Adds a smiley to the happiness view at the given Position + * + * @param happinessBarView the happiness bar to add the heart to. + * @param happinessPos the number of the smileys to add. + * @param smiley the smiley to add. + */ + private static void addSmiley(final View happinessBarView, final int happinessPos, final SmileyEnum smiley) + { + @NotNull final Image smileyImage = new Image(); + smileyImage.setImage(smiley.Image, smiley.X, smiley.Y, HEART_ICON_HEIGHT_WIDTH, HEART_ICON_HEIGHT_WIDTH); + smileyImage.setMapDimensions(9, 87); + smileyImage.setSize(HEART_ICON_HEIGHT_WIDTH, HEART_ICON_HEIGHT_WIDTH); + smileyImage.setPosition(happinessPos * HEART_ICON_POS_X + HEART_ICON_OFFSET_X, HEART_ICON_POS_Y); + happinessBarView.addChild(smileyImage); + } + + /** + * General happiness bar setup. + * @param citizen citizen its for. + * @param window window its at. + */ + public static void createHappinessBar(final ICitizenDataView citizen, final AbstractWindowSkeleton window) + { + //Calculates how much percent of the next level has been completed. + window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class).setAlignment(Alignment.MIDDLE_RIGHT); + window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS, Text.class).setText(Component.literal(Integer.toString((int) citizen.getHappiness()))); + createHappinessBar(citizen, window.findPaneOfTypeByID(WINDOW_ID_HAPPINESS_BAR, View.class)); + } + /** * Fills the citizen gui with it's skill values. * @param citizen the citizen to use. @@ -331,8 +412,9 @@ public static void updateHappiness(final ICitizenDataView citizen, final Abstrac int yPos = 62; for (final String name : citizen.getHappinessHandler().getModifiers()) { - final double value = citizen.getHappinessHandler().getModifier(name).getFactor(); - + final double value = citizen.getHappinessHandler().getModifier(name).getFactor(null); + if (value == 1.0) + continue; final Image image = new Image(); image.setSize(11, 11); image.setPosition(45, yPos); @@ -348,7 +430,7 @@ public static void updateHappiness(final ICitizenDataView citizen, final Abstrac if (value > 1.0) { - image.setImage(new ResourceLocation(GREEN_ICON), false); + image.setImage(new ResourceLocation(HAPPY_ICON), false); PaneBuilders.tooltipBuilder() .append(Component.translatable(LABEL_HAPPINESS_POSITIVE)) .hoverPane(image) @@ -356,7 +438,7 @@ public static void updateHappiness(final ICitizenDataView citizen, final Abstrac } else if (value == 1) { - image.setImage(new ResourceLocation(BLUE_ICON), false); + image.setImage(new ResourceLocation(SATISFIED_ICON), false); PaneBuilders.tooltipBuilder() .append(Component.translatable(LABEL_HAPPINESS_NEUTRAL)) .hoverPane(image) @@ -364,7 +446,7 @@ else if (value == 1) } else if (value > 0.75) { - image.setImage(new ResourceLocation(YELLOW_ICON), false); + image.setImage(new ResourceLocation(UNSATISFIED_ICON), false); PaneBuilders.tooltipBuilder() .append(Component.translatable(LABEL_HAPPINESS_SLIGHTLY_NEGATIVE)) .hoverPane(image) @@ -372,7 +454,7 @@ else if (value > 0.75) } else { - image.setImage(new ResourceLocation(RED_ICON), false); + image.setImage(new ResourceLocation(UNHAPPY_ICON), false); PaneBuilders.tooltipBuilder() .append(Component.translatable(LABEL_HAPPINESS_NEGATIVE)) .hoverPane(image) diff --git a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowCitizenInventory.java b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowCitizenInventory.java index b6ceec6cc30..0ca02183c06 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowCitizenInventory.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowCitizenInventory.java @@ -2,15 +2,25 @@ import com.minecolonies.api.inventory.container.ContainerCitizenInventory; import com.minecolonies.api.util.constant.Constants; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; +import java.util.Optional; + /** * ------------ Class not Documented ------------ */ @@ -19,12 +29,12 @@ public class WindowCitizenInventory extends AbstractContainerScreen SLOTS_EACH_ROW - 1) - { - this.imageWidth = this.imageWidth + (this.inventoryRows - SLOTS_EACH_ROW) * (SLOTS_EACH_ROW + 1); - } + this.imageWidth = 245; } @Override @@ -79,15 +86,17 @@ public void render(@NotNull final PoseStack stack, int x, int y, float z) /** * Draw the foreground layer for the GuiContainer (everything in front of the items) */ + @Override protected void renderLabels(@NotNull final PoseStack stack, final int mouseX, final int mouseY) { - this.font.draw(stack, this.menu.getDisplayName(), 8, 6, 4210752); - this.font.draw(stack, this.playerInventoryTitle.getString(), 8, 20 + this.inventoryRows * SLOT_OFFSET, 4210752); + this.font.draw(stack, this.menu.getDisplayName(), 80, 9, 4210752); + this.font.draw(stack, this.playerInventoryTitle.getString(), 8, 25 + this.inventoryRows * SLOT_OFFSET, 4210752); } /** * Draws the background layer of this container (behind the items). */ + @Override protected void renderBg(@NotNull final PoseStack stack, float partialTicks, int mouseX, int mouseY) { RenderSystem.setShader(GameRenderer::getPositionTexShader); @@ -95,8 +104,79 @@ protected void renderBg(@NotNull final PoseStack stack, float partialTicks, int RenderSystem.setShaderTexture(0, TEXT); int i = (this.width - this.imageWidth) / 2; int j = (this.height - this.imageHeight) / 2; - blit(stack, i, j, 0, 0, this.imageWidth, this.inventoryRows * SLOT_OFFSET + SLOT_OFFSET - 1, TEXTURE_SIZE, TEXTURE_SIZE); - blit(stack, i, j + this.inventoryRows * SLOT_OFFSET + SLOT_OFFSET - 1, 0, - TEXTURE_OFFSET, this.imageWidth, TEXTURE_HEIGHT, TEXTURE_SIZE, TEXTURE_SIZE); + + + blit(stack, i, j, 0, 0, this.imageWidth, 10 + this.inventoryRows * SLOT_OFFSET + 12, TEXTURE_SIZE, TEXTURE_SIZE); + + + blit(stack, i, j + 10 + this.inventoryRows * SLOT_OFFSET + 12, 0, TEXTURE_OFFSET, this.imageWidth, TEXTURE_HEIGHT, TEXTURE_SIZE, TEXTURE_SIZE); + + + //stack.blit(TEXT, i, j, 0, 0, this.imageWidth, this.inventoryRows * SLOT_OFFSET + 12, TEXTURE_SIZE, TEXTURE_SIZE); + + + blit(stack, i + 172, j + 22, 0, 227, 49, 72, TEXTURE_SIZE, TEXTURE_SIZE); + + for (int index = 0; index < 4; index++) + { + blit(stack, i + 222, j + 22 + index * 18, 0, 300, 18, 18, TEXTURE_SIZE, TEXTURE_SIZE); + } + + renderEntityInInventoryFollowsMouse(stack, i + 197, j + 88, 30, (float)(i + 51) - mouseX, (float)(j + 75 - 50) - mouseY, this.menu.getEntity()); + } + + + public static void renderEntityInInventoryFollowsMouse(PoseStack stack, int x, int y, int scale, float mouseX, float mouseY, Optional optionalEntity) { + optionalEntity.ifPresent(entity -> { + float relativeMouseX = (float)Math.atan(mouseX / 40.0F); + float relativeMouseY = (float)Math.atan(mouseY / 40.0F); + renderEntityInInventoryFollowsAngle(stack, x, y, scale, relativeMouseX, relativeMouseY, (LivingEntity) entity); + }); + } + + public static void renderEntityInInventoryFollowsAngle(PoseStack stack, int x, int y, int scale, float angleXComponent, float angleYComponent, LivingEntity entity) { + float f = angleXComponent; + float f1 = angleYComponent; + PoseStack posestack = RenderSystem.getModelViewStack(); + posestack.pushPose(); + posestack.translate((double)x, (double)y, 1050.0D); + posestack.scale(1.0F, 1.0F, -1.0F); + RenderSystem.applyModelViewMatrix(); + PoseStack posestack1 = new PoseStack(); + posestack1.translate(0.0D, 0.0D, 1000.0D); + posestack1.scale((float)scale, (float)scale, (float)scale); + Quaternion quaternion = Vector3f.ZP.rotationDegrees(180.0F); + Quaternion quaternion1 = Vector3f.XP.rotationDegrees(f1 * 20.0F); + quaternion.mul(quaternion1); + posestack1.mulPose(quaternion); + float f2 = entity.yBodyRot; + float f3 = entity.getYRot(); + float f4 = entity.getXRot(); + float f5 = entity.yHeadRotO; + float f6 = entity.yHeadRot; + entity.yBodyRot = 180.0F + f * 20.0F; + entity.setYRot(180.0F + f * 40.0F); + entity.setXRot(-f1 * 20.0F); + entity.yHeadRot = entity.getYRot(); + entity.yHeadRotO = entity.getYRot(); + Lighting.setupForEntityInInventory(); + EntityRenderDispatcher entityrenderdispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); + quaternion1.conj(); + entityrenderdispatcher.overrideCameraOrientation(quaternion1); + entityrenderdispatcher.setRenderShadow(false); + MultiBufferSource.BufferSource multibuffersource$buffersource = Minecraft.getInstance().renderBuffers().bufferSource(); + RenderSystem.runAsFancy(() -> { + entityrenderdispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, posestack1, multibuffersource$buffersource, 15728880); + }); + multibuffersource$buffersource.endBatch(); + entityrenderdispatcher.setRenderShadow(true); + entity.yBodyRot = f2; + entity.setYRot(f3); + entity.setXRot(f4); + entity.yHeadRotO = f5; + entity.yHeadRot = f6; + posestack.popPose(); + RenderSystem.applyModelViewMatrix(); + Lighting.setupFor3DItems(); } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowField.java b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowField.java index 0e85f6155f1..ed2786709dc 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowField.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowField.java @@ -1,328 +1,349 @@ package com.minecolonies.coremod.client.gui.containers; -import com.google.common.collect.Lists; -import com.minecolonies.api.inventory.container.ContainerField; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Button; +import com.ldtteam.blockui.controls.ButtonImage; +import com.ldtteam.blockui.controls.ItemIcon; +import com.ldtteam.blockui.controls.Text; +import com.minecolonies.api.colony.ICitizen; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.tileentities.AbstractTileEntityScarecrow; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.network.messages.server.FieldPlotResizeMessage; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; +import com.minecolonies.coremod.client.gui.AbstractWindowSkeleton; +import com.minecolonies.coremod.client.gui.WindowSelectRes; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.FarmFieldPlotResizeMessage; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.FarmFieldUpdateSeedMessage; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.Widget; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.*; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.CropBlock; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.Tags; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.List; - -import net.minecraft.ChatFormatting; -import net.minecraft.locale.Language; +import java.util.Objects; +import java.util.Optional; import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_GUI_ASSIGNED_FARMER; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_GUI_NO_ASSIGNED_FARMER; /** * Class which creates the GUI of our field inventory. */ @OnlyIn(Dist.CLIENT) -public class WindowField extends AbstractContainerScreen +public class WindowField extends AbstractWindowSkeleton { /** - * The resource location of the GUI background. + * Link to the xml file of the window. */ - private static final ResourceLocation TEXTURE = new ResourceLocation(Constants.MOD_ID, "textures/gui/scarecrow.png"); + private static final String WINDOW_RESOURCE = ":gui/windowfield.xml"; /** - * The X-OFFSET of the string in the GUI. + * The ID for the "not in colony" text. */ - private static final int X_OFFSET = 8; + private static final String NOT_IN_COLONY_TEXT_ID = "not-in-colony"; /** - * Y-OFFSET of the string in the GUI. + * The prefix ID of the directional buttons. */ - private static final int Y_OFFSET = 6; + private static final String DIRECTIONAL_BUTTON_ID_PREFIX = "dir-resize-"; /** - * The text color of the string in the GUI. + * The ID of the center icon of the directional buttons. */ - private static final int TEXT_COLOR = 0x404040; + private static final String DIRECTIONAL_BUTTON_CENTER_ICON_ID = "dir-center"; /** - * The width and height of the DirectionalButtons (they're square) + * The ID of the select seed button. */ - private static final int BUTTON_SIDE_LENGTH = 24; + private static final String SELECT_SEED_BUTTON_ID = "select-seed"; /** - * Tile entity of the scarecrow. + * The ID for the current seed text. */ - private final AbstractScarecrowTileEntity tileEntity; + private static final String CURRENT_SEED_TEXT_ID = "current-seed"; + + /** + * The ID for the current farmer text. + */ + private static final String CURRENT_FARMER_TEXT_ID = "current-farmer"; + + /** + * The resource location of the GUI background. + */ + private static final ResourceLocation TEXTURE = new ResourceLocation(Constants.MOD_ID, "textures/gui/scarecrow.png"); /** - * The values to render on each directional button, indicating the size of the field - * S, W, N, E. + * The width and height of the directional buttons (they're square) */ - private final int[] radii = new int[4]; + private static final int BUTTON_SIZE = 24; + + /** + * The tile entity of the scarecrow. + */ + @NotNull + private final AbstractTileEntityScarecrow tileEntityScarecrow; + + /** + * The farm field instance. + */ + @Nullable + private FarmField farmField; /** * Create the field GUI. * - * @param container the container. - * @param playerInventory the player inv. - * @param iTextComponent the display text component. + * @param tileEntityScarecrow the scarecrow tile entity. */ - public WindowField(final ContainerField container, final Inventory playerInventory, final Component iTextComponent) + public WindowField(@NotNull AbstractTileEntityScarecrow tileEntityScarecrow) { - super(container, playerInventory, iTextComponent); - this.tileEntity = container.getTileEntity(); - } - - @Override - protected void init() - { - super.init(); + super(Constants.MOD_ID + WINDOW_RESOURCE); + this.tileEntityScarecrow = tileEntityScarecrow; - final int centerX = this.leftPos + this.imageWidth / 2 + 1; - final int centerY = this.topPos + this.imageHeight / 2; + registerButton(SELECT_SEED_BUTTON_ID, this::selectSeed); for (Direction dir : Direction.Plane.HORIZONTAL) { - int xFromPolar = (int) Math.sin(Math.PI * (4 - dir.get2DDataValue()) / 2) * (BUTTON_SIDE_LENGTH); - int yFromPolar = (int) Math.cos(Math.PI * (4 - dir.get2DDataValue()) / 2) * (BUTTON_SIDE_LENGTH); - this.radii[dir.get2DDataValue()] = tileEntity.getRadius(dir); - - // Some magic numbering to get the offsets right - DirectionalButton db = new DirectionalButton( - centerX + xFromPolar - 12, - centerY - 40 + yFromPolar - 12, - BUTTON_SIDE_LENGTH, - BUTTON_SIDE_LENGTH, - Component.literal(String.valueOf(this.radii[dir.get2DDataValue()])), - dir - ); - this.addRenderableWidget(db); + registerButton(DIRECTIONAL_BUTTON_ID_PREFIX + dir.getName(), this::onDirectionalButtonClick); } + + updateAll(); } - @Override - protected void renderLabels(@NotNull final PoseStack stack, final int mouseX, final int mouseY) + /** + * Button handler for selecting a seed. + */ + private void selectSeed() { - if (!tileEntity.getOwner().isEmpty()) + new WindowSelectRes( + this, + stack -> stack.is(Tags.Items.SEEDS) || stack.getItem() instanceof BlockItem item && item.getBlock() instanceof CropBlock, + (stack, qty) -> setSeed(stack), + false).open(); + } + + /** + * Button handler for clicking on any of the directional buttons. + * + * @param button which button was clicked. + */ + private void onDirectionalButtonClick(Button button) + { + if (farmField == null || !button.isEnabled()) { - this.font.draw(stack, Component.translatable(WORKER_FIELD, tileEntity.getOwner()), X_OFFSET, -Y_OFFSET * 2, 16777215 /* WHITE */); + return; } - this.font.draw(stack, Component.translatable(BLOCK_HUT_FIELD), X_OFFSET, Y_OFFSET, TEXT_COLOR); + String directionName = button.getID().replace(DIRECTIONAL_BUTTON_ID_PREFIX, ""); + Optional direction = Direction.Plane.HORIZONTAL.stream().filter(f -> f.getName().equals(directionName)).findFirst(); - for (Widget widget : this.renderables) + if (direction.isEmpty()) { - if (widget instanceof AbstractWidget) - { - if (((AbstractWidget) widget).isMouseOver(mouseX, mouseY)) - { - ((AbstractWidget) widget).renderToolTip(stack, mouseX - this.leftPos, mouseY - this.topPos); - break; - } - } + return; } + + int newRadius = (farmField.getRadius(direction.get()) % farmField.getMaxRadius()) + 1; + farmField.setRadius(direction.get(), newRadius); + button.setText(Component.literal(String.valueOf(newRadius))); + + Network.getNetwork().sendToServer(new FarmFieldPlotResizeMessage(tileEntityScarecrow.getCurrentColony(), newRadius, direction.get(), farmField.getPosition())); + } + + private void updateAll() + { + updateFarmField(); + updateElementStates(); + updateOwner(); + updateSeed(); + updateButtons(); } /** - * Does draw the background of the GUI. + * Sends a message to the server to update the seed of the field. * - * @param partialTicks the ticks delivered. - * @param mouseX the mouseX position. - * @param mouseY the mouseY position. + * @param stack the provided item stack with the seed. */ - @Override - protected void renderBg(@NotNull final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) + private void setSeed(ItemStack stack) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, TEXTURE); - final int marginHorizontal = (width - imageWidth) / 2; - final int marginVertical = (height - imageHeight) / 2; - blit(stack, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); - } + IColonyView colonyView = getCurrentColony(); + if (colonyView != null && farmField != null) + { + Network.getNetwork().sendToServer(new FarmFieldUpdateSeedMessage(colonyView, stack, farmField.getPosition())); - @Override - public void render(@NotNull final PoseStack stack, int x, int y, float z) - { - this.renderBackground(stack); - super.render(stack, x, y, z); - this.renderTooltip(stack, x, y); + farmField.setSeed(stack); + } } /** - * Buttons with a direction. Textures are assigned based on direction specified. + * Keep attempting to fetch the currently loaded farm field, if not present already. */ - protected class DirectionalButton extends Button + private void updateFarmField() { - public Direction direction; - public int textureX = 176; - public int textureY = 0; - - /** - * The arrangement of the button's direction textures in the image. - */ - public int columns = 2; - - /** - * Construct a directional button. Arguments based on a basic Button widget - * - * @param x the x position from screen top left - * @param y the y position from screen top left - * @param width the width of the button in the gui - * @param height the height of the button in the gui - * @param text the label on the button - * @param direction the direction this button faces. Adjusts texture coordinates. - */ - public DirectionalButton(int x, int y, int width, int height, Component text, Direction direction) + if (farmField != null) { - super(x, y, width, height, text, button -> {}); - this.direction = direction; + return; } - @Override - public boolean mouseClicked(final double mouseX, final double mouseY, final int button) + IColonyView colonyView = getCurrentColony(); + if (colonyView == null) { - if (this.clicked(mouseX, mouseY)) - { - int index = this.direction.get2DDataValue(); - int delta = this.isValidClickButton(button) ? 1 : -1; + return; + } + + final IField field = colonyView.getField(otherField -> otherField.getFieldType().equals(FieldRegistries.farmField.get()) && otherField.getPosition() + .equals(tileEntityScarecrow.getBlockPos())); + if (field instanceof FarmField farmFieldFound) + { + farmField = farmFieldFound; + } + } - // Perform the cycle - radii[index] = (radii[index] + delta) % (ScarecrowTileEntity.getMaxRange() + 1); - if (radii[index] < 0) radii[index] = ScarecrowTileEntity.getMaxRange(); + /** + * Updates the states of certain additional elements, determining whether they should be enabled/visible. + */ + private void updateElementStates() + { + IColonyView colonyView = getCurrentColony(); - this.setMessage(Component.literal(String.valueOf(radii[index]))); - Network.getNetwork().sendToServer(new FieldPlotResizeMessage(radii[index], this.direction, tileEntity.getBlockPos())); + findPaneOfTypeByID(NOT_IN_COLONY_TEXT_ID, Text.class).setVisible(colonyView == null); + findPaneOfTypeByID(CURRENT_FARMER_TEXT_ID, Text.class).setVisible(colonyView != null); + findPaneOfTypeByID(SELECT_SEED_BUTTON_ID, ButtonImage.class).setVisible(colonyView != null); + findPaneOfTypeByID(CURRENT_SEED_TEXT_ID, ItemIcon.class).setVisible(colonyView != null); + findPaneOfTypeByID(DIRECTIONAL_BUTTON_CENTER_ICON_ID, ItemIcon.class).setVisible(colonyView != null); - return true; - } + for (Direction dir : Direction.Plane.HORIZONTAL) + { + findPaneOfTypeByID(DIRECTIONAL_BUTTON_ID_PREFIX + dir.getName(), ButtonImage.class).setVisible(colonyView != null); + } + } - return false; + /** + * Update the label which farmer owns the field, if any. + */ + private void updateOwner() + { + findPaneOfTypeByID(CURRENT_FARMER_TEXT_ID, Text.class).setText(Component.translatable(FIELD_GUI_NO_ASSIGNED_FARMER)); + + IColonyView colonyView = getCurrentColony(); + if (colonyView == null || farmField == null || !farmField.isTaken()) + { + return; } - /** - * Retrieves the texture offset depending on the direction of the button - * - * @return the X offset for the image texture - */ - public int getTextureXOffset() + final IBuildingView building = colonyView.getBuilding(farmField.getBuildingId()); + if (building == null) { - return this.textureX + 24 * Math.floorDiv(this.direction.get2DDataValue(), this.columns); + return; } - /** - * Retrieves the texture offset depending on the direction of the button - * - * @return the Y offset for the image texture - */ - public int getTextureYOffset() + final Integer citizenId = building.getAllAssignedCitizens().stream().findFirst().orElse(null); + if (citizenId == null) { - return this.textureY + 72 * (this.direction.get2DDataValue() % this.columns); + return; } - /** - * Neatens the buttons by offsetting the text towards the main area of the texture - * - * @param axis the Axis of the direction that the button represents - * @return the render offset - */ - public int getTextOffset(Direction.Axis axis) + ICitizen citizen = colonyView.getCitizen(citizenId); + if (citizen == null) { - switch (this.direction) - { - case NORTH: - return axis == Direction.Axis.X ? 0 : +2; - case EAST: - return axis == Direction.Axis.X ? -2 : 0; - case SOUTH: - return axis == Direction.Axis.X ? 0 : -2; - case WEST: - return axis == Direction.Axis.X ? +2 : 0; - } - return 0; + return; } - @Override - public void renderButton(@NotNull final PoseStack stack, int mouseX, int mouseY, float partialTicks) + findPaneOfTypeByID(CURRENT_FARMER_TEXT_ID, Text.class).setText(Component.translatable(FIELD_GUI_ASSIGNED_FARMER, citizen.getName())); + } + + /** + * Updates the seed icon next to the selection button. + */ + private void updateSeed() + { + if (farmField != null) { - Minecraft minecraft = Minecraft.getInstance(); - Font fontrenderer = minecraft.font; - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); - RenderSystem.setShaderTexture(0, TEXTURE); - - int i = this.getYImage(this.isHovered); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - this.blit(stack, this.x, this.y, getTextureXOffset(), getTextureYOffset() + i * 24, this.width, this.height); - this.renderBg(stack, minecraft, mouseX, mouseY); - int j = getFGColor(); - drawCenteredString(stack, - fontrenderer, this.getMessage(), - this.x + this.width / 2 + getTextOffset(Direction.Axis.X), - this.y + (this.height - 8) / 2 + getTextOffset(Direction.Axis.Y), - j | Mth.ceil(this.alpha * 255.0F) << 24 - ); + findPaneOfTypeByID(CURRENT_SEED_TEXT_ID, ItemIcon.class).setItem(farmField.getSeed()); } + } - @Override - public void renderToolTip(@NotNull final PoseStack stack, int mouseX, int mouseY) + /** + * Updates the directional buttons. + */ + private void updateButtons() + { + for (Direction dir : Direction.Plane.HORIZONTAL) { - // Don't render while they are dragging a stack around - if (!menu.getCarried().isEmpty()) + ButtonImage button = findPaneOfTypeByID(DIRECTIONAL_BUTTON_ID_PREFIX + dir.getName(), ButtonImage.class); + button.setEnabled(!Objects.isNull(farmField)); + + int buttonState = 1; + if (!button.isEnabled()) { - return; + buttonState = 0; + } + else if (button.wasCursorInPane()) + { + buttonState = 2; } - List lines = Lists.newArrayList( - Component.translatable(PARTIAL_BLOCK_HUT_FIELD_DIRECTION_ABSOLUTE + this.direction.getSerializedName()), - Component.translatable(getDirectionalTranslationKey()) - .setStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY)) - ); + button.setImage(TEXTURE, dir.get2DDataValue() * BUTTON_SIZE, buttonState * BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE); + button.setText(Component.literal(String.valueOf(Objects.isNull(farmField) ? "" : farmField.getRadius(dir)))); - WindowField.this.renderTooltip(stack, Language.getInstance().getVisualOrder(lines), mouseX, mouseY); + PaneBuilders.tooltipBuilder() + .hoverPane(button) + .append(Component.translatable(PARTIAL_BLOCK_HUT_FIELD_DIRECTION_ABSOLUTE + dir.getSerializedName())) + .appendNL(Component.translatable(getDirectionalTranslationKey(dir)).setStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY))) + .build(); } + } - /** - * Calculates where the player is and the appropriate relative direction - * - * @return the translation key - */ - public String getDirectionalTranslationKey() + /** + * Get the current colony, if any, from the tile entity. + * + * @return the colony view, if exists. + */ + @Nullable + private IColonyView getCurrentColony() + { + if (tileEntityScarecrow.getCurrentColony() instanceof IColonyView colonyView) { - Direction[] looks = Direction.orderedByNearest(Minecraft.getInstance().player); - Direction facing = looks[0].getAxis() == Direction.Axis.Y ? looks[1] : looks[0]; - - switch (facing.getOpposite().get2DDataValue() - this.direction.get2DDataValue()) - { - case 1: - case -3: - return BLOCK_HUT_FIELD_DIRECTION_RELATIVE_TO_RIGHT; - case 2: - case -2: - return BLOCK_HUT_FIELD_DIRECTION_RELATIVE_OPPOSITE; - case 3: - case -1: - return BLOCK_HUT_FIELD_DIRECTION_RELATIVE_TO_LEFT; - default: - return BLOCK_HUT_FIELD_DIRECTION_RELATIVE_NEAREST; - } + return colonyView; } + return null; + } + + /** + * Get translation keys for the different directional buttons. + * + * @param direction the direction. + * @return the translation key. + */ + private String getDirectionalTranslationKey(Direction direction) + { + Direction[] looks = Direction.orderedByNearest(Minecraft.getInstance().player); + Direction facing = looks[0].getAxis() == Direction.Axis.Y ? looks[1] : looks[0]; + + return switch (facing.getOpposite().get2DDataValue() - direction.get2DDataValue()) + { + case 1, -3 -> BLOCK_HUT_FIELD_DIRECTION_RELATIVE_TO_RIGHT; + case 2, -2 -> BLOCK_HUT_FIELD_DIRECTION_RELATIVE_OPPOSITE; + case 3, -1 -> BLOCK_HUT_FIELD_DIRECTION_RELATIVE_TO_LEFT; + default -> BLOCK_HUT_FIELD_DIRECTION_RELATIVE_NEAREST; + }; + } + + @Override + public void onUpdate() + { + super.onUpdate(); + updateAll(); } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowRack.java b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowRack.java index c445a6292d5..a52bcda12ed 100755 --- a/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowRack.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/containers/WindowRack.java @@ -1,5 +1,7 @@ package com.minecolonies.coremod.client.gui.containers; +import com.minecolonies.api.blocks.AbstractBlockMinecoloniesRack; +import com.minecolonies.api.blocks.types.RackType; import com.minecolonies.api.inventory.container.ContainerRack; import com.minecolonies.api.util.constant.Constants; import com.mojang.blaze3d.vertex.PoseStack; @@ -70,7 +72,7 @@ public WindowRack(final ContainerRack container, final Inventory playerInventory super(container, playerInventory, iTextComponent); if (container.neighborRack != null) { - if (container.rack.isMain()) + if (container.rack.getBlockState().getValue(AbstractBlockMinecoloniesRack.VARIANT) != RackType.EMPTYAIR) { this.jointChestInventory = new CombinedInvWrapper(container.rack.getInventory(), container.neighborRack.getInventory()); } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/map/ColonySize.java b/src/main/java/com/minecolonies/coremod/client/gui/map/ColonySize.java new file mode 100644 index 00000000000..6d524032fc3 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/map/ColonySize.java @@ -0,0 +1,57 @@ +package com.minecolonies.coremod.client.gui.map; + +import com.ldtteam.blockui.Loader; +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.View; +import com.minecolonies.coremod.network.messages.client.colony.ColonyListMessage; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +/** + * Represents a colony by size, returns the used image corresponding for each size. + */ +public enum ColonySize +{ + SMALL("minecolonies:gui/map/colonysmall.xml", 25), + MEDIUM("minecolonies:gui/map/colonymedium.xml", 75), + LARGE("minecolonies:gui/map/colonylarge.xml", 5000); + + private final String imagePath; + private final int maxCitizens; + + ColonySize(final String imagePath, final int maxCitizens) + { + this.imagePath = imagePath; + this.maxCitizens = maxCitizens; + } + + public static View createViewForInfo(final ColonyListMessage.ColonyInfo colony) + { + final View colonyPane = new View(); + + final ColonySize size = getSizeByCount(colony.getCitizencount()); + + Loader.createFromXMLFile(new ResourceLocation(size.imagePath), colonyPane); + + final Pane background = colonyPane.findPaneByID("background"); + colonyPane.setSize(background.getWidth(), background.getHeight()); + + final Text colonyName = colonyPane.findPaneOfTypeByID("textcontent", Text.class); + colonyName.setText(Component.literal(colony.getName())); + + return colonyPane; + } + + public static ColonySize getSizeByCount(final int count) + { + for (ColonySize size : values()) + { + if (count < size.maxCitizens) + { + return size; + } + } + return SMALL; + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/map/MinecraftMap.java b/src/main/java/com/minecolonies/coremod/client/gui/map/MinecraftMap.java new file mode 100644 index 00000000000..027dfd69612 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/map/MinecraftMap.java @@ -0,0 +1,94 @@ +package com.minecolonies.coremod.client.gui.map; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneParams; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; + +/** + * Simple minecraft map element. + */ +public class MinecraftMap extends Pane implements AutoCloseable +{ + private DynamicTexture texture; + private ResourceLocation textureResLoc; + + /** + * Default Constructor. + */ + public MinecraftMap() + { + super(); + } + + /** + * Constructor used by the xml loader. + * + * @param params PaneParams loaded from the xml. + */ + public MinecraftMap(final PaneParams params) + { + super(params); + } + + /** + * Set the fitting map data. + * @param mapData the mapData to set. + */ + public void setMapData(final MapItemSavedData mapData) + { + if (texture != null) + { + freeTexture(); + } + + texture = new DynamicTexture(128, 128, false); + + for (int y = 0; y < 128; ++y) + { + for (int x = 0; x < 128; ++x) + { + texture.getPixels().setPixelRGBA(x, y, MaterialColor.getColorFromPackedId(mapData.colors[x + y * 128])); + } + } + + texture.upload(); + textureResLoc = mc.textureManager.register("minecolonies_map/" + id, texture); + } + + /** + * Draw this image on the GUI. + * + * @param mx Mouse x (relative to parent) + * @param my Mouse y (relative to parent) + */ + @Override + public void drawSelf(final PoseStack ms, final double mx, final double my) + { + if (textureResLoc != null) + { + blit(ms, textureResLoc, x, y, width, height); + } + } + + private void freeTexture() + { + if (textureResLoc != null) + { + texture.close(); + mc.textureManager.release(textureResLoc); + + texture = null; + textureResLoc = null; + } + } + + @Override + public void close() + { + freeTexture(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/map/WindowColonyMap.java b/src/main/java/com/minecolonies/coremod/client/gui/map/WindowColonyMap.java new file mode 100644 index 00000000000..3f9168eb710 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/map/WindowColonyMap.java @@ -0,0 +1,418 @@ +package com.minecolonies.coremod.client.gui.map; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.AbstractTextBuilder; +import com.ldtteam.blockui.controls.Image; +import com.ldtteam.blockui.controls.ItemIcon; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.View; +import com.ldtteam.blockui.views.ZoomDragView; +import com.ldtteam.structurize.util.LanguageHandler; +import com.minecolonies.api.client.render.modeltype.ISimpleModelType; +import com.minecolonies.api.client.render.modeltype.registry.IModelTypeRegistry; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.client.gui.AbstractWindowSkeleton; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import com.minecolonies.coremod.network.messages.client.colony.ColonyListMessage; +import com.minecolonies.coremod.network.messages.server.colony.OpenInventoryMessage; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.minecolonies.api.research.util.ResearchConstants.COLOR_TEXT_FULFILLED; +import static com.minecolonies.api.util.constant.WindowConstants.BUTTON_EXIT; +import static com.minecolonies.api.util.constant.WindowConstants.BUTTON_INVENTORY; + +public class WindowColonyMap extends AbstractWindowSkeleton +{ + /** + * Link to the xml file of the window. + */ + private static final String WINDOW_RESOURCE = ":gui/map/windowcolonymap.xml"; + + /** + * Scale at which colonies stop showing details + */ + private static final double COLONY_DETAIL_SCALE = 0.3; + + /** + * List of known colonies + */ + private static List colonies = new ArrayList<>(); + + /** + * The position of the looker + */ + private final BlockPos playerPos; + + /** + * The zoomable view + */ + private final ZoomDragMap dragView; + + /** + * Colony data beeing currently displayed + */ + private Map citizens = new HashMap<>(); + private Map buildings = new HashMap<>(); + private Map coloniesImages = new HashMap<>(); + private List maps = new ArrayList<>(); + + /** + * building reference of the view + */ + private IBuildingView building; + + /** + * Scale formatting + */ + private final DecimalFormat scaleformet = new DecimalFormat("##"); + + /** + * Scale of the map element + */ + private double currentScale = 0; + + /** + * Check if it has maps. + */ + private boolean hasMaps = false; + + /** + * Constructor for the skeleton class of the windows. + * + * @param building The building the info window is for. + */ + public WindowColonyMap(final IBuildingView building) + { + super(Constants.MOD_ID + WINDOW_RESOURCE); + this.building = building; + playerPos = new BlockPos(Minecraft.getInstance().player.blockPosition().getX(), 0, Minecraft.getInstance().player.blockPosition().getZ()); + final ZoomDragView parent = findPaneOfTypeByID("dragView", ZoomDragView.class); + dragView = new ZoomDragMap(); + dragView.setSize(parent.getWidth(), parent.getHeight()); + dragView.setPosition(parent.getX(), parent.getY()); + dragView.enable(); + dragView.setVisible(true); + dragView.setFocus(); + dragView.setWindow(this); + parent.addChild(dragView); + if (addMaps()) + { + addCitizens(building.getColony()); + addCenterPos(); + } + + registerButton(BUTTON_EXIT, () -> building.openGui(false)); + registerButton(BUTTON_INVENTORY, this::inventoryClicked); + + Network.getNetwork().sendToServer(new ColonyListMessage()); + } + + /** + * Action when a button opening an inventory is clicked. + */ + private void inventoryClicked() + { + Network.getNetwork().sendToServer(new OpenInventoryMessage(building)); + } + + /** + * Add the map. Return false if has no maps. + * @return true if so. + */ + private boolean addMaps() + { + for (final MinecraftMap map : maps) + { + dragView.removeChild(map); + map.close(); + } + + maps.clear(); + + for (final MapItemSavedData mapData : ((BuildingTownHall.View) building).getMapDataList()) + { + if (mapData.scale != 0) + { + continue; + } + + hasMaps = true; + + final MinecraftMap mapImage = new MinecraftMap(); + mapImage.setPosition(worldPosToUIPos(new BlockPos(mapData.x - 64, 0, 0)).getX(), worldPosToUIPos(new BlockPos(0, 0, mapData.z - 64)).getZ()); + mapImage.setID("map" + mapData.x + "-" + mapData.z); + mapImage.setMapData(mapData); + mapImage.setSize((int) (512*currentScale), (int) (512*currentScale)); + dragView.addChildFirst(mapImage); + maps.add(mapImage); + } + + findPaneByID("warning").setVisible(!hasMaps); + return hasMaps; + } + + /** + * Set the known colonies with minimal info + * + * @param colonyInfo + */ + public static void setColonies(final List colonyInfo) + { + colonies = colonyInfo; + } + + @Override + public void onUpdate() + { + super.onUpdate(); + + if (hasMaps) + { + for (Map.Entry entry : citizens.entrySet()) + { + final EntityCitizen citizen = (EntityCitizen) building.getColony().getWorld().getEntity(entry.getKey().getEntityId()); + if (citizen != null) + { + entry.getValue().setPosition(worldPosToUIPos(citizen.blockPosition()).getX(), worldPosToUIPos(citizen.blockPosition()).getZ()); + } + } + + if (currentScale != dragView.getScale()) + { + currentScale = dragView.getScale(); + updateScale(); + } + } + } + + /** + * Update elements to the new scaling factor + */ + private void updateScale() + { + for (final ColonyListMessage.ColonyInfo info : colonies) + { + updateColonyInfoImage(info); + } + + for (final ColonyListMessage.ColonyInfo info : colonies) + { + updateColonyInfoImage(info); + } + + for (final IBuildingView buildingView : building.getColony().getBuildings()) + { + updateBuildingView(buildingView); + } + + if (currentScale < COLONY_DETAIL_SCALE) + { + // Hide small icons + // show colony + + for (Map.Entry buildingEntry : buildings.entrySet()) + { + buildingEntry.getValue().off(); + } + + for (Map.Entry citizenEntry : citizens.entrySet()) + { + citizenEntry.getValue().off(); + } + } + else + { + // Display small icons + for (Map.Entry buildingEntry : buildings.entrySet()) + { + buildingEntry.getValue().on(); + } + + for (Map.Entry citizenEntry : citizens.entrySet()) + { + citizenEntry.getValue().on(); + } + + for (final Map.Entry colonyEntry : coloniesImages.entrySet()) + { + colonyEntry.getValue().off(); + } + } + + addMaps(); + findPaneOfTypeByID("scale", Text.class).setText(Component.literal(scaleformet.format(1 / currentScale) + "x")); + } + + /** + * Adds a colony image for the given colony + * + * @param colonyInfo + */ + private void updateColonyInfoImage(final ColonyListMessage.ColonyInfo colonyInfo) + { + View colonyPane = coloniesImages.get(colonyInfo); + if (colonyPane == null) + { + colonyPane = ColonySize.createViewForInfo(colonyInfo); + colonyPane.setID(colonyInfo.getId() + colonyInfo.getOwner()); + dragView.addChild(colonyPane); + coloniesImages.put(colonyInfo, colonyPane); + PaneBuilders.tooltipBuilder().hoverPane(colonyPane) + .append(Component.literal("Owner:" + colonyInfo.getOwner())) + .appendNL(Component.literal("Coordinates: " + colonyInfo.getCenter().getX() + "X, " + colonyInfo.getCenter().getZ() + "Z")) + .appendNL(Component.literal("Citizens: " + colonyInfo.getCitizencount())) + .build(); + } + + if (currentScale < COLONY_DETAIL_SCALE) + { + colonyPane.setPosition(worldPosToUIPos(colonyInfo.getCenter()).getX() - colonyPane.getWidth() / 2, + worldPosToUIPos(colonyInfo.getCenter()).getZ() - colonyPane.getHeight() / 2); + colonyPane.on(); + } + else + { + colonyPane.off(); + } + } + + /** + * Adds the central blob identifying the current position + */ + private void addCenterPos() + { + final Image citizenImage = new Image(); + citizenImage.setImage(new ResourceLocation(Constants.MOD_ID, "textures/gui/red_wax_home.png"), false); + citizenImage.setSize(16, 16); + citizenImage.setPosition(worldPosToUIPos(playerPos).getX(), worldPosToUIPos(playerPos).getZ()); + dragView.addChild(citizenImage); + } + + /** + * Generate a list of icons for the buildings + * + * @param buildingView + * @return + */ + private void updateBuildingView(final IBuildingView buildingView) + { + ItemIcon uiBuilding = buildings.get(buildingView); + if (uiBuilding == null) + { + uiBuilding = new ItemIcon(); + + uiBuilding.setID(buildingView.getID().toShortString()); + uiBuilding.setSize(11 + buildingView.getBuildingLevel(), 11 + buildingView.getBuildingLevel()); + final ItemStack item = buildingView.getBuildingType().getBuildingBlock().asItem().getDefaultInstance(); + uiBuilding.setItem(item); + dragView.addChild(uiBuilding); + + AbstractTextBuilder.TooltipBuilder tooltip = PaneBuilders.tooltipBuilder(); + tooltip.hoverPane(uiBuilding) + .append(window.getScreen().getTooltipFromItem(item).get(0)).append(Component.literal(" : " + buildingView.getBuildingLevel())) + .appendNL(Component.literal("Coordinates: " + buildingView.getID().getX() + "X, " + buildingView.getID().getZ() + "Z")) + .appendNL(Component.literal("Citizens: " + buildingView.getAllAssignedCitizens().size())); + + for (int id : buildingView.getAllAssignedCitizens()) + { + final ICitizenDataView dataView = building.getColony().getCitizen(id); + if (dataView != null) + { + tooltip.appendNL(Component.literal(dataView.getName())); + } + } + tooltip.build(); + + uiBuilding.setVisible(true); + + dragView.removeChild(this.buildings.get(buildingView)); + this.buildings.put(buildingView, uiBuilding); + } + + uiBuilding.setPosition(worldPosToUIPos(buildingView.getID()).getX(), worldPosToUIPos(buildingView.getID()).getZ()); + } + + /** + * Adds all citizen icons + * + * @param colony + */ + private void addCitizens(final IColonyView colony) + { + for (final ICitizenDataView data : colony.getCitizens().values()) + { + final EntityCitizen citizen = (EntityCitizen) colony.getWorld().getEntity(data.getEntityId()); + if (citizen != null) + { + final View citizenView = new View(); + citizenView.setPosition(worldPosToUIPos(citizen.blockPosition()).getX(), worldPosToUIPos(citizen.blockPosition()).getZ()); + + final Image citizenImage = new Image(); + citizenImage.setImage(((ISimpleModelType) IModelTypeRegistry.getInstance().getModelType(citizen.getModelType())).getTextureIcon(citizen), false); + citizenImage.setSize(4, 4); + citizenView.addChild(citizenImage); + + dragView.addChild(citizenView); + final AbstractTextBuilder.TooltipBuilder builder = PaneBuilders.tooltipBuilder().hoverPane(citizenView).paragraphBreak().append(citizen.getDisplayName()); + if (!data.getJob().isEmpty()) + { + citizenImage.setSize(8, 8); + builder.newLine().append(Component.translatable("com.minecolonies.coremod.gui.citizen.job.label", LanguageHandler.format(data.getJob()))); + } + builder.color(COLOR_TEXT_FULFILLED).build(); + citizenView.setSize(citizenImage.getWidth(), citizenImage.getHeight()); + + if (data.hasVisibleInteractions()) + { + final Image interactionImage = new Image(); + interactionImage.setImage(data.getInteractionIcon(), false); + interactionImage.setSize(6, 6); + citizenImage.setPosition(5, 0); + citizenView.addChild(interactionImage); + citizenView.setSize(citizenView.getWidth() + 6, citizenView.getHeight() + 6); + } + + dragView.removeChild(citizens.get(data)); + citizens.put(data, citizenView); + } + } + } + + /** + * Scales the world pos to the UI pos, current scales positions which are farther out to display closer so you get a decent overview of nearby colonies which can be quite far away + * + * @param worldPos + * @return + */ + private BlockPos worldPosToUIPos(final BlockPos worldPos) + { + return new BlockPos( + dragView.getWidth() / 2.0 - ((playerPos.getX() - worldPos.getX()) * 4 / Math.max(1, Math.log(Math.abs(playerPos.getX() - worldPos.getX()) / 1000f))) * currentScale, + 0, + dragView.getHeight() / 2.0 - ((playerPos.getZ() - worldPos.getZ()) * 4 / Math.max(1, Math.log(Math.abs(playerPos.getZ() - worldPos.getZ()) / 1000f))) * currentScale); + } + + @Override + public void onClosed() + { + super.onClosed(); + maps.forEach(MinecraftMap::close); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/map/ZoomDragMap.java b/src/main/java/com/minecolonies/coremod/client/gui/map/ZoomDragMap.java new file mode 100644 index 00000000000..ac686e12806 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/map/ZoomDragMap.java @@ -0,0 +1,222 @@ +package com.minecolonies.coremod.client.gui.map; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneParams; +import com.ldtteam.blockui.views.View; +import com.ldtteam.structurize.util.WorldRenderMacros; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.MapItem; +import org.jetbrains.annotations.NotNull; + +/** + * Zoomable and scrollable "online map"-like view, mostly copied from BlockUI's drag view + */ +public class ZoomDragMap extends View +{ + public double scrollX = 0d; + public double scrollY = 0d; + private double scale = 1d; + + protected int contentHeight = 0; + protected int contentWidth = 0; + + private double dragFactor = 1d; + private boolean dragEnabled = true; + + private double zoomFactor = 1.1d; + private boolean zoomEnabled = true; + private double minScale = 0.02d; + private double maxScale = 6d; + + /** + * Required default constructor. + */ + public ZoomDragMap() + { + super(); + } + + /** + * Constructs a View from PaneParams. + * + * @param params Params for the Pane. + */ + public ZoomDragMap(final PaneParams params) + { + super(params); + dragFactor = params.getDouble("dragfactor", dragFactor); + dragEnabled = params.getBoolean("dragenabled", dragEnabled); + zoomFactor = params.getDouble("zoomfactor", zoomFactor); + zoomEnabled = params.getBoolean("zoomenabled", zoomEnabled); + minScale = params.getDouble("minscale", minScale); + maxScale = params.getDouble("maxscale", maxScale); + } + + @Override + protected boolean childIsVisible(@NotNull final Pane child) + { + return calcInverseAbsoluteX(child.getX()) < getInteriorWidth() && calcInverseAbsoluteY(child.getY()) < getInteriorHeight() + && calcInverseAbsoluteX(child.getX() + child.getWidth()) >= 0 && calcInverseAbsoluteY(child.getY() + child.getHeight()) >= 0; + } + + /** + * Converts X of child to scaled and scrolled X in absolute coordinates. + */ + private double calcInverseAbsoluteX(final double xIn) + { + return xIn * scale - scrollX; + } + + /** + * Converts Y of child to scaled and scrolled Y in absolute coordinates. + */ + private double calcInverseAbsoluteY(final double yIn) + { + return yIn * scale - scrollY; + } + + /** + * Converts X from event to unscaled and unscrolled X for child in relative (top-left) coordinates. + */ + private double calcRelativeX(final double xIn) + { + return (xIn - x + scrollX) / scale + x; + } + + /** + * Converts Y from event to unscaled and unscrolled Y for child in relative (top-left) coordinates. + */ + private double calcRelativeY(final double yIn) + { + return (yIn - y + scrollY) / scale + y; + } + + @Override + public void parseChildren(final PaneParams params) + { + super.parseChildren(params); + computeContentSize(); + } + + @Override + public void addChild(final Pane child) + { + super.addChild(child); + computeContentSize(); + } + + public void addChildFirst(final Pane child) + { + child.setWindow(getWindow()); + children.add(0, child); + adjustChild(child); + child.setParentView(this); + computeContentSize(); + } + + /** + * Compute the height in pixels of the container. + */ + protected void computeContentSize() + { + contentHeight = 0; + contentWidth = 0; + + for (@NotNull final Pane child : children) + { + if (child != null) + { + contentHeight = Math.max(contentHeight, child.getY() + child.getHeight()); + contentWidth = Math.max(contentWidth, child.getX() + child.getWidth()); + } + } + + // Recompute scroll + setScrollY(scrollY); + setScrollX(scrollX); + } + + @Override + public void drawSelf(final PoseStack ms, final double mx, final double my) + { + scissorsStart(ms, contentWidth, contentHeight); + + ms.pushPose(); + ms.translate(-scrollX, -scrollY, 0.0d); + ms.translate((1 - scale) * x, (1 - scale) * y, 0.0d); + final float renderScale = (float) Mth.clamp(scale, 0.26219988382999904, 6d); + ms.scale(renderScale, renderScale, 1.0f); + super.drawSelf(ms, calcRelativeX(mx), calcRelativeY(my)); + + ms.popPose(); + scissorsEnd(ms); + } + + @Override + public void drawSelfLast(final PoseStack ms, final double mx, final double my) + { + scissorsStart(ms, contentWidth, contentHeight); + + ms.pushPose(); + ms.translate(-scrollX, -scrollY, 0.0d); + ms.translate((1 - scale) * x, (1 - scale) * y, 0.0d); + final float renderScale = (float) Mth.clamp(scale, 0.26219988382999904, 6d); + ms.scale(renderScale, renderScale, 1.0f); + super.drawSelfLast(ms, calcRelativeX(mx), calcRelativeY(my)); + ms.popPose(); + + scissorsEnd(ms); + } + + private void setScrollY(final double offset) + { + scrollY = offset; + } + + private void setScrollX(final double offset) + { + scrollX = offset; + } + + @Override + public boolean onMouseDrag(final double startX, final double startY, final int speed, final double x, final double y) + { + final boolean childResult = super.onMouseDrag(startX, startY, speed, calcRelativeX(x), calcRelativeY(y)); + if (!childResult && dragEnabled) + { + setScrollX(scrollX - x * dragFactor); + setScrollY(scrollY - y * dragFactor); + return true; + } + return childResult; + } + + @Override + public boolean scrollInput(final double wheel, final double mx, final double my) + { + final boolean childResult = super.scrollInput(wheel, (width - scrollX) / 2, (height - scrollY) / 2); + if (!childResult && zoomEnabled) + { + final double childX = (width - scrollX) / 2; + final double childY = (height - scrollY) / 2; + final double oldX = (childX + scrollX) / scale; + final double oldY = (childY + scrollY) / scale; + scale = wheel < 0 ? scale / zoomFactor : scale * zoomFactor; + scale = Mth.clamp(scale, minScale, maxScale); + setScrollX(oldX * scale - childX); + setScrollY(oldY * scale - childY); + return true; + } + return childResult; + } + + public double getScale() + { + return scale; + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/DOCraftingWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/DOCraftingWindow.java index cb75263ae83..58c20e7839b 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/DOCraftingWindow.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/DOCraftingWindow.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.client.gui.modules; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.ItemIcon; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.ScrollingList; @@ -35,11 +36,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import static com.minecolonies.api.util.constant.TranslationConstants.DOCRAFTING_BLOCK; import static com.minecolonies.api.util.constant.WindowConstants.*; /** @@ -52,10 +51,14 @@ public class DOCraftingWindow extends AbstractModuleWindow */ private static final String RESOURCE_STRING = ":gui/layouthuts/layoutdocrafting.xml"; - private static final String[] BLOCKICONS = new String[] { BLOCK1, BLOCK2, BLOCK3 }; + /** + * Inputs scrolling list. + */ + private final ScrollingList inputs; + private final List inputIcons = new ArrayList<>(); /** - * Resource scrolling list. + * Outputs scrolling list. */ private final ScrollingList resourceList; @@ -85,15 +88,34 @@ public DOCraftingWindow(final IBuildingView building, final DOCraftingModuleView this.craftingModuleView = view; validator = craftingModuleView.getIngredientValidator(); + inputs = this.window.findPaneOfTypeByID(LIST_RESOURCES, ScrollingList.class); resourceList = this.window.findPaneOfTypeByID("resourcesstock", ScrollingList.class); - registerButton(BLOCK1_ADD, this::addBlock1); - registerButton(BLOCK2_ADD, this::addBlock2); - registerButton(BLOCK3_ADD, this::addBlock3); - registerButton(ADD, this::addRecipe); + inputIcons.addAll(Collections.nCopies(inputInventory.getContainerSize(), null)); + inputs.setDataProvider(inputInventory::getContainerSize, this::updateInputs); + + registerButton("add", this::addRecipe); registerButton(BUTTON_REQUEST, this::showRequests); } + private void updateInputs(final int index, final Pane rowPane) + { + rowPane.findPaneOfTypeByID(RESOURCE_NAME, Text.class) + .setText(Component.translatable(DOCRAFTING_BLOCK, index + 1)); + + final ItemIcon icon = rowPane.findPaneOfTypeByID(RESOURCE_ICON, ItemIcon.class); + inputIcons.set(index, icon); + + rowPane.findPaneOfTypeByID(RESOURCE_ADD, Button.class).setHandler(btn -> + { + new WindowSelectRes(this, (stack) -> MateriallyTexturedBlockManager.getInstance().doesItemStackContainsMaterialForSlot(index, stack), (stack, qty) -> { + inputInventory.setItem(index, stack); + icon.setItem(stack); + updateStockList(); + }, false).open(); + }); + } + private void showRequests() { new WindowSelectRequest(this.buildingView, this::matchingRequest, this::reopenWithRequest).open(); @@ -132,13 +154,13 @@ private void reopenWithRequest(@Nullable final IRequest request) { final ItemStack componentBlock = new ItemStack(textureData.getTexturedComponents().getOrDefault(component.getId(), Blocks.AIR)); inputInventory.setItem(slot, componentBlock); - findPaneOfTypeByID(BLOCKICONS[slot], ItemIcon.class).setItem(componentBlock); + inputIcons.get(slot).setItem(componentBlock); ++slot; } - for (; slot < 3; ++slot) + for (; slot < inputInventory.getContainerSize(); ++slot) { inputInventory.setItem(slot, ItemStack.EMPTY); - findPaneOfTypeByID(BLOCKICONS[slot], ItemIcon.class).setItem(ItemStack.EMPTY); + inputIcons.get(slot).setItem(ItemStack.EMPTY); } updateStockList(); } @@ -208,42 +230,6 @@ private void addRecipe() Network.getNetwork().sendToServer(new AddRemoveRecipeMessage(buildingView, false, storage, craftingModuleView.getId())); } - /** - * Add the stack. - */ - private void addBlock1() - { - new WindowSelectRes(this, buildingView, (stack) -> MateriallyTexturedBlockManager.getInstance().doesItemStackContainsMaterialForSlot(0, stack), (stack, qty) -> { - inputInventory.setItem(0, stack); - findPaneOfTypeByID(BLOCK1, ItemIcon.class).setItem(stack); - updateStockList(); - }, false).open(); - } - - /** - * Add the stack. - */ - private void addBlock2() - { - new WindowSelectRes(this, buildingView, (stack) -> MateriallyTexturedBlockManager.getInstance().doesItemStackContainsMaterialForSlot(1, stack), (stack, qty) -> { - inputInventory.setItem(1, stack); - findPaneOfTypeByID(BLOCK2, ItemIcon.class).setItem(stack); - updateStockList(); - }, false).open(); - } - - /** - * Add the stack. - */ - private void addBlock3() - { - new WindowSelectRes(this, buildingView, (stack) -> MateriallyTexturedBlockManager.getInstance().doesItemStackContainsMaterialForSlot(2, stack), (stack, qty) -> { - inputInventory.setItem(2, stack); - updateStockList(); - findPaneOfTypeByID(BLOCK3, ItemIcon.class).setItem(stack); - }, false).open(); - } - @Override public void onOpened() { diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmFieldsModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmFieldsModuleWindow.java new file mode 100644 index 00000000000..f2b1b0f0d48 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmFieldsModuleWindow.java @@ -0,0 +1,221 @@ +package com.minecolonies.coremod.client.gui.modules; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Button; +import com.ldtteam.blockui.controls.ItemIcon; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.ScrollingList; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.client.gui.AbstractModuleWindow; +import com.minecolonies.coremod.colony.buildings.moduleviews.FieldsModuleView; +import com.minecolonies.coremod.colony.fields.FarmField; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_HIRING_ON; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_LABEL_FIELD_COUNT; + +/** + * BOWindow for the fields tab in huts. + */ +public class FarmFieldsModuleWindow extends AbstractModuleWindow +{ + /** + * Resource suffix of the GUI. + */ + private static final String HUT_FIELDS_RESOURCE_SUFFIX = ":gui/layouthuts/layoutfarmfields.xml"; + + /** + * ID of the fields list inside the GUI. + */ + private static final String LIST_FIELDS = "fields"; + + /** + * ID of the distance label inside the GUI. + */ + private static final String TAG_DISTANCE = "dist"; + + /** + * ID of the direction label inside the GUI. + */ + private static final String TAG_DIRECTION = "dir"; + + /** + * ID of the assign button inside the GUI. + */ + private static final String TAG_BUTTON_ASSIGN = "assignFarm"; + + /** + * ID of the assignmentMode button inside the GUI. + */ + private static final String TAG_BUTTON_ASSIGNMENT_MODE = "assignmentMode"; + + /** + * ID of the field count label inside the GUI. + */ + private static final String TAG_FIELD_COUNT = "fieldCount"; + + /** + * String which displays the release of a field. + */ + private static final String RED_X = "X"; + + /** + * String which displays adding a field. + */ + private static final String APPROVE = "✓"; + + /** + * ID of the icon inside the GUI. + */ + private static final String TAG_ICON = "icon"; + + /** + * The field module view. + */ + private final FieldsModuleView moduleView; + + /** + * ScrollList with the fields. + */ + private ScrollingList fieldList; + + /** + * Constructor for the window. + * + * @param moduleView {@link FieldsModuleView}. + */ + public FarmFieldsModuleWindow(final IBuildingView building, final FieldsModuleView moduleView) + { + super(building, Constants.MOD_ID + HUT_FIELDS_RESOURCE_SUFFIX); + this.moduleView = moduleView; + + registerButton(TAG_BUTTON_ASSIGNMENT_MODE, this::assignmentModeClicked); + registerButton(TAG_BUTTON_ASSIGN, this::assignClicked); + } + + /** + * Fired when the assignment mode has been toggled. + * + * @param button clicked button. + */ + private void assignmentModeClicked(@NotNull final Button button) + { + moduleView.setAssignFieldManually(!moduleView.assignFieldManually()); + updateUI(); + } + + /** + * Fired when assign has been clicked in the field list. + * + * @param button clicked button. + */ + private void assignClicked(@NotNull final Button button) + { + final int row = fieldList.getListElementIndexByPane(button); + final IField field = moduleView.getFields().get(row); + if (field.isTaken()) + { + moduleView.freeField(field); + } + else + { + moduleView.assignField(field); + } + updateUI(); + } + + /** + * Contains the logic to refresh the UI whenever something changes. + */ + private void updateUI() + { + findPaneOfTypeByID(TAG_BUTTON_ASSIGNMENT_MODE, Button.class) + .setText(Component.translatable(moduleView.assignFieldManually() ? COM_MINECOLONIES_COREMOD_GUI_HIRING_ON : COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); + findPaneOfTypeByID(TAG_FIELD_COUNT, Text.class) + .setText(Component.translatable(FIELD_LIST_LABEL_FIELD_COUNT, moduleView.getOwnedFields().size(), moduleView.getMaxFieldCount())); + } + + @Override + public void onOpened() + { + super.onOpened(); + + fieldList = findPaneOfTypeByID(LIST_FIELDS, ScrollingList.class); + fieldList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return moduleView.getFields().size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final IField field = moduleView.getFields().get(index); + final String distance = Integer.toString(field.getSqDistance(buildingView)); + final Component direction = BlockPosUtil.calcDirection(buildingView.getPosition(), field.getPosition()); + + rowPane.findPaneOfTypeByID(TAG_DISTANCE, Text.class).setText(Component.translatable(distance + "m")); + rowPane.findPaneOfTypeByID(TAG_DIRECTION, Text.class).setText(direction); + + final Button assignButton = rowPane.findPaneOfTypeByID(TAG_BUTTON_ASSIGN, Button.class); + assignButton.setEnabled(moduleView.assignFieldManually()); + assignButton.setHoverPane(null); + assignButton.show(); + + if (field.isTaken() && !buildingView.getID().equals(field.getBuildingId())) + { + assignButton.hide(); + } + else + { + if (field.isTaken()) + { + assignButton.setText(Component.translatable(RED_X).withStyle(ChatFormatting.RED)); + } + else + { + assignButton.setText(Component.translatable(APPROVE).withStyle(ChatFormatting.GREEN)); + + if (!moduleView.canAssignField(field)) + { + assignButton.disable(); + + MutableComponent warningTooltip = moduleView.getFieldWarningTooltip(field); + if (warningTooltip != null && moduleView.assignFieldManually()) + { + PaneBuilders.tooltipBuilder() + .append(warningTooltip.withStyle(ChatFormatting.RED)) + .hoverPane(assignButton) + .build(); + } + } + } + } + + if (field instanceof FarmField farmField && !farmField.getSeed().isEmpty()) + { + rowPane.findPaneOfTypeByID(TAG_ICON, ItemIcon.class).setItem(farmField.getSeed()); + } + } + }); + + updateUI(); + } + + @Override + public void onUpdate() + { + super.onUpdate(); + updateUI(); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmerFieldsModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmerFieldsModuleWindow.java deleted file mode 100644 index 205c7d3adbe..00000000000 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/FarmerFieldsModuleWindow.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.minecolonies.coremod.client.gui.modules; - -import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.controls.Button; -import com.ldtteam.blockui.controls.ItemIcon; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.ScrollingList; -import com.minecolonies.api.colony.buildings.views.IBuildingView; -import com.minecolonies.api.util.BlockPosUtil; -import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.coremod.client.gui.AbstractModuleWindow; -import com.minecolonies.coremod.colony.buildings.moduleviews.FarmerFieldModuleView; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.contents.TranslatableContents; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.BlockPos; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -import static com.minecolonies.api.util.constant.TranslationConstants.*; - -/** - * BOWindow for the farmer hut. - */ -public class FarmerFieldsModuleWindow extends AbstractModuleWindow -{ - /** - * Tag of the pages view. - */ - private static final String VIEW_PAGES = "pages"; - - /** - * Resource suffix of the GUI. - */ - private static final String HUT_FARMER_RESOURCE_SUFFIX = ":gui/layouthuts/layoutfarmerfields.xml"; - - /** - * Id of the the fields page inside the GUI. - */ - private static final String PAGE_FIELDS = "pageFields"; - - /** - * Id of the the fields list inside the GUI. - */ - private static final String LIST_FIELDS = "fields"; - - /** - * Id of the the worker label inside the GUI. - */ - private static final String TAG_WORKER = "worker"; - - /** - * Id of the the distance label inside the GUI. - */ - private static final String TAG_DISTANCE = "dist"; - - /** - * Id of the the direction label inside the GUI. - */ - private static final String TAG_DIRECTION = "dir"; - - /** - * Id of the the assign button inside the GUI. - */ - private static final String TAG_BUTTON_ASSIGN = "assignFarm"; - - /** - * Id of the the assignmentMode button inside the GUI. - */ - private static final String TAG_BUTTON_ASSIGNMENT_MODE = "assignmentMode"; - - /** - * String which displays the release of a field. - */ - private static final String RED_X = "§n§4X"; - - /** - * String which displays adding a field. - */ - private static final String APPROVE = "✓"; - - /** - * Id of the icon inside the GUI. - */ - private static final String TAG_ICON = "icon"; - - /** - * The farmer module view. - */ - private final FarmerFieldModuleView moduleView; - - /** - * List of fields the building seeds. - */ - private List fields = new ArrayList<>(); - - /** - * ScrollList with the fields. - */ - private ScrollingList fieldList; - - /** - * The world. - */ - private final ClientLevel world = Minecraft.getInstance().level; - - /** - * Constructor for the window of the farmer. - * - * @param moduleView {@link FarmerFieldModuleView}. - */ - public FarmerFieldsModuleWindow(final IBuildingView building, final FarmerFieldModuleView moduleView) - { - super(building, Constants.MOD_ID + HUT_FARMER_RESOURCE_SUFFIX); - registerButton(TAG_BUTTON_ASSIGNMENT_MODE, this::assignmentModeClicked); - registerButton(TAG_BUTTON_ASSIGN, this::assignClicked); - this.moduleView = moduleView; - } - - /** - * Fired when assign has been clicked in the field list. - * - * @param button clicked button. - */ - private void assignClicked(@NotNull final Button button) - { - final int row = fieldList.getListElementIndexByPane(button); - final BlockPos field = fields.get(row); - final BlockEntity entity = world.getBlockEntity(field); - if (entity instanceof ScarecrowTileEntity) - { - if (button.getTextAsString().equals(RED_X)) - { - button.setText(Component.literal(APPROVE)); - moduleView.changeFields(field, false, (ScarecrowTileEntity) entity); - } - else - { - button.setText(Component.literal(RED_X)); - moduleView.changeFields(field, true, (ScarecrowTileEntity) entity); - } - - pullLevelsFromHut(); - window.findPaneOfTypeByID(LIST_FIELDS, ScrollingList.class).refreshElementPanes(); - } - } - - /** - * Retrieve levels from the building to display in GUI. - */ - private void pullLevelsFromHut() - { - fields = moduleView.getFields(); - } - - /** - * Fired when the assignment mode has been toggled. - * - * @param button clicked button. - */ - private void assignmentModeClicked(@NotNull final Button button) - { - String buttonText = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); - - if (buttonText.equals(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)) - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - moduleView.setAssignFieldManually(true); - } - else - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); - moduleView.setAssignFieldManually(false); - } - window.findPaneOfTypeByID(LIST_FIELDS, ScrollingList.class).refreshElementPanes(); - } - - @Override - public void onOpened() - { - super.onOpened(); - - if (moduleView.assignFieldManually()) - { - findPaneOfTypeByID(TAG_BUTTON_ASSIGNMENT_MODE, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - } - else - { - findPaneOfTypeByID(TAG_BUTTON_ASSIGNMENT_MODE, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); - } - - fieldList = findPaneOfTypeByID(LIST_FIELDS, ScrollingList.class); - fieldList.setDataProvider(new ScrollingList.DataProvider() - { - @Override - public int getElementCount() - { - return fields.size(); - } - - @Override - public void updateElement(final int index, @NotNull final Pane rowPane) - { - final BlockPos field = fields.get(index); - @NotNull final String distance = Integer.toString((int) Math.sqrt(BlockPosUtil.getDistanceSquared(field, buildingView.getPosition()))); - final Component direction = BlockPosUtil.calcDirection(buildingView.getPosition(), field); - final BlockEntity entity = world.getBlockEntity(field); - if (entity instanceof ScarecrowTileEntity) - { - final ScarecrowTileEntity scarecrowTileEntity = (ScarecrowTileEntity) entity; - @NotNull final Component owner = scarecrowTileEntity.getOwner().isEmpty() - ? Component.literal("<") - .append(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_WORKER_HUTS_FARMER_HUT_UNUSED)) - .append(">") - : Component.literal(scarecrowTileEntity.getOwner()); - - rowPane.findPaneOfTypeByID(TAG_WORKER, Text.class).setText(owner); - rowPane.findPaneOfTypeByID(TAG_DISTANCE, Text.class).setText(Component.literal(distance + "m")); - - rowPane.findPaneOfTypeByID(TAG_DIRECTION, Text.class).setText(direction); - - final Button assignButton = rowPane.findPaneOfTypeByID(TAG_BUTTON_ASSIGN, Button.class); - - assignButton.setEnabled(moduleView.assignFieldManually()); - - if (((ScarecrowTileEntity) entity).isTaken()) - { - assignButton.setText(Component.literal(RED_X)); - } - else - { - assignButton.setText(Component.literal(APPROVE)); - if (buildingView.getBuildingLevel() <= moduleView.getAmountOfFields()) - { - assignButton.disable(); - } - } - - if (((ScarecrowTileEntity) entity).getSeed() != null) - { - rowPane.findPaneOfTypeByID(TAG_ICON, ItemIcon.class).setItem(((ScarecrowTileEntity) entity).getSeed()); - } - } - } - }); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - pullLevelsFromHut(); - } -} - diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/MinimumStockModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/MinimumStockModuleWindow.java index 502b59ed1a7..1d7d8ec75d7 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/MinimumStockModuleWindow.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/MinimumStockModuleWindow.java @@ -6,7 +6,6 @@ import com.ldtteam.blockui.controls.ItemIcon; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.ScrollingList; -import com.ldtteam.structurize.util.LanguageHandler; import com.minecolonies.api.colony.buildings.modules.IMinimumStockModuleView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.crafting.ItemStorage; @@ -18,8 +17,8 @@ import com.minecolonies.coremod.network.messages.server.colony.building.AddMinimumStockToBuildingModuleMessage; import com.minecolonies.coremod.network.messages.server.colony.building.RemoveMinimumStockFromBuildingModuleMessage; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; import static com.minecolonies.api.util.constant.WindowConstants.*; @@ -69,7 +68,7 @@ public MinimumStockModuleWindow( { final ButtonImage button = findPaneOfTypeByID(STOCK_ADD, ButtonImage.class); button.setText(Component.translatable(LABEL_LIMIT_REACHED)); - button.setImage(new ResourceLocation(Constants.MOD_ID, "textures/gui/builderhut/builder_button_medium_dark.png"), false); + button.setImage(new ResourceLocation(Constants.MOD_ID, "textures/gui/builderhut/builder_button_medium_disabled.png"), false); } registerButton(STOCK_REMOVE, this::removeStock); @@ -96,7 +95,7 @@ private void addStock() { if (!moduleView.hasReachedLimit()) { - new WindowSelectRes(this, buildingView, (stack) -> true, (stack, qty) -> Network.getNetwork().sendToServer(new AddMinimumStockToBuildingModuleMessage(buildingView, stack, qty)), true).open(); + new WindowSelectRes(this, (stack) -> true, (stack, qty) -> Network.getNetwork().sendToServer(new AddMinimumStockToBuildingModuleMessage(buildingView, stack, qty)), true).open(); } } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/PlantationFieldsModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/PlantationFieldsModuleWindow.java new file mode 100644 index 00000000000..4cd6771c3de --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/PlantationFieldsModuleWindow.java @@ -0,0 +1,229 @@ +package com.minecolonies.coremod.client.gui.modules; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Button; +import com.ldtteam.blockui.controls.ItemIcon; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.ScrollingList; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.client.gui.AbstractModuleWindow; +import com.minecolonies.coremod.colony.buildings.moduleviews.FieldsModuleView; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingPlantation; +import com.minecolonies.coremod.colony.fields.PlantationField; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_HIRING_ON; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_LABEL_FIELD_COUNT; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_LABEL_PLANT_COUNT; + +/** + * BOWindow for the fields tab in huts. + */ +public class PlantationFieldsModuleWindow extends AbstractModuleWindow +{ + /** + * Resource suffix of the GUI. + */ + private static final String HUT_FIELDS_RESOURCE_SUFFIX = ":gui/layouthuts/layoutplantationfields.xml"; + + /** + * ID of the fields list inside the GUI. + */ + private static final String LIST_FIELDS = "fields"; + + /** + * ID of the distance label inside the GUI. + */ + private static final String TAG_DISTANCE = "dist"; + + /** + * ID of the direction label inside the GUI. + */ + private static final String TAG_DIRECTION = "dir"; + + /** + * ID of the assign button inside the GUI. + */ + private static final String TAG_BUTTON_ASSIGN = "assignFarm"; + + /** + * ID of the assignmentMode button inside the GUI. + */ + private static final String TAG_BUTTON_ASSIGNMENT_MODE = "assignmentMode"; + + /** + * ID of the field count label inside the GUI. + */ + private static final String TAG_FIELD_COUNT = "fieldCount"; + + /** + * ID of the plant count label inside the GUI. + */ + private static final String TAG_PLANT_COUNT = "plantCount"; + + /** + * String which displays the release of a field. + */ + private static final String RED_X = "X"; + + /** + * String which displays adding a field. + */ + private static final String APPROVE = "✓"; + + /** + * ID of the icon inside the GUI. + */ + private static final String TAG_ICON = "icon"; + + /** + * The field module view. + */ + private final BuildingPlantation.PlantationFieldsModuleView moduleView; + + /** + * ScrollList with the fields. + */ + private ScrollingList fieldList; + + /** + * Constructor for the window. + * + * @param moduleView {@link FieldsModuleView}. + */ + public PlantationFieldsModuleWindow(final IBuildingView building, final BuildingPlantation.PlantationFieldsModuleView moduleView) + { + super(building, Constants.MOD_ID + HUT_FIELDS_RESOURCE_SUFFIX); + registerButton(TAG_BUTTON_ASSIGNMENT_MODE, this::assignmentModeClicked); + registerButton(TAG_BUTTON_ASSIGN, this::assignClicked); + this.moduleView = moduleView; + } + + /** + * Fired when the assignment mode has been toggled. + * + * @param button clicked button. + */ + private void assignmentModeClicked(@NotNull final Button button) + { + moduleView.setAssignFieldManually(!moduleView.assignFieldManually()); + updateUI(); + } + + /** + * Fired when assign has been clicked in the field list. + * + * @param button clicked button. + */ + private void assignClicked(@NotNull final Button button) + { + final int row = fieldList.getListElementIndexByPane(button); + final IField field = moduleView.getFields().get(row); + if (field.isTaken()) + { + moduleView.freeField(field); + } + else + { + moduleView.assignField(field); + } + updateUI(); + } + + /** + * Contains the logic to refresh the UI whenever something changes. + */ + private void updateUI() + { + findPaneOfTypeByID(TAG_BUTTON_ASSIGNMENT_MODE, Button.class) + .setText(Component.translatable(moduleView.assignFieldManually() ? COM_MINECOLONIES_COREMOD_GUI_HIRING_ON : COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); + findPaneOfTypeByID(TAG_FIELD_COUNT, Text.class) + .setText(Component.translatable(FIELD_LIST_LABEL_FIELD_COUNT, moduleView.getOwnedFields().size(), moduleView.getMaxFieldCount())); + findPaneOfTypeByID(TAG_PLANT_COUNT, Text.class) + .setText(Component.translatable(FIELD_LIST_LABEL_PLANT_COUNT, moduleView.getCurrentPlants(), moduleView.getMaxConcurrentPlants())); + } + + @Override + public void onOpened() + { + super.onOpened(); + + fieldList = findPaneOfTypeByID(LIST_FIELDS, ScrollingList.class); + fieldList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return moduleView.getFields().size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final PlantationField field = (PlantationField) moduleView.getFields().get(index); + final String distance = Integer.toString(field.getSqDistance(buildingView)); + final Component direction = BlockPosUtil.calcDirection(buildingView.getPosition(), field.getPosition()); + + rowPane.findPaneOfTypeByID(TAG_DISTANCE, Text.class).setText(Component.translatable(distance + "m")); + rowPane.findPaneOfTypeByID(TAG_DIRECTION, Text.class).setText(direction); + + final Button assignButton = rowPane.findPaneOfTypeByID(TAG_BUTTON_ASSIGN, Button.class); + assignButton.setEnabled(moduleView.assignFieldManually()); + assignButton.setHoverPane(null); + assignButton.show(); + + if (field.isTaken() && !buildingView.getID().equals(field.getBuildingId())) + { + assignButton.hide(); + } + else + { + if (field.isTaken()) + { + assignButton.setText(Component.translatable(RED_X).withStyle(ChatFormatting.RED)); + } + else + { + assignButton.setText(Component.translatable(APPROVE).withStyle(ChatFormatting.GREEN)); + + if (!moduleView.canAssignField(field)) + { + assignButton.disable(); + + MutableComponent warningTooltip = moduleView.getFieldWarningTooltip(field); + if (warningTooltip != null && moduleView.assignFieldManually()) + { + PaneBuilders.tooltipBuilder() + .append(warningTooltip.withStyle(ChatFormatting.RED)) + .hoverPane(assignButton) + .build(); + } + } + } + } + + final Item item = field.getModule().getItem(); + rowPane.findPaneOfTypeByID(TAG_ICON, ItemIcon.class).setItem(new ItemStack(item)); + } + }); + + updateUI(); + } + + @Override + public void onUpdate() + { + super.onUpdate(); + updateUI(); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/SettingsModuleWindow.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/SettingsModuleWindow.java index bd388403050..9ae58e0843f 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/SettingsModuleWindow.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/SettingsModuleWindow.java @@ -1,12 +1,15 @@ package com.minecolonies.coremod.client.gui.modules; +import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.Box; import com.ldtteam.blockui.views.ScrollingList; import com.ldtteam.blockui.views.View; +import com.minecolonies.api.colony.buildings.modules.settings.ISetting; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.util.Log; import com.minecolonies.coremod.client.gui.AbstractModuleWindow; import com.minecolonies.coremod.colony.buildings.moduleviews.SettingsModuleView; import net.minecraft.network.chat.Component; @@ -14,7 +17,8 @@ import java.util.Locale; -import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.api.util.constant.WindowConstants.DESC_LABEL; +import static com.minecolonies.api.util.constant.WindowConstants.LIST_SETTINGS; /** * BOWindow for all the settings of a hut. @@ -22,14 +26,14 @@ public class SettingsModuleWindow extends AbstractModuleWindow { /** - * Resource scrolling list. + * The building this belongs to. */ - private final ScrollingList settingsList; + protected final IBuildingView building; /** - * The building this belongs to. + * Resource scrolling list. */ - protected final IBuildingView building; + private final ScrollingList settingsList; /** * The module view. @@ -38,8 +42,8 @@ public class SettingsModuleWindow extends AbstractModuleWindow /** * @param building the building it belongs to. - * @param res the building res id. - * @param moduleView the assigned module view. + * @param res the building res id. + * @param moduleView the assigned module view. */ public SettingsModuleWindow( final String res, @@ -68,8 +72,6 @@ private void updateSettingsList() { settingsList.enable(); settingsList.show(); - - //Creates a dataProvider for the unemployed resourceList. settingsList.setDataProvider(new ScrollingList.DataProvider() { /** @@ -79,7 +81,7 @@ private void updateSettingsList() @Override public int getElementCount() { - return moduleView.getActiveSettings().size(); + return moduleView.getSettingsToShow().size(); } /** @@ -90,17 +92,45 @@ public int getElementCount() @Override public void updateElement(final int index, @NotNull final Pane rowPane) { - final ISettingKey key = moduleView.getActiveSettings().get(index); - if (rowPane.findPaneOfTypeByID("box", Box.class).getChildren().isEmpty()) + final ISettingKey key = moduleView.getSettingsToShow().get(index); + final ISetting setting = moduleView.getSetting(key); + if (setting == null) { - moduleView.getSettings().get(key).setupHandler(key, rowPane, moduleView, building, SettingsModuleWindow.this); + return; } - else if (!rowPane.findPaneOfTypeByID("id", Text.class).getText().getString().equals(key.getUniqueId().toString())) + + final Box box = rowPane.findPaneOfTypeByID("box", Box.class); + final Text idField = box.findPaneOfTypeByID("id", Text.class); + + if (idField != null && !idField.getTextAsString().equals(key.getUniqueId().toString())) { - ((View) rowPane).getChildren().clear(); - moduleView.getSettings().get(key).setupHandler(key, rowPane, moduleView, building, SettingsModuleWindow.this); + box.getChildren().clear(); } - moduleView.getSettings().get(key).render(key, rowPane, moduleView, building, SettingsModuleWindow.this); + + if (box.getChildren().isEmpty()) + { + Loader.createFromXMLFile(setting.getLayoutItem(), (View) rowPane); + setting.setupHandler(key, rowPane, moduleView, building, SettingsModuleWindow.this); + final Text rowIdField = rowPane.findPaneOfTypeByID("id", Text.class); + if (rowIdField != null) + { + rowIdField.setText(Component.literal(key.getUniqueId().toString())); + } + else + { + Log.getLogger() + .warn( + "Settings for class \"{}\" it's window does not provide an \"id\" field. Make sure this exists so the view can be properly recycled when the settings list is modified!", + setting.getClass().getName()); + } + final Text rowDescriptionField = rowPane.findPaneOfTypeByID("desc", Text.class); + if (rowDescriptionField != null) + { + rowDescriptionField.setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); + } + } + + setting.render(key, rowPane, moduleView, building, SettingsModuleWindow.this); } }); } diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowBuilderResModule.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowBuilderResModule.java index 8240d672600..0f7ecdb020d 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowBuilderResModule.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowBuilderResModule.java @@ -17,9 +17,9 @@ import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBuilder; import com.minecolonies.coremod.network.messages.server.colony.building.MarkBuildingDirtyMessage; import com.minecolonies.coremod.network.messages.server.colony.building.TransferItemsRequestMessage; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; @@ -56,7 +56,7 @@ public class WindowBuilderResModule extends AbstractModuleWindow /** * Tick to update the list. */ - private int tick = 0; + private int tickToInventoryUpdate = 0; /** * Constructor for window builder hut. @@ -215,10 +215,10 @@ private void updateResourcePane(final int index, @NotNull final Pane rowPane) public void onUpdate() { super.onUpdate(); - if (tick++ == 20) + if (tickToInventoryUpdate++ == 20) { pullResourcesFromHut(); - tick = 0; + tickToInventoryUpdate = 0; } window.findPaneOfTypeByID(LIST_RESOURCES, ScrollingList.class).refreshElementPanes(); } @@ -241,6 +241,9 @@ private void transferItems(@NotNull final Button button) } else { + // Delay updates to allow conflicts with network data 3s until server data is loaded + tickToInventoryUpdate = -20 * 3; + // The itemStack size should not be greater than itemStack.getMaxStackSize, We send 1 instead // and use quantity for the size @NotNull final ItemStack itemStack = res.getItemStack().copy(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowHutCrafterTaskModule.java b/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowHutCrafterTaskModule.java index 21a5c0f5f8d..1feae22a0c7 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowHutCrafterTaskModule.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/modules/WindowHutCrafterTaskModule.java @@ -1,19 +1,25 @@ package com.minecolonies.coremod.client.gui.modules; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.controls.Image; +import com.ldtteam.blockui.controls.ItemIcon; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.ScrollingList; import com.minecolonies.api.colony.ICitizenDataView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.request.RequestState; +import com.minecolonies.api.colony.requestsystem.requestable.IStackBasedTask; import com.minecolonies.api.colony.requestsystem.requestable.deliveryman.IDeliverymanRequestable; import com.minecolonies.api.colony.requestsystem.token.IToken; import com.minecolonies.coremod.client.gui.AbstractModuleWindow; import com.minecolonies.coremod.colony.buildings.moduleviews.WorkerBuildingModuleView; import com.minecolonies.coremod.colony.jobs.views.CrafterJobView; import com.minecolonies.coremod.colony.jobs.views.DmanJobView; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -21,6 +27,7 @@ import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ENTITY_DELIVERYMAN_PRIORITY; import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.LABEL_MAIN_TAB_NAME; /** * Task list module. @@ -68,8 +75,7 @@ else if (citizen.getJobView() instanceof DmanJobView) } } - final ScrollingList deliveryList = findPaneOfTypeByID(LIST_TASKS, ScrollingList.class); - deliveryList.setDataProvider(new ScrollingList.DataProvider() + findPaneOfTypeByID(LIST_TASKS, ScrollingList.class).setDataProvider(new ScrollingList.DataProvider() { @Override public int getElementCount() @@ -83,23 +89,49 @@ public void updateElement(final int index, @NotNull final Pane rowPane) { final IRequest request = buildingView.getColony().getRequestManager().getRequestForToken(tasks.get(index)); - final IRequest parent = buildingView.getColony().getRequestManager().getRequestForToken(request.getParent()); + IRequest parent = buildingView.getColony().getRequestManager().getRequestForToken(request.getParent()); - if (parent != null) + while (parent != null && parent.getRequester().getLocation().equals(request.getRequester().getLocation())) { - rowPane.findPaneOfTypeByID(REQUESTER, Text.class) - .setText(Component.literal(request.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), request).getString() + " ->")); - rowPane.findPaneOfTypeByID(PARENT, Text.class) - .setText(parent.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), parent)); + final IRequest tempParent = buildingView.getColony().getRequestManager().getRequestForToken(parent.getParent()); + if (tempParent != null) + { + parent = tempParent; + } + else + { + break; + } + } + + if (parent == null) + { + rowPane.findPaneOfTypeByID(REQUESTER, Text.class).setText(request.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), request)); } else { rowPane.findPaneOfTypeByID(REQUESTER, Text.class) - .setText(request.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), request)); - rowPane.findPaneOfTypeByID(PARENT, Text.class).clearText(); + .setText(Component.literal(request.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), request).getString() + " -> " + parent.getRequester().getRequesterDisplayName(buildingView.getColony().getRequestManager(), parent).getString())); + PaneBuilders.tooltipBuilder().hoverPane(rowPane.findPaneOfTypeByID(REQUESTER, Text.class)) + .build().setText(Component.literal(request.getRequester().getLocation().getInDimensionLocation().toShortString() + " -> " + parent.getRequester().getLocation().getInDimensionLocation().toShortString())); + } - rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(Component.literal(request.getShortDisplayString().getString().replace("§f", ""))); + // Add an extra thing with an Interface about having a stack to display, if we have this, then also add a method for a shorter string. + if (request instanceof IStackBasedTask) + { + final ItemIcon icon = rowPane.findPaneOfTypeByID("detailIcon", ItemIcon.class); + final ItemStack copyStack = ((IStackBasedTask) request).getTaskStack().copy(); + copyStack.setCount(((IStackBasedTask) request).getDisplayCount()); + icon.setItem(copyStack); + icon.setVisible(true); + rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(((IStackBasedTask) request).getDisplayPrefix().withStyle(request.getState() == RequestState.IN_PROGRESS ? ChatFormatting.DARK_GREEN : ChatFormatting.BLACK)); + } + else + { + rowPane.findPaneOfTypeByID("detailIcon", ItemIcon.class).setVisible(false); + rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Text.class).setText(Component.literal(request.getShortDisplayString().getString().replace("§f", "")).withStyle(request.getState() == RequestState.IN_PROGRESS ? ChatFormatting.DARK_GREEN : ChatFormatting.BLACK)); + } if (request.getRequest() instanceof IDeliverymanRequestable) { diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/Constants.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/Constants.java new file mode 100644 index 00000000000..5b507a38a76 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/Constants.java @@ -0,0 +1,53 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import java.time.Duration; + +/** + * Constants for the quest log. + */ +public class Constants +{ + /** + * Highlight manager key for the quest log tracking. + */ + public static final String HIGHLIGHT_QUEST_LOG_TRACKER_KEY = "questLogTracking"; + + /** + * Highlight manager key for the quest log tracking. + */ + public static final Duration HIGHLIGHT_QUEST_LOG_TRACKER_DURATION = Duration.ofSeconds(10); + + /** + * ID of the quests list inside the GUI. + */ + public static final String LIST_QUESTS = "quests"; + + /** + * ID of the label for the quest name. + */ + public static final String LABEL_QUEST_NAME = "questName"; + + /** + * ID of the label for the quest giver. + */ + public static final String LABEL_QUEST_GIVER = "questGiver"; + + /** + * ID of the label for the quest objective. + */ + public static final String LABEL_QUEST_OBJECTIVE = "questObjective"; + + /** + * ID of the label for the quest completed count. + */ + public static final String LABEL_COMPLETED_COUNT = "questCompletedCount"; + + /** + * ID of the button for the quest locator. + */ + public static final String BUTTON_QUEST_LOCATOR = "questLocator"; + + private Constants() + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLog.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLog.java new file mode 100644 index 00000000000..275e971d83e --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLog.java @@ -0,0 +1,168 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Button; +import com.ldtteam.blockui.controls.ButtonImage; +import com.ldtteam.blockui.views.ScrollingList; +import com.ldtteam.blockui.views.SwitchView; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.client.gui.AbstractWindowSkeleton; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.QUEST_LOG_TRACK_CITIZEN_TEXT; +import static com.minecolonies.coremod.client.gui.questlog.Constants.BUTTON_QUEST_LOCATOR; +import static com.minecolonies.coremod.client.gui.questlog.Constants.LIST_QUESTS; + +/** + * Quest log window in progress tab. + */ +public class WindowQuestLog extends AbstractWindowSkeleton +{ + /** + * Link to the xml file of the window. + */ + private static final String WINDOW_RESOURCE = ":gui/windowquestlog.xml"; + + /** + * Map of the different module classes, each dedicated to its own view. + */ + private final Map> moduleMap = new HashMap<>(); + + /** + * Default constructor. + * + * @param colonyView the colony which this quest log is attached to. + */ + public WindowQuestLog(final @NotNull IColonyView colonyView) + { + super(Constants.MOD_ID + WINDOW_RESOURCE); + registerButton(BUTTON_QUEST_LOCATOR, this::locateCitizenClickedInternal); + + this.moduleMap.put("pageInProgress", new QuestModuleContainer<>(new WindowQuestLogInProgressQuestQuestModule(), colonyView, switchView, "pageInProgress")); + this.moduleMap.put("pageAvailable", new QuestModuleContainer<>(new WindowQuestLogAvailableQuestModule(), colonyView, switchView, "pageAvailable")); + this.moduleMap.put("pageFinished", new QuestModuleContainer<>(new WindowQuestLogFinishedQuestModule(), colonyView, switchView, "pageFinished")); + } + + /** + * Internal method for handling the locate button. + * + * @param button clicked button. + */ + private void locateCitizenClickedInternal(@NotNull final Button button) + { + if (switchView.getCurrentView() != null) + { + String pageId = switchView.getCurrentView().getID(); + final QuestModuleContainer module = moduleMap.get(pageId); + if (module != null) + { + module.trackQuest(button); + } + } + } + + @Override + public void onUpdate() + { + super.onUpdate(); + + if (switchView.getCurrentView() != null) + { + String pageId = switchView.getCurrentView().getID(); + final QuestModuleContainer module = moduleMap.get(pageId); + if (module != null) + { + module.onUpdate(); + } + } + } + + /** + * Internal class for keeping track of the different pages. + */ + private static class QuestModuleContainer + { + /** + * The module class used to render the quest items. + */ + private final WindowQuestLogQuestModule module; + + /** + * The current colony. + */ + private final IColonyView colonyView; + + /** + * The scrolling list containing all the quests. + */ + private final ScrollingList questsList; + + /** + * The current list of quest items for this page. + */ + private List questItems; + + /** + * Default constructor. + */ + public QuestModuleContainer(final WindowQuestLogQuestModule module, final IColonyView colonyView, final SwitchView switchView, final String pageId) + { + this.module = module; + this.colonyView = colonyView; + Pane parent = switchView.getChildren().stream().filter(f -> f.getID().equals(pageId)).findFirst().orElseThrow(); + this.questsList = parent.findPaneOfTypeByID(LIST_QUESTS, ScrollingList.class); + + this.questItems = module.getQuestItems(colonyView); + + this.questsList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return questItems.size(); + } + + @Override + public void updateElement(final int index, final Pane rowPane) + { + module.renderQuestItem(questItems.get(index), colonyView, rowPane); + + final ButtonImage questLocator = rowPane.findPaneOfTypeByID(BUTTON_QUEST_LOCATOR, ButtonImage.class); + if (questLocator != null) + { + PaneBuilders.tooltipBuilder() + .append(Component.translatable(QUEST_LOG_TRACK_CITIZEN_TEXT)) + .hoverPane(questLocator) + .build(); + } + } + }); + } + + /** + * Updates the underlying quest list. + */ + void onUpdate() + { + this.questItems = module.getQuestItems(colonyView); + } + + /** + * Gives a signal that the given quest should be tracked. + * + * @param button the button which was clicked, helping to find which quest item should be tracked. + */ + void trackQuest(final Button button) + { + final int row = questsList.getListElementIndexByPane(button); + module.trackQuest(questItems.get(row)); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogAvailableQuestModule.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogAvailableQuestModule.java new file mode 100644 index 00000000000..26469be939a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogAvailableQuestModule.java @@ -0,0 +1,85 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Text; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestManager; +import com.minecolonies.api.quests.IQuestTemplate; +import com.minecolonies.coremod.client.render.worldevent.HighlightManager; +import com.minecolonies.coremod.client.render.worldevent.highlightmanager.CitizenRenderData; +import net.minecraft.network.chat.Component; + +import java.util.List; + +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.QUEST_LOG_GIVER_PREFIX; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.QUEST_LOG_NAME_PREFIX; +import static com.minecolonies.coremod.client.gui.questlog.Constants.*; + +/** + * Window quest log renderer for available quests. + */ +public class WindowQuestLogAvailableQuestModule implements WindowQuestLogQuestModule +{ + @Override + public List getQuestItems(final IColonyView colonyView) + { + return colonyView.getQuestManager().getAvailableQuests(); + } + + @Override + public void renderQuestItem(final IQuestInstance quest, final IColonyView colonyView, final Pane row) + { + IQuestTemplate questTemplate = IQuestManager.GLOBAL_SERVER_QUESTS.get(quest.getId()); + + setText(row, LABEL_QUEST_NAME, Component.translatable(QUEST_LOG_NAME_PREFIX).append(questTemplate.getName())); + setText(row, LABEL_QUEST_GIVER, Component.translatable(QUEST_LOG_GIVER_PREFIX).append(getQuestGiverName(colonyView, quest))); + } + + @Override + public void trackQuest(final IQuestInstance quest) + { + HighlightManager.addHighlight(HIGHLIGHT_QUEST_LOG_TRACKER_KEY, new CitizenRenderData(quest.getQuestGiverId(), HIGHLIGHT_QUEST_LOG_TRACKER_DURATION)); + } + + /** + * Quick setter for assigning text to a field, as well as providing a tooltip if the text is too long. + * + * @param container the container element for the text element. + * @param id the id of the text element. + * @param component the text component to write as text on the element. + */ + private void setText(final Pane container, final String id, final Component component) + { + final Text label = container.findPaneOfTypeByID(id, Text.class); + label.setText(component); + + if (label.getRenderedTextWidth() > label.getWidth()) + { + PaneBuilders.tooltipBuilder() + .append(component) + .hoverPane(label) + .build(); + } + } + + /** + * Get the name of the citizen who gave the quest. + * + * @param colonyView the colony view instance. + * @param quest the quest instance. + * @return the component containing the name of the citizen. + */ + private Component getQuestGiverName(final IColonyView colonyView, final IQuestInstance quest) + { + final ICitizenDataView citizen = colonyView.getCitizen(quest.getQuestGiverId()); + if (citizen != null) + { + return Component.literal(citizen.getName()); + } + return Component.empty(); + } +} + diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogFinishedQuestModule.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogFinishedQuestModule.java new file mode 100644 index 00000000000..e12f7c57b68 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogFinishedQuestModule.java @@ -0,0 +1,66 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Text; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.quests.FinishedQuest; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + +import java.util.List; + +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.*; +import static com.minecolonies.coremod.client.gui.questlog.Constants.LABEL_COMPLETED_COUNT; +import static com.minecolonies.coremod.client.gui.questlog.Constants.LABEL_QUEST_NAME; + +/** + * Window quest log renderer for finished quests. + */ +public class WindowQuestLogFinishedQuestModule implements WindowQuestLogQuestModule +{ + @Override + public List getQuestItems(final IColonyView colonyView) + { + return colonyView.getQuestManager().getFinishedQuests(); + } + + @Override + public void renderQuestItem(final FinishedQuest quest, final IColonyView colonyView, final Pane row) + { + setText(row, LABEL_QUEST_NAME, Component.translatable(QUEST_LOG_NAME_PREFIX).append(quest.template().getName())); + + if (quest.template().getMaxOccurrence() > 1) + { + setText(row, + LABEL_COMPLETED_COUNT, + Component.translatable(QUEST_LOG_COMPLETED_MULTIPLE_TEXT, quest.finishedCount(), quest.template().getMaxOccurrence()).withStyle(ChatFormatting.GOLD)); + } + else + { + setText(row, LABEL_COMPLETED_COUNT, Component.translatable(QUEST_LOG_COMPLETED_ONCE_TEXT).withStyle(ChatFormatting.GOLD)); + } + } + + /** + * Quick setter for assigning text to a field, as well as providing a tooltip if the text is too long. + * + * @param container the container element for the text element. + * @param id the id of the text element. + * @param component the text component to write as text on the element. + */ + private void setText(final Pane container, final String id, final Component component) + { + final Text label = container.findPaneOfTypeByID(id, Text.class); + label.setText(component); + + if (label.getRenderedTextWidth() > label.getWidth()) + { + PaneBuilders.tooltipBuilder() + .append(component) + .hoverPane(label) + .build(); + } + } +} + diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogInProgressQuestQuestModule.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogInProgressQuestQuestModule.java new file mode 100644 index 00000000000..4a195961594 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogInProgressQuestQuestModule.java @@ -0,0 +1,99 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.Text; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.quests.*; +import com.minecolonies.coremod.client.render.worldevent.HighlightManager; +import com.minecolonies.coremod.client.render.worldevent.highlightmanager.CitizenRenderData; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; + +import java.util.List; + +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.QUEST_LOG_GIVER_PREFIX; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.QUEST_LOG_NAME_PREFIX; +import static com.minecolonies.coremod.client.gui.questlog.Constants.*; + +/** + * Window quest log renderer for in progress quests. + */ +public class WindowQuestLogInProgressQuestQuestModule implements WindowQuestLogQuestModule +{ + @Override + public List getQuestItems(final IColonyView colonyView) + { + return colonyView.getQuestManager().getInProgressQuests(); + } + + @Override + public void renderQuestItem(final IQuestInstance quest, final IColonyView colonyView, final Pane row) + { + IQuestTemplate questTemplate = IQuestManager.GLOBAL_SERVER_QUESTS.get(quest.getId()); + + setText(row, LABEL_QUEST_NAME, Component.translatable(QUEST_LOG_NAME_PREFIX).append(questTemplate.getName())); + setText(row, LABEL_QUEST_GIVER, Component.translatable(QUEST_LOG_GIVER_PREFIX).append(getQuestGiverName(colonyView, quest))); + + final IQuestObjectiveTemplate objectiveTemplate = questTemplate.getObjective(quest.getObjectiveIndex()); + final Text questObjectiveText = row.findPaneOfTypeByID(LABEL_QUEST_OBJECTIVE, Text.class); + + final Component progressText = objectiveTemplate.getProgressText(quest, Style.EMPTY.withColor(ChatFormatting.GOLD)); + final Component mainComponent = Component.literal(" - ") + .append(progressText) + .withStyle(ChatFormatting.GOLD); + + questObjectiveText.setText(mainComponent); + + PaneBuilders.tooltipBuilder() + .append(objectiveTemplate.getProgressText(quest, Style.EMPTY.withColor(ChatFormatting.WHITE))) + .hoverPane(questObjectiveText) + .build(); + } + + @Override + public void trackQuest(final IQuestInstance quest) + { + HighlightManager.addHighlight(HIGHLIGHT_QUEST_LOG_TRACKER_KEY, new CitizenRenderData(quest.getQuestGiverId(), HIGHLIGHT_QUEST_LOG_TRACKER_DURATION)); + } + + /** + * Quick setter for assigning text to a field, as well as providing a tooltip if the text is too long. + * + * @param container the container element for the text element. + * @param id the id of the text element. + * @param component the text component to write as text on the element. + */ + private void setText(final Pane container, final String id, final Component component) + { + final Text label = container.findPaneOfTypeByID(id, Text.class); + label.setText(component); + + if (label.getRenderedTextWidth() > label.getWidth()) + { + PaneBuilders.tooltipBuilder() + .append(component) + .hoverPane(label) + .build(); + } + } + + /** + * Get the name of the citizen who gave the quest. + * + * @param colonyView the colony view instance. + * @param quest the quest instance. + * @return the component containing the name of the citizen. + */ + private Component getQuestGiverName(final IColonyView colonyView, final IQuestInstance quest) + { + final ICitizenDataView citizen = colonyView.getCitizen(quest.getQuestGiverId()); + if (citizen != null) + { + return Component.literal(citizen.getName()); + } + return Component.empty(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogQuestModule.java b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogQuestModule.java new file mode 100644 index 00000000000..599ee362386 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/questlog/WindowQuestLogQuestModule.java @@ -0,0 +1,38 @@ +package com.minecolonies.coremod.client.gui.questlog; + +import com.ldtteam.blockui.Pane; +import com.minecolonies.api.colony.IColonyView; + +import java.util.List; + +/** + * Interface for quest log renderers. + * + * @param the quest instance type. + */ +public interface WindowQuestLogQuestModule +{ + /** + * Get the list of quests for this window. + * + * @param colonyView the colony instance. + * @return a list of quest items. + */ + List getQuestItems(IColonyView colonyView); + + /** + * Renderer method for an individual quest item. Called via the scrolling list. + * + * @param quest the current quest instance. + * @param colonyView the colony view instance. + * @param row the parenting row pane. + */ + void renderQuestItem(final T quest, final IColonyView colonyView, final Pane row); + + /** + * Method to instantiate quest tracking, does not have to be implemented. + * + * @param quest the quest instance. + */ + default void trackQuest(final T quest) {} +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/AbstractWindowTownHall.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/AbstractWindowTownHall.java index f91e5125c45..02a7dbb43aa 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/AbstractWindowTownHall.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/AbstractWindowTownHall.java @@ -7,6 +7,8 @@ import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.gui.AbstractWindowModuleBuilding; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; +import net.minecraft.sounds.SoundEvents; + import static com.minecolonies.api.util.constant.WindowConstants.*; /** @@ -33,11 +35,10 @@ public AbstractWindowTownHall(final BuildingTownHall.View townHall, final String registerButton(BUTTON_ACTIONS, () -> new WindowMainPage(townHall).open()); registerButton(BUTTON_INFOPAGE, () -> new WindowInfoPage(townHall).open()); - registerButton(BUTTON_SETTINGS, () -> new WindowSettingsPage(townHall).open()); registerButton(BUTTON_PERMISSIONS, () -> new WindowPermissionsPage(townHall).open()); registerButton(BUTTON_CITIZENS, () -> new WindowCitizenPage(townHall).open()); - registerButton(BUTTON_WORKORDER, () -> new WindowWorkOrderPage(townHall).open()); registerButton(BUTTON_STATS, () -> new WindowStatsPage(townHall).open()); + registerButton(BUTTON_ALLIANCE, () -> new WindowAlliancePage(townHall).open()); findPaneOfTypeByID(getWindowId() + "0", Image.class).hide(); findPaneOfTypeByID(getWindowId(), ButtonImage.class).hide(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowAlliancePage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowAlliancePage.java new file mode 100644 index 00000000000..3a6103dde9d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowAlliancePage.java @@ -0,0 +1,131 @@ +package com.minecolonies.coremod.client.gui.townhall; + +import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.controls.Button; +import com.ldtteam.blockui.controls.Text; +import com.ldtteam.blockui.views.ScrollingList; +import com.minecolonies.api.colony.CompactColonyReference; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.coremod.MineColonies; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; +import com.minecolonies.coremod.commands.ClickEventWithExecutable; +import com.minecolonies.coremod.network.messages.server.colony.TeleportToColonyMessage; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.WindowConstants.*; + +/** + * BOWindow for the town hall ally list. + */ +public class WindowAlliancePage extends AbstractWindowTownHall +{ + /** + * The ScrollingList of all feuds. + */ + private final ScrollingList feudsList; + /** + * The ScrollingList of all allies. + */ + private final ScrollingList alliesList; + + /** + * Constructor for the town hall window. + * + * @param building {@link BuildingTownHall.View}. + */ + public WindowAlliancePage(final BuildingTownHall.View building) + { + super(building, "layoutalliance.xml"); + + alliesList = findPaneOfTypeByID(LIST_ALLIES, ScrollingList.class); + feudsList = findPaneOfTypeByID(LIST_FEUDS, ScrollingList.class); + + registerButton(BUTTON_TP, this::teleportToColony); + fillAlliesAndFeudsList(); + } + + /** + * On Button click teleport to the colony.. + * + * @param button the clicked button. + */ + private void teleportToColony(@NotNull final Button button) + { + final int row = alliesList.getListElementIndexByPane(button); + final CompactColonyReference ally = building.getColony().getAllies().get(row); + + MessageUtils.format(DO_REALLY_WANNA_TP, ally.name) + .with(Style.EMPTY.withClickEvent(new ClickEventWithExecutable(ClickEvent.Action.RUN_COMMAND, + "", + () -> Network.getNetwork().sendToServer(new TeleportToColonyMessage(ally.dimension, ally.id))))) + .with(ChatFormatting.BOLD, ChatFormatting.GOLD) + .sendTo(Minecraft.getInstance().player); + this.close(); + } + + /** + * Fills the allies and feuds lists. + */ + private void fillAlliesAndFeudsList() + { + alliesList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return building.getColony().getAllies().size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final CompactColonyReference colonyReference = building.getColony().getAllies().get(index); + rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class).setText(Component.literal(colonyReference.name)); + final long distance = BlockPosUtil.getDistance2D(colonyReference.center, building.getPosition()); + rowPane.findPaneOfTypeByID(DIST_LABEL, Text.class).setText(Component.literal((int) distance + "b")); + final Button button = rowPane.findPaneOfTypeByID(BUTTON_TP, Button.class); + if (colonyReference.hasTownHall && (building.getBuildingLevel() < MineColonies.getConfig().getServer().minThLevelToTeleport.get() || !building.canPlayerUseTP())) + { + button.setText(Component.translatable(TH_TOO_LOW)); + button.disable(); + } + else + { + button.enable(); + } + } + }); + + feudsList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return building.getColony().getFeuds().size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final CompactColonyReference colonyReference = building.getColony().getFeuds().get(index); + rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class).setText(Component.literal(colonyReference.name)); + final long distance = BlockPosUtil.getDistance2D(colonyReference.center, building.getPosition()); + rowPane.findPaneOfTypeByID(DIST_LABEL, Text.class).setText(Component.literal(String.valueOf((int) distance))); + } + }); + } + + @Override + protected String getWindowId() + { + return BUTTON_ALLIANCE; + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowCitizenPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowCitizenPage.java index 7776f32e349..14fddd82ed7 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowCitizenPage.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowCitizenPage.java @@ -1,24 +1,32 @@ package com.minecolonies.coremod.client.gui.townhall; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.controls.*; import com.ldtteam.blockui.views.ScrollingList; +import com.ldtteam.blockui.views.View; import com.minecolonies.api.colony.ICitizen; import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.entity.citizen.Skill; import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.client.gui.citizen.CitizenWindowUtils; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; import com.minecolonies.coremod.network.messages.server.colony.citizen.RecallSingleCitizenMessage; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Pose; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.*; -import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_CITIZEN_UNEMPLOYED; +import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.coremod.client.gui.modules.WindowBuilderResModule.BLACK; /** * BOWindow for the town hall. @@ -36,6 +44,21 @@ public class WindowCitizenPage extends AbstractWindowTownHall @NotNull private final List citizens = new ArrayList<>(); + /** + * The selected citizen. + */ + private ICitizenDataView selectedCitizen; + + /** + * The selected citizen. + */ + private Entity selectedEntity; + + /** + * The filter for the resource list. + */ + private String filter = ""; + /** * Constructor for the town hall window. * @@ -47,9 +70,24 @@ public WindowCitizenPage(final BuildingTownHall.View townHall) updateCitizens(); fillCitizensList(); + if (!citizens.isEmpty()) + { + selectedCitizen = citizens.get(0); + } - registerButton(NAME_LABEL, this::fillCitizenInfo); + registerButton(NAME_LABEL, this::citizenSelected); registerButton(RECALL_ONE, this::recallOneClicked); + fillCitizenInfo(); + fillHappinessList(); + + window.findPaneOfTypeByID(SEARCH_INPUT, TextField.class).setHandler(input -> { + final String newFilter = input.getText(); + if (!newFilter.equals(filter)) + { + filter = newFilter; + updateCitizens(); + } + }); } /** @@ -58,31 +96,62 @@ public WindowCitizenPage(final BuildingTownHall.View townHall) private void updateCitizens() { citizens.clear(); - citizens.addAll(building.getColony().getCitizens().values()); + if (filter.isEmpty()) + { + citizens.addAll(building.getColony().getCitizens().values()); + } + else + { + citizens.addAll(building.getColony().getCitizens().values().stream().filter(cit -> cit.getName().toLowerCase(Locale.US).contains(filter.toLowerCase(Locale.US)) + || cit.getJobComponent().getString().toLowerCase(Locale.US).contains(filter.toLowerCase(Locale.US))).toList()); + } citizens.sort(COMPARE_BY_NAME); } /** - * Executed when fill citizen is clicked. - * + * On clicking a citizen name in the list. * @param button the clicked button. */ - private void fillCitizenInfo(final Button button) + private void citizenSelected(final Button button) { final ScrollingList citizenList = findPaneOfTypeByID(LIST_CITIZENS, ScrollingList.class); - for (final Pane pane : citizenList.getContainer().getChildren()) + selectedCitizen = citizens.get(citizenList.getListElementIndexByPane(button)); + + fillCitizenInfo(); + } + + /** + * Setup citizen info in UI. + */ + private void fillCitizenInfo() + { + if (selectedCitizen == null) + { + return; + } + + if (selectedCitizen.isFemale()) + { + findPaneOfTypeByID(WINDOW_ID_GENDER, Image.class).setImage(new ResourceLocation(FEMALE_SOURCE), false); + } + else { - pane.findPaneOfTypeByID(NAME_LABEL, ButtonImage.class).enable(); + findPaneOfTypeByID(WINDOW_ID_GENDER, Image.class).setImage(new ResourceLocation(MALE_SOURCE), false); + } + + findPaneOfTypeByID(JOB_LABEL, Text.class).setText(selectedCitizen.getJobComponent().withStyle(ChatFormatting.BOLD)); + + findPaneOfTypeByID(HEALTH_SHORT_LABEL, Text.class).setText(Component.literal((int)selectedCitizen.getHealth() + "/" + (int) selectedCitizen.getMaxHealth())); + findPaneOfTypeByID(HAPPINESS_SHORT_LABEL, Text.class).setText(Component.literal((int) selectedCitizen.getHappiness() + "/" + 10)); + findPaneOfTypeByID(SATURATION_SHORT_LABEL, Text.class).setText(Component.literal((int)selectedCitizen.getSaturation() + "/" + 20)); + + selectedEntity = Minecraft.getInstance().level.getEntity(selectedCitizen.getEntityId()); + if (selectedEntity != null && selectedEntity.getPose() == Pose.SLEEPING) + { + final EntityIcon entityIcon = findPaneOfTypeByID(ENTITY_ICON, EntityIcon.class); + entityIcon.setEntity(selectedEntity); + entityIcon.show(); } - final int row = citizenList.getListElementIndexByPane(button); - findPaneByID(CITIZEN_INFO).show(); - button.disable(); - final ICitizenDataView view = citizens.get(row); - CitizenWindowUtils.createHappinessBar(view, this); - CitizenWindowUtils.createSkillContent(view, this); - String jobKey = view.getJob().trim().isEmpty() ? COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_CITIZEN_UNEMPLOYED : view.getJob(); - findPaneOfTypeByID(JOB_LABEL, Text.class).setText(Component.translatable(jobKey).withStyle(ChatFormatting.BOLD)); - findPaneOfTypeByID(HIDDEN_CITIZEN_ID, Text.class).setText(Component.literal(String.valueOf(view.getId()))); } /** @@ -92,8 +161,11 @@ private void fillCitizenInfo(final Button button) */ private void recallOneClicked(final Button button) { - final int citizenid = Integer.parseInt(button.getParent().findPaneOfTypeByID(HIDDEN_CITIZEN_ID, Text.class).getTextAsString()); - Network.getNetwork().sendToServer(new RecallSingleCitizenMessage(building, citizenid)); + if (selectedCitizen == null) + { + return; + } + Network.getNetwork().sendToServer(new RecallSingleCitizenMessage(building, selectedCitizen.getId())); } /** @@ -114,7 +186,91 @@ public int getElementCount() public void updateElement(final int index, @NotNull final Pane rowPane) { final ICitizenDataView citizen = citizens.get(index); - rowPane.findPaneOfTypeByID(NAME_LABEL, ButtonImage.class).setText(Component.literal(citizen.getName())); + final Button button = rowPane.findPaneOfTypeByID(NAME_LABEL, ButtonImage.class); + button.setText(Component.literal(citizen.getName())); + + final AbstractTextBuilder.TextBuilder textBuilder = PaneBuilders.textBuilder(); + for (final Map.Entry> entry : citizen.getCitizenSkillHandler().getSkills().entrySet()) + { + final String skillName = entry.getKey().name().toLowerCase(Locale.US); + final int skillLevel = entry.getValue().getA(); + + textBuilder.append(Component.translatable("com.minecolonies.coremod.gui.citizen.skills." + skillName)); + textBuilder.append(Component.literal(": " + skillLevel + " ")); + } + PaneBuilders.tooltipBuilder().hoverPane(button).build().setText(textBuilder.build().getText()); + if (selectedCitizen == citizen) + { + button.disable(); + } + else + { + button.enable(); + } + } + }); + } + + + /** + * Fills the citizens list in the GUI. + */ + private void fillHappinessList() + { + final Map happinessMap = new HashMap<>(); + + for (final ICitizenDataView data : building.getColony().getCitizens().values()) + { + for (final String modifier : data.getHappinessHandler().getModifiers()) + { + happinessMap.put(modifier, happinessMap.getOrDefault(modifier, 0.0) + data.getHappinessHandler().getModifier(modifier).getFactor(null)); + } + } + + final DecimalFormat df = new DecimalFormat("#.#"); + df.setRoundingMode(RoundingMode.CEILING); + + final String roundedHappiness = df.format(building.getColony().getOverallHappiness()); + findPaneOfTypeByID("happinessTitle", Text.class).setText(Component.translatable("com.minecolonies.coremod.gui.townhall.currenthappiness", roundedHappiness)); + + final List> happinessList = new ArrayList<>(happinessMap.entrySet()); + + final ScrollingList happinessScrollingList = findPaneOfTypeByID(LIST_HAPPINESS, ScrollingList.class); + happinessScrollingList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return happinessList.size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final Map.Entry entry = happinessList.get(index); + final double value = entry.getValue() / building.getColony().getCitizenCount(); + final Image image = rowPane.findPaneOfTypeByID("icon", Image.class); + + final Text label = rowPane.findPaneOfTypeByID("name", Text.class); + label.setText(Component.translatable(PARTIAL_HAPPINESS_MODIFIER_NAME + entry.getKey())); + + if (value > 1.0) + { + image.setImage(new ResourceLocation(HAPPY_ICON), false); + } + else if (value == 1) + { + image.setImage(new ResourceLocation(SATISFIED_ICON), false); + } + else if (value > 0.75) + { + image.setImage(new ResourceLocation(UNSATISFIED_ICON), false); + } + else + { + image.setImage(new ResourceLocation(UNHAPPY_ICON), false); + } + PaneBuilders.tooltipBuilder().hoverPane(label).append(Component.translatable("com.minecolonies.coremod.gui.townhall.happiness.desc." + entry.getKey())).build(); } }); } @@ -124,6 +280,15 @@ public void onUpdate() { super.onUpdate(); updateCitizens(); + final EntityIcon entityIcon = findPaneOfTypeByID(ENTITY_ICON, EntityIcon.class); + if (selectedEntity != null && selectedEntity.getPose() == Pose.SLEEPING) + { + entityIcon.hide(); + } + else + { + entityIcon.show(); + } } @Override diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowInfoPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowInfoPage.java index 4198691f095..225240f7103 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowInfoPage.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowInfoPage.java @@ -5,33 +5,23 @@ import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.ScrollingList; -import com.minecolonies.api.MinecoloniesAPIProxy; -import com.minecolonies.api.colony.ICitizenDataView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.colonyEvents.descriptions.IBuildingEventDescription; import com.minecolonies.api.colony.colonyEvents.descriptions.ICitizenEventDescription; import com.minecolonies.api.colony.colonyEvents.descriptions.IColonyEventDescription; -import com.minecolonies.api.colony.permissions.PermissionEvent; +import com.minecolonies.api.colony.workorders.IWorkOrderView; import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.api.util.Tuple; -import com.minecolonies.api.util.constant.TranslationConstants; -import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.colony.buildings.moduleviews.WorkerBuildingModuleView; -import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; +import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingBuilderView; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; import com.minecolonies.coremod.colony.colonyEvents.citizenEvents.CitizenDiedEvent; -import com.minecolonies.coremod.network.messages.PermissionsMessage; +import com.minecolonies.coremod.network.messages.server.colony.WorkOrderChangeMessage; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import org.jetbrains.annotations.NotNull; -import java.math.RoundingMode; -import java.text.DecimalFormat; import java.util.*; +import java.util.stream.Collectors; -import static com.minecolonies.api.research.util.ResearchConstants.CITIZEN_CAP; -import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.api.util.constant.WindowConstants.*; /** @@ -40,14 +30,14 @@ public class WindowInfoPage extends AbstractWindowTownHall { /** - * The ScrollingList of the events. + * List of workOrders. */ - private ScrollingList eventList; + private final List workOrders = new ArrayList<>(); /** - * Whether the event list should display permission events, or colony events. + * The ScrollingList of the events. */ - private boolean permissionEvents; + private ScrollingList eventList; /** * Constructor for the town hall window. @@ -57,9 +47,11 @@ public class WindowInfoPage extends AbstractWindowTownHall public WindowInfoPage(final BuildingTownHall.View building) { super(building, "layoutinfo.xml"); + updateWorkOrders(); - registerButton(BUTTON_PERMISSION_EVENTS, this::permissionEventsClicked); - registerButton(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, this::addPlayerToColonyClicked); + registerButton(BUTTON_UP, this::updatePriority); + registerButton(BUTTON_DOWN, this::updatePriority); + registerButton(BUTTON_DELETE, this::deleteWorkOrder); } /** @@ -69,227 +61,185 @@ public WindowInfoPage(final BuildingTownHall.View building) public void onOpened() { super.onOpened(); - createAndSetStatistics(); + fillWorkOrderList(); fillEventsList(); } - /** - * Creates several statistics and sets them in the building GUI. - */ - private void createAndSetStatistics() - { - final DecimalFormat df = new DecimalFormat("#.#"); - df.setRoundingMode(RoundingMode.CEILING); - final String roundedHappiness = df.format(building.getColony().getOverallHappiness()); - - findPaneOfTypeByID(HAPPINESS_LABEL, Text.class).setText(Component.literal(roundedHappiness)); - final int citizensSize = building.getColony().getCitizens().size(); - final int citizensCap; - if(MinecoloniesAPIProxy.getInstance().getGlobalResearchTree().hasResearchEffect(CITIZEN_CAP)) - { - citizensCap = (int) (Math.min(MineColonies.getConfig().getServer().maxCitizenPerColony.get(), - 25 + this.building.getColony().getResearchManager().getResearchEffects().getEffectStrength(CITIZEN_CAP))); - } - else - { - citizensCap = MineColonies.getConfig().getServer().maxCitizenPerColony.get(); - } - - final Text totalCitizenLabel = findPaneOfTypeByID(TOTAL_CITIZENS_LABEL, Text.class); - totalCitizenLabel.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_TOTALCITIZENS_COUNT, - citizensSize, - Math.max(citizensSize, building.getColony().getCitizenCountLimit()))); - List hoverText = new ArrayList<>(); - if(citizensSize < (citizensCap * 0.9) && citizensSize < (building.getColony().getCitizenCountLimit() * 0.9)) - { - totalCitizenLabel.setColors(DARKGREEN); - } - else if(citizensSize < citizensCap) - { - hoverText.add(Component.translatable(WARNING_POPULATION_NEEDS_HOUSING, this.building.getColony().getName())); - totalCitizenLabel.setColors(ORANGE); - } - else + private void fillEventsList() + { + eventList = findPaneOfTypeByID(EVENTS_LIST, ScrollingList.class); + eventList.setDataProvider(new ScrollingList.DataProvider() { - if(citizensCap < MineColonies.getConfig().getServer().maxCitizenPerColony.get()) - { - hoverText.add(Component.translatable(WARNING_POPULATION_RESEARCH_LIMITED, this.building.getColony().getName())); - } - else + @Override + public int getElementCount() { - hoverText.add(Component.translatable( WARNING_POPULATION_CONFIG_LIMITED, this.building.getColony().getName())); + return building.getColonyEvents().size(); } - totalCitizenLabel.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_TOTALCITIZENS_COUNT, citizensSize, citizensCap)); - totalCitizenLabel.setColors(RED); - } - PaneBuilders.tooltipBuilder().hoverPane(totalCitizenLabel).build().setText(hoverText); - int children = 0; - final Map> jobMaxCountMap = new HashMap<>(); - for (@NotNull final IBuildingView building : building.getColony().getBuildings()) - { - if (building instanceof AbstractBuildingView) + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) { - for (final WorkerBuildingModuleView module : building.getModuleViews(WorkerBuildingModuleView.class)) - { - int max = module.getMaxInhabitants(); - int workers = module.getAssignedCitizens().size(); - - final String jobName = module.getJobDisplayName().toLowerCase(Locale.ENGLISH); + final Text nameLabel = rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class); + final Text actionLabel = rowPane.findPaneOfTypeByID(ACTION_LABEL, Text.class); - final Tuple tuple = jobMaxCountMap.getOrDefault(jobName, new Tuple<>(0, 0)); - jobMaxCountMap.put(jobName, new Tuple<>(tuple.getA() + workers, tuple.getB() + max)); + final IColonyEventDescription event = building.getColonyEvents().get(index); + if (event instanceof CitizenDiedEvent) + { + actionLabel.setText(Component.literal(((CitizenDiedEvent) event).getDeathCause())); + } + else + { + actionLabel.setText(Component.literal(event.getName())); + } + if (event instanceof ICitizenEventDescription) + { + nameLabel.setText(Component.literal(((ICitizenEventDescription) event).getCitizenName())); + } + else if (event instanceof IBuildingEventDescription) + { + IBuildingEventDescription buildEvent = (IBuildingEventDescription) event; + nameLabel.setText(MessageUtils.format(buildEvent.getBuildingName()).append(" " + buildEvent.getLevel()).create()); } + rowPane.findPaneOfTypeByID(POS_LABEL, Text.class) + .setText(Component.literal(event.getEventPos().getX() + " " + event.getEventPos().getY() + " " + event.getEventPos().getZ())); + rowPane.findPaneOfTypeByID(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, Button.class).hide(); } - } - + }); + } - //calculate number of children - int unemployed = 0; - for (ICitizenDataView iCitizenDataView : building.getColony().getCitizens().values()) - { - if (iCitizenDataView.isChild()) - { - children++; - } - else if (iCitizenDataView.getJobView() == null) - { - unemployed++; - } - } - final int childCount = children; - final int unemployedCount = unemployed; + /** + * Clears and resets all work orders. + */ + private void updateWorkOrders() + { + workOrders.clear(); + workOrders.addAll(building.getColony().getWorkOrders().stream().filter(wo -> wo.shouldShowIn(building)).collect(Collectors.toList())); + sortWorkOrders(); + } - final ScrollingList list = findPaneOfTypeByID("citizen-stats", ScrollingList.class); - if (list == null) - { - return; - } + /** + * Re-sorts the WorkOrders list according to the priorities inside the list. + */ + private void sortWorkOrders() + { + workOrders.sort(Comparator.comparing(IWorkOrderView::getPriority, Comparator.reverseOrder())); + } - final int maxJobs = jobMaxCountMap.size(); - final List>> theList = new ArrayList<>(jobMaxCountMap.entrySet()); - theList.sort(Map.Entry.comparingByKey()); + /** + * On Button click update the priority. + * + * @param button the clicked button. + */ + private void updatePriority(@NotNull final Button button) + { + final int id = Integer.parseInt(button.getParent().findPaneOfTypeByID("hiddenId", Text.class).getTextAsString()); + final String buttonLabel = button.getID(); - list.setDataProvider(new ScrollingList.DataProvider() + for (int i = 0; i < workOrders.size(); i++) { - @Override - public int getElementCount() - { - return maxJobs + 2; - } - - @Override - public void updateElement(final int index, @NotNull final Pane rowPane) + final IWorkOrderView workOrder = workOrders.get(i); + if (workOrder.getId() == id) { - final Text label = rowPane.findPaneOfTypeByID(CITIZENS_AMOUNT_LABEL, Text.class); - // preJobsHeaders = number of all unemployed citizens - - if (index < theList.size()) + if (buttonLabel.equals(BUTTON_UP) && i > 0) { - final Map.Entry> entry = theList.get(index); - final Component job = Component.translatable(entry.getKey()); - final Component numberOfWorkers = Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_EACH, job, entry.getValue().getA(), entry.getValue().getB()); - label.setText(numberOfWorkers); + workOrder.setPriority(workOrders.get(i - 1).getPriority() + 1); + Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, false, workOrder.getPriority())); } - else + else if (buttonLabel.equals(BUTTON_DOWN) && i <= workOrders.size()) { - if (index == maxJobs + 1) - { - label.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_UNEMPLOYED, unemployedCount)); - } - else - { - label.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_CHILDS, childCount)); - } + workOrder.setPriority(workOrders.get(i + 1).getPriority() - 1); + Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, false, workOrder.getPriority())); } + + sortWorkOrders(); + window.findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class).refreshElementPanes(); + return; } - }); + } } - private void fillEventsList() + /** + * On Button click remove the workOrder. + * + * @param button the clicked button. + */ + private void deleteWorkOrder(@NotNull final Button button) { - eventList = findPaneOfTypeByID(EVENTS_LIST, ScrollingList.class); - eventList.setDataProvider(new ScrollingList.DataProvider() + final int id = Integer.parseInt(button.getParent().findPaneOfTypeByID("hiddenId", Text.class).getTextAsString()); + for (int i = 0; i < workOrders.size(); i++) + { + if (workOrders.get(i).getId() == id) + { + workOrders.remove(i); + break; + } + } + Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, true, 0)); + window.findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class).refreshElementPanes(); + } + + /** + * Fills the workOrder list inside the townhall GUI. + */ + private void fillWorkOrderList() + { + final ScrollingList workOrderList = findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class); + workOrderList.enable(); + workOrderList.show(); + + //Creates a dataProvider for the unemployed citizenList. + workOrderList.setDataProvider(new ScrollingList.DataProvider() { @Override public int getElementCount() { - return permissionEvents ? building.getPermissionEvents().size() : building.getColonyEvents().size(); + return workOrders.size(); } @Override public void updateElement(final int index, @NotNull final Pane rowPane) { - final Text nameLabel = rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class); - final Text actionLabel = rowPane.findPaneOfTypeByID(ACTION_LABEL, Text.class); - if (permissionEvents) - { - final List permissionEvents = building.getPermissionEvents(); - Collections.reverse(permissionEvents); - final PermissionEvent event = permissionEvents.get(index); + final IWorkOrderView workOrder = workOrders.get(index); + String claimingCitizen = ""; - nameLabel.setText(Component.literal(event.getName() + (event.getId() == null ? " " : ""))); - rowPane.findPaneOfTypeByID(POS_LABEL, Text.class).setText(Component.literal(event.getPosition().getX() + " " + event.getPosition().getY() + " " + event.getPosition().getZ())); + final int numElements = getElementCount(); - rowPane.findPaneOfTypeByID(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, Button.class).setVisible(event.getId() != null); - - actionLabel.setText(Component.translatable(KEY_TO_PERMISSIONS + event.getAction().toString().toLowerCase(Locale.US))); + if (index == 0) + { + rowPane.findPaneOfTypeByID(BUTTON_DOWN, Button.class).setVisible(numElements != 1); + rowPane.findPaneOfTypeByID(BUTTON_UP, Button.class).show(); } - else + else if (index == numElements - 1) { - final List colonyEvents = building.getColonyEvents(); - Collections.reverse(colonyEvents); - final IColonyEventDescription event = colonyEvents.get(index); - if (event instanceof CitizenDiedEvent) - { - actionLabel.setText(Component.literal(((CitizenDiedEvent) event).getDeathCause())); - } - else - { - actionLabel.setText(Component.literal(event.getName())); - } - if (event instanceof ICitizenEventDescription) - { - nameLabel.setText(Component.literal(((ICitizenEventDescription) event).getCitizenName())); - } - else if (event instanceof IBuildingEventDescription) + rowPane.findPaneOfTypeByID(BUTTON_DOWN, Button.class).hide(); + } + + //Searches citizen of id x + for (@NotNull final IBuildingView buildingView : building.getColony().getBuildings()) + { + if (buildingView.getPosition().equals(workOrder.getClaimedBy()) && buildingView instanceof AbstractBuildingBuilderView) { - IBuildingEventDescription buildEvent = (IBuildingEventDescription) event; - nameLabel.setText(MessageUtils.format(buildEvent.getBuildingName()).append(" " + buildEvent.getLevel()).create()); + claimingCitizen = ((AbstractBuildingBuilderView) buildingView).getWorkerName(); + break; } - rowPane.findPaneOfTypeByID(POS_LABEL, Text.class).setText(Component.literal(event.getEventPos().getX() + " " + event.getEventPos().getY() + " " + event.getEventPos().getZ())); - rowPane.findPaneOfTypeByID(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, Button.class).hide(); } + + Text workOrderTextPanel = rowPane.findPaneOfTypeByID(WORK_LABEL, Text.class); + PaneBuilders.tooltipBuilder().append(workOrder.getDisplayName()).hoverPane(workOrderTextPanel).build(); + workOrderTextPanel.setText(workOrder.getDisplayName()); + rowPane.findPaneOfTypeByID(ASSIGNEE_LABEL, Text.class).setText(Component.literal(claimingCitizen)); + rowPane.findPaneOfTypeByID(HIDDEN_WORKORDER_ID, Text.class).setText(Component.literal(Integer.toString(workOrder.getId()))); } }); } - /** - * Action performed when remove player button is clicked. - * - * @param button Button that holds the user clicked on. - */ - private void addPlayerToColonyClicked(@NotNull final Button button) - { - final int row = eventList.getListElementIndexByPane(button); - if (row >= 0 && row < building.getPermissionEvents().size()) - { - final PermissionEvent user = building.getPermissionEvents().get(row); - Network.getNetwork().sendToServer(new PermissionsMessage.AddPlayerOrFakePlayer(building.getColony(), user.getName(), user.getId())); - } - } - - /** - * Switching between permission and colony events. - * - * @param button the clicked button. - */ - public void permissionEventsClicked(@NotNull final Button button) + @Override + public void onUpdate() { - permissionEvents = !permissionEvents; - button.setText(Component.translatable(permissionEvents ? TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_COLONYEVENTS : TranslationConstants.COM_MINECOLONIES_CIREMOD_GUI_TOWNHALL_PERMISSIONEVENTS)); + super.onUpdate(); + updateWorkOrders(); } @Override diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowMainPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowMainPage.java index 31c1152a6c6..486d7afec43 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowMainPage.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowMainPage.java @@ -1,41 +1,88 @@ package com.minecolonies.coremod.client.gui.townhall; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.controls.*; -import com.ldtteam.blockui.views.ScrollingList; -import com.minecolonies.api.colony.CompactColonyReference; -import com.minecolonies.api.util.BlockPosUtil; -import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.coremod.MineColonies; +import com.ldtteam.blockui.views.DropDownList; +import com.ldtteam.structurize.client.gui.WindowSwitchPack; +import com.ldtteam.structurize.storage.StructurePacks; import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.client.gui.WindowBannerPicker; +import com.minecolonies.coremod.client.gui.map.WindowColonyMap; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; -import com.minecolonies.coremod.commands.ClickEventWithExecutable; -import com.minecolonies.coremod.network.messages.server.colony.TeleportToColonyMessage; +import com.minecolonies.coremod.network.messages.server.colony.*; +import net.minecraft.Util; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ConfirmLinkScreen; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.*; +import net.minecraft.network.chat.contents.TranslatableContents; import org.jetbrains.annotations.NotNull; +import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; import static com.minecolonies.api.util.constant.Constants.TICKS_FOURTY_MIN; -import static com.minecolonies.api.util.constant.TranslationConstants.DO_REALLY_WANNA_TP; -import static com.minecolonies.api.util.constant.TranslationConstants.TH_TOO_LOW; +import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.ON_STRING; import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.coremod.event.TextureReloadListener.TEXTURE_PACKS; import net.minecraft.ChatFormatting; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; + /** * BOWindow for the town hall. */ public class WindowMainPage extends AbstractWindowTownHall { + + /** + * Is the special feature unlocked. + */ + private static AtomicBoolean isFeatureUnlocked = new AtomicBoolean(false); + + /** + * Drop down list for style. + */ + private DropDownList colorDropDownList; + + /** + * Drop down list for style. + */ + private DropDownList textureDropDownList; + /** - * The ScrollingList of all allies. + * Drop down list for name style. */ - private final ScrollingList alliesList; + private DropDownList nameStyleDropDownList; /** - * The ScrollingList of all feuds. + * The initial texture index. */ - private final ScrollingList feudsList; + private int initialTextureIndex; + + /** + * The initial texture index. + */ + private int initialNamePackIndex; + + + + /** + * Label for the colony name. + */ + private final Text title; + /** * Constructor for the town hall window. @@ -45,102 +92,386 @@ public class WindowMainPage extends AbstractWindowTownHall public WindowMainPage(final BuildingTownHall.View building) { super(building, "layoutactions.xml"); + initDropDowns(); - alliesList = findPaneOfTypeByID(LIST_ALLIES, ScrollingList.class); - feudsList = findPaneOfTypeByID(LIST_FEUDS, ScrollingList.class); + title = findPaneOfTypeByID(LABEL_BUILDING_NAME, Text.class); registerButton(BUTTON_CHANGE_SPEC, this::doNothing); registerButton(BUTTON_RENAME, this::renameClicked); registerButton(BUTTON_MERCENARY, this::mercenaryClicked); + registerButton(BUTTON_TOWNHALLMAP, this::mapButtonClicked); + registerButton(BUTTON_PATREON, this::patreonClicked); + registerButton(BUTTON_TOGGLE_JOB, this::toggleHiring); + registerButton(BUTTON_TOGGLE_HOUSING, this::toggleHousing); + registerButton(BUTTON_TOGGLE_MOVE_IN, this::toggleMoveIn); + registerButton(BUTTON_TOGGLE_PRINT_PROGRESS, this::togglePrintProgress); + + + registerButton(BUTTON_COLONY_SWITCH_STYLE, this::switchPack); + + findPaneOfTypeByID(BUTTON_COLONY_SWITCH_STYLE, ButtonImage.class).setText(Component.literal(building.getColony().getStructurePack())); + registerButton(BUTTON_BANNER_PICKER, this::openBannerPicker); + registerButton(BUTTON_RESET_TEXTURE, this::resetTextureStyle); - registerButton(BUTTON_TP, this::teleportToColony); + this.colorDropDownList.setSelectedIndex(building.getColony().getTeamColonyColor().ordinal()); + this.textureDropDownList.setSelectedIndex(TEXTURE_PACKS.indexOf(building.getColony().getTextureStyleId())); + this.initialTextureIndex = textureDropDownList.getSelectedIndex(); + + this.nameStyleDropDownList.setSelectedIndex(building.getColony().getNameFileIds().indexOf(building.getColony().getNameStyle())); + this.initialNamePackIndex = nameStyleDropDownList.getSelectedIndex(); + + checkFeatureUnlock(); + + if (building.getColony().isManualHiring()) + { + findPaneOfTypeByID(BUTTON_TOGGLE_JOB, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); + } + + if (!building.getColony().isPrintingProgress()) + { + findPaneOfTypeByID(BUTTON_TOGGLE_PRINT_PROGRESS, Button.class).setText(Component.translatable(OFF_STRING)); + } + + if (building.getColony().isManualHousing()) + { + findPaneOfTypeByID(BUTTON_TOGGLE_HOUSING, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); + } + + if (building.getColony().canMoveIn()) + { + findPaneOfTypeByID(BUTTON_TOGGLE_MOVE_IN, Button.class).setText(Component.translatable(ON_STRING)); + } } /** - * On Button click teleport to the colony.. + * Toggles the allocation of a certain job. Manual or automatic. * - * @param button the clicked button. + * @param button the pressed button. */ - private void teleportToColony(@NotNull final Button button) + private void toggleHiring(@NotNull final Button button) { - final int row = alliesList.getListElementIndexByPane(button); - final CompactColonyReference ally = building.getColony().getAllies().get(row); + String key = button.getText().getContents() instanceof TranslatableContents contents ? contents.getKey() : button.getTextAsString(); - MessageUtils.format(DO_REALLY_WANNA_TP, ally.name) - .with(Style.EMPTY.withClickEvent(new ClickEventWithExecutable(ClickEvent.Action.RUN_COMMAND, - "", - () -> Network.getNetwork().sendToServer(new TeleportToColonyMessage(ally.dimension, ally.id))))) - .with(ChatFormatting.BOLD, ChatFormatting.GOLD) - .sendTo(Minecraft.getInstance().player); - this.close(); + final boolean toggle; + if (key.equals(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)) + { + button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); + toggle = true; + } + else + { + button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); + toggle = false; + } + Network.getNetwork().sendToServer(new ToggleJobMessage(this.building.getColony(), toggle)); } /** - * Executed when WindowTownHall is opened. Does tasks like setting buttons. + * Toggles the allocation of a certain job. Manual or automatic. + * + * @param button the pressed button. */ - @Override - public void onOpened() + private void toggleHousing(@NotNull final Button button) { - super.onOpened(); - fillAlliesAndFeudsList(); + String key = button.getText().getContents() instanceof TranslatableContents contents ? contents.getKey() : button.getTextAsString(); - if (building.getColony().getMercenaryUseTime() != 0 - && building.getColony().getWorld().getGameTime() - building.getColony().getMercenaryUseTime() < TICKS_FOURTY_MIN) + final boolean toggle; + if (key.equals(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)) { - findPaneOfTypeByID(BUTTON_MERCENARY, Button.class).disable(); + button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); + toggle = true; + } + else + { + button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); + toggle = false; + } + Network.getNetwork().sendToServer(new ToggleHousingMessage(this.building.getColony(), toggle)); + } + + /** + * Toggles citizens moving in. Off means citizens stop moving in. + * + * @param button the pressed button. + */ + private void toggleMoveIn(@NotNull final Button button) + { + String key = button.getText().getContents() instanceof TranslatableContents contents ? contents.getKey() : button.getTextAsString(); + + final boolean toggle; + if (key.equals(OFF_STRING)) + { + button.setText(Component.translatable(ON_STRING)); + toggle = true; + } + else + { + button.setText(Component.translatable(OFF_STRING)); + toggle = false; + } + Network.getNetwork().sendToServer(new ToggleMoveInMessage(this.building.getColony(), toggle)); + } + + /** + * Toggles printing progress. + * + * @param button the button to toggle. + */ + private void togglePrintProgress(@NotNull final Button button) + { + String key = button.getText().getContents() instanceof TranslatableContents contents ? contents.getKey() : button.getTextAsString(); + + if (key.equals(OFF_STRING)) + { + button.setText(Component.translatable(ON_STRING)); + } + else + { + button.setText(Component.translatable(OFF_STRING)); } + Network.getNetwork().sendToServer(new ToggleHelpMessage(this.building.getColony())); + } + + /** + * Switch the structure style pack. + */ + private void switchPack() + { + new WindowSwitchPack(() -> { + building.getColony().setStructurePack(StructurePacks.selectedPack.getName()); + Network.getNetwork().sendToServer(new ColonyStructureStyleMessage(building.getColony(), StructurePacks.selectedPack.getName())); + return new WindowMainPage((BuildingTownHall.View) this.building); + }).open(); } /** - * Fills the allies and feuds lists. + * Initialise the previous/next and drop down list for style. */ - private void fillAlliesAndFeudsList() + private void initDropDowns() { - alliesList.setDataProvider(new ScrollingList.DataProvider() + findPaneOfTypeByID(DROPDOWN_COLOR_ID, DropDownList.class).setEnabled(enabled); + + colorDropDownList = findPaneOfTypeByID(DROPDOWN_COLOR_ID, DropDownList.class); + colorDropDownList.setHandler(this::onDropDownListChanged); + + final List textColors = Arrays.stream(ChatFormatting.values()).filter(ChatFormatting::isColor).toList(); + + colorDropDownList.setDataProvider(new DropDownList.DataProvider() { @Override public int getElementCount() { - return building.getColony().getAllies().size(); + return textColors.size(); } @Override - public void updateElement(final int index, @NotNull final Pane rowPane) + public String getLabel(final int index) { - final CompactColonyReference colonyReference = building.getColony().getAllies().get(index); - rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class).setText(Component.literal(colonyReference.name)); - final long distance = BlockPosUtil.getDistance2D(colonyReference.center, building.getPosition()); - rowPane.findPaneOfTypeByID(DIST_LABEL, Text.class).setText(Component.literal((int) distance + "b")); - final Button button = rowPane.findPaneOfTypeByID(BUTTON_TP, Button.class); - if (colonyReference.hasTownHall && (building.getBuildingLevel() < MineColonies.getConfig().getServer().minThLevelToTeleport.get() || !building.canPlayerUseTP())) + if (index >= 0 && index < textColors.size()) { - button.setText(Component.translatable(TH_TOO_LOW)); - button.disable(); - } - else - { - button.enable(); + final String colorName = textColors.get(index).getName().replace("_", " "); + return colorName.substring(0, 1).toUpperCase(Locale.US) + colorName.substring(1); } + return ""; } }); - feudsList.setDataProvider(new ScrollingList.DataProvider() + textureDropDownList = findPaneOfTypeByID(DROPDOWN_TEXT_ID, DropDownList.class); + textureDropDownList.setHandler(this::toggleTexture); + textureDropDownList.setDataProvider(new DropDownList.DataProvider() { @Override public int getElementCount() { - return building.getColony().getFeuds().size(); + return TEXTURE_PACKS.size(); } @Override - public void updateElement(final int index, @NotNull final Pane rowPane) + public String getLabel(final int index) { - final CompactColonyReference colonyReference = building.getColony().getFeuds().get(index); - rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class).setText(Component.literal(colonyReference.name)); - final long distance = BlockPosUtil.getDistance2D(colonyReference.center, building.getPosition()); - rowPane.findPaneOfTypeByID(DIST_LABEL, Text.class).setText(Component.literal(String.valueOf((int) distance))); + return TEXTURE_PACKS.get(index); } }); + + nameStyleDropDownList = findPaneOfTypeByID(DROPDOWN_NAME_ID, DropDownList.class); + nameStyleDropDownList.setHandler(this::toggleNameFile); + nameStyleDropDownList.setDataProvider(new DropDownList.DataProvider() + { + @Override + public int getElementCount() + { + return building.getColony().getNameFileIds().size(); + } + + @Override + public String getLabel(final int index) + { + return building.getColony().getNameFileIds().get(index); + } + }); + } + + /** + * Toggle the dropdownlist with the selected index to change the texture of the colonists. + * + * @param dropDownList the toggle dropdown list. + */ + private void toggleTexture(final DropDownList dropDownList) + { + if (dropDownList.getSelectedIndex() != initialTextureIndex) + { + Network.getNetwork().sendToServer(new ColonyTextureStyleMessage(building.getColony(), TEXTURE_PACKS.get(dropDownList.getSelectedIndex()))); + } + } + + /** + * Toggle the dropdownlist with the selected index to change the texture of the colonists. + * + * @param dropDownList the toggle dropdown list. + */ + private void toggleNameFile(final DropDownList dropDownList) + { + if (dropDownList.getSelectedIndex() != initialNamePackIndex) + { + Network.getNetwork().sendToServer(new ColonyNameStyleMessage(building.getColony(), building.getColony().getNameFileIds().get(dropDownList.getSelectedIndex()))); + } + } + + /** + * Called when the dropdownList changed. + * + * @param dropDownList the list. + */ + private void onDropDownListChanged(final DropDownList dropDownList) + { + Network.getNetwork().sendToServer(new TeamColonyColorChangeMessage(dropDownList.getSelectedIndex(), building)); + } + + /** + * Opens the banner picker window. BOWindow does not use blockui, so is started manually. + * + * @param button the trigger button + */ + private void openBannerPicker(@NotNull final Button button) + { + Screen window = new WindowBannerPicker(building.getColony(), this, isFeatureUnlocked); + Minecraft.getInstance().setScreen(window); + } + + /** + * Reset the texture style. + */ + private void resetTextureStyle() + { + Network.getNetwork().sendToServer(new ColonyTextureStyleMessage(building.getColony(), TEXTURE_PACKS.get(0))); + } + + @Override + public void onUpdate() + { + super.onUpdate(); + final Pane textPane = findPaneByID(DROPDOWN_TEXT_ID); + final Pane namePane = findPaneByID(DROPDOWN_NAME_ID); + final Pane resetButton = findPaneByID(BUTTON_RESET_TEXTURE); + + if (isFeatureUnlocked.get()) + { + textPane.enable(); + namePane.enable(); + textPane.show(); + resetButton.hide(); + } + else + { + textPane.disable(); + namePane.disable(); + + if (!building.getColony().getTextureStyleId().equals("default")) + { + resetButton.show(); + textPane.hide(); + } + else + { + textPane.show(); + } + + PaneBuilders.tooltipBuilder().hoverPane(textPane).append(Component.translatable("com.minecolonies.core.townhall.patreon.textures")) + .paragraphBreak() + .appendNL(Component.empty()) + .appendNL(Component.translatable("com.minecolonies.core.townhall.patreon")) + .paragraphBreak() + .build(); + + PaneBuilders.tooltipBuilder().hoverPane(namePane) + .append(Component.translatable("com.minecolonies.core.townhall.patreon.names")).paragraphBreak() + .appendNL(Component.empty()) + .appendNL(Component.translatable("com.minecolonies.core.townhall.patreon")).paragraphBreak() + .build(); + } + } + + /** + * Check if the feature is unlocked through the patreon API. + */ + public void checkFeatureUnlock() + { + final String player = Minecraft.getInstance().player.getStringUUID(); + new Thread(() -> { + try + { + final SSLSocketFactory sslsocketfactory = HttpsURLConnection.getDefaultSSLSocketFactory(); + final URL url = new URL("https://auth.minecolonies.com/api/minecraft/" + player + "/features"); + final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + + conn.setSSLSocketFactory(sslsocketfactory); + + final InputStream responseBody = conn.getInputStream(); + final BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody)); + + String inputLine; + final StringBuilder response = new StringBuilder(); + + while ((inputLine = reader.readLine()) != null) + { + response.append(inputLine); + } + reader.close(); + isFeatureUnlocked.set(Boolean.parseBoolean(response.toString())); + } + catch (IOException e) + { + e.printStackTrace(); + } + }).start(); + } + + /** + * On Patreon button clicked. Open website link to patreon. + */ + private void patreonClicked() + { + Minecraft.getInstance().setScreen(new ConfirmLinkScreen((check) -> { + if (check) { + Util.getPlatform().openUri("https://www.patreon.com/Minecolonies"); + } + + Minecraft.getInstance().setScreen(this.screen); + }, "https://www.patreon.com/Minecolonies", true)); + } + + @Override + public void onOpened() + { + super.onOpened(); + + title.setText(Component.literal(building.getColony().getName())); + + if (building.getColony().getMercenaryUseTime() != 0 + && building.getColony().getWorld().getGameTime() - building.getColony().getMercenaryUseTime() < TICKS_FOURTY_MIN) + { + findPaneOfTypeByID(BUTTON_MERCENARY, Button.class).disable(); + } } /** @@ -161,6 +492,15 @@ private void mercenaryClicked() window.open(); } + /** + * Opens the map on button clicked + */ + private void mapButtonClicked() + { + @NotNull final WindowColonyMap window = new WindowColonyMap(building); + window.open(); + } + @Override protected String getWindowId() { diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowPermissionsPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowPermissionsPage.java index 91071257ece..5c2bc99e6dd 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowPermissionsPage.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowPermissionsPage.java @@ -1,27 +1,33 @@ package com.minecolonies.coremod.client.gui.townhall; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; +import com.ldtteam.blockui.controls.AbstractTextBuilder; import com.ldtteam.blockui.controls.Button; import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.controls.TextField; import com.ldtteam.blockui.views.DropDownList; import com.ldtteam.blockui.views.ScrollingList; -import com.ldtteam.blockui.views.SwitchView; -import com.minecolonies.api.colony.permissions.Action; -import com.minecolonies.api.colony.permissions.ColonyPlayer; -import com.minecolonies.api.colony.permissions.IPermissions; -import com.minecolonies.api.colony.permissions.Rank; +import com.minecolonies.api.colony.CompactColonyReference; +import com.minecolonies.api.colony.permissions.*; import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.api.util.SoundUtils; +import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; +import com.minecolonies.coremod.commands.ClickEventWithExecutable; import com.minecolonies.coremod.network.messages.PermissionsMessage; import com.minecolonies.coremod.network.messages.server.colony.ChangeFreeToInteractBlockMessage; +import com.minecolonies.coremod.network.messages.server.colony.TeleportToColonyMessage; +import net.minecraft.ChatFormatting; import net.minecraft.ResourceLocationException; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -86,6 +92,11 @@ public class WindowPermissionsPage extends AbstractWindowTownHall */ private Map rankTypes = new HashMap<>(); + /** + * The ScrollingList of the events. + */ + private ScrollingList eventList; + /** * Constructor for the town hall window. * @@ -117,8 +128,25 @@ public WindowPermissionsPage(final BuildingTownHall.View building) registerButton(BUTTON_ADD_RANK, this::addRank); registerButton(TOWNHALL_RANK_BUTTON, this::onRankButtonClicked); registerButton(BUTTON_REMOVE_RANK, this::onRemoveRankButtonClicked); - registerButton(TOWNHALL_PERM_MODE_TOGGLE, this::togglePermMode); registerButton(TOWNHALL_BUTTON_SUBSCRIBER, this::setSubscriber); + registerButton(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, this::addPlayerToColonyClicked); + + fillEventsList(); + } + + /** + * Action performed when remove player button is clicked. + * + * @param button Button that holds the user clicked on. + */ + private void addPlayerToColonyClicked(@NotNull final Button button) + { + final int row = eventList.getListElementIndexByPane(button); + if (row >= 0 && row < building.getPermissionEvents().size()) + { + final PermissionEvent user = building.getPermissionEvents().get(row); + Network.getNetwork().sendToServer(new PermissionsMessage.AddPlayerOrFakePlayer(building.getColony(), user.getName(), user.getId())); + } } /** @@ -146,40 +174,6 @@ private void changeRankMode(DropDownList dropdown) Network.getNetwork().sendToServer(new PermissionsMessage.EditRankType(building.getColony(), actionsRank, dropdown.getSelectedIndex())); } - /** - * Switch the view on the rank view (between permissions and settings) - * - * @param button the button clicked - */ - private void togglePermMode(Button button) - { - SwitchView permSwitch = findPaneOfTypeByID(TOWNHALL_PERM_MANAGEMENT, SwitchView.class); - permSwitch.setView(permSwitch.getCurrentView() != null && permSwitch.getCurrentView().getID().equals(TOWNHALL_PERM_LIST) ? TOWNHALL_PERM_SETTINGS : TOWNHALL_PERM_LIST); - if (permSwitch.getCurrentView().getID().equals(TOWNHALL_PERM_SETTINGS)) - { - DropDownList dropdown = findPaneOfTypeByID(TOWNHALL_RANK_TYPE_PICKER, DropDownList.class); - dropdown.setDataProvider(new DropDownList.DataProvider() - { - @Override - public int getElementCount() - { - return rankTypes.size(); - } - - @Override - public String getLabel(final int i) - { - return Component.translatable(rankTypes.get(i)).getString(); - } - }); - dropdown.setHandler(this::changeRankMode); - dropdown.setSelectedIndex(actionsRank.isColonyManager() ? 0 : (actionsRank.isHostile() ? 1 : 2)); - findPaneOfTypeByID(TOWNHALL_BUTTON_SUBSCRIBER, Button.class).setText(Component.translatable(actionsRank.isSubscriber() - ? COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_ON - : COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_OFF)); - } - } - /** * Read the text input with the name of the rank to be added * If the chosen name is valid, send a message to the server, hide the error label and empty the input @@ -187,17 +181,16 @@ public String getLabel(final int i) */ private void addRank() { - final Text label = findPaneOfTypeByID(TOWNHALL_ADD_RANK_ERROR, Text.class); final TextField input = findPaneOfTypeByID(INPUT_ADDRANK_NAME, TextField.class); if (isValidRankname(input.getText())) { Network.getNetwork().sendToServer(new PermissionsMessage.AddRank(building.getColony(), input.getText())); input.setText(""); - label.hide(); + SoundUtils.playSuccessSound(Minecraft.getInstance().player, Minecraft.getInstance().player.blockPosition()); } else { - label.show(); + SoundUtils.playErrorSound(Minecraft.getInstance().player, Minecraft.getInstance().player.blockPosition()); } } @@ -266,18 +259,40 @@ public void onOpened() fillPermissionList(); LocalPlayer player = Minecraft.getInstance().player; - Text label = findPaneOfTypeByID(TOWNHALL_PERMISSION_ERROR, Text.class); - Button button = findPaneOfTypeByID(BUTTON_ADD_PLAYER, Button.class); + + final Button addPlayerButton = findPaneOfTypeByID(BUTTON_ADD_PLAYER, Button.class); + final TextField playerNameField = findPaneOfTypeByID(INPUT_ADDPLAYER_NAME, TextField.class); + final TextField rankNameField = findPaneOfTypeByID(INPUT_ADDRANK_NAME, TextField.class); + final Button addRankButton = findPaneOfTypeByID(BUTTON_ADD_RANK, Button.class); + + if (building.getColony().getPermissions().hasPermission(player, Action.EDIT_PERMISSIONS)) { - label.hide(); - button.setEnabled(true); + addPlayerButton.setEnabled(true); + playerNameField.setEnabled(true); + rankNameField.setEnabled(true); + addRankButton.setEnabled(true); } else { - label.show(); - button.setEnabled(false); + AbstractTextBuilder.TooltipBuilder hoverText = PaneBuilders.tooltipBuilder().hoverPane(playerNameField); + hoverText.append(Component.translatable("com.minecolonies.coremod.gui.townhall.player_permission_error")).paragraphBreak(); + hoverText.build(); + + AbstractTextBuilder.TooltipBuilder hoverText2 = PaneBuilders.tooltipBuilder().hoverPane(rankNameField); + hoverText2.append(Component.translatable("com.minecolonies.core.gui.townhall.rank_permission_error")).paragraphBreak(); + hoverText2.build(); + + rankNameField.setEnabled(false); + addPlayerButton.setEnabled(false); + playerNameField.setEnabled(false); + addRankButton.setEnabled(false); } + + findPaneOfTypeByID(TOWNHALL_RANK_TYPE_PICKER, DropDownList.class).setSelectedIndex(actionsRank.isColonyManager() ? 0 : (actionsRank.isHostile() ? 1 : 2)); + findPaneOfTypeByID(TOWNHALL_BUTTON_SUBSCRIBER, Button.class).setText(Component.translatable(actionsRank.isSubscriber() + ? COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_ON + : COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_OFF)); } /** @@ -320,6 +335,23 @@ public void updateElement(final int i, final Pane pane) pane.findPaneOfTypeByID("rankId", Text.class).setText(Component.literal(Integer.toString(rank.getId()))); } }); + + DropDownList dropdown = findPaneOfTypeByID(TOWNHALL_RANK_TYPE_PICKER, DropDownList.class); + dropdown.setDataProvider(new DropDownList.DataProvider() + { + @Override + public int getElementCount() + { + return rankTypes.size(); + } + + @Override + public String getLabel(final int i) + { + return Component.translatable(rankTypes.get(i)).getString(); + } + }); + dropdown.setHandler(this::changeRankMode); } /** @@ -336,10 +368,45 @@ private void onRankButtonClicked(@NotNull final Button button) actionsRank = rank; button.setEnabled(false); findPaneOfTypeByID(BUTTON_REMOVE_RANK, Button.class).setEnabled(!actionsRank.isInitial()); - findPaneOfTypeByID(TOWNHALL_PERM_MANAGEMENT, SwitchView.class).setView(TOWNHALL_PERM_LIST); + + findPaneOfTypeByID(TOWNHALL_RANK_TYPE_PICKER, DropDownList.class).setSelectedIndex(actionsRank.isColonyManager() ? 0 : (actionsRank.isHostile() ? 1 : 2)); + findPaneOfTypeByID(TOWNHALL_BUTTON_SUBSCRIBER, Button.class).setText(Component.translatable(actionsRank.isSubscriber() + ? COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_ON + : COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_OFF)); } } + private void fillEventsList() + { + eventList = findPaneOfTypeByID(EVENTS_LIST, ScrollingList.class); + eventList.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() + { + return building.getPermissionEvents().size(); + } + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) + { + final Text nameLabel = rowPane.findPaneOfTypeByID(NAME_LABEL, Text.class); + final Text actionLabel = rowPane.findPaneOfTypeByID(ACTION_LABEL, Text.class); + + final List permissionEvents = building.getPermissionEvents(); + Collections.reverse(permissionEvents); + final PermissionEvent event = permissionEvents.get(index); + + nameLabel.setText(Component.literal(event.getName() + (event.getId() == null ? " " : ""))); + rowPane.findPaneOfTypeByID(POS_LABEL, Text.class).setText(Component.literal(event.getPosition().getX() + " " + event.getPosition().getY() + " " + event.getPosition().getZ())); + + rowPane.findPaneOfTypeByID(BUTTON_ADD_PLAYER_OR_FAKEPLAYER, Button.class).setVisible(event.getId() != null); + + actionLabel.setText(Component.translatable(KEY_TO_PERMISSIONS + event.getAction().toString().toLowerCase(Locale.US))); + } + }); + } + private void removeBlock(final Button button) { final int row = freeBlocksList.getListElementIndexByPane(button); @@ -446,7 +513,7 @@ private void trigger(@NotNull final Button button) final IPermissions permissions = building.getColony().getPermissions(); final Player playerEntity = Minecraft.getInstance().player; - String key = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); + String key = button.getText().getContents() instanceof TranslatableContents contents ? contents.getKey() : button.getTextAsString(); final boolean enable = !COM_MINECOLONIES_COREMOD_GUI_WORKERHUTS_RETRIEVE_ON.equals(key); button.disable(); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowSettingsPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowSettingsPage.java deleted file mode 100644 index f92903d3abb..00000000000 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowSettingsPage.java +++ /dev/null @@ -1,431 +0,0 @@ -package com.minecolonies.coremod.client.gui.townhall; - -import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.PaneBuilders; -import com.ldtteam.blockui.controls.AbstractTextBuilder; -import com.ldtteam.blockui.controls.Button; -import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.views.DropDownList; -import com.ldtteam.structurize.client.gui.WindowSwitchPack; -import com.ldtteam.structurize.storage.StructurePacks; -import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.client.gui.WindowBannerPicker; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; -import com.minecolonies.coremod.network.messages.server.colony.*; -import com.minecolonies.coremod.network.messages.server.colony.building.BuildingSetStyleMessage; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.contents.TranslatableContents; -import org.jetbrains.annotations.NotNull; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -import static com.minecolonies.api.util.constant.TranslationConstants.*; -import static com.minecolonies.api.util.constant.WindowConstants.*; -import static com.minecolonies.coremod.event.TextureReloadListener.TEXTURE_PACKS; - -/** - * BOWindow for the town hall. - */ -public class WindowSettingsPage extends AbstractWindowTownHall -{ - /** - * Is the special feature unlocked. - */ - private static AtomicBoolean isFeatureUnlocked = new AtomicBoolean(false); - - /** - * Drop down list for style. - */ - private DropDownList colorDropDownList; - - /** - * Drop down list for style. - */ - private DropDownList textureDropDownList; - - /** - * Drop down list for name style. - */ - private DropDownList nameStyleDropDownList; - - /** - * The initial texture index. - */ - private int initialTextureIndex; - - /** - * The initial texture index. - */ - private int initialNamePackIndex; - - /** - * Constructor for the town hall window. - * - * @param townHall {@link BuildingTownHall.View}. - */ - public WindowSettingsPage(final BuildingTownHall.View townHall) - { - super(townHall, "layoutsettings.xml"); - initDropDowns(); - - registerButton(BUTTON_TOGGLE_JOB, this::toggleHiring); - registerButton(BUTTON_TOGGLE_HOUSING, this::toggleHousing); - registerButton(BUTTON_TOGGLE_MOVE_IN, this::toggleMoveIn); - registerButton(BUTTON_TOGGLE_PRINT_PROGRESS, this::togglePrintProgress); - registerButton(BUTTON_COLONY_SWITCH_STYLE, this::switchPack); - - findPaneOfTypeByID(BUTTON_COLONY_SWITCH_STYLE, ButtonImage.class).setText(Component.literal(townHall.getColony().getStructurePack())); - registerButton("bannerPicker", this::openBannerPicker); - - this.colorDropDownList.setSelectedIndex(townHall.getColony().getTeamColonyColor().ordinal()); - this.textureDropDownList.setSelectedIndex(TEXTURE_PACKS.indexOf(townHall.getColony().getTextureStyleId())); - this.initialTextureIndex = textureDropDownList.getSelectedIndex(); - - this.nameStyleDropDownList.setSelectedIndex(townHall.getColony().getNameFileIds().indexOf(townHall.getColony().getNameStyle())); - this.initialNamePackIndex = nameStyleDropDownList.getSelectedIndex(); - - checkFeatureUnlock(); - } - - /** - * Switch the structure style pack. - */ - private void switchPack() - { - new WindowSwitchPack(() -> { - building.getColony().setStructurePack(StructurePacks.selectedPack.getName()); - Network.getNetwork().sendToServer(new BuildingSetStyleMessage(building, StructurePacks.selectedPack.getName())); - return new WindowSettingsPage((BuildingTownHall.View) this.building); - }).open(); - } - - /** - * Initialise the previous/next and drop down list for style. - */ - private void initDropDowns() - { - registerButton(BUTTON_PREVIOUS_COLOR_ID, this::previousStyle); - registerButton(BUTTON_NEXT_COLOR_ID, this::nextStyle); - findPaneOfTypeByID(DROPDOWN_COLOR_ID, DropDownList.class).setEnabled(enabled); - - colorDropDownList = findPaneOfTypeByID(DROPDOWN_COLOR_ID, DropDownList.class); - colorDropDownList.setHandler(this::onDropDownListChanged); - - final List textColors = Arrays.stream(ChatFormatting.values()).filter(ChatFormatting::isColor).collect(Collectors.toList()); - - colorDropDownList.setDataProvider(new DropDownList.DataProvider() - { - @Override - public int getElementCount() - { - return textColors.size(); - } - - @Override - public String getLabel(final int index) - { - if (index >= 0 && index < textColors.size()) - { - return textColors.get(index).getName(); - } - return ""; - } - }); - - textureDropDownList = findPaneOfTypeByID(DROPDOWN_TEXT_ID, DropDownList.class); - textureDropDownList.setHandler(this::toggleTexture); - textureDropDownList.setDataProvider(new DropDownList.DataProvider() - { - @Override - public int getElementCount() - { - return TEXTURE_PACKS.size(); - } - - @Override - public String getLabel(final int index) - { - return TEXTURE_PACKS.get(index); - } - }); - - nameStyleDropDownList = findPaneOfTypeByID(DROPDOWN_NAME_ID, DropDownList.class); - nameStyleDropDownList.setHandler(this::toggleNameFile); - nameStyleDropDownList.setDataProvider(new DropDownList.DataProvider() - { - @Override - public int getElementCount() - { - return building.getColony().getNameFileIds().size(); - } - - @Override - public String getLabel(final int index) - { - return building.getColony().getNameFileIds().get(index); - } - }); - } - - /** - * Toggle the dropdownlist with the selected index to change the texture of the colonists. - * - * @param dropDownList the toggle dropdown list. - */ - private void toggleTexture(final DropDownList dropDownList) - { - if (dropDownList.getSelectedIndex() != initialTextureIndex) - { - Network.getNetwork().sendToServer(new ColonyTextureStyleMessage(building.getColony(), TEXTURE_PACKS.get(dropDownList.getSelectedIndex()))); - } - } - - /** - * Toggle the dropdownlist with the selected index to change the texture of the colonists. - * - * @param dropDownList the toggle dropdown list. - */ - private void toggleNameFile(final DropDownList dropDownList) - { - if (dropDownList.getSelectedIndex() != initialNamePackIndex) - { - Network.getNetwork().sendToServer(new ColonyNameStyleMessage(building.getColony(), building.getColony().getNameFileIds().get(dropDownList.getSelectedIndex()))); - } - } - - /** - * Called when the dropdownList changed. - * - * @param dropDownList the list. - */ - private void onDropDownListChanged(final DropDownList dropDownList) - { - Network.getNetwork().sendToServer(new TeamColonyColorChangeMessage(dropDownList.getSelectedIndex(), building)); - } - - /** - * Change to the next style. - */ - private void nextStyle() - { - colorDropDownList.selectNext(); - } - - /** - * Change to the previous style. - */ - private void previousStyle() - { - colorDropDownList.selectPrevious(); - } - - /** - * Executed when WindowTownHall is opened. Does tasks like setting buttons. - */ - @Override - public void onOpened() - { - super.onOpened(); - - if (building.getColony().isManualHiring()) - { - findPaneOfTypeByID(BUTTON_TOGGLE_JOB, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - } - - if (!building.getColony().isPrintingProgress()) - { - findPaneOfTypeByID(BUTTON_TOGGLE_PRINT_PROGRESS, Button.class).setText(Component.translatable(OFF_STRING)); - } - - if (building.getColony().isManualHousing()) - { - findPaneOfTypeByID(BUTTON_TOGGLE_HOUSING, Button.class).setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - } - - if (building.getColony().canMoveIn()) - { - findPaneOfTypeByID(BUTTON_TOGGLE_MOVE_IN, Button.class).setText(Component.translatable(ON_STRING)); - } - } - - /** - * Toggles the allocation of a certain job. Manual or automatic. - * - * @param button the pressed button. - */ - private void toggleHiring(@NotNull final Button button) - { - String key = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); - - final boolean toggle; - if (key.equals(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)) - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - toggle = true; - } - else - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); - toggle = false; - } - Network.getNetwork().sendToServer(new ToggleJobMessage(this.building.getColony(), toggle)); - } - - /** - * Toggles the allocation of a certain job. Manual or automatic. - * - * @param button the pressed button. - */ - private void toggleHousing(@NotNull final Button button) - { - String key = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); - - final boolean toggle; - if (key.equals(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)) - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_ON)); - toggle = true; - } - else - { - button.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_HIRING_OFF)); - toggle = false; - } - Network.getNetwork().sendToServer(new ToggleHousingMessage(this.building.getColony(), toggle)); - } - - /** - * Toggles citizens moving in. Off means citizens stop moving in. - * - * @param button the pressed button. - */ - private void toggleMoveIn(@NotNull final Button button) - { - String key = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); - - final boolean toggle; - if (key.equals(OFF_STRING)) - { - button.setText(Component.translatable(ON_STRING)); - toggle = true; - } - else - { - button.setText(Component.translatable(OFF_STRING)); - toggle = false; - } - Network.getNetwork().sendToServer(new ToggleMoveInMessage(this.building.getColony(), toggle)); - } - - /** - * Toggles printing progress. - * - * @param button the button to toggle. - */ - private void togglePrintProgress(@NotNull final Button button) - { - String key = button.getText().getContents() instanceof TranslatableContents ? ((TranslatableContents) button.getText().getContents()).getKey() : button.getTextAsString(); - - if (key.equals(OFF_STRING)) - { - button.setText(Component.translatable(ON_STRING)); - } - else - { - button.setText(Component.translatable(OFF_STRING)); - } - Network.getNetwork().sendToServer(new ToggleHelpMessage(this.building.getColony())); - } - - /** - * Opens the banner picker window. BOWindow does not use blockui, so is started manually. - * - * @param button the trigger button - */ - private void openBannerPicker(@NotNull final Button button) - { - Screen window = new WindowBannerPicker(building.getColony(), this); - Minecraft.getInstance().execute(() -> Minecraft.getInstance().setScreen(window)); - } - - @Override - protected String getWindowId() - { - return BUTTON_SETTINGS; - } - - @Override - public void onUpdate() - { - super.onUpdate(); - final Pane textPane = findPaneByID(DROPDOWN_TEXT_ID); - final Pane namePane = findPaneByID(DROPDOWN_NAME_ID); - - if (isFeatureUnlocked.get()) - { - textPane.enable(); - namePane.enable(); - } - else - { - textPane.disable(); - namePane.disable(); - - AbstractTextBuilder.TooltipBuilder hoverText = PaneBuilders.tooltipBuilder().hoverPane(textPane); - hoverText.append(Component.translatable("com.minecolonies.core.townhall.patreon")).paragraphBreak(); - hoverText.build(); - - AbstractTextBuilder.TooltipBuilder hoverText2 = PaneBuilders.tooltipBuilder().hoverPane(namePane); - hoverText2.append(Component.translatable("com.minecolonies.core.townhall.patreon")).paragraphBreak(); - hoverText2.build(); - } - } - - /** - * Check if the feature is unlocked through the patreon API. - */ - public void checkFeatureUnlock() - { - final String player = Minecraft.getInstance().player.getStringUUID(); - new Thread(() -> { - try - { - final SSLSocketFactory sslsocketfactory = HttpsURLConnection.getDefaultSSLSocketFactory(); - final URL url = new URL("https://auth.minecolonies.com/api/minecraft/" + player + "/features"); - final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - - conn.setSSLSocketFactory(sslsocketfactory); - - final InputStream responseBody = conn.getInputStream(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody)); - - String inputLine; - final StringBuilder response = new StringBuilder(); - - while ((inputLine = reader.readLine()) != null) - { - response.append(inputLine); - } - reader.close(); - isFeatureUnlocked.set(Boolean.parseBoolean(response.toString())); - } - catch (IOException e) - { - e.printStackTrace(); - } - }).start(); - } -} diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowStatsPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowStatsPage.java index e82b31455c4..8c307c04692 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowStatsPage.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowStatsPage.java @@ -5,19 +5,26 @@ import com.ldtteam.blockui.controls.*; import com.ldtteam.blockui.views.DropDownList; import com.ldtteam.blockui.views.ScrollingList; -import com.ldtteam.blockui.views.View; +import com.minecolonies.api.MinecoloniesAPIProxy; import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.util.Tuple; +import com.minecolonies.api.util.constant.CitizenConstants; +import com.minecolonies.coremod.MineColonies; +import com.minecolonies.coremod.colony.buildings.moduleviews.CombinedHiringLimitModuleView; +import com.minecolonies.coremod.colony.buildings.moduleviews.WorkerBuildingModuleView; +import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.chat.MutableComponent; import org.jetbrains.annotations.NotNull; import java.util.*; -import static com.minecolonies.api.util.constant.TranslationConstants.PARTIAL_HAPPINESS_MODIFIER_NAME; -import static com.minecolonies.api.util.constant.TranslationConstants.PARTIAL_STATS_MODIFIER_NAME; +import static com.minecolonies.api.research.util.ResearchConstants.CITIZEN_CAP; +import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_CHILDS; import static com.minecolonies.api.util.constant.WindowConstants.*; -import static com.minecolonies.coremod.client.gui.modules.WindowBuilderResModule.BLACK; /** * BOWindow for the town hall. @@ -64,70 +71,154 @@ public WindowStatsPage(final BuildingTownHall.View townHall) public void onOpened() { super.onOpened(); - updateHappiness(); updateStats(); + createAndSetStatistics(); } /** - * Update the display for the happiness. + * + * Creates several statistics and sets them in the building GUI. */ - private void updateHappiness() + private void createAndSetStatistics() { - final Map happinessMap = new HashMap<>(); + final int citizensSize = building.getColony().getCitizens().size(); + final int citizensCap; + + if (MinecoloniesAPIProxy.getInstance().getGlobalResearchTree().hasResearchEffect(CITIZEN_CAP)) + { + final int max = Math.max(CitizenConstants.CITIZEN_LIMIT_DEFAULT, (int) this.building.getColony().getResearchManager().getResearchEffects().getEffectStrength(CITIZEN_CAP)); + citizensCap = Math.min(max, MineColonies.getConfig().getServer().maxCitizenPerColony.get()); + } + else + { + citizensCap = MineColonies.getConfig().getServer().maxCitizenPerColony.get(); + } - for (final ICitizenDataView data : building.getColony().getCitizens().values()) + final Text totalCitizenLabel = findPaneOfTypeByID(TOTAL_CITIZENS_LABEL, Text.class); + totalCitizenLabel.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_TOTALCITIZENS_COUNT, + citizensSize, + Math.max(citizensSize, building.getColony().getCitizenCountLimit()))); + List hoverText = new ArrayList<>(); + if(citizensSize < (citizensCap * 0.9) && citizensSize < (building.getColony().getCitizenCountLimit() * 0.9)) { - for (final String modifier : data.getHappinessHandler().getModifiers()) + totalCitizenLabel.setColors(DARKGREEN); + } + else if(citizensSize < citizensCap) + { + hoverText.add(Component.translatable(WARNING_POPULATION_NEEDS_HOUSING, this.building.getColony().getName())); + totalCitizenLabel.setColors(ORANGE); + } + else + { + if(citizensCap < MineColonies.getConfig().getServer().maxCitizenPerColony.get()) + { + hoverText.add(Component.translatable(WARNING_POPULATION_RESEARCH_LIMITED, this.building.getColony().getName())); + } + else { - happinessMap.put(modifier, happinessMap.getOrDefault(modifier, 0.0) + data.getHappinessHandler().getModifier(modifier).getFactor()); + hoverText.add(Component.translatable( WARNING_POPULATION_CONFIG_LIMITED, this.building.getColony().getName())); } + totalCitizenLabel.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_TOTALCITIZENS_COUNT, citizensSize, citizensCap)); + totalCitizenLabel.setColors(RED); } + PaneBuilders.tooltipBuilder().hoverPane(totalCitizenLabel).build().setText(hoverText); - final View pane = findPaneOfTypeByID("happinesspage", View.class); - final Text titleLabel = new Text(); - titleLabel.setSize(136, 11); - titleLabel.setPosition(25, 42); - titleLabel.setColors(BLACK); - titleLabel.setText(Component.translatable("com.minecolonies.coremod.gui.townhall.currenthappiness")); - pane.addChild(titleLabel); + int children = 0; + final Map> jobMaxCountMap = new HashMap<>(); + for (@NotNull final IBuildingView building : building.getColony().getBuildings()) + { + if (building instanceof AbstractBuildingView) + { + for (final WorkerBuildingModuleView module : building.getModuleViews(WorkerBuildingModuleView.class)) + { + int alreadyAssigned = -1; + if (module instanceof CombinedHiringLimitModuleView) + { + alreadyAssigned = 0; + for (final WorkerBuildingModuleView combinedModule : building.getModuleViews(WorkerBuildingModuleView.class)) + { + alreadyAssigned += combinedModule.getAssignedCitizens().size(); + } + } + int max = module.getMaxInhabitants(); + if (alreadyAssigned != -1) + { + max -= alreadyAssigned; + max += module.getAssignedCitizens().size(); + } + int workers = module.getAssignedCitizens().size(); + final String jobName = module.getJobDisplayName().toLowerCase(Locale.ENGLISH); - int yPos = 60; - for (final Map.Entry entry : happinessMap.entrySet()) + final Tuple tuple = jobMaxCountMap.getOrDefault(jobName, new Tuple<>(0, 0)); + jobMaxCountMap.put(jobName, new Tuple<>(tuple.getA() + workers, tuple.getB() + max)); + } + } + } + + //calculate number of children + int unemployed = 0; + for (ICitizenDataView iCitizenDataView : building.getColony().getCitizens().values()) { - final double value = entry.getValue() / building.getColony().getCitizenCount(); - final Image image = new Image(); - image.setSize(11, 11); - image.setPosition(0, yPos); - - final Text label = new Text(); - label.setSize(136, 11); - label.setPosition(25, yPos); - label.setColors(BLACK); - label.setText(Component.translatable(PARTIAL_HAPPINESS_MODIFIER_NAME + entry.getKey())); - - if (value > 1.0) + if (iCitizenDataView.isChild()) { - image.setImage(new ResourceLocation(GREEN_ICON), false); + children++; } - else if (value == 1) + else if (iCitizenDataView.getJobView() == null) { - image.setImage(new ResourceLocation(BLUE_ICON), false); + unemployed++; } - else if (value > 0.75) + } + + final int childCount = children; + final int unemployedCount = unemployed; + + final ScrollingList list = findPaneOfTypeByID("citizen-stats", ScrollingList.class); + if (list == null) + { + return; + } + + final int maxJobs = jobMaxCountMap.size(); + final List>> theList = new ArrayList<>(jobMaxCountMap.entrySet()); + theList.sort(Map.Entry.comparingByKey()); + + list.setDataProvider(new ScrollingList.DataProvider() + { + @Override + public int getElementCount() { - image.setImage(new ResourceLocation(YELLOW_ICON), false); + return maxJobs + 2; } - else + + @Override + public void updateElement(final int index, @NotNull final Pane rowPane) { - image.setImage(new ResourceLocation(RED_ICON), false); - } - pane.addChild(image); - pane.addChild(label); - PaneBuilders.tooltipBuilder().hoverPane(label).append(Component.translatable("com.minecolonies.coremod.gui.townhall.happiness.desc." + entry.getKey())).build(); + final Text label = rowPane.findPaneOfTypeByID(CITIZENS_AMOUNT_LABEL, Text.class); + // preJobsHeaders = number of all unemployed citizens - yPos += 12; - } + if (index < theList.size()) + { + final Map.Entry> entry = theList.get(index); + final String jobString = Component.translatable(entry.getKey()).getString(); + final String formattedJobString = jobString.substring(0, 1).toUpperCase(Locale.US) + jobString.substring(1); + + final Component numberOfWorkers = Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_EACH, formattedJobString, entry.getValue().getA(), entry.getValue().getB()); + label.setText(numberOfWorkers); + } + else + { + if (index == maxJobs + 1) + { + label.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_UNEMPLOYED, unemployedCount)); + } + else + { + label.setText(Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_POPULATION_CHILDS, childCount)); + } + } + } + }); } /** diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowTownHallMercenary.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowTownHallMercenary.java index 711ea838bae..dc64a51e453 100644 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowTownHallMercenary.java +++ b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowTownHallMercenary.java @@ -5,8 +5,10 @@ import com.ldtteam.blockui.controls.Image; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.util.constant.ColonyConstants; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.colony.CitizenData; import com.minecolonies.coremod.colony.ColonyView; import com.minecolonies.coremod.network.messages.server.colony.HireMercenaryMessage; import net.minecraft.client.Minecraft; @@ -48,10 +50,11 @@ public WindowTownHallMercenary(final IColonyView c) int startX = 160; final int startY = 40; - for (int i = 0; i < amountOfMercenaries; i++) + for (int i = 0; i < Math.min(amountOfMercenaries, 9); i++) { + final Image newImage = new Image(); - newImage.setImage(new ResourceLocation("minecolonies:textures/entity_icon/citizenmale3.png"), false); + newImage.setImage(new ResourceLocation("minecolonies:textures/entity_icon/citizen/default/citizenmale3" + CitizenData.SUFFIXES.get(ColonyConstants.rand.nextInt(CitizenData.SUFFIXES.size())) + ".png"), false); newImage.setSize(10, 10); newImage.setPosition(startX, startY); this.addChild(newImage); diff --git a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowWorkOrderPage.java b/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowWorkOrderPage.java deleted file mode 100644 index 90a384adbd9..00000000000 --- a/src/main/java/com/minecolonies/coremod/client/gui/townhall/WindowWorkOrderPage.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.minecolonies.coremod.client.gui.townhall; - -import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.PaneBuilders; -import com.ldtteam.blockui.controls.Button; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.ScrollingList; -import com.minecolonies.api.colony.buildings.views.IBuildingView; -import com.minecolonies.api.colony.workorders.IWorkOrderView; -import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingBuilderView; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; -import com.minecolonies.coremod.network.messages.server.colony.WorkOrderChangeMessage; -import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -import static com.minecolonies.api.util.constant.WindowConstants.*; - -/** - * BOWindow for the town hall. - */ -public class WindowWorkOrderPage extends AbstractWindowTownHall -{ - /** - * List of workOrders. - */ - private final List workOrders = new ArrayList<>(); - - /** - * Constructor for the town hall window. - * - * @param townHall {@link BuildingTownHall.View}. - */ - public WindowWorkOrderPage(final BuildingTownHall.View townHall) - { - super(townHall, "layoutworkorder.xml"); - updateWorkOrders(); - - registerButton(BUTTON_UP, this::updatePriority); - registerButton(BUTTON_DOWN, this::updatePriority); - registerButton(BUTTON_DELETE, this::deleteWorkOrder); - } - - /** - * Executed when WindowTownHall is opened. Does tasks like setting buttons. - */ - @Override - public void onOpened() - { - super.onOpened(); - fillWorkOrderList(); - } - - /** - * Clears and resets all work orders. - */ - private void updateWorkOrders() - { - workOrders.clear(); - workOrders.addAll(building.getColony().getWorkOrders().stream().filter(wo -> wo.shouldShowIn(building)).collect(Collectors.toList())); - sortWorkOrders(); - } - - /** - * Re-sorts the WorkOrders list according to the priorities inside the list. - */ - private void sortWorkOrders() - { - workOrders.sort(Comparator.comparing(IWorkOrderView::getPriority, Comparator.reverseOrder())); - } - - /** - * On Button click update the priority. - * - * @param button the clicked button. - */ - private void updatePriority(@NotNull final Button button) - { - final int id = Integer.parseInt(button.getParent().findPaneOfTypeByID("hiddenId", Text.class).getTextAsString()); - final String buttonLabel = button.getID(); - - for (int i = 0; i < workOrders.size(); i++) - { - final IWorkOrderView workOrder = workOrders.get(i); - if (workOrder.getId() == id) - { - if (buttonLabel.equals(BUTTON_UP) && i > 0) - { - workOrder.setPriority(workOrders.get(i - 1).getPriority() + 1); - Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, false, workOrder.getPriority())); - } - else if (buttonLabel.equals(BUTTON_DOWN) && i <= workOrders.size()) - { - workOrder.setPriority(workOrders.get(i + 1).getPriority() - 1); - Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, false, workOrder.getPriority())); - } - - sortWorkOrders(); - window.findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class).refreshElementPanes(); - return; - } - } - } - - /** - * On Button click remove the workOrder. - * - * @param button the clicked button. - */ - private void deleteWorkOrder(@NotNull final Button button) - { - final int id = Integer.parseInt(button.getParent().findPaneOfTypeByID("hiddenId", Text.class).getTextAsString()); - for (int i = 0; i < workOrders.size(); i++) - { - if (workOrders.get(i).getId() == id) - { - workOrders.remove(i); - break; - } - } - Network.getNetwork().sendToServer(new WorkOrderChangeMessage(this.building, id, true, 0)); - window.findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class).refreshElementPanes(); - } - - /** - * Fills the workOrder list inside the townhall GUI. - */ - private void fillWorkOrderList() - { - final ScrollingList workOrderList = findPaneOfTypeByID(LIST_WORKORDER, ScrollingList.class); - workOrderList.enable(); - workOrderList.show(); - - //Creates a dataProvider for the unemployed citizenList. - workOrderList.setDataProvider(new ScrollingList.DataProvider() - { - @Override - public int getElementCount() - { - return workOrders.size(); - } - - @Override - public void updateElement(final int index, @NotNull final Pane rowPane) - { - final IWorkOrderView workOrder = workOrders.get(index); - String claimingCitizen = ""; - - final int numElements = getElementCount(); - - if (index == 0) - { - if (numElements == 1) - { - rowPane.findPaneOfTypeByID(BUTTON_DOWN, Button.class).hide(); - } - else - { - rowPane.findPaneOfTypeByID(BUTTON_DOWN, Button.class).show(); - } - rowPane.findPaneOfTypeByID(BUTTON_UP, Button.class).hide(); - } - else if (index == numElements - 1) - { - rowPane.findPaneOfTypeByID(BUTTON_DOWN, Button.class).hide(); - } - - //Searches citizen of id x - for (@NotNull final IBuildingView buildingView : building.getColony().getBuildings()) - { - if (buildingView.getPosition().equals(workOrder.getClaimedBy()) && buildingView instanceof AbstractBuildingBuilderView) - { - claimingCitizen = ((AbstractBuildingBuilderView) buildingView).getWorkerName(); - break; - } - } - - Text workOrderTextPanel = rowPane.findPaneOfTypeByID(WORK_LABEL, Text.class); - PaneBuilders.tooltipBuilder().append(workOrder.getDisplayName()).hoverPane(workOrderTextPanel).build(); - workOrderTextPanel.setText(workOrder.getDisplayName()); - rowPane.findPaneOfTypeByID(ASSIGNEE_LABEL, Text.class).setText(Component.literal(claimingCitizen)); - rowPane.findPaneOfTypeByID(HIDDEN_WORKORDER_ID, Text.class).setText(Component.literal(Integer.toString(workOrder.getId()))); - } - }); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - updateWorkOrders(); - } - - @Override - protected String getWindowId() - { - return BUTTON_WORKORDER; - } -} diff --git a/src/main/java/com/minecolonies/coremod/client/render/CitizenArmorLayer.java b/src/main/java/com/minecolonies/coremod/client/render/CitizenArmorLayer.java new file mode 100644 index 00000000000..d486ec38ef3 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/CitizenArmorLayer.java @@ -0,0 +1,105 @@ +package com.minecolonies.coremod.client.render; + +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +@OnlyIn(Dist.CLIENT) +public class CitizenArmorLayer, A extends HumanoidModel> extends HumanoidArmorLayer +{ + public CitizenArmorLayer(RenderLayerParent parentLayer, A innerModel, A outerModel) + { + super(parentLayer, innerModel, outerModel); + } + + @Override + public void render( + @NotNull PoseStack poseStack, + @NotNull MultiBufferSource bufferSource, + int light, + @NotNull T citizen, + float ignore_1, + float ignore_2, + float ignore_3, + float ignore_4, + float ignore_5, + float ignore_6) + { + if (citizen.getCitizenDataView() == null) + { + return; + } + + if (citizen.getCitizenDataView().getInventory() == null) + { + return; + } + this.renderArmorPiece(poseStack, bufferSource, citizen, EquipmentSlot.CHEST, light, this.getArmorModel(EquipmentSlot.CHEST)); + this.renderArmorPiece(poseStack, bufferSource, citizen, EquipmentSlot.LEGS, light, this.getArmorModel(EquipmentSlot.LEGS)); + this.renderArmorPiece(poseStack, bufferSource, citizen, EquipmentSlot.FEET, light, this.getArmorModel(EquipmentSlot.FEET)); + this.renderArmorPiece(poseStack, bufferSource, citizen, EquipmentSlot.HEAD, light, this.getArmorModel(EquipmentSlot.HEAD)); + } + + private void renderArmorPiece(PoseStack poseStack, MultiBufferSource bufferSource, T citizen, EquipmentSlot equipmentSlot, int light, A armor) + { + ItemStack itemstack = citizen.getCitizenDataView().getInventory().getArmorInSlot(equipmentSlot); + if (itemstack.isEmpty()) + { + itemstack = citizen.getItemBySlot(equipmentSlot); + } + Item armorItem = itemstack.getItem(); + if (armorItem instanceof ArmorItem armoritem) + { + if (armoritem.getSlot() == equipmentSlot) + { + this.getParentModel().copyPropertiesTo(armor); + this.setPartVisibility(armor, equipmentSlot); + net.minecraft.client.model.Model model = getArmorModelHook(citizen, itemstack, equipmentSlot, armor); + boolean flag = this.usesInnerModel(equipmentSlot); + if (armoritem instanceof net.minecraft.world.item.DyeableLeatherItem) + { + int i = ((net.minecraft.world.item.DyeableLeatherItem) armoritem).getColor(itemstack); + float f = (float) (i >> 16 & 255) / 255.0F; + float f1 = (float) (i >> 8 & 255) / 255.0F; + float f2 = (float) (i & 255) / 255.0F; + this.renderModel(poseStack, bufferSource, light, armoritem, model, flag, f, f1, f2, this.getArmorResource(citizen, itemstack, equipmentSlot, null)); + this.renderModel(poseStack, bufferSource, light, armoritem, model, flag, 1.0F, 1.0F, 1.0F, this.getArmorResource(citizen, itemstack, equipmentSlot, "overlay")); + } + else + { + this.renderModel(poseStack, bufferSource, light, armoritem, model, flag, 1.0F, 1.0F, 1.0F, this.getArmorResource(citizen, itemstack, equipmentSlot, null)); + } + + if (itemstack.hasFoil()) + { + this.renderGlint(poseStack, bufferSource, light, model); + } + } + } + } + + private void renderModel(PoseStack poseStack, MultiBufferSource bufferSource, int light, ArmorItem armorItem, net.minecraft.client.model.Model model, boolean ignore, float red, float green, float blue, ResourceLocation armorResource) + { + VertexConsumer vertexconsumer = bufferSource.getBuffer(RenderType.armorCutoutNoCull(armorResource)); + model.renderToBuffer(poseStack, vertexconsumer, light, OverlayTexture.NO_OVERLAY, red, green, blue, 1.0F); + } + + private void renderGlint(PoseStack poseStack, MultiBufferSource bufferSource, int light, net.minecraft.client.model.Model model) + { + model.renderToBuffer(poseStack, bufferSource.getBuffer(RenderType.armorEntityGlint()), light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/ClipBoardDecorator.java b/src/main/java/com/minecolonies/coremod/client/render/ClipBoardDecorator.java new file mode 100644 index 00000000000..06638cff331 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/ClipBoardDecorator.java @@ -0,0 +1,98 @@ +package com.minecolonies.coremod.client.render; + +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.requestsystem.manager.IRequestManager; +import com.minecolonies.api.colony.requestsystem.resolver.player.IPlayerRequestResolver; +import com.minecolonies.api.colony.requestsystem.resolver.retrying.IRetryingRequestResolver; +import com.minecolonies.api.colony.requestsystem.token.IToken; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.IItemDecorator; + +import java.util.HashSet; +import java.util.Set; + +import static com.minecolonies.coremod.items.ItemClipboard.TAG_COLONY; + +public class ClipBoardDecorator implements IItemDecorator +{ + private static IColonyView colonyView; + private static boolean render = false; + private long lastChange; + + @Override + public boolean render(Font font, ItemStack stack, int xOffset, int yOffset, float blitOffset) + { + final long gametime = Minecraft.getInstance().level.getGameTime(); + + if (lastChange != gametime && gametime % 40 == 0) + { + lastChange = gametime; + render = !render; + } + + if (render) + { + final CompoundTag compoundTag = stack.getTag(); + if (compoundTag != null) + { + final int colonyId = compoundTag.getInt(TAG_COLONY); + colonyView = IColonyManager.getInstance().getColonyView(colonyId, Minecraft.getInstance().level.dimension()); + + if (colonyView != null) + { + final Set> asyncRequest = new HashSet<>(); + for (final ICitizenDataView view : colonyView.getCitizens().values()) + { + if (view.getJobView() != null) + { + asyncRequest.addAll(view.getJobView().getAsyncRequests()); + } + } + + final IRequestManager requestManager = colonyView.getRequestManager(); + if (requestManager != null) + { + final IPlayerRequestResolver resolver = requestManager.getPlayerResolver(); + final IRetryingRequestResolver retryingRequestResolver = requestManager.getRetryingRequestResolver(); + + final Set> requestTokens = new HashSet<>(); + requestTokens.addAll(resolver.getAllAssignedRequests()); + requestTokens.addAll(retryingRequestResolver.getAllAssignedRequests()); + + int count = 0; + for (final IToken reqId : requestTokens) + { + if (!asyncRequest.contains(reqId)) + { + count++; + } + } + + if (count > 0) + { + final PoseStack ps = new PoseStack(); + ps.pushPose(); + ps.translate(0, 0, 500); + GuiComponent.drawCenteredString(ps, font, + Component.literal(count + ""), + xOffset + 15, + yOffset - 2, + 0xFF4500 | (255 << 24)); + ps.popPose(); + return true; + } + } + } + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/client/render/RenderBipedCitizen.java b/src/main/java/com/minecolonies/coremod/client/render/RenderBipedCitizen.java index 540136816a2..90d80bc240b 100755 --- a/src/main/java/com/minecolonies/coremod/client/render/RenderBipedCitizen.java +++ b/src/main/java/com/minecolonies/coremod/client/render/RenderBipedCitizen.java @@ -11,25 +11,19 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelLayers; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; -import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.model.HumanoidModel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.UseAnim; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.resources.ResourceLocation; -import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Renderer for the citizens. @@ -47,7 +41,7 @@ public class RenderBipedCitizen extends MobRenderer(context.bakeLayer(ModelLayers.PLAYER)), (float) SHADOW_SIZE); - this.addLayer(new HumanoidArmorLayer<>(this, new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)))); + this.addLayer(new CitizenArmorLayer(this, new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)))); super.addLayer(new ItemInHandLayer<>(this, context.getItemInHandRenderer())); ModModelTypeInitializer.init(context); } @@ -92,7 +86,7 @@ public void render( private void setupMainModelFrom(@NotNull final AbstractEntityCitizen citizen) { - final @Nullable IModelType modelType = IModelTypeRegistry.getInstance().getModelType(citizen.getModelType()); + final IModelType modelType = IModelTypeRegistry.getInstance().getModelType(citizen.getModelType()); model = citizen.isFemale() ? modelType.getFemaleModel() : modelType.getMaleModel(); if (model == null) { @@ -125,30 +119,23 @@ protected void renderNameTag( double distance = this.entityRenderDispatcher.distanceToSqr(entityIn.getX(), entityIn.getY(), entityIn.getZ()); if (distance <= 4096.0D) { - double yOffset = model.young ? -0.3 : 0; - boolean isSneaking = entityIn.isShiftKeyDown(); - double height = entityIn.getBbHeight() + 0.5F - (isSneaking ? 0.25F : 0.0F); - double y = height + 0.3 + yOffset; - - final ResourceLocation texture = entityIn.getCitizenDataView().getInteractionIcon(); + double y = entityIn.getBbHeight() + (model.young ? 0.5f : 0.8f); matrixStack.pushPose(); matrixStack.translate(0, y, 0); matrixStack.mulPose(entityRenderDispatcher.cameraOrientation()); - matrixStack.mulPose(Vector3f.ZP.rotationDegrees(90)); + //matrixStack.mulPose(Vector3f.ZP.rotationDegrees(90)); matrixStack.scale(-0.025F, -0.025F, 0.025F); - VertexConsumer r = buffer.getBuffer(RenderTypes.getEntityCutoutFront(texture)); - final Matrix4f pose = matrixStack.last().pose(); - final Matrix3f norm = matrixStack.last().normal(); - - r.vertex(pose, 0, 0, 0).color(255, 255, 255, 255).uv(0, 0).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(packedLight).normal(norm, 0, 1, 0).endVertex(); - r.vertex(pose, 0, 10, 0).color(255, 255, 255, 255).uv(1, 0).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(packedLight).normal(norm, 0, 1, 0).endVertex(); - r.vertex(pose, 10, 10, 0).color(255, 255, 255, 255).uv(1, 1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(packedLight).normal(norm, 0, 1, 0).endVertex(); - r.vertex(pose, 10, 0, 0).color(255, 255, 255, 255).uv(0, 1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(packedLight).normal(norm, 0, 1, 0).endVertex(); - + + VertexConsumer r = buffer.getBuffer(RenderTypes.worldEntityIcon(entityIn.getCitizenDataView().getInteractionIcon())); + r.vertex(pose, -5, 0, 0).uv(0, 0).endVertex(); + r.vertex(pose, -5, 10, 0).uv(0, 1).endVertex(); + r.vertex(pose, 5, 10, 0).uv(1, 1).endVertex(); + r.vertex(pose, 5, 0, 0).uv(1, 0).endVertex(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/minecolonies/coremod/client/render/TileEntityDecoControllerRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/TileEntityDecoControllerRenderer.java new file mode 100755 index 00000000000..2632a74b559 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/TileEntityDecoControllerRenderer.java @@ -0,0 +1,101 @@ +package com.minecolonies.coremod.client.render; + +import com.minecolonies.coremod.blocks.BlockDecorationController; +import com.minecolonies.coremod.client.render.worldevent.RenderTypes; +import com.minecolonies.coremod.tileentities.TileEntityDecorationController; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.piston.PistonBaseBlock; +import net.minecraft.world.level.block.piston.PistonHeadBlock; +import net.minecraft.world.level.block.piston.PistonMovingBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.PistonType; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +@OnlyIn(Dist.CLIENT) +public class TileEntityDecoControllerRenderer implements BlockEntityRenderer +{ + private BlockRenderDispatcher blockRenderer; + + public TileEntityDecoControllerRenderer(BlockEntityRendererProvider.Context p_173623_) + { + this.blockRenderer = p_173623_.getBlockRenderDispatcher(); + } + + @Override + public void render(@NotNull BlockEntity blockEntity, float partialTick, @NotNull PoseStack matrixStack, @NotNull MultiBufferSource bufferSource, int lightA, int lightB) + { + if (blockEntity instanceof TileEntityDecorationController decorationController) + { + Level level = blockEntity.getLevel(); + if (level != null) + { + final BlockState decoController = decorationController.getBlockState(); + final Direction direction = decoController.getValue(BlockDecorationController.FACING); + final BlockPos offsetPos = blockEntity.getBlockPos().relative(direction); + final BlockState state = level.getBlockState(offsetPos); + final VoxelShape shape = state.getShape(level, offsetPos); + if (shape.isEmpty() || Block.isShapeFullBlock(shape)) + { + ModelBlockRenderer.enableCaching(); + matrixStack.pushPose(); + + this.renderBlock(offsetPos, decoController, matrixStack, bufferSource, level, lightA); + + matrixStack.popPose(); + ModelBlockRenderer.clearCache(); + return; + } + + final Vec3 translateVec = switch (direction) + { + case UP -> new Vec3(0, shape.min(Direction.Axis.Y), 0); + case DOWN -> new Vec3(0, shape.max(Direction.Axis.Y)-1, 0); + case NORTH -> new Vec3(0, 0, shape.max(Direction.Axis.Z)-1); + case SOUTH -> new Vec3(0, 0, shape.min(Direction.Axis.Z)); + case EAST -> new Vec3( shape.min(Direction.Axis.X), 0, 0); + case WEST -> new Vec3(shape.max(Direction.Axis.X)-1, 0, 0); + }; + + if (!decoController.isAir()) + { + ModelBlockRenderer.enableCaching(); + matrixStack.pushPose(); + matrixStack.translate(translateVec.x, translateVec.y, translateVec.z); + + this.renderBlock(offsetPos, decoController, matrixStack, bufferSource, level, lightB); + + matrixStack.popPose(); + ModelBlockRenderer.clearCache(); + } + } + } + } + + private void renderBlock(BlockPos pos, BlockState state, PoseStack poseStack, MultiBufferSource buffer, Level level, int light) + { + VertexConsumer vertexconsumer = buffer.getBuffer(RenderType.cutout()); + this.blockRenderer.getModelRenderer() + .tesselateBlock(level, this.blockRenderer.getBlockModel(state), state, pos, poseStack, vertexconsumer, false, RandomSource.create(), state.getSeed(pos), light); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/TileEntityScarecrowRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/TileEntityScarecrowRenderer.java index 094f96a2dfb..54ef763ec46 100755 --- a/src/main/java/com/minecolonies/coremod/client/render/TileEntityScarecrowRenderer.java +++ b/src/main/java/com/minecolonies/coremod/client/render/TileEntityScarecrowRenderer.java @@ -1,7 +1,7 @@ package com.minecolonies.coremod.client.render; import com.minecolonies.api.blocks.huts.AbstractBlockMinecoloniesDefault; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; +import com.minecolonies.api.tileentities.AbstractTileEntityScarecrow; import com.minecolonies.api.tileentities.ScareCrowType; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.blocks.BlockScarecrow; @@ -27,7 +27,7 @@ * Class to render the scarecrow. */ @OnlyIn(Dist.CLIENT) -public class TileEntityScarecrowRenderer implements BlockEntityRenderer +public class TileEntityScarecrowRenderer implements BlockEntityRenderer { /** * Offset to the block middle. @@ -90,7 +90,7 @@ public TileEntityScarecrowRenderer(final BlockEntityRendererProvider.Context con @Override public void render( - final AbstractScarecrowTileEntity te, + final AbstractTileEntityScarecrow te, final float partialTicks, final PoseStack matrixStack, @NotNull final MultiBufferSource iRenderTypeBuffer, @@ -139,7 +139,7 @@ public void render( * @return the material. */ @NotNull - private static Material getMaterial(@NotNull final AbstractScarecrowTileEntity tileEntity) + private static Material getMaterial(@NotNull final AbstractTileEntityScarecrow tileEntity) { if (tileEntity.getScarecrowType() == ScareCrowType.PUMPKINHEAD) { diff --git a/src/main/java/com/minecolonies/coremod/client/render/projectile/RendererSpear.java b/src/main/java/com/minecolonies/coremod/client/render/projectile/RendererSpear.java index 39855829956..678b3ebfbe0 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/projectile/RendererSpear.java +++ b/src/main/java/com/minecolonies/coremod/client/render/projectile/RendererSpear.java @@ -1,6 +1,6 @@ package com.minecolonies.coremod.client.render.projectile; -import com.minecolonies.api.entity.SpearEntity; +import com.minecolonies.coremod.entity.SpearEntity; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.client.model.SpearModel; import com.mojang.blaze3d.vertex.PoseStack; @@ -14,6 +14,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.world.entity.projectile.ThrownTrident; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; @@ -22,7 +23,7 @@ * Custom renderer for spears */ @OnlyIn(Dist.CLIENT) -public class RendererSpear extends EntityRenderer +public class RendererSpear extends EntityRenderer { private final ResourceLocation texture = new ResourceLocation(Constants.MOD_ID, "textures/entity/spear.png"); private final SpearModel model ; @@ -38,7 +39,7 @@ public RendererSpear(final EntityRendererProvider.Context context) } @Override - public void render(@NotNull final SpearEntity entity, final float entityYaw, final float partialTicks, @NotNull final PoseStack stack, @NotNull final MultiBufferSource buffer, final int light) + public void render(@NotNull final ThrownTrident entity, final float entityYaw, final float partialTicks, @NotNull final PoseStack stack, @NotNull final MultiBufferSource buffer, final int light) { super.render(entity, entityYaw, partialTicks, stack, buffer, light); @@ -52,7 +53,7 @@ public void render(@NotNull final SpearEntity entity, final float entityYaw, fi @NotNull @Override - public ResourceLocation getTextureLocation(@NotNull final SpearEntity spearEntity) + public ResourceLocation getTextureLocation(@NotNull final ThrownTrident spearEntity) { return texture; } diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBlueprintRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBlueprintRenderer.java index 13a45a79fe3..9172867438f 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBlueprintRenderer.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBlueprintRenderer.java @@ -1,15 +1,19 @@ package com.minecolonies.coremod.client.render.worldevent; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.ldtteam.structurize.blueprints.v1.Blueprint; import com.ldtteam.structurize.client.StructureClientHandler; import com.ldtteam.structurize.storage.StructurePacks; import com.ldtteam.structurize.storage.rendering.RenderingCache; import com.ldtteam.structurize.storage.rendering.types.BlueprintPreviewData; import com.ldtteam.structurize.storage.rendering.types.BoxPreviewData; -import com.ldtteam.structurize.util.PlacementSettings; -import com.ldtteam.structurize.util.WorldRenderMacros; +import com.ldtteam.structurize.util.RotationMirror; import com.minecolonies.api.MinecoloniesAPIProxy; -import com.minecolonies.api.colony.buildings.ModBuildings; +import com.minecolonies.api.client.ModKeyMappings; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.workorders.IWorkOrderView; import com.minecolonies.api.colony.workorders.WorkOrderType; @@ -20,15 +24,18 @@ import com.minecolonies.coremod.colony.workorders.view.WorkOrderBuildingView; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Tuple; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.time.Duration; import java.util.*; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import java.util.function.Supplier; import static com.ldtteam.structurize.items.ModItems.buildTool; @@ -48,16 +55,34 @@ public class ColonyBlueprintRenderer private static final double CACHE_RESET_RANGE = 12.5F; /** - * The cached map of blueprints that are rendered. + * The cached list of blueprints to be rendered. */ - private static Map blueprintCache = new HashMap<>(); + private static Map> blueprintRenderCache = new HashMap<>(); + + /** + * The cached list of boxes to be rendered. + */ + private static Map boxRenderCache = new HashMap<>(); + + /** + * The cache of blueprint data. + */ + private static final LoadingCache blueprintDataCache = CacheBuilder.newBuilder() + .expireAfterAccess(Duration.ofMinutes(2)) + .softValues() + .build(CacheLoader.from(ColonyBlueprintRenderer::makeBlueprintPreview)); private static BlockPos lastCacheRebuild = null; + /** + * True when blueprints should be rendered. Toggled via hotkey. + */ + private static boolean shouldRenderBlueprints = true; + /** * Blueprints we're still loading. */ - private static final Queue pendingBlueprints = new LinkedList<>(); + private static final Map pendingBoxes = new HashMap<>(); /** * Rendering rules. Order matters. @@ -70,16 +95,42 @@ public class ColonyBlueprintRenderer renderRules.add(new BuildGoggles()); } + /** + * Invalidate the cache, because something significant has changed in colony data (e.g. more work orders). + */ + public static void invalidateCache() + { + lastCacheRebuild = null; + } + + /** + * Indicates whether blueprint rendering is enabled or disabled. + * + * @return true when enabled. + */ + public static boolean willRenderBlueprints() + { + return shouldRenderBlueprints; + } + /** * Renders blueprints into the client. * * @param ctx rendering context */ - static void render(final WorldEventContext ctx) + static void renderBlueprints(final WorldEventContext ctx) { + if (ModKeyMappings.TOGGLE_GOGGLES.get().consumeClick()) + { + shouldRenderBlueprints = !shouldRenderBlueprints; + + ctx.clientPlayer.playNotifySound(SoundEvents.NOTE_BLOCK_PLING, SoundSource.NEUTRAL, 1.0F, shouldRenderBlueprints ? 0.75F : 0.25F); + } + if (!ctx.hasNearestColony()) { - blueprintCache.clear(); + blueprintRenderCache.clear(); + boxRenderCache.clear(); lastCacheRebuild = null; return; } @@ -95,7 +146,8 @@ static void render(final WorldEventContext ctx) if (activeRules.isEmpty()) { - blueprintCache.clear(); + blueprintRenderCache.clear(); + boxRenderCache.clear(); lastCacheRebuild = null; return; } @@ -112,133 +164,164 @@ static void render(final WorldEventContext ctx) processPendingBlueprints(); } - for (final Map.Entry entry : blueprintCache.entrySet()) + if (shouldRenderBlueprints) { - final RenderData buildingData = entry.getValue(); - if (buildingData == null) { continue; } - - final BlockPos position = entry.getKey(); - if (buildingData.blueprint != null && buildingData.blueprint.getBlueprint() != null) + for (final Map.Entry> entry : blueprintRenderCache.entrySet()) { - StructureClientHandler.renderStructureAtPos(buildingData.blueprint, ctx.partialTicks, position, ctx.poseStack); + final BlueprintPreviewData data = blueprintDataCache.getUnchecked(entry.getKey()); + StructureClientHandler.renderStructureAtPosList(data, ctx.partialTicks, entry.getValue(), ctx.poseStack); } + } + } + + /** + * Renders boxes into the client. Must be called after {@link #renderBlueprints}. + * + * @param ctx rendering context + */ + static void renderBoxes(final WorldEventContext ctx) + { + for (final Map.Entry entry : boxRenderCache.entrySet()) + { + final BoxRenderData buildingData = entry.getValue(); if (buildingData.box().getPos1() != INVALID_POS) { - WorldRenderMacros.renderLineBox(ctx.bufferSource.getBuffer(WorldRenderMacros.LINES_WITH_WIDTH), - ctx.poseStack, - buildingData.box().getPos1(), - buildingData.box().getPos2(), - 0, - 0, - 255, - 255, - 0.08f); + ColonyWorldRenderMacros.renderLineBox(ctx.poseStack, ctx.bufferSource, + new AABB(buildingData.box().getPos1(), buildingData.box().getPos2().offset(1, 1, 1)), + 0.08f, 0xFF0000FF, false); } buildingData.box().getAnchor().ifPresent(pos -> { if (ctx.clientPlayer.isShiftKeyDown()) { - WorldRenderMacros.renderRedGlintLineBox(WorldRenderMacros.getBufferSource(), ctx.poseStack, pos, pos, 0.02f); + ColonyWorldRenderMacros.renderLineBox(ctx.poseStack, ctx.bufferSource, + new AABB(pos), 0.02f, 0xFFFF0000, true); } }); + + if (ctx.nearestColony != null && buildingData.builder() != 0 && ctx.clientPlayer.isShiftKeyDown()) + { + final ICitizenDataView citizen = ctx.nearestColony.getCitizen(buildingData.builder()); + if (citizen != null) + { + final BlockPos pos = citizen.getStatusPosition(); + if (pos != null) + { + ColonyWorldRenderMacros.renderLineBox(ctx.poseStack, ctx.bufferSource, + new AABB(pos), 0.02f, 0xFF00FF00, true); + } + } + } } + + ColonyWorldRenderMacros.endRenderLineBox(ctx.bufferSource); } private static void rebuildCache(final WorldEventContext ctx, final List rules) { Collections.reverse(rules); // so the first rule "wins" - final Map> desired = new HashMap<>(); + final Map desired = new HashMap<>(); for (final IRenderBlueprintRule rule : rules) { desired.putAll(rule.getDesiredBlueprints(ctx)); } - final Map newCache = new HashMap<>(); - for (final Map.Entry> entry : desired.entrySet()) + final Map> newBlueprints = new HashMap<>(); + final Map newBoxes = new HashMap<>(); + for (final Map.Entry entry : desired.entrySet()) { - if (blueprintCache.containsKey(entry.getKey())) + if (entry.getValue().blueprint() != null && !entry.getValue().boxOnly()) + { + final List posList = newBlueprints.computeIfAbsent(entry.getValue().blueprint(), k -> new ArrayList<>()); + posList.add(entry.getKey()); + } + + final BoxRenderData newBox = tryLoadBox(entry.getValue()); + if (newBox != null) { - newCache.put(entry.getKey(), blueprintCache.get(entry.getKey())); + newBoxes.put(entry.getKey(), newBox); } else { - newCache.put(entry.getKey(), null); - pendingBlueprints.add(entry.getValue().get()); + pendingBoxes.put(entry.getKey(), entry.getValue()); + + final BoxRenderData oldBox = boxRenderCache.getOrDefault(entry.getKey(), null); + if (oldBox != null) + { + newBoxes.put(entry.getKey(), oldBox); + } } } - blueprintCache = newCache; + blueprintRenderCache = newBlueprints; + boxRenderCache = newBoxes; } - private static void processPendingBlueprints() + private static @Nullable BoxRenderData tryLoadBox(@NotNull final PendingRenderData data) { - while (!pendingBlueprints.isEmpty()) + if (data.blueprint() == null) { - final PendingRenderData data = pendingBlueprints.peek(); - if (data.blueprint() != null && !data.blueprint().isDone()) + if (data.boxOnly() && data.hasAnchor()) // render only the anchor { - break; + final BoxPreviewData box = new BoxPreviewData(INVALID_POS, INVALID_POS, Optional.of(data.pos())); + return new BoxRenderData(box, 0); } - try - { - pendingBlueprints.poll(); - if (data.blueprint() == null) - { - if (data.boxOnly() && data.hasAnchor()) // render only the anchor - { - final BoxPreviewData box = new BoxPreviewData(INVALID_POS, INVALID_POS, Optional.of(data.pos())); - blueprintCache.put(data.pos(), new RenderData(null, box)); - } - else - { - blueprintCache.remove(data.pos()); - } - continue; - } - final Blueprint localBlueprint = data.blueprint().get(); - if (localBlueprint == null) - { - blueprintCache.remove(data.pos()); - } - else if (blueprintCache.containsKey(data.pos())) - { - final BlueprintPreviewData blueprintPreviewData = new BlueprintPreviewData(); - blueprintPreviewData.setBlueprint(localBlueprint); - blueprintPreviewData.setPos(data.pos()); - blueprintPreviewData.rotate(data.settings().getRotation()); - if (data.settings().getMirror() != Mirror.NONE) - { - blueprintPreviewData.mirror(); - } + return new BoxRenderData(null, 0); + } - final BlockPos primaryOffset = localBlueprint.getPrimaryBlockOffset(); - final BlockPos boxStartPos = data.pos().subtract(primaryOffset); - final BlockPos size = new BlockPos(localBlueprint.getSizeX(), localBlueprint.getSizeY(), localBlueprint.getSizeZ()); - final BlockPos boxEndPos = boxStartPos.offset(size).offset(-1, -1, -1); - final BoxPreviewData box = new BoxPreviewData(boxStartPos, boxEndPos, data.hasAnchor() ? Optional.of(data.pos()) : Optional.empty()); + final BlueprintPreviewData blueprintData = blueprintDataCache.getUnchecked(data.blueprint()); + final Blueprint localBlueprint = blueprintData.getBlueprint(); + if (localBlueprint == null) + { + return null; + } - localBlueprint.setRenderSource(data.pos()); - if (data.boxOnly()) - { - blueprintCache.put(data.pos(), new RenderData(null, box)); - } - else - { - blueprintCache.put(data.pos(), new RenderData(blueprintPreviewData, box)); - } + if (blueprintData.isEmpty()) + { + return new BoxRenderData(null, 0); + } + else + { + final BlockPos primaryOffset = localBlueprint.getPrimaryBlockOffset(); + final BlockPos boxStartPos = data.pos().subtract(primaryOffset); + final BlockPos boxEndPos = boxStartPos.offset(localBlueprint.getSizeX() - 1, localBlueprint.getSizeY() - 1, localBlueprint.getSizeZ() - 1); + final BoxPreviewData box = new BoxPreviewData(boxStartPos, boxEndPos, data.hasAnchor() ? Optional.of(data.pos()) : Optional.empty()); - // only process one real blueprint per call - break; - } - } - catch (final InterruptedException | ExecutionException ex) + return new BoxRenderData(box, data.builder()); + } + } + + private static void processPendingBlueprints() + { + final Iterator> iterator = pendingBoxes.entrySet().iterator(); + while (iterator.hasNext()) + { + final Map.Entry entry = iterator.next(); + final BoxRenderData box = tryLoadBox(entry.getValue()); + if (box != null) { - //Noop + if (box.box() != null || box.builder() != 0) + { + boxRenderCache.put(entry.getKey(), box); + } + iterator.remove(); } } } + private static @NotNull BlueprintPreviewData makeBlueprintPreview(@NotNull final BlueprintCacheKey key) + { + final Future blueprintFuture = StructurePacks.getBlueprintFuture(key.packName(), key.path()); + + final BlueprintPreviewData blueprintPreviewData = new BlueprintPreviewData(false); + blueprintPreviewData.setBlueprintFuture(blueprintFuture); + blueprintPreviewData.setPos(BlockPos.ZERO); + blueprintPreviewData.setRotationMirror(key.orientation()); + + return blueprintPreviewData; + } + /** * Abstract rule for deciding which blueprints to render. */ @@ -250,22 +333,29 @@ private interface IRenderBlueprintRule boolean isEnabled(WorldEventContext ctx); /** - * Report the complete list of locations that should render blueprints; if they're new then it will fetch the data. + * Report the complete list of locations that should render blueprints. */ - Map> getDesiredBlueprints(WorldEventContext ctx); + Map getDesiredBlueprints(WorldEventContext ctx); } /** - * Holds blueprint renderdata (loaded). + * Holds blueprint renderdata (pending load). */ - private record RenderData(BlueprintPreviewData blueprint, BoxPreviewData box) + private record PendingRenderData(@Nullable BlueprintCacheKey blueprint, @NotNull BlockPos pos, int builder, boolean boxOnly, boolean hasAnchor) { } /** - * Holds blueprint renderdata (pending load). + * Holds box renderdata (loaded). */ - private record PendingRenderData(Future blueprint, BlockPos pos, PlacementSettings settings, boolean boxOnly, boolean hasAnchor) + private record BoxRenderData(@Nullable BoxPreviewData box, int builder) + { + } + + /** + * Cache key for {@link #blueprintDataCache}. + */ + private record BlueprintCacheKey(@NotNull String packName, @NotNull String path, RotationMirror orientation) { } @@ -283,9 +373,9 @@ public boolean isEnabled(final WorldEventContext ctx) } @Override - public Map> getDesiredBlueprints(final WorldEventContext ctx) + public Map getDesiredBlueprints(final WorldEventContext ctx) { - final Map> desired = new HashMap<>(); + final Map desired = new HashMap<>(); final BlockPos activePosition = RenderingCache.getOrCreateBlueprintPreviewData("blueprint").getPos(); final Blueprint blueprint = RenderingCache.getOrCreateBlueprintPreviewData("blueprint").getBlueprint(); final BlockPos zeroPos = activePosition.subtract(blueprint.getPrimaryBlockOffset()); @@ -294,14 +384,8 @@ public Map> getDesiredBlueprints(final Wor for (final IBuildingView buildingView : ctx.nearestColony.getBuildings()) { - if (buildingView.getBuildingType() == ModBuildings.postBox.get() || buildingView.getBuildingType() == ModBuildings.stash.get()) - { - continue; - } final BlockPos currentPosition = buildingView.getPosition(); - - final TileEntityColonyBuilding tileEntityColonyBuilding = (TileEntityColonyBuilding) ctx.clientLevel.getBlockEntity(buildingView.getPosition()); - if (tileEntityColonyBuilding != null) + if (ctx.clientLevel.getBlockEntity(currentPosition) instanceof final TileEntityColonyBuilding tileEntityColonyBuilding) { final Tuple corners = tileEntityColonyBuilding.getInWorldCorners(); BlockPos cornerA = corners.getA(); @@ -309,20 +393,19 @@ public Map> getDesiredBlueprints(final Wor if (blueprintAABB.intersects(new AABB(cornerA, cornerB))) { - desired.put(currentPosition, () -> - { - String schemPath = buildingView.getStructurePath(); - schemPath = schemPath.replace(".blueprint", ""); - schemPath = schemPath.substring(0, schemPath.length() - 1) + buildingView.getBuildingMaxLevel() + ".blueprint"; + String schemPath = buildingView.getStructurePath(); + schemPath = schemPath.replace(".blueprint", ""); + schemPath = schemPath.substring(0, schemPath.length() - 1) + buildingView.getBuildingMaxLevel() + ".blueprint"; - final String structurePack = buildingView.getStructurePack(); + final String structurePack = buildingView.getStructurePack(); + final BlueprintCacheKey key = new BlueprintCacheKey(structurePack, schemPath, + RotationMirror.of(BlockPosUtil.getRotationFromRotations(buildingView.getRotation()), + buildingView.isMirrored() ? Mirror.FRONT_BACK : Mirror.NONE)); - final Future localBlueprint = StructurePacks.getBlueprintFuture(structurePack, schemPath); - return new PendingRenderData(localBlueprint, currentPosition, - new PlacementSettings(buildingView.isMirrored() ? Mirror.FRONT_BACK : Mirror.NONE, BlockPosUtil.getRotationFromRotations(buildingView.getRotation())), + desired.put(currentPosition, + new PendingRenderData(key, currentPosition, 0, buildingView.getBuildingLevel() >= buildingView.getBuildingMaxLevel(), - true); - }); + true)); } } } @@ -343,26 +426,25 @@ public boolean isEnabled(final WorldEventContext ctx) } @Override - public Map> getDesiredBlueprints(final WorldEventContext ctx) + public Map getDesiredBlueprints(final WorldEventContext ctx) { // ideally we'd check based on the bounding box, but we don't know that until we load the blueprints final double range = MathUtils.square(MinecoloniesAPIProxy.getInstance().getConfig().getClient().buildgogglerange.get()); // show work orders - final Map> desired = new HashMap<>(); + final Map desired = new HashMap<>(); for (final IWorkOrderView workOrder : ctx.nearestColony.getWorkOrders()) { if (workOrder.getLocation().distSqr(ctx.clientPlayer.blockPosition()) < range) { - desired.put(workOrder.getLocation(), () -> - { - final Future localBlueprint = StructurePacks.getBlueprintFuture(workOrder.getPackName(), workOrder.getStructurePath()); - return new PendingRenderData(localBlueprint, workOrder.getLocation(), - new PlacementSettings(workOrder.isMirrored() ? Mirror.FRONT_BACK : Mirror.NONE, - BlockPosUtil.getRotationFromRotations(workOrder.getRotation())), + final int builder = getBuilderId(ctx.nearestColony, workOrder.getClaimedBy()); + final BlueprintCacheKey key = new BlueprintCacheKey(workOrder.getPackName(), workOrder.getStructurePath(), + RotationMirror.of(BlockPosUtil.getRotationFromRotations(workOrder.getRotation()), + workOrder.isMirrored() ? Mirror.FRONT_BACK : Mirror.NONE)); + desired.put(workOrder.getLocation(), + new PendingRenderData(key, workOrder.getLocation(), builder, workOrder.getWorkOrderType() == WorkOrderType.REMOVE, - workOrder instanceof WorkOrderBuildingView); - }); + workOrder instanceof WorkOrderBuildingView)); } } @@ -374,13 +456,37 @@ public Map> getDesiredBlueprints(final Wor building.getBuildingMaxLevel() > 0 && building.getPosition().distSqr(ctx.clientPlayer.blockPosition()) < range) { - desired.put(building.getPosition(), () -> - new PendingRenderData(null, building.getPosition(), new PlacementSettings(), + desired.put(building.getPosition(), + new PendingRenderData(null, building.getPosition(), 0, true, true)); } } return desired; } + + /** + * Find the builder for this work order, if any. + * + * @param colony the colony. + * @param builderPos the builder's building id. + * @return the builder's id, or 0. + */ + private int getBuilderId(final IColonyView colony, final BlockPos builderPos) + { + if (builderPos != null && !builderPos.equals(BlockPos.ZERO)) + { + final IBuildingView builderView = colony.getBuilding(builderPos); + if (builderView != null) + { + final Set builders = builderView.getAllAssignedCitizens(); + if (!builders.isEmpty()) + { + return builders.iterator().next(); + } + } + } + return 0; + } } } diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBorderRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBorderRenderer.java index 87a2f729f2e..fe28d69e7f2 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBorderRenderer.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyBorderRenderer.java @@ -62,6 +62,7 @@ static void render(final WorldEventContext ctx) for (int chunkZ = -range; chunkZ <= range; chunkZ++) { final LevelChunk chunk = ctx.clientLevel.getChunk(playerChunkPos.x + chunkX, playerChunkPos.z + chunkZ); + if (chunk.isEmpty()) { continue; } final ChunkPos chunkPos = chunk.getPos(); chunk.getCapability(CLOSE_COLONY_CAP, null).ifPresent(cap -> coloniesMap.put(chunkPos, cap.getOwningColony())); diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyPatrolPointRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyPatrolPointRenderer.java index 41c405484f9..ebff66a5b4e 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyPatrolPointRenderer.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyPatrolPointRenderer.java @@ -16,7 +16,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; +import static com.minecolonies.api.util.constant.Constants.STORAGE_STYLE; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ID; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS; @@ -57,7 +57,7 @@ static void render(final WorldEventContext ctx) if (pendingTemplate == null && partolPointTemplate == null) { - pendingTemplate = StructurePacks.getBlueprintFuture(DEFAULT_STYLE, "infrastructure/misc/patrolpoint.blueprint"); + pendingTemplate = StructurePacks.getBlueprintFuture(STORAGE_STYLE, "infrastructure/misc/patrolpoint.blueprint"); return; } else if (pendingTemplate != null && pendingTemplate.isDone()) diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWaypointRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWaypointRenderer.java index c733a5d73c3..c99d967baa3 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWaypointRenderer.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWaypointRenderer.java @@ -12,7 +12,7 @@ import java.util.concurrent.Future; import static com.minecolonies.api.util.constant.CitizenConstants.WAYPOINT_STRING; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; +import static com.minecolonies.api.util.constant.Constants.STORAGE_STYLE; public class ColonyWaypointRenderer { @@ -38,7 +38,7 @@ static void render(final WorldEventContext ctx) { if (wayPointTemplate == null && pendingTemplate == null) { - pendingTemplate = StructurePacks.getBlueprintFuture(DEFAULT_STYLE, "infrastructure/misc/waypoint.blueprint"); + pendingTemplate = StructurePacks.getBlueprintFuture(STORAGE_STYLE, "infrastructure/misc/waypoint.blueprint"); } if (pendingTemplate != null) diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWorldRenderMacros.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWorldRenderMacros.java new file mode 100644 index 00000000000..c330a98be85 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ColonyWorldRenderMacros.java @@ -0,0 +1,101 @@ +package com.minecolonies.coremod.client.render.worldevent; + +import com.ldtteam.structurize.util.WorldRenderMacros; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.FastColor; +import net.minecraft.world.phys.AABB; + +/** + * Extra {@link com.ldtteam.structurize.util.WorldRenderMacros}. Maybe port it to Structurize at some point. + */ +public class ColonyWorldRenderMacros +{ + /** + * Render a wireframe box. + * @param poseStack pose stack + * @param bufferSource buffer source + * @param bounds bounding box to draw + * @param width line width + * @param color line color (ARGB) + * @param showThroughBlocks true to render through existing blocks, false to only render in air + */ + public static void renderLineBox(final PoseStack poseStack, final MultiBufferSource.BufferSource bufferSource, + final AABB bounds, final float width, final int color, final boolean showThroughBlocks) + { + final float halfLine = width / 2.0f; + final float minX = (float) (bounds.minX - halfLine); + final float minY = (float) (bounds.minY - halfLine); + final float minZ = (float) (bounds.minZ - halfLine); + final float minX2 = minX + width; + final float minY2 = minY + width; + final float minZ2 = minZ + width; + + final float maxX = (float) (bounds.maxX + halfLine); + final float maxY = (float) (bounds.maxY + halfLine); + final float maxZ = (float) (bounds.maxZ + halfLine); + final float maxX2 = maxX - width; + final float maxY2 = maxY - width; + final float maxZ2 = maxZ - width; + + final int red = FastColor.ARGB32.red(color); + final int green = FastColor.ARGB32.green(color); + final int blue = FastColor.ARGB32.blue(color); + final int alpha = FastColor.ARGB32.alpha(color); + + if (showThroughBlocks) + { + renderLineBox(poseStack, bufferSource.getBuffer(RenderTypes.LINES_INSIDE_BLOCKS), + minX, minY, minZ, minX2, minY2, minZ2, maxX, maxY, maxZ, maxX2, maxY2, maxZ2, + red / 2, green / 2, blue / 2, alpha / 2); + } + + renderLineBox(poseStack, bufferSource.getBuffer(RenderTypes.LINES_OUTSIDE_BLOCKS), + minX, minY, minZ, minX2, minY2, minZ2, maxX, maxY, maxZ, maxX2, maxY2, maxZ2, + red, green, blue, alpha); + } + + /** + * Call after a series of {@link #renderLineBox(PoseStack, MultiBufferSource.BufferSource, AABB, float, int, boolean)} + * @param bufferSource buffer source + */ + public static void endRenderLineBox(final MultiBufferSource.BufferSource bufferSource) + { + bufferSource.endBatch(RenderTypes.LINES_INSIDE_BLOCKS); + bufferSource.endBatch(RenderTypes.LINES_OUTSIDE_BLOCKS); + } + + /** + * Render a wireframe box. + * @param poseStack pose stack + * @param buffer buffer + * @param minX min X + * @param minY min Y + * @param minZ min Z + * @param minX2 min X + width + * @param minY2 min Y + width + * @param minZ2 min Z + width + * @param maxX max X + * @param maxY max Y + * @param maxZ max Z + * @param maxX2 max X - width + * @param maxY2 max Y - width + * @param maxZ2 max Z - width + * @param red red + * @param green green + * @param blue blue + * @param alpha alpha + */ + private static void renderLineBox(final PoseStack poseStack, final VertexConsumer buffer, + final float minX, final float minY, final float minZ, + final float minX2, final float minY2, final float minZ2, + final float maxX, final float maxY, final float maxZ, + final float maxX2, final float maxY2, final float maxZ2, + final int red, final int green, final int blue, final int alpha) + { + buffer.defaultColor(red, green, blue, alpha); + WorldRenderMacros.populateRenderLineBox(minX, minY, minZ, minX2, minY2, minZ2, maxX, maxY, maxZ, maxX2, maxY2, maxZ2, poseStack.last().pose(), buffer); + buffer.unsetDefaultColor(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/HighlightManager.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/HighlightManager.java index e91ee0fac89..e06835da740 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/HighlightManager.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/HighlightManager.java @@ -1,13 +1,10 @@ package com.minecolonies.coremod.client.render.worldevent; -import com.ldtteam.structurize.util.WorldRenderMacros; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.core.BlockPos; +import com.minecolonies.coremod.client.render.worldevent.highlightmanager.IHighlightRenderData; + +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -16,118 +13,122 @@ public class HighlightManager /** * A position to highlight with a unique id. */ - private static final Map> HIGHLIGHT_MAP = new HashMap<>(); + private static final Map HIGHLIGHT_ITEMS = new HashMap<>(); /** * Highlights positions * - * @param ctx rendering context + * @param context rendering context */ - static void render(final WorldEventContext ctx) + static void render(final WorldEventContext context) { - if (HIGHLIGHT_MAP.isEmpty()) + if (HIGHLIGHT_ITEMS.isEmpty()) { return; } - final long worldTime = ctx.clientLevel.getGameTime(); + final long worldTime = context.clientLevel.getGameTime(); - for (final Iterator> categoryIterator = HIGHLIGHT_MAP.values().iterator(); categoryIterator.hasNext();) + List itemsToRemove = new ArrayList<>(); + for (final HighlightRenderDataContainer renderDataContainer : HIGHLIGHT_ITEMS.values()) { - final List boxes = categoryIterator.next(); - for (final Iterator boxListIterator = boxes.iterator(); boxListIterator.hasNext();) - { - final TimedBoxRenderData boxRenderData = boxListIterator.next(); - - if (boxRenderData.removalTimePoint <= worldTime) - { - boxListIterator.remove(); - continue; - } - - final MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); - WorldRenderMacros.renderLineBox(buffer.getBuffer( - WorldRenderMacros.GLINT_LINES_WITH_WIDTH), ctx.poseStack, boxRenderData.pos, boxRenderData.argbColor, 0.025f); - if (!boxRenderData.text.isEmpty()) - { - WorldRenderMacros.renderDebugText(boxRenderData.pos, boxRenderData.text, ctx.poseStack, true, 3, buffer); - } - buffer.endBatch(); + renderDataContainer.attemptStart(context); + IHighlightRenderData renderData = renderDataContainer.data; + if (renderDataContainer.isExpired(worldTime)) + { + renderData.stopRender(context); + itemsToRemove.add(renderDataContainer); } - - if (boxes.isEmpty()) + else { - categoryIterator.remove(); + renderData.render(context); } } + + for (HighlightRenderDataContainer container : itemsToRemove) + { + HIGHLIGHT_ITEMS.remove(container.key); + } } /** - * Box data for rendering + * Clears all highlight items for the given key. + * + * @param key the key to remove the render data for. */ - public static class TimedBoxRenderData + public static void clearHighlightsForKey(final String key) { - private List text = new ArrayList<>(); - private BlockPos pos = BlockPos.ZERO; - private long removalTimePoint = 0; - private int argbColor = 0xffffffff; + HIGHLIGHT_ITEMS.remove(key); + } + /** + * Adds a highlight item for the given key. + * + * @param key the key of the item to render. + * @param data the highlight render data. + */ + public static void addHighlight(final String key, final IHighlightRenderData data) + { + HIGHLIGHT_ITEMS.put(key, new HighlightRenderDataContainer(key, data)); + } + + /** + * Internal container for managing highlight renderer data. + */ + private static class HighlightRenderDataContainer + { /** - * List of strings to display + * The key for this renderer. */ - public TimedBoxRenderData addText(final String text) - { - this.text.add(text); - return this; - } + private final String key; + + /** + * The data for this renderer. + */ + private final IHighlightRenderData data; + + /** + * The time at which the highlighter was started. + */ + private long startTime = 0; /** - * Timepoint of removal (world gametime) + * Default constructor. */ - public TimedBoxRenderData setRemovalTimePoint(final long removalTimePoint) + private HighlightRenderDataContainer(String key, IHighlightRenderData data) { - this.removalTimePoint = removalTimePoint; - return this; + this.key = key; + this.data = data; } /** - * Position to display at + * Check if the highlight has expired. + * + * @return true if expired. */ - public TimedBoxRenderData setPos(final BlockPos pos) + private boolean isExpired(final long worldTime) { - this.pos = pos; - return this; + Duration duration = data.getDuration(); + if (duration != null) + { + return (startTime + (duration.getSeconds() * 20)) < worldTime; + } + return false; } /** - * Color code for the box, argb format + * Attempt to start the rendering of the highlight data. + * + * @param context the world event context. */ - public TimedBoxRenderData setColor(final int argbColor) + private void attemptStart(final WorldEventContext context) { - this.argbColor = argbColor; - return this; + if (startTime == 0) + { + startTime = context.clientLevel.getGameTime(); + data.startRender(context); + } } } - - /** - * Adds a box to be rendered for the given category - * - * @param category - * @param data - */ - public static void addRenderBox(final String category, final TimedBoxRenderData data) - { - HIGHLIGHT_MAP.computeIfAbsent(category, k -> new ArrayList<>()).add(data); - } - - /** - * Clears all boxes of a category - * - * @param category - */ - public static void clearCategory(final String category) - { - HIGHLIGHT_MAP.remove(category); - } } diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/ItemOverlayBoxesRenderer.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ItemOverlayBoxesRenderer.java new file mode 100644 index 00000000000..f35ba088d6c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/ItemOverlayBoxesRenderer.java @@ -0,0 +1,31 @@ +package com.minecolonies.coremod.client.render.worldevent; + +import com.minecolonies.api.items.IBlockOverlayItem; + +import java.util.List; + +/** + * Renders boxes for {@link com.minecolonies.api.items.IBlockOverlayItem} + */ +public class ItemOverlayBoxesRenderer +{ + /** + * Renders overlay boxes into the client. + * + * @param ctx rendering context + */ + static void render(final WorldEventContext ctx) + { + if (ctx.mainHandItem.getItem() instanceof final IBlockOverlayItem overlayItem) + { + final List boxes = overlayItem.getOverlayBoxes(ctx.clientLevel, ctx.clientPlayer, ctx.mainHandItem); + + for (final IBlockOverlayItem.OverlayBox box : boxes) + { + ColonyWorldRenderMacros.renderLineBox(ctx.poseStack, ctx.bufferSource, box.bounds(), box.width(), box.color(), box.showThroughBlocks()); + } + + ColonyWorldRenderMacros.endRenderLineBox(ctx.bufferSource); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/RenderTypes.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/RenderTypes.java index d78009665ba..878bcaedefa 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/RenderTypes.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/RenderTypes.java @@ -1,11 +1,15 @@ package com.minecolonies.coremod.client.render.worldevent; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.Util; import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderStateShard.DepthTestStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import org.lwjgl.opengl.GL11; + import java.util.function.Function; public class RenderTypes @@ -13,16 +17,29 @@ public class RenderTypes /** * Usable for rendering simple flat textures * - * @param resLoc texture location - * @return render type + * @param resLoc texture location + * @return render type */ - public static RenderType getEntityCutoutFront(final ResourceLocation resLoc) + public static RenderType worldEntityIcon(final ResourceLocation resLoc) { - return InnerRenderTypes.ENTITY_CUTOUT_FRONT.apply(resLoc); + return InnerRenderTypes.WORLD_ENTITY_ICON.apply(resLoc); } + /** + * Used to draw overlay lines that only appear outside existing blocks. + */ + public static RenderType LINES_OUTSIDE_BLOCKS = InnerRenderTypes.LINES_OUTSIDE_BLOCKS; + + /** + * Used to draw overlay lines that only appear inside existing blocks. + */ + public static RenderType LINES_INSIDE_BLOCKS = InnerRenderTypes.LINES_INSIDE_BLOCKS; + public static final class InnerRenderTypes extends RenderType { + private static final DepthTestStateShard ALWAYS_DEPTH_TEST = new AlwaysDepthTestStateShard(); + private static final DepthTestStateShard GREATER_DEPTH_TEST = new DepthTestStateShard(">", GL11.GL_GREATER); + private InnerRenderTypes(final String nameIn, final VertexFormat formatIn, final VertexFormat.Mode drawModeIn, @@ -36,17 +53,72 @@ private InnerRenderTypes(final String nameIn, throw new IllegalStateException(); } - private static final Function ENTITY_CUTOUT_FRONT = Util.memoize((p_173202_) -> { - RenderType.CompositeState rendertype$compositestate = RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_CUTOUT_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(p_173202_, false, false)) - .setTransparencyState(NO_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .setDepthTestState(NO_DEPTH_TEST) - .createCompositeState(true); - return create("entity_cutout", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, rendertype$compositestate); + private static final Function WORLD_ENTITY_ICON = Util.memoize((p_173202_) -> { + return create("minecolonies_entity_icon", + DefaultVertexFormat.POSITION_TEX, + VertexFormat.Mode.QUADS, + 1024, + false, + true, + RenderType.CompositeState.builder() + .setShaderState(POSITION_TEX_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(p_173202_, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDepthTestState(ALWAYS_DEPTH_TEST) + .createCompositeState(false)); }); + private static final RenderType LINES_OUTSIDE_BLOCKS = create("minecolonies:lines_outside_blocks", + DefaultVertexFormat.POSITION_COLOR, + VertexFormat.Mode.TRIANGLES, + 1024, + false, + false, + RenderType.CompositeState.builder() + .setTextureState(NO_TEXTURE) + .setShaderState(POSITION_COLOR_SHADER) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDepthTestState(LEQUAL_DEPTH_TEST) + .setCullState(CULL) + .setLightmapState(NO_LIGHTMAP) + .setOverlayState(NO_OVERLAY) + .setLayeringState(NO_LAYERING) + .setOutputState(MAIN_TARGET) + .setTexturingState(DEFAULT_TEXTURING) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(false)); + + private static final RenderType LINES_INSIDE_BLOCKS = create("minecolonies:lines_inside_blocks", + DefaultVertexFormat.POSITION_COLOR, + VertexFormat.Mode.TRIANGLES, + 1024, + false, + false, + RenderType.CompositeState.builder() + .setTextureState(NO_TEXTURE) + .setShaderState(POSITION_COLOR_SHADER) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDepthTestState(GREATER_DEPTH_TEST) + .setCullState(CULL) + .setLightmapState(NO_LIGHTMAP) + .setOverlayState(NO_OVERLAY) + .setLayeringState(NO_LAYERING) + .setOutputState(MAIN_TARGET) + .setTexturingState(DEFAULT_TEXTURING) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(false)); + + } + + private static class AlwaysDepthTestStateShard extends DepthTestStateShard + { + private AlwaysDepthTestStateShard() + { + super("true_always", -1); + setupState = () -> { + RenderSystem.enableDepthTest(); + RenderSystem.depthFunc(GL11.GL_ALWAYS); + }; + } } } diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/WorldEventContext.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/WorldEventContext.java index a5876f9d810..3e932a6c651 100644 --- a/src/main/java/com/minecolonies/coremod/client/render/worldevent/WorldEventContext.java +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/WorldEventContext.java @@ -27,14 +27,14 @@ private WorldEventContext() // singleton } - BufferSource bufferSource; - PoseStack poseStack; - float partialTicks; - ClientLevel clientLevel; - LocalPlayer clientPlayer; - ItemStack mainHandItem; + public BufferSource bufferSource; + public PoseStack poseStack; + public float partialTicks; + public ClientLevel clientLevel; + public LocalPlayer clientPlayer; + public ItemStack mainHandItem; @Nullable - IColonyView nearestColony; + public IColonyView nearestColony; /** * In chunks @@ -59,7 +59,7 @@ public void renderWorldLastEvent(final RenderLevelStageEvent event) if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_CUTOUT_MIPPED_BLOCKS_BLOCKS) { ColonyBorderRenderer.render(this); // renders directly (not into bufferSource) - ColonyBlueprintRenderer.render(this); + ColonyBlueprintRenderer.renderBlueprints(this); ColonyWaypointRenderer.render(this); ColonyPatrolPointRenderer.render(this); GuardTowerRallyBannerRenderer.render(this); @@ -67,9 +67,13 @@ public void renderWorldLastEvent(final RenderLevelStageEvent event) bufferSource.endBatch(); } - else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) + else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { + ColonyBlueprintRenderer.renderBoxes(this); + ItemOverlayBoxesRenderer.render(this); HighlightManager.render(this); + + bufferSource.endBatch(); } poseStack.popPose(); diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/CitizenRenderData.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/CitizenRenderData.java new file mode 100644 index 00000000000..876db8438c2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/CitizenRenderData.java @@ -0,0 +1,84 @@ +package com.minecolonies.coremod.client.render.worldevent.highlightmanager; + +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.coremod.client.render.worldevent.WorldEventContext; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import org.jetbrains.annotations.Nullable; + +import java.time.Duration; + +/** + * Highlight render data for marking a citizen. + */ +public class CitizenRenderData implements IHighlightRenderData +{ + /** + * Which citizen should be marked. + */ + private final int citizenId; + + /** + * How long the citizen should be marked. + */ + private final Duration duration; + + /** + * Default constructor. + */ + public CitizenRenderData(final int citizenId, final Duration duration) + { + this.citizenId = citizenId; + this.duration = duration; + } + + @Override + public void startRender(final WorldEventContext context) + { + final EntityCitizen citizenEntity = getCitizenEntity(context); + if (citizenEntity != null) + { + citizenEntity.setGlowingTag(true); + } + } + + @Override + public void render(final WorldEventContext context) + { + // No-op + } + + @Override + public void stopRender(final WorldEventContext context) + { + final EntityCitizen citizenEntity = getCitizenEntity(context); + if (citizenEntity != null) + { + citizenEntity.setGlowingTag(false); + } + } + + @Override + public @Nullable Duration getDuration() + { + return duration; + } + + @Nullable + private EntityCitizen getCitizenEntity(final WorldEventContext context) + { + final IColonyView colony = context.nearestColony; + if (colony == null) + { + return null; + } + + final ICitizenDataView citizen = colony.getCitizen(citizenId); + if (citizen == null) + { + return null; + } + + return colony.getWorld().getEntity(citizen.getEntityId()) instanceof EntityCitizen entityCitizen ? entityCitizen : null; + } +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/IHighlightRenderData.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/IHighlightRenderData.java new file mode 100644 index 00000000000..4c0a0bc5f93 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/IHighlightRenderData.java @@ -0,0 +1,35 @@ +package com.minecolonies.coremod.client.render.worldevent.highlightmanager; + +import com.minecolonies.coremod.client.render.worldevent.WorldEventContext; +import org.jetbrains.annotations.Nullable; + +import java.time.Duration; + +/** + * Interface for highlightable items. + */ +public interface IHighlightRenderData +{ + /** + * Indicate the render data it should start rendering. + */ + default void startRender(final WorldEventContext context) {} + + /** + * Indicate the render data it should continue rendering. + */ + void render(final WorldEventContext context); + + /** + * Indicate the render data it should stop rendering. + */ + default void stopRender(final WorldEventContext context) {} + + /** + * Get the duration of the highlight. + * + * @return a duration instance, or null for an infinite highlight (should be manually cancelled). + */ + @Nullable + Duration getDuration(); +} diff --git a/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/TimedBoxRenderData.java b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/TimedBoxRenderData.java new file mode 100644 index 00000000000..fb2eb97ca25 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/client/render/worldevent/highlightmanager/TimedBoxRenderData.java @@ -0,0 +1,93 @@ +package com.minecolonies.coremod.client.render.worldevent.highlightmanager; + +import com.ldtteam.structurize.util.WorldRenderMacros; +import com.minecolonies.coremod.client.render.worldevent.ColonyWorldRenderMacros; +import com.minecolonies.coremod.client.render.worldevent.WorldEventContext; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; + +/** + * Highlight render data for marking blocks in the world with potential warnings on them. + */ +public class TimedBoxRenderData implements IHighlightRenderData +{ + /** + * List of texts to display. + */ + private final List text = new ArrayList<>(); + + /** + * Position where to render the box. + */ + private final BlockPos pos; + + /** + * How long the box should stay. + */ + private Duration duration; + + /** + * The colour at which the box should render. + */ + private int argbColor = 0xffffffff; + + /** + * Default constructor. + */ + public TimedBoxRenderData(final BlockPos pos) + { + this.pos = pos; + } + + @Override + public void render(final WorldEventContext context) + { + final MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + ColonyWorldRenderMacros.renderLineBox(context.poseStack, buffer, new AABB(pos), 0.025f, argbColor, true); + if (!text.isEmpty()) + { + WorldRenderMacros.renderDebugText(pos, text, context.poseStack, true, 3, buffer); + } + ColonyWorldRenderMacros.endRenderLineBox(buffer); + buffer.endBatch(); + } + + @Override + public Duration getDuration() + { + return duration; + } + + /** + * Duration of the box. + */ + public TimedBoxRenderData setDuration(final Duration duration) + { + this.duration = duration; + return this; + } + + /** + * List of strings to display + */ + public TimedBoxRenderData addText(final String text) + { + this.text.add(text); + return this; + } + + /** + * Color code for the box, argb format + */ + public TimedBoxRenderData setColor(final int argbColor) + { + this.argbColor = argbColor; + return this; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/CitizenData.java b/src/main/java/com/minecolonies/coremod/colony/CitizenData.java index 614b1b1816f..6621b6babf7 100755 --- a/src/main/java/com/minecolonies/coremod/colony/CitizenData.java +++ b/src/main/java/com/minecolonies/coremod/colony/CitizenData.java @@ -5,6 +5,8 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.modules.IAssignsJob; +import com.minecolonies.api.colony.buildings.modules.IBuildingModule; import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.interactionhandling.IInteractionResponseHandler; import com.minecolonies.api.colony.jobs.IJob; @@ -17,41 +19,42 @@ import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenSkillHandler; import com.minecolonies.api.inventory.InventoryCitizen; +import com.minecolonies.api.quests.IQuestDeliveryObjective; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestManager; import com.minecolonies.api.util.*; import com.minecolonies.api.util.constant.Suppression; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.colony.buildings.modules.LivingBuildingModule; import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; +import com.minecolonies.coremod.colony.interactionhandling.QuestDeliveryInteraction; +import com.minecolonies.coremod.colony.interactionhandling.QuestDialogueInteraction; import com.minecolonies.coremod.colony.interactionhandling.ServerCitizenInteraction; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; -import com.minecolonies.coremod.entity.ai.basic.AbstractAISkeleton; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenHappinessHandler; import com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenMournHandler; import com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenSkillHandler; import com.minecolonies.coremod.util.AttributeModifierUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.*; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.nbt.IntTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; - +import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.ref.WeakReference; import java.util.*; -import java.util.stream.Collectors; import static com.minecolonies.api.entity.citizen.AbstractEntityCitizen.*; import static com.minecolonies.api.research.util.ResearchConstants.HEALTH_BOOST; @@ -59,8 +62,11 @@ import static com.minecolonies.api.util.ItemStackUtils.CAN_EAT; import static com.minecolonies.api.util.constant.BuildingConstants.TAG_ACTIVE; import static com.minecolonies.api.util.constant.CitizenConstants.*; +import static com.minecolonies.api.util.constant.ColonyConstants.UPDATE_SUBSCRIBERS_INTERVAL; +import static com.minecolonies.api.util.constant.Constants.TAG_STRING; import static com.minecolonies.api.util.constant.NbtTagConstants.*; import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.translation.DebugTranslationConstants.DEBUG_WARNING_CITIZEN_LOAD_FAILURE; /** * Extra data for Citizens. @@ -71,7 +77,7 @@ public class CitizenData implements ICitizenData /** * The max health. */ - private static final float MAX_HEALTH = 20.0F; + public static final float MAX_HEALTH = 20.0F; /** * Max levels of an attribute a citizen may initially have. @@ -88,6 +94,11 @@ public class CitizenData implements ICitizenData */ public static final List SUFFIXES = Arrays.asList("_b", "_d", "_a", "_w"); + /** + * Number of sound profiles. + */ + private static final int NUM_SOUND_PROFILES = 4; + /** * The unique citizen id. */ @@ -154,12 +165,6 @@ public class CitizenData implements ICitizenData @Nullable private IBuilding homeBuilding; - /** - * The work building of the citizen. - */ - @Nullable - private IBuilding workBuilding; - /** * The job of the citizen. */ @@ -168,7 +173,7 @@ public class CitizenData implements ICitizenData /** * If the citizen is dirty (Has to be updated on client side). */ - private boolean dirty; + private int dirty = Integer.MAX_VALUE; /** * Its entitity. @@ -226,6 +231,11 @@ public class CitizenData implements ICitizenData */ private VisibleCitizenStatus status; + /** + * The current location of interest. + */ + @Nullable private BlockPos statusPosition; + /** * The citizen data random. */ @@ -271,6 +281,31 @@ public class CitizenData implements ICitizenData */ private int inactivityTimer = DISABLED; + /** + * The list of available quests the citizen can give out. + */ + private final List availableQuests = new ArrayList<>(); + + /** + * The list of participating quests the citizen can give out. + */ + private final List participatingQuests = new ArrayList<>(); + + /** + * Tracking quests the citizen was the quest giver in. + */ + private final List finishedQuests = new ArrayList<>(); + + /** + * Tracking quests the citizen participated in. + */ + private final List finishedQuestParticipation = new ArrayList<>(); + + /** + * The sound profile index. + */ + private int soundProfile; + /** * Create a CitizenData given an ID. Used as a super-constructor or during loading. * @@ -288,12 +323,12 @@ public CitizenData(final int id, final IColony colony) } @Override - public void onResponseTriggered(@NotNull final Component key, @NotNull final Component response, final Player player) + public void onResponseTriggered(@NotNull final Component key, final int responseId, final Player player) { if (citizenChatOptions.containsKey(key)) { - citizenChatOptions.get(key).onServerResponseTriggered(response, player, this); - markDirty(); + citizenChatOptions.get(key).onServerResponseTriggered(responseId, player, this); + markDirty(0); } } @@ -310,6 +345,12 @@ public Optional getEntity() return Optional.ofNullable(citizen); } + @Override + public int getSoundProfile() + { + return soundProfile; + } + @Override public void setEntity(@Nullable final AbstractCivilianEntity citizen) { @@ -326,16 +367,19 @@ public void setEntity(@Nullable final AbstractCivilianEntity citizen) } @Override - public void markDirty() + public void markDirty(final int time) { - dirty = true; - colony.getCitizenManager().markDirty(); + dirty = Math.min(dirty, time); + if (isDirty()) + { + colony.getCitizenManager().markDirty(); + } } /** * Returns a random element in a list. * - * @param rand Random object. + * @param rand Random object. * @param list Array to select from. * @return Random element from array. */ @@ -402,6 +446,7 @@ public void initForNewCivilian() //Assign the gender before name female = random.nextBoolean(); textureSuffix = SUFFIXES.get(random.nextInt(SUFFIXES.size())); + soundProfile = random.nextInt(NUM_SOUND_PROFILES); paused = false; name = generateName(random, female, getColony(), getColony().getCitizenNameFile()); textureId = random.nextInt(255); @@ -411,7 +456,7 @@ public void initForNewCivilian() citizenSkillHandler.init(levelCap); - markDirty(); + markDirty(0); } /** @@ -449,6 +494,11 @@ public void initEntityValues() citizen.getEntityData().set(DATA_JOB, getJob() == null ? "" : getJob().getJobRegistryEntry().getKey().toString()); citizen.getEntityData().set(DATA_STYLE, colony.getTextureStyleId()); + if (getBedPos().equals(BlockPos.ZERO)) + { + citizen.getCitizenSleepHandler().onWakeUp(); + } + citizen.getCitizenExperienceHandler().updateLevel(); setLastPosition(citizen.blockPosition()); @@ -459,7 +509,7 @@ public void initEntityValues() applyItemModifiers(citizen); - markDirty(); + markDirty(0); } /** @@ -471,7 +521,16 @@ private void applyItemModifiers(AbstractEntityCitizen citizen) { for (final EquipmentSlot slot : EquipmentSlot.values()) { - final ItemStack stack = citizen.getItemBySlot(slot); + final ItemStack stack; + if (slot.getType() == EquipmentSlot.Type.ARMOR) + { + stack = citizen.getInventoryCitizen().getArmorInSlot(slot); + } + else + { + stack = citizen.getItemBySlot(slot); + } + if (!ItemStackUtils.isEmpty(stack)) { citizen.getAttributes().addTransientAttributeModifiers(stack.getAttributeModifiers(slot)); @@ -482,7 +541,7 @@ private void applyItemModifiers(AbstractEntityCitizen citizen) /** * Generates a random name from a set of names. * - * @param rand Random object. + * @param rand Random object. * @param female the gender * @param colony the colony. * @return Name of the citizen. @@ -587,7 +646,7 @@ public void generateName(@NotNull final Random rand, final String firstParentNam { if (nameFile.parts == 3) { - middleInitial = firstParentNameSplit[eastern? 0 : firstParentNameSplit.length - 1].substring(0, 1); + middleInitial = firstParentNameSplit[eastern ? 0 : firstParentNameSplit.length - 1].substring(0, 1); lastName = secondParentNameSplit[eastern ? 0 : secondParentNameSplit.length - 1]; } else @@ -654,7 +713,8 @@ else if (nameFile.parts == 2) @Override public boolean isRelatedTo(final ICitizenData data) { - return siblings.contains(data.getId()) || children.contains(data.getId()) || partner == data.getId() || parents.getA().equals(data.getName()) || parents.getB().equals(data.getName()); + return siblings.contains(data.getId()) || children.contains(data.getId()) || partner == data.getId() || parents.getA().equals(data.getName()) || parents.getB() + .equals(data.getName()); } @Override @@ -680,7 +740,7 @@ public void setGenderAndGenerateName(final boolean isFemale) { this.female = isFemale; this.name = generateName(random, isFemale, getColony(), getColony().getCitizenNameFile()); - markDirty(); + markDirty(0); } @Override @@ -693,7 +753,7 @@ public void setGender(final boolean isFemale) public void setPaused(final boolean p) { this.paused = p; - markDirty(); + markDirty(40); } @Override @@ -711,13 +771,25 @@ public int getTextureId() @Override public boolean isDirty() { - return dirty; + return dirty <= 0; } @Override public void clearDirty() { - dirty = false; + if (isDirty()) + { + dirty = Integer.MAX_VALUE; + } + + if (dirty > 0) + { + dirty -= UPDATE_SUBSCRIBERS_INTERVAL; + if (isDirty()) + { + colony.getCitizenManager().markDirty(); + } + } } @Override @@ -727,11 +799,6 @@ public void onRemoveBuilding(final IBuilding building) { setHomeBuilding(null); } - - if (workBuilding != null && workBuilding.getID().equals(building.getID())) - { - setWorkBuilding(null); - } } @Override @@ -750,7 +817,7 @@ public void setHomeBuilding(@Nullable final IBuilding building) } homeBuilding = building; - markDirty(); + markDirty(0); if (getEntity().isPresent() && getEntity().get().getCitizenJobHandler().getColonyJob() == null) { @@ -764,53 +831,11 @@ public void setHomeBuilding(@Nullable final IBuilding building) @Nullable public IBuilding getWorkBuilding() { - if (job == null && workBuilding != null) - { - setWorkBuilding(null); - } - return workBuilding; - } - - @Override - public void setWorkBuilding(@Nullable final IBuilding building) - { - if (workBuilding != null && building != null && workBuilding != building) - { - Log.getLogger().warn("CitizenData.setWorkBuilding() - already assigned a work building when setting a new work building"); - } - else if (workBuilding != building) + if (job == null) { - workBuilding = building; - - if (workBuilding != null) - { - // We have a place to work, do we have the assigned Job? - if (job == null) - { - // If this is null, something is very wrong! - final WorkerBuildingModule module = building.getModuleMatching(WorkerBuildingModule.class, m -> m.getAssignedCitizen().contains(this)); - // No job, create one! - setJob(module.createJob(this)); - colony.getWorkManager().clearWorkForCitizen(this); - } - } - else if (job != null) - { - getEntity().ifPresent(entityCitizen -> { - entityCitizen.getTasks() - .availableGoals.stream() - .filter(task -> task.getGoal() instanceof AbstractAISkeleton) - .findFirst() - .ifPresent(e -> entityCitizen.getTasks().removeGoal(e)); - }); - - // No place of employment, get rid of our job - setJob(null); - colony.getWorkManager().clearWorkForCitizen(this); - } - - markDirty(); + return null; } + return job.getWorkBuilding(); } @Override @@ -847,13 +872,15 @@ public void setJob(final IJob job) { if (this.job != null && job == null) { - this.job.onRemoval(); + final IJob oldJob = this.job; + this.job = null; + oldJob.onRemoval(); } this.job = job; getEntity().ifPresent(entityCitizen -> entityCitizen.getCitizenJobHandler().onJobChanged(job)); - markDirty(); + markDirty(0); } @Override @@ -886,18 +913,14 @@ public void serializeViewNetworkData(@NotNull final FriendlyByteBuf buf) buf.writeBlockPos(homeBuilding.getID()); } - buf.writeBoolean(workBuilding != null); - if (workBuilding != null) + buf.writeBoolean(getWorkBuilding() != null); + if (getWorkBuilding() != null) { - buf.writeBlockPos(workBuilding.getID()); + buf.writeBlockPos(getWorkBuilding().getID()); } - // If the entity is not present we assumes standard values. - buf.writeFloat(getEntity().map(AbstractEntityCitizen::getHealth).orElse(MAX_HEALTH)); - buf.writeFloat(getEntity().map(AbstractEntityCitizen::getMaxHealth).orElse(MAX_HEALTH)); - buf.writeDouble(getSaturation()); - buf.writeDouble(citizenHappinessHandler.getHappiness(getColony())); + buf.writeDouble(citizenHappinessHandler.getHappiness(getColony(), this)); buf.writeNbt(citizenSkillHandler.write()); @@ -906,13 +929,13 @@ public void serializeViewNetworkData(@NotNull final FriendlyByteBuf buf) buf.writeInt(colony.getID()); final CompoundTag compound = new CompoundTag(); - compound.put("inventory", inventory.write(new ListTag())); + inventory.write(compound); buf.writeNbt(compound); buf.writeBlockPos(lastPosition); if (colony.getWorld() != null) { - final List subInteractions = citizenChatOptions.values().stream().filter(e -> e.isVisible(colony.getWorld())).collect(Collectors.toList()); + final List subInteractions = citizenChatOptions.values().stream().filter(e -> e.isVisible(colony.getWorld())).toList(); buf.writeInt(subInteractions.size()); for (final IInteractionResponseHandler interactionHandler : subInteractions) @@ -931,6 +954,12 @@ public void serializeViewNetworkData(@NotNull final FriendlyByteBuf buf) buf.writeInt(status != null ? status.getId() : -1); + buf.writeBoolean(statusPosition != null); + if (statusPosition != null) + { + buf.writeBlockPos(statusPosition); + } + buf.writeBoolean(job != null); if (job != null) { @@ -958,6 +987,18 @@ public void serializeViewNetworkData(@NotNull final FriendlyByteBuf buf) } buf.writeUtf(parents.getA()); buf.writeUtf(parents.getB()); + + buf.writeInt(availableQuests.size()); + for (final ResourceLocation av : availableQuests) + { + buf.writeResourceLocation(av); + } + + buf.writeInt(participatingQuests.size()); + for (final ResourceLocation av : participatingQuests) + { + buf.writeResourceLocation(av); + } } @Override @@ -1078,7 +1119,7 @@ public void restartDone() public void setIsChild(final boolean isChild) { this.isChild = isChild; - markDirty(); + markDirty(0); if (colony != null) { @@ -1112,6 +1153,7 @@ public CompoundTag serializeNBT() nbtTagCompound.putInt(TAG_ID, id); nbtTagCompound.putString(TAG_NAME, name); nbtTagCompound.putString(TAG_SUFFIX, textureSuffix); + nbtTagCompound.putInt(TAG_SOUND_PROFILE, soundProfile); nbtTagCompound.putBoolean(TAG_FEMALE, female); nbtTagCompound.putBoolean(TAG_PAUSED, paused); @@ -1136,7 +1178,7 @@ public CompoundTag serializeNBT() citizenHappinessHandler.write(nbtTagCompound); citizenMournHandler.write(nbtTagCompound); - nbtTagCompound.put(TAG_INVENTORY, inventory.write(new ListTag())); + inventory.write(nbtTagCompound); nbtTagCompound.putInt(TAG_HELD_ITEM_SLOT, inventory.getHeldItemSlot(InteractionHand.MAIN_HAND)); nbtTagCompound.putInt(TAG_OFFHAND_HELD_ITEM_SLOT, inventory.getHeldItemSlot(InteractionHand.OFF_HAND)); @@ -1174,6 +1216,36 @@ public CompoundTag serializeNBT() nbtTagCompound.putInt(TAG_PARTNER, partner); nbtTagCompound.putBoolean(TAG_ACTIVE, this.isWorking); + + @NotNull final ListTag avQuestNBT = new ListTag(); + for (final ResourceLocation quest : availableQuests) + { + avQuestNBT.add(StringTag.valueOf(quest.toString())); + } + nbtTagCompound.put(TAG_AV_QUESTS, avQuestNBT); + + @NotNull final ListTag partQuestNBT = new ListTag(); + for (final ResourceLocation quest : participatingQuests) + { + partQuestNBT.add(StringTag.valueOf(quest.toString())); + } + nbtTagCompound.put(TAG_PART_QUESTS, partQuestNBT); + + @NotNull final ListTag finishedQuestNBT = new ListTag(); + for (final ResourceLocation quest : finishedQuests) + { + finishedQuestNBT.add(StringTag.valueOf(quest.toString())); + } + nbtTagCompound.put(TAG_FINISHED_AV_QUESTS, finishedQuestNBT); + + @NotNull final ListTag finishedPartQuestNBT = new ListTag(); + for (final ResourceLocation quest : finishedQuestParticipation) + { + finishedPartQuestNBT.add(StringTag.valueOf(quest.toString())); + } + nbtTagCompound.put(TAG_FINISHED_PART_QUESTS, finishedPartQuestNBT); + + return nbtTagCompound; } @@ -1186,7 +1258,7 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) isChild = nbtTagCompound.getBoolean(TAG_CHILD); textureId = nbtTagCompound.getInt(TAG_TEXTURE); - if (nbtTagCompound.getAllKeys().contains(TAG_SUFFIX)) + if (nbtTagCompound.contains(TAG_SUFFIX)) { textureSuffix = nbtTagCompound.getString(TAG_SUFFIX); } @@ -1195,6 +1267,15 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) textureSuffix = SUFFIXES.get(random.nextInt(SUFFIXES.size())); } + if (nbtTagCompound.contains(TAG_SOUND_PROFILE)) + { + soundProfile = nbtTagCompound.getInt(TAG_SOUND_PROFILE); + } + else + { + soundProfile = random.nextInt(NUM_SOUND_PROFILES); + } + lastPosition = BlockPosUtil.read(nbtTagCompound, TAG_POS); if (nbtTagCompound.contains(TAG_RESPAWN_POS)) @@ -1206,15 +1287,14 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) saturation = nbtTagCompound.getDouble(TAG_SATURATION); - if (nbtTagCompound.getAllKeys().contains("job")) + if (nbtTagCompound.contains("job")) { setJob(IJobDataManager.getInstance().createFrom(this, nbtTagCompound.getCompound("job"))); } - if (nbtTagCompound.getAllKeys().contains(TAG_INVENTORY)) + if (nbtTagCompound.contains(TAG_INVENTORY)) { - final ListTag nbttaglist = nbtTagCompound.getList(TAG_INVENTORY, 10); - this.inventory.read(nbttaglist); + this.inventory.read(nbtTagCompound); this.inventory.setHeldItem(InteractionHand.MAIN_HAND, nbtTagCompound.getInt(TAG_HELD_ITEM_SLOT)); this.inventory.setHeldItem(InteractionHand.OFF_HAND, nbtTagCompound.getInt(TAG_OFFHAND_HELD_ITEM_SLOT)); } @@ -1224,37 +1304,44 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) name = generateName(random, isFemale(), getColony(), getColony().getCitizenNameFile()); } - if (nbtTagCompound.getAllKeys().contains(TAG_ASLEEP)) + if (nbtTagCompound.contains(TAG_ASLEEP)) { bedPos = BlockPosUtil.read(nbtTagCompound, TAG_BEDS); isAsleep = nbtTagCompound.getBoolean(TAG_ASLEEP); } - if (nbtTagCompound.getAllKeys().contains(TAG_JUST_ATE)) + if (nbtTagCompound.contains(TAG_JUST_ATE)) { justAte = nbtTagCompound.getBoolean(TAG_JUST_ATE); } // Citizen chat options. - if (nbtTagCompound.getAllKeys().contains(TAG_CHAT_OPTIONS)) + if (nbtTagCompound.contains(TAG_CHAT_OPTIONS)) { final ListTag handlerTagList = nbtTagCompound.getList(TAG_CHAT_OPTIONS, Tag.TAG_COMPOUND); for (int i = 0; i < handlerTagList.size(); ++i) { - final ServerCitizenInteraction handler = - (ServerCitizenInteraction) MinecoloniesAPIProxy.getInstance() - .getInteractionResponseHandlerDataManager() - .createFrom(this, handlerTagList.getCompound(i).getCompound(TAG_CHAT_OPTION)); - citizenChatOptions.put(handler.getInquiry(), handler); + try + { + final ServerCitizenInteraction handler = + (ServerCitizenInteraction) MinecoloniesAPIProxy.getInstance() + .getInteractionResponseHandlerDataManager() + .createFrom(this, handlerTagList.getCompound(i).getCompound(TAG_CHAT_OPTION)); + citizenChatOptions.put(handler.getId(), handler); + } + catch (final Exception ex) + { + Log.getLogger().warn("Failed to load Interaction for a quest. Did the quest vanish?", ex); + } } } this.citizenHappinessHandler.read(nbtTagCompound); this.citizenMournHandler.read(nbtTagCompound); - if (nbtTagCompound.getAllKeys().contains(TAG_LEVEL_MAP) && !nbtTagCompound.getAllKeys().contains(TAG_NEW_SKILLS)) + if (nbtTagCompound.contains(TAG_LEVEL_MAP) && !nbtTagCompound.contains(TAG_NEW_SKILLS)) { - citizenSkillHandler.init((int) citizenHappinessHandler.getHappiness(getColony())); + citizenSkillHandler.init((int) citizenHappinessHandler.getHappiness(getColony(), this)); final Map levels = new HashMap<>(); final ListTag levelTagList = nbtTagCompound.getList(TAG_LEVEL_MAP, Tag.TAG_COMPOUND); for (int i = 0; i < levelTagList.size(); ++i) @@ -1295,10 +1382,64 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) partner = nbtTagCompound.getInt(TAG_PARTNER); this.isWorking = nbtTagCompound.getBoolean(TAG_ACTIVE); + + @NotNull final ListTag availQuestNbt = nbtTagCompound.getList(TAG_AV_QUESTS, TAG_STRING); + for (int i = 0; i < availQuestNbt.size(); i++) + { + availableQuests.add(new ResourceLocation(availQuestNbt.getString(i))); + } + + @NotNull final ListTag partQuestsNbt = nbtTagCompound.getList(TAG_PART_QUESTS, TAG_STRING); + for (int i = 0; i < partQuestsNbt.size(); i++) + { + participatingQuests.add(new ResourceLocation(partQuestsNbt.getString(i))); + } + + @NotNull final ListTag finQuestNbt = nbtTagCompound.getList(TAG_FINISHED_AV_QUESTS, TAG_STRING); + for (int i = 0; i < finQuestNbt.size(); i++) + { + finishedQuests.add(new ResourceLocation(finQuestNbt.getString(i))); + } + + @NotNull final ListTag finPartQuestsNbt = nbtTagCompound.getList(TAG_FINISHED_PART_QUESTS, TAG_STRING); + for (int i = 0; i < finPartQuestsNbt.size(); i++) + { + finishedQuestParticipation.add(new ResourceLocation(finPartQuestsNbt.getString(i))); + } } @Override - public void tick() + public void onBuildingLoad() + { + if (job == null || job.getBuildingPos() == null) + { + return; + } + + if (job.getBuildingPos() != null && job.getWorkBuilding() == null) + { + final IBuilding building = colony.getBuildingManager().getBuilding(job.getBuildingPos()); + + if (building != null) + { + for (final IAssignsJob module : building.getModules(IAssignsJob.class)) + { + if (module.getJobEntry().equals(job.getJobRegistryEntry()) && module.assignCitizen(this)) + { + break; + } + } + } + + if (building == null || job.getWorkBuilding() == null) + { + setJob(null); + } + } + } + + @Override + public void update() { if (!getEntity().isPresent() || !getEntity().get().isAlive()) { @@ -1331,17 +1472,17 @@ public void tick() if (!toRemove.isEmpty()) { - markDirty(); + markDirty(20 * 10); } for (final IInteractionResponseHandler handler : toRemove) { - citizenChatOptions.remove(handler.getInquiry()); + citizenChatOptions.remove(handler.getId()); for (final Component comp : handler.getPossibleResponses()) { if (citizenChatOptions.containsKey(handler.getResponseResult(comp))) { - citizenChatOptions.get(handler.getResponseResult(comp)).removeParent(handler.getInquiry()); + citizenChatOptions.get(handler.getResponseResult(comp)).removeParent(handler.getId()); } } } @@ -1350,14 +1491,14 @@ public void tick() @Override public void triggerInteraction(@NotNull final IInteractionResponseHandler handler) { - if (!this.citizenChatOptions.containsKey(handler.getInquiry())) + if (!this.citizenChatOptions.containsKey(handler.getId())) { - this.citizenChatOptions.put(handler.getInquiry(), handler); + this.citizenChatOptions.put(handler.getId(), handler); for (final IInteractionResponseHandler childHandler : handler.genChildInteractions()) { - this.citizenChatOptions.put(childHandler.getInquiry(), (ServerCitizenInteraction) childHandler); + this.citizenChatOptions.put(childHandler.getId(), (ServerCitizenInteraction) childHandler); } - markDirty(); + markDirty(20 * 5); } } @@ -1429,11 +1570,27 @@ public void setVisibleStatus(final VisibleCitizenStatus status) { if (this.status != status) { - markDirty(); + markDirty(20); } this.status = status; } + @Override + public @Nullable BlockPos getStatusPosition() + { + return this.statusPosition; + } + + @Override + public void setStatusPosition(@Nullable BlockPos pos) + { + if (!Objects.equals(this.statusPosition, pos)) + { + this.statusPosition = pos; + markDirty(20); + } + } + /** * Loads this citizen data from nbt * @@ -1471,7 +1628,9 @@ public void applyResearchEffects() AttributeModifierUtils.addModifier(citizen, speedModifier, Attributes.MOVEMENT_SPEED); final AttributeModifier healthModLevel = - new AttributeModifier(HEALTH_BOOST.toString(), colony.getResearchManager().getResearchEffects().getEffectStrength(HEALTH_BOOST), AttributeModifier.Operation.ADDITION); + new AttributeModifier(HEALTH_BOOST.toString(), + colony.getResearchManager().getResearchEffects().getEffectStrength(HEALTH_BOOST), + AttributeModifier.Operation.ADDITION); AttributeModifierUtils.addHealthModifier(citizen, healthModLevel); } } @@ -1484,7 +1643,7 @@ public void onGoSleep() return; } - if (workBuilding != null && !workBuilding.isGuardBuildingNear() && !WorldUtil.isPeaceful(colony.getWorld())) + if (job != null && job.getWorkBuilding() != null && !job.getWorkBuilding().isGuardBuildingNear() && !WorldUtil.isPeaceful(colony.getWorld())) { triggerInteraction(new StandardInteraction(Component.translatable(CITIZEN_NOT_GUARD_NEAR_WORK), Component.translatable(CITIZEN_NOT_GUARD_NEAR_WORK), @@ -1497,6 +1656,8 @@ public void onGoSleep() Component.translatable(CITIZEN_NOT_GUARD_NEAR_HOME), ChatPriority.CHITCHAT)); } + + decreaseSaturation(job == null || job.getWorkBuilding().getBuildingLevel() == 0 ? 1 : (SATURATION_DECREASE_FACTOR * Math.pow(2, job.getWorkBuilding().getBuildingLevel())) * 2); } @Override @@ -1531,9 +1692,8 @@ public boolean isWorking() @Override public void onResurrect() { - this.workBuilding = null; this.homeBuilding = null; - this.job = null; + setJob(null); } @Override @@ -1614,4 +1774,71 @@ public void setParents(final String firstParent, final String secondParent) { this.parents = new Tuple<>(firstParent, secondParent); } + + @Override + public void setIdleDays(final int days) + { + + } + + @Override + public void assignQuest(final IQuestInstance quest) + { + this.availableQuests.add(quest.getId()); + } + + @Override + public void openDialogue(final IQuestInstance quest, final int index) + { + final Component comp = Component.literal(quest.getId().toString()); + if (IQuestManager.GLOBAL_SERVER_QUESTS.get(quest.getId()).getObjective(index) instanceof IQuestDeliveryObjective) + { + citizenChatOptions.put(comp, new QuestDeliveryInteraction(comp, ChatPriority.CHITCHAT, quest.getId(), index, this)); + } + else + { + citizenChatOptions.put(comp, new QuestDialogueInteraction(comp, ChatPriority.CHITCHAT, quest.getId(), index, this)); + } + this.markDirty(0); + } + + @Override + public void addQuestParticipation(final IQuestInstance quest) + { + this.participatingQuests.add(quest.getId()); + } + + @Override + public void onQuestDeletion(final ResourceLocation questId) + { + this.availableQuests.remove(questId); + this.participatingQuests.remove(questId); + } + + @Override + public boolean isParticipantOfQuest(final ResourceLocation questId) + { + return this.availableQuests.contains(questId) || this.participatingQuests.contains(questId); + } + + @Override + public void onQuestCompletion(final ResourceLocation questId) + { + if (this.availableQuests.contains(questId)) + { + this.availableQuests.remove(questId); + this.finishedQuests.add(questId); + } + else if (this.participatingQuests.contains(questId)) + { + this.participatingQuests.remove(questId); + this.finishedQuestParticipation.add(questId); + } + } + + @Override + public void onInteractionClosed(final Component key, final ServerPlayer sender) + { + citizenChatOptions.get(key).onClosed(); + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/CitizenDataManager.java b/src/main/java/com/minecolonies/coremod/colony/CitizenDataManager.java index 26e84d3b3db..30f25941606 100755 --- a/src/main/java/com/minecolonies/coremod/colony/CitizenDataManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/CitizenDataManager.java @@ -22,7 +22,7 @@ public ICitizenData createFromNBT(@NotNull final CompoundTag compound, final ICo @Override public ICitizenDataView createFromNetworkData(final int id, @NotNull final FriendlyByteBuf networkBuffer, final IColonyView colonyView) { - ICitizenDataView citizenDataView = colonyView.getCitizen(id) == null ? new CitizenDataView(id) : colonyView.getCitizen(id); + ICitizenDataView citizenDataView = colonyView.getCitizen(id) == null ? new CitizenDataView(id, colonyView) : colonyView.getCitizen(id); try { diff --git a/src/main/java/com/minecolonies/coremod/colony/CitizenDataView.java b/src/main/java/com/minecolonies/coremod/colony/CitizenDataView.java index 0a42d77e77e..1280fcd554f 100644 --- a/src/main/java/com/minecolonies/coremod/colony/CitizenDataView.java +++ b/src/main/java/com/minecolonies/coremod/colony/CitizenDataView.java @@ -2,6 +2,7 @@ import com.minecolonies.api.MinecoloniesAPIProxy; import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.interactionhandling.ChatPriority; @@ -19,13 +20,15 @@ import com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenHappinessHandler; import com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenSkillHandler; import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.InteractionHand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,6 +36,7 @@ import java.util.stream.Collectors; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_OFFHAND_HELD_ITEM_SLOT; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_CITIZEN_UNEMPLOYED; /** * The CitizenDataView is the client-side representation of a CitizenData. Views contain the CitizenData's data that is relevant to a Client, in a more client-friendly form. @@ -56,6 +60,7 @@ public class CitizenDataView implements ICitizenDataView * Attributes. */ private final int id; + private final IColonyView colonyView; protected int entityId; protected String name; protected boolean female; @@ -72,8 +77,6 @@ public class CitizenDataView implements ICitizenDataView /** * Placeholder skills. */ - private double health; - private double maxHealth; private double saturation; /** @@ -126,6 +129,11 @@ public class CitizenDataView implements ICitizenDataView */ private VisibleCitizenStatus statusIcon; + /** + * The current location of interest. + */ + @Nullable private BlockPos statusPosition; + /** * Parents of the citizen. */ @@ -146,16 +154,27 @@ public class CitizenDataView implements ICitizenDataView */ private Integer partner; + /** + * The list of available quests the citizen can give out. + */ + private final List availableQuests = new ArrayList<>(); + + /** + * The list of participating quests the citizen can give out. + */ + private final List participatingQuests = new ArrayList<>(); + /** * Set View id. * * @param id the id to set. */ - protected CitizenDataView(final int id) + protected CitizenDataView(final int id, final IColonyView colonyView) { this.id = id; this.citizenSkillHandler = new CitizenSkillHandler(); this.citizenHappinessHandler = new CitizenHappinessHandler(); + this.colonyView = colonyView; } @Override @@ -188,6 +207,12 @@ public boolean isPaused() return paused; } + @Override + public IColony getColony() + { + return colonyView; + } + @Override public boolean isChild() { @@ -209,6 +234,12 @@ public String getJob() return job; } + @Override + public MutableComponent getJobComponent() + { + return job.isEmpty() ? Component.translatable(COM_MINECOLONIES_COREMOD_GUI_TOWNHALL_CITIZEN_UNEMPLOYED) : Component.translatable(job); + } + @Override @Nullable public BlockPos getHomeBuilding() @@ -256,13 +287,27 @@ public double getSaturation() @Override public double getHealth() { - return health; + final Entity entity = colonyView.getWorld().getEntity(entityId); + + if (entity instanceof LivingEntity) + { + return ((LivingEntity) entity).getHealth(); + } + + return CitizenData.MAX_HEALTH; } @Override public double getMaxHealth() { - return maxHealth; + final Entity entity = colonyView.getWorld().getEntity(entityId); + + if (entity instanceof LivingEntity) + { + return ((LivingEntity) entity).getMaxHealth(); + } + + return CitizenData.MAX_HEALTH; } @Override @@ -283,10 +328,6 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) homeBuilding = buf.readBoolean() ? buf.readBlockPos() : null; workBuilding = buf.readBoolean() ? buf.readBlockPos() : null; - // Attributes - health = buf.readFloat(); - maxHealth = buf.readFloat(); - saturation = buf.readDouble(); happiness = buf.readDouble(); @@ -298,8 +339,7 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) final CompoundTag compound = buf.readNbt(); inventory = new InventoryCitizen(this.name, true); - final ListTag ListNBT = compound.getList("inventory", 10); - this.inventory.read(ListNBT); + this.inventory.read(compound); this.inventory.setHeldItem(InteractionHand.MAIN_HAND, compound.getInt(TAG_HELD_ITEM_SLOT)); this.inventory.setHeldItem(InteractionHand.OFF_HAND, compound.getInt(TAG_OFFHAND_HELD_ITEM_SLOT)); @@ -321,6 +361,7 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) int statusindex = buf.readInt(); statusIcon = statusindex >= 0 ? VisibleCitizenStatus.getForId(statusindex) : null; + statusPosition = buf.readBoolean() ? buf.readBlockPos() : null; if (buf.readBoolean()) { @@ -351,6 +392,21 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) final String parentA = buf.readUtf(); final String parentB = buf.readUtf(); parents = new Tuple<>(parentA, parentB); + + availableQuests.clear(); + participatingQuests.clear(); + + final int avSize = buf.readInt(); + for (int i = 0; i < avSize; i++) + { + availableQuests.add(buf.readResourceLocation()); + } + + final int partSize = buf.readInt(); + for (int i = 0; i < partSize; i++) + { + participatingQuests.add(buf.readResourceLocation()); + } } @Override @@ -386,10 +442,12 @@ public boolean hasBlockingInteractions() return false; } - final IInteractionResponseHandler interaction = sortedInteractions.get(0); - if (interaction != null) + for (final IInteractionResponseHandler interaction : sortedInteractions) { - return interaction.getPriority().getPriority() >= ChatPriority.IMPORTANT.getPriority(); + if (interaction.getPriority().getPriority() >= ChatPriority.IMPORTANT.getPriority()) + { + return true; + } } return false; @@ -403,12 +461,13 @@ public boolean hasVisibleInteractions() return false; } - final IInteractionResponseHandler interaction = sortedInteractions.get(0); - if (interaction != null) + for (final IInteractionResponseHandler interaction : sortedInteractions) { - return interaction.getPriority().getPriority() >= ChatPriority.CHITCHAT.getPriority(); + if (interaction.getPriority().getPriority() >= ChatPriority.CHITCHAT.getPriority()) + { + return true; + } } - return false; } @@ -420,10 +479,12 @@ public boolean hasPendingInteractions() return false; } - final IInteractionResponseHandler interaction = sortedInteractions.get(0); - if (interaction != null) + for (final IInteractionResponseHandler interaction : sortedInteractions) { - return interaction.isPrimary(); + if (interaction.isPrimary()) + { + return true; + } } return false; @@ -471,6 +532,12 @@ public VisibleCitizenStatus getVisibleStatus() return statusIcon; } + @Override + public @Nullable BlockPos getStatusPosition() + { + return statusPosition; + } + @Nullable @Override public Integer getPartner() diff --git a/src/main/java/com/minecolonies/coremod/colony/Colony.java b/src/main/java/com/minecolonies/coremod/colony/Colony.java index 0abc34fab57..c282d67a174 100644 --- a/src/main/java/com/minecolonies/coremod/colony/Colony.java +++ b/src/main/java/com/minecolonies/coremod/colony/Colony.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.colony; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.colony.*; import com.minecolonies.api.colony.buildings.IBuilding; @@ -15,6 +16,7 @@ import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.quests.IQuestManager; import com.minecolonies.api.research.IResearchManager; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.Log; @@ -26,13 +28,14 @@ import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.managers.*; +import com.minecolonies.coremod.colony.permissions.ColonyPermissionEventHandler; import com.minecolonies.coremod.colony.permissions.Permissions; import com.minecolonies.coremod.colony.pvp.AttackingPlayer; import com.minecolonies.coremod.colony.requestsystem.management.manager.StandardRequestManager; import com.minecolonies.coremod.colony.workorders.WorkManager; import com.minecolonies.coremod.datalistener.CitizenNameListener; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewRemoveWorkOrderMessage; -import com.minecolonies.coremod.permissions.ColonyPermissionEventHandler; +import com.minecolonies.coremod.quests.QuestManager; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; @@ -59,6 +62,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.time.LocalDateTime; +import java.time.Month; import java.util.*; import static com.minecolonies.api.colony.ColonyState.*; @@ -178,15 +183,25 @@ public class Colony implements IColony */ private final IStatisticsManager statisticManager = new StatisticsManager(this); + /** + * Reputation manager of the colony. + */ + private final IStatisticsManager reputationManager = new StatisticsManager(this); + + /** + * Quest manager for this colony + */ + private IQuestManager questManager; + /** * The Positions which players can freely interact. */ - private final Set freePositions = new HashSet<>(); + private ImmutableSet freePositions = ImmutableSet.of(); /** * The Blocks which players can freely interact with. */ - private final Set freeBlocks = new HashSet<>(); + private ImmutableSet freeBlocks = ImmutableSet.of(); /** * Colony permission event handler. @@ -268,12 +283,12 @@ public class Colony implements IColony /** * The colonies state machine */ - private final ITickRateStateMachine colonyStateMachine; + private ITickRateStateMachine colonyStateMachine = null; /** * If the colony is dirty. */ - private boolean isActive = true; + private boolean isDirty = true; /** * The colony team color. @@ -284,8 +299,8 @@ public class Colony implements IColony * The colony flag, as a list of patterns. */ private ListTag colonyFlag = new BannerPattern.Builder() - .addPattern(BannerPatterns.BASE, DyeColor.WHITE) - .toListTag(); + .addPattern(BannerPatterns.BASE, DyeColor.WHITE) + .toListTag(); /** * The last time the mercenaries were used. @@ -347,6 +362,7 @@ public class Colony implements IColony this.permissions = new Permissions(this); requestManager = new StandardRequestManager(this); researchManager = new ResearchManager(this); + questManager = new QuestManager(this); } /** @@ -357,6 +373,7 @@ public class Colony implements IColony */ protected Colony(final int id, @Nullable final Level world) { + questManager = new QuestManager(this); this.id = id; if (world != null) { @@ -366,7 +383,11 @@ protected Colony(final int id, @Nullable final Level world) } this.permissions = new Permissions(this); researchManager = new ResearchManager(this); - colonyStateMachine = new TickRateStateMachine<>(INACTIVE, e -> {}); + colonyStateMachine = new TickRateStateMachine<>(INACTIVE, e -> + { + Log.getLogger().warn("Exception triggered in colony:"+getID()+" in dimension:"+getDimension().location(), e); + colonyStateMachine.setCurrentDelay(20 * 60 * 5); + }); colonyStateMachine.addTransition(new TickingTransition<>(INACTIVE, () -> true, this::updateState, UPDATE_STATE_INTERVAL)); colonyStateMachine.addTransition(new TickingTransition<>(UNLOADED, () -> true, this::updateState, UPDATE_STATE_INTERVAL)); @@ -396,13 +417,13 @@ private ColonyState updateState() if (!packageManager.getCloseSubscribers().isEmpty() || (loadedChunks.size() > 40 && !packageManager.getImportantColonyPlayers().isEmpty())) { - isActive = true; + isDirty = true; return ACTIVE; } if (!packageManager.getImportantColonyPlayers().isEmpty() || forceLoadTimer > 0) { - isActive = true; + isDirty = true; return UNLOADED; } @@ -450,6 +471,7 @@ private boolean worldTickSlow() graveManager.onColonyTick(this); workManager.onColonyTick(this); reproductionManager.onColonyTick(this); + questManager.onColonyTick(); final long currTime = System.currentTimeMillis(); if (lastOnlineTime != 0) @@ -482,7 +504,7 @@ private void updateChunkLoadTimer() { if (getPermissions().hasPermission(sub, Action.CAN_KEEP_COLONY_ACTIVE_WHILE_AWAY)) { - this.forceLoadTimer = CHUNK_UNLOAD_DELAY; + this.forceLoadTimer = getConfig().getServer().loadtime.get() * 20 * 60; pendingChunks.addAll(pendingToUnloadChunks); for (final long pending : pendingChunks) { @@ -729,11 +751,11 @@ public void read(@NotNull final CompoundTag compound) buildingManager.read(compound.getCompound(TAG_BUILDING_MANAGER)); // Recalculate max after citizens and buildings are loaded. - citizenManager.calculateMaxCitizens(); + citizenManager.afterBuildingLoad(); graveManager.read(compound.getCompound(TAG_GRAVE_MANAGER)); - if (compound.getAllKeys().contains(TAG_PROGRESS_MANAGER)) + if (compound.contains(TAG_PROGRESS_MANAGER)) { progressManager.read(compound); } @@ -741,9 +763,10 @@ public void read(@NotNull final CompoundTag compound) eventManager.readFromNBT(compound); statisticManager.readFromNBT(compound); + questManager.deserializeNBT(compound.getCompound(TAG_QUEST_MANAGER)); eventDescManager.deserializeNBT(compound.getCompound(NbtTagConstants.TAG_EVENT_DESC_MANAGER)); - if (compound.getAllKeys().contains(TAG_RESEARCH)) + if (compound.contains(TAG_RESEARCH)) { researchManager.readFromNBT(compound.getCompound(TAG_RESEARCH)); // now that buildings, colonists, and research are loaded, check for new autoStartResearch. @@ -766,27 +789,29 @@ public void read(@NotNull final CompoundTag compound) } // Free blocks - freeBlocks.clear(); + final Set tempFreeBlocks = new HashSet<>(); final ListTag freeBlockTagList = compound.getList(TAG_FREE_BLOCKS, Tag.TAG_STRING); for (int i = 0; i < freeBlockTagList.size(); ++i) { - freeBlocks.add(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(freeBlockTagList.getString(i)))); + tempFreeBlocks.add(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(freeBlockTagList.getString(i)))); } + freeBlocks = ImmutableSet.copyOf(tempFreeBlocks); - freePositions.clear(); + final Set tempFreePositions = new HashSet<>(); // Free positions final ListTag freePositionTagList = compound.getList(TAG_FREE_POSITIONS, Tag.TAG_COMPOUND); for (int i = 0; i < freePositionTagList.size(); ++i) { final CompoundTag blockTag = freePositionTagList.getCompound(i); final BlockPos block = BlockPosUtil.read(blockTag, TAG_FREE_POSITIONS); - freePositions.add(block); + tempFreePositions.add(block); } + freePositions = ImmutableSet.copyOf(tempFreePositions); packageManager.setLastContactInHours(compound.getInt(TAG_ABANDONED)); manualHousing = compound.getBoolean(TAG_MANUAL_HOUSING); - if (compound.getAllKeys().contains(TAG_MOVE_IN)) + if (compound.contains(TAG_MOVE_IN)) { moveIn = compound.getBoolean(TAG_MOVE_IN); } @@ -802,7 +827,7 @@ public void read(@NotNull final CompoundTag compound) raidManager.read(compound); - if (compound.getAllKeys().contains(TAG_AUTO_DELETE)) + if (compound.contains(TAG_AUTO_DELETE)) { this.canColonyBeAutoDeleted = compound.getBoolean(TAG_AUTO_DELETE); } @@ -811,20 +836,20 @@ public void read(@NotNull final CompoundTag compound) this.canColonyBeAutoDeleted = true; } - if (compound.getAllKeys().contains(TAG_TEAM_COLOR)) + if (compound.contains(TAG_TEAM_COLOR)) { // This read can occur before the world is non-null, due to Minecraft's order of operations for capabilities. // As a result, setColonyColor proper must wait until onWorldLoad fires. this.colonyTeamColor = ChatFormatting.values()[compound.getInt(TAG_TEAM_COLOR)]; } - if (compound.getAllKeys().contains(TAG_FLAG_PATTERNS)) + if (compound.contains(TAG_FLAG_PATTERNS)) { this.setColonyFlag(compound.getList(TAG_FLAG_PATTERNS, Constants.TAG_COMPOUND)); } this.requestManager.reset(); - if (compound.getAllKeys().contains(TAG_REQUESTMANAGER)) + if (compound.contains(TAG_REQUESTMANAGER)) { this.requestManager.deserializeNBT(compound.getCompound(TAG_REQUESTMANAGER)); } @@ -897,6 +922,7 @@ public CompoundTag write(@NotNull final CompoundTag compound) eventManager.writeToNBT(compound); statisticManager.writeToNBT(compound); + compound.put(TAG_QUEST_MANAGER, questManager.serializeNBT()); compound.put(NbtTagConstants.TAG_EVENT_DESC_MANAGER, eventDescManager.serializeNBT()); raidManager.write(compound); @@ -948,7 +974,7 @@ public CompoundTag write(@NotNull final CompoundTag compound) this.colonyTag = compound; - isActive = false; + isDirty = false; return compound; } @@ -989,6 +1015,7 @@ public void onWorldLoad(@NotNull final Level w) if (eventHandler == null) { eventHandler = new ColonyPermissionEventHandler(this); + questManager.onWorldLoad(); MinecraftForge.EVENT_BUS.register(eventHandler); } setColonyColor(this.colonyTeamColor); @@ -1043,7 +1070,7 @@ public IWorkManager getWorkManager() */ public Set getFreePositions() { - return new HashSet<>(freePositions); + return freePositions; } /** @@ -1053,7 +1080,7 @@ public Set getFreePositions() */ public Set getFreeBlocks() { - return new HashSet<>(freeBlocks); + return freeBlocks; } /** @@ -1063,7 +1090,10 @@ public Set getFreeBlocks() */ public void addFreePosition(@NotNull final BlockPos pos) { - freePositions.add(pos); + ImmutableSet.Builder builder = ImmutableSet.builder(); + builder.addAll(freePositions); + builder.add(pos); + freePositions = builder.build(); markDirty(); } @@ -1074,7 +1104,10 @@ public void addFreePosition(@NotNull final BlockPos pos) */ public void addFreeBlock(@NotNull final Block block) { - freeBlocks.add(block); + ImmutableSet.Builder builder = ImmutableSet.builder(); + builder.addAll(freeBlocks); + builder.add(block); + freeBlocks = builder.build(); markDirty(); } @@ -1085,7 +1118,15 @@ public void addFreeBlock(@NotNull final Block block) */ public void removeFreePosition(@NotNull final BlockPos pos) { - freePositions.remove(pos); + ImmutableSet.Builder builder = ImmutableSet.builder(); + for (final BlockPos tempPos : freePositions) + { + if (!pos.equals(tempPos)) + { + builder.add(tempPos); + } + } + freePositions = builder.build(); markDirty(); } @@ -1096,7 +1137,15 @@ public void removeFreePosition(@NotNull final BlockPos pos) */ public void removeFreeBlock(@NotNull final Block block) { - freeBlocks.remove(block); + ImmutableSet.Builder builder = ImmutableSet.builder(); + for (final Block tempBlock : freeBlocks) + { + if (block != tempBlock) + { + builder.add(tempBlock); + } + } + freeBlocks = builder.build(); markDirty(); } @@ -1303,7 +1352,7 @@ public IRequestManager getRequestManager() public void markDirty() { packageManager.setDirty(); - isActive = true; + isDirty = true; } @Override @@ -1458,7 +1507,7 @@ public double getOverallHappiness() double happinessSum = 0; for (final ICitizenData citizen : citizenManager.getCitizens()) { - happinessSum += citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony()); + happinessSum += citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony(), citizen); } return happinessSum / citizenManager.getCitizens().size(); } @@ -1658,7 +1707,7 @@ public CompoundTag getColonyTag() { try { - if (this.colonyTag == null || this.isActive) + if (this.colonyTag == null || this.isDirty) { this.write(new CompoundTag()); } @@ -1762,6 +1811,7 @@ public boolean isColonyUnderAttack() * * @return the ChatFormatting enum color. */ + @Override public ChatFormatting getTeamColonyColor() { return colonyTeamColor; @@ -1773,16 +1823,19 @@ public ChatFormatting getTeamColonyColor() * @return the list of pattern-color pairs */ @Override - public ListTag getColonyFlag() { return colonyFlag; } + public ListTag getColonyFlag() + { + return colonyFlag; + } /** - * Set the colony to be active. + * Set the colony to be dirty. * - * @param isActive if active. + * @param dirty if dirty. */ - public void setActive(final boolean isActive) + public void setDirty(final boolean dirty) { - this.isActive = isActive; + this.isDirty = dirty; } /** @@ -1863,6 +1916,12 @@ public int getLoadedChunkCount() return loadedChunks.size(); } + @Override + public Set getLoadedChunks() + { + return loadedChunks; + } + @Override public ColonyState getState() { @@ -1897,6 +1956,13 @@ public void setTextureStyle(final String style) @Override public String getTextureStyleId() { + if (MineColonies.getConfig().getServer().holidayFeatures.get() && + (LocalDateTime.now().getDayOfMonth() >= 29 && LocalDateTime.now().getMonth() == Month.OCTOBER) + || (LocalDateTime.now().getDayOfMonth() <= 2 && LocalDateTime.now().getMonth() == Month.NOVEMBER)) + { + return "nether"; + } + return this.textureStyle; } @@ -1934,4 +2000,16 @@ public int getDay() { return day; } + + @Override + public IQuestManager getQuestManager() + { + return questManager; + } + + @Override + public ICitizen getCitizen(final int id) + { + return citizenManager.getCivilian(id); + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/ColonyManager.java b/src/main/java/com/minecolonies/coremod/colony/ColonyManager.java index 695a4bc2e5c..40621faae57 100755 --- a/src/main/java/com/minecolonies/coremod/colony/ColonyManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/ColonyManager.java @@ -5,6 +5,8 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.event.ColonyViewUpdatedEvent; +import com.minecolonies.api.colony.managers.events.ColonyManagerLoadedEvent; +import com.minecolonies.api.colony.managers.events.ColonyManagerUnloadedEvent; import com.minecolonies.api.colony.permissions.ColonyPlayer; import com.minecolonies.api.compatibility.CompatibilityManager; import com.minecolonies.api.compatibility.ICompatibilityManager; @@ -43,8 +45,6 @@ import static com.minecolonies.coremod.MineColonies.COLONY_MANAGER_CAP; import static com.minecolonies.coremod.MineColonies.getConfig; -import net.minecraftforge.event.TickEvent.LevelTickEvent; - /** * Singleton class that links colonies to minecraft. */ @@ -83,13 +83,13 @@ public final class ColonyManager implements IColonyManager private boolean capLoaded = false; @Override - public void createColony(@NotNull final Level w, final BlockPos pos, @NotNull final Player player, @NotNull final String colonyName, @NotNull final String pack) + public IColony createColony(@NotNull final Level w, final BlockPos pos, @NotNull final Player player, @NotNull final String colonyName, @NotNull final String pack) { final IColonyManagerCapability cap = w.getCapability(COLONY_MANAGER_CAP, null).resolve().orElse(null); if (cap == null) { Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE); - return; + return null; } final IColony colony = cap.createColony(w, pos); @@ -106,10 +106,11 @@ public void createColony(@NotNull final Level w, final BlockPos pos, @NotNull fi if (colony.getWorld() == null) { Log.getLogger().error("Unable to claim chunks because of the missing world in the colony, please report this to the mod authors!", new Exception()); - return; + return null; } ChunkDataHelper.claimColonyChunks(colony.getWorld(), true, colony.getID(), colony.getCenter()); + return colony; } @Override @@ -636,7 +637,7 @@ public void read(@NotNull final CompoundTag compound) serverUUID = compound.getUUID(TAG_UUID); } - if (compound.getAllKeys().contains(TAG_COMPATABILITY_MANAGER)) + if (compound.contains(TAG_COMPATABILITY_MANAGER)) { compatibilityManager.read(compound.getCompound(TAG_COMPATABILITY_MANAGER)); } @@ -680,6 +681,8 @@ public void onWorldLoad(@NotNull final Level world) { c.onWorldLoad(world); } + + MinecraftForge.EVENT_BUS.post(new ColonyManagerLoadedEvent(this)); } } @@ -717,6 +720,8 @@ public void onWorldUnload(@NotNull final Level world) { BackUpHelper.backupColonyData(); } + + MinecraftForge.EVENT_BUS.post(new ColonyManagerUnloadedEvent(this)); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/ColonyView.java b/src/main/java/com/minecolonies/coremod/colony/ColonyView.java index f7be5c70401..36a2cf5555b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/ColonyView.java +++ b/src/main/java/com/minecolonies/coremod/colony/ColonyView.java @@ -6,6 +6,7 @@ import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.buildings.workerbuildings.ITownHallView; +import com.minecolonies.api.colony.fields.IField; import com.minecolonies.api.colony.managers.interfaces.*; import com.minecolonies.api.colony.permissions.ColonyPlayer; import com.minecolonies.api.colony.permissions.IPermissions; @@ -17,11 +18,13 @@ import com.minecolonies.api.colony.workorders.IWorkOrderView; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.network.IMessage; +import com.minecolonies.api.quests.IQuestManager; import com.minecolonies.api.research.IResearchManager; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.Log; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.client.render.worldevent.ColonyBlueprintRenderer; import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; import com.minecolonies.coremod.colony.managers.ResearchManager; @@ -33,6 +36,7 @@ import com.minecolonies.coremod.network.messages.PermissionsMessage; import com.minecolonies.coremod.network.messages.server.colony.ColonyFlagChangeMessage; import com.minecolonies.coremod.network.messages.server.colony.TownHallRenameMessage; +import com.minecolonies.coremod.quests.QuestManager; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -57,6 +61,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Predicate; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_BANNER_PATTERNS; @@ -74,11 +79,15 @@ public final class ColonyView implements IColonyView // General Attributes private final int id; private final Map workOrders = new HashMap<>(); + private final Map workOrderClaimCache = new HashMap<>(); + private int workOrderCachedCount; // Administration/permissions @NotNull private final PermissionsView permissions = new PermissionsView(); @NotNull private final Map buildings = new HashMap<>(); + @NotNull + private final Set fields = new HashSet<>(); // Citizenry @NotNull private final Map citizens = new HashMap<>(); @@ -95,8 +104,8 @@ public final class ColonyView implements IColonyView * The colony flag (set to plain white as default) */ private ListTag colonyFlag = new BannerPattern.Builder() - .addPattern(BannerPatterns.BASE, DyeColor.WHITE) - .toListTag(); + .addPattern(BannerPatterns.BASE, DyeColor.WHITE) + .toListTag(); private BlockPos center = BlockPos.ZERO; @@ -207,7 +216,7 @@ public final class ColonyView implements IColonyView /** * The research effects of the colony. */ - private final IResearchManager manager; + private final IResearchManager researchManager; /** * Whether spies are active and highlight enemy positions. @@ -240,6 +249,11 @@ public final class ColonyView implements IColonyView */ private IStatisticsManager statisticManager = new StatisticsManager(this); + /** + * Client side quest manager. + */ + private IQuestManager questManager; + /** * Day in the colony. */ @@ -253,7 +267,8 @@ public final class ColonyView implements IColonyView private ColonyView(final int id) { this.id = id; - this.manager = new ResearchManager(this); + this.researchManager = new ResearchManager(this); + this.questManager = new QuestManager(this); } /** @@ -411,10 +426,6 @@ public static void serializeNetworkData(@NotNull Colony colony, @NotNull Friendl buf.writeUtf(col.getDimension().location().toString()); } - final CompoundTag treeTag = new CompoundTag(); - colony.getResearchManager().writeToNBT(treeTag); - buf.writeNbt(treeTag); - if (hasNewSubscribers || colony.isTicketedChunksDirty()) { buf.writeInt(colony.getTicketedChunks().size()); @@ -432,6 +443,7 @@ public static void serializeNetworkData(@NotNull Colony colony, @NotNull Friendl colony.getGraveManager().write(graveTag); buf.writeNbt(graveTag); // this could be more efficient, but it should usually be short anyway colony.getStatisticsManager().serialize(buf); + buf.writeNbt(colony.getQuestManager().serializeNBT()); buf.writeInt(colony.getDay()); } @@ -632,6 +644,12 @@ public int getLoadedChunkCount() return 0; } + @Override + public Set getLoadedChunks() + { + return null; + } + @Override public ColonyState getState() { @@ -899,8 +917,6 @@ public IMessage handleColonyViewMessage(@NotNull final FriendlyByteBuf buf, @Not ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(buf.readUtf(32767))))); } - this.manager.readFromNBT(buf.readNbt()); - final int ticketChunkCount = buf.readInt(); if (ticketChunkCount != -1) { @@ -913,6 +929,7 @@ public IMessage handleColonyViewMessage(@NotNull final FriendlyByteBuf buf, @Not this.graveManager.read(buf.readNbt()); this.statisticManager.deserialize(buf); + this.questManager.deserializeNBT(buf.readNbt()); this.day = buf.readInt(); return null; } @@ -941,6 +958,8 @@ public IMessage handlePermissionsViewMessage(@NotNull final FriendlyByteBuf buf) @Nullable public IMessage handleColonyViewWorkOrderMessage(final FriendlyByteBuf buf) { + boolean claimsChanged = false; + workOrders.clear(); final int amount = buf.readInt(); for (int i = 0; i < amount; i++) @@ -949,14 +968,23 @@ public IMessage handleColonyViewWorkOrderMessage(final FriendlyByteBuf buf) if (workOrder != null) { workOrders.put(workOrder.getId(), workOrder); + + final BlockPos oldClaimedBy = workOrderClaimCache.put(workOrder.getId(), workOrder.getClaimedBy()); + claimsChanged |= !Objects.equals(workOrder.getClaimedBy(), oldClaimedBy); } } + if (claimsChanged || workOrders.size() != workOrderCachedCount) + { + workOrderCachedCount = workOrders.size(); + ColonyBlueprintRenderer.invalidateCache(); + } + return null; } /** - * Update a ColonyView's citizens given a network data ColonyView update packet. This uses a full-replacement - citizens do not get updated and are instead overwritten. + * Update a ColonyView's citizens given a network data ColonyView update packet. The ICitizenManager makes sure to update citizens instead of replacing them. * * @param id ID of the citizen. * @param buf Network data. @@ -1083,6 +1111,35 @@ public IMessage handleColonyBuildingViewMessage(final BlockPos buildingId, @NotN return null; } + @Override + public void handleColonyViewResearchManagerUpdate(final CompoundTag compoundTag) + { + this.researchManager.readFromNBT(compoundTag); + } + + @Override + public void handleColonyFieldViewUpdateMessage(final Set fields) + { + this.fields.clear(); + this.fields.addAll(fields); + } + + @Override + public @NotNull List getFields(final Predicate matcher) + { + return fields.stream() + .filter(matcher) + .toList(); + } + + @Override + public @Nullable IField getField(final Predicate matcher) + { + return getFields(matcher).stream() + .findFirst() + .orElse(null); + } + /** * Update a players permissions. * @@ -1539,7 +1596,7 @@ public List getFeuds() @Override public IResearchManager getResearchManager() { - return manager; + return researchManager; } @Override @@ -1590,4 +1647,10 @@ public int getDay() { return this.day; } -} + + @Override + public IQuestManager getQuestManager() + { + return this.questManager; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/IColonyManagerCapability.java b/src/main/java/com/minecolonies/coremod/colony/IColonyManagerCapability.java index 64edcd7fafb..df191a332fc 100755 --- a/src/main/java/com/minecolonies/coremod/colony/IColonyManagerCapability.java +++ b/src/main/java/com/minecolonies/coremod/colony/IColonyManagerCapability.java @@ -9,7 +9,6 @@ import com.minecolonies.coremod.util.BackUpHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; -import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraftforge.common.capabilities.Capability; @@ -127,19 +126,22 @@ public int getTopID() class Storage { - public static Tag writeNBT(@NotNull final Capability capability, @NotNull final IColonyManagerCapability instance, @Nullable final Direction side) + public static Tag writeNBT(@NotNull final Capability capability, @NotNull final IColonyManagerCapability instance, final boolean overworld) { final CompoundTag compound = new CompoundTag(); compound.put(TAG_COLONIES, instance.getColonies().stream().map(IColony::getColonyTag).filter(Objects::nonNull).collect(NBTUtils.toListNBT())); - final CompoundTag managerCompound = new CompoundTag(); - IColonyManager.getInstance().write(managerCompound); - compound.put(TAG_COLONY_MANAGER, managerCompound); + + if (overworld) + { + final CompoundTag managerCompound = new CompoundTag(); + IColonyManager.getInstance().write(managerCompound); + compound.put(TAG_COLONY_MANAGER, managerCompound); + } return compound; } public static void readNBT( - @NotNull final Capability capability, @NotNull final IColonyManagerCapability instance, - @Nullable final Direction side, @NotNull final Tag nbt) + @NotNull final Capability capability, @NotNull final IColonyManagerCapability instance, final boolean overworld, @NotNull final Tag nbt) { // Notify that we did load the cap for this world IColonyManager.getInstance().setCapLoaded(); @@ -189,7 +191,7 @@ public static void readNBT( } } - if (compound.getAllKeys().contains(TAG_COLONY_MANAGER)) + if (compound.contains(TAG_COLONY_MANAGER) && overworld) { IColonyManager.getInstance().read(compound.getCompound(TAG_COLONY_MANAGER)); } diff --git a/src/main/java/com/minecolonies/coremod/colony/VisitorDataView.java b/src/main/java/com/minecolonies/coremod/colony/VisitorDataView.java index a7701743c91..0083185ea5b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/VisitorDataView.java +++ b/src/main/java/com/minecolonies/coremod/colony/VisitorDataView.java @@ -20,11 +20,6 @@ */ public class VisitorDataView extends CitizenDataView implements IVisitorViewData { - /** - * The related colony view - */ - private final IColonyView colony; - /** * The recruitment costs */ @@ -48,8 +43,7 @@ public class VisitorDataView extends CitizenDataView implements IVisitorViewData */ public VisitorDataView(final int id, final IColonyView colony) { - super(id); - this.colony = colony; + super(id, colony); } @Override @@ -64,12 +58,6 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) } } - @Override - public IColonyView getColonyView() - { - return colony; - } - @Override public ItemStack getRecruitCost() { diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuilding.java b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuilding.java index 8147087bb4a..59c0a276711 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuilding.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuilding.java @@ -17,6 +17,7 @@ import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.jobs.registry.JobEntry; +import com.minecolonies.api.colony.modules.ModuleContainerUtils; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.colony.requestsystem.data.IRequestSystemBuildingDataStore; import com.minecolonies.api.colony.requestsystem.location.ILocation; @@ -74,6 +75,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; @@ -92,7 +94,6 @@ import static com.minecolonies.api.util.constant.Suppression.GENERIC_WILDCARD; import static com.minecolonies.api.util.constant.Suppression.UNCHECKED; import static com.minecolonies.api.util.constant.TranslationConstants.*; -import net.minecraftforge.common.capabilities.ForgeCapabilities; /** * Base building class, has all the foundation for what a building stores and does. @@ -175,67 +176,40 @@ protected AbstractBuilding(@NotNull final IColony colony, final BlockPos pos) @Override public boolean hasModule(final Class clazz) { - for (final IBuildingModule module : modules) - { - if (clazz.isInstance(module)) - { - return true; - } - } - return false; + return ModuleContainerUtils.hasModule(modules, clazz); } @NotNull @Override public T getFirstModuleOccurance(final Class clazz) { - for (final IBuildingModule module : modules) - { - if (clazz.isInstance(module)) - { - return (T) module; - } - } - - throw new IllegalStateException("The module of class: " + clazz.toString() + "should never be null!"); + return ModuleContainerUtils.getFirstModuleOccurance(modules, + clazz, + "The module of class: " + clazz.toString() + "should never be null! Building:" + getBuildingType().getTranslationKey() + " pos:" + getID().toShortString()); } @NotNull @Override public Optional getFirstOptionalModuleOccurance(final Class clazz) { - for (final IBuildingModule module : modules) - { - if (clazz.isInstance(module)) - { - return Optional.of((T) module); - } - } - return Optional.empty(); + return ModuleContainerUtils.getFirstOptionalModuleOccurance(modules, clazz); } @NotNull @Override public T getModuleMatching(final Class clazz, final Predicate modulePredicate) { - for (final IBuildingModule module : modules) - { - if (clazz.isInstance(module) && modulePredicate.test((T) module)) - { - return (T) module; - } - } - throw new IllegalArgumentException("no matching module"); + return ModuleContainerUtils.getModuleMatching(modules, + clazz, + modulePredicate, + "no matching module for Building:" + getBuildingType().getTranslationKey() + " pos:" + getID().toShortString()); } @NotNull @Override public List getModules(final Class clazz) { - return this.modules.stream() - .filter(clazz::isInstance) - .map(c -> (T) c) - .collect(Collectors.toList()); + return ModuleContainerUtils.getModules(modules, clazz); } @Override @@ -332,7 +306,10 @@ public void onPlayerEnterNearby(final Player player) @Override public void onPlacement() { - ChunkDataHelper.claimBuildingChunks(colony, true, getPosition(), getClaimRadius(getBuildingLevel()), getCorners()); + if (getBuildingLevel() == 0) + { + ChunkDataHelper.claimBuildingChunks(colony, true, getPosition(), getClaimRadius(getBuildingLevel()), getCorners()); + } } /** @@ -352,7 +329,7 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); loadRequestSystemFromNBT(compound); - if (compound.getAllKeys().contains(TAG_IS_BUILT)) + if (compound.contains(TAG_IS_BUILT)) { isBuilt = compound.getBoolean(TAG_IS_BUILT); } @@ -360,7 +337,7 @@ else if (getBuildingLevel() > 0) { isBuilt = true; } - if (compound.getAllKeys().contains(TAG_CUSTOM_NAME)) + if (compound.contains(TAG_CUSTOM_NAME)) { this.customName = compound.getString(TAG_CUSTOM_NAME); } @@ -922,7 +899,7 @@ && getPosition() != null } else { - Log.getLogger().error("Somehow the wrong TileEntity is at the location where the building should be!", new Exception()); + Log.getLogger().error("Somehow the wrong TileEntity is at the location where the building should be! Building:"+getBuildingType().getTranslationKey()+" pos:"+getID().toShortString(), new Exception()); Log.getLogger().error("Trying to restore order!"); final AbstractTileEntityColonyBuilding tileEntityColonyBuilding = new TileEntityColonyBuilding(MinecoloniesTileEntities.BUILDING.get(), getPosition(), colony.getWorld().getBlockState(this.getPosition())); @@ -968,6 +945,7 @@ public void onUpgradeComplete(final int newLevel) getModules(IBuildingEventsModule.class).forEach(module -> module.onUpgradeComplete(newLevel)); colony.getResearchManager().checkAutoStartResearch(); + colony.getBuildingManager().onBuildingUpgradeComplete(this, newLevel); } @Override @@ -982,7 +960,6 @@ public void calculateCorners() try { - final WorkOrderBuilding workOrder = WorkOrderBuilding.create(WorkOrderType.BUILD, this); final Blueprint blueprint = StructurePacks.getBlueprint(getStructurePack(), getBlueprintPath()); if (blueprint == null) { @@ -993,9 +970,14 @@ public void calculateCorners() = ColonyUtils.calculateCorners(this.getPosition(), colony.getWorld(), blueprint, - workOrder.getRotation(), - workOrder.isMirrored()); + getRotation(), + isMirrored()); this.setCorners(corners.getA(), corners.getB()); + + if (te != null) + { + this.getTileEntity().setSchematicCorners(corners.getA().subtract(getPosition()), corners.getB().subtract(getPosition())); + } } catch (final Exception ex) { @@ -1123,7 +1105,7 @@ public Map, Tuple> getRequiredItemsAndAmo @Override public boolean canEat(final ItemStack stack) { - return stack.getItem().getFoodProperties().getNutrition() >= getBuildingLevel(); + return stack.getItem().getFoodProperties(stack, null).getNutrition() >= getBuildingLevel(); } @Override @@ -1286,7 +1268,7 @@ protected void setupRsDataStore() private void loadRequestSystemFromNBT(final CompoundTag compound) { - if (compound.getAllKeys().contains(TAG_REQUESTOR_ID)) + if (compound.contains(TAG_REQUESTOR_ID)) { this.requester = StandardFactoryController.getInstance().deserialize(compound.getCompound(TAG_REQUESTOR_ID)); } @@ -1295,7 +1277,7 @@ private void loadRequestSystemFromNBT(final CompoundTag compound) this.requester = StandardFactoryController.getInstance().getNewInstance(TypeToken.of(BuildingBasedRequester.class), this); } - if (compound.getAllKeys().contains(TAG_RS_BUILDING_DATASTORE)) + if (compound.contains(TAG_RS_BUILDING_DATASTORE)) { this.rsDataStoreToken = StandardFactoryController.getInstance().deserialize(compound.getCompound(TAG_RS_BUILDING_DATASTORE)); } @@ -1350,12 +1332,12 @@ public IToken createRequest(@NotNull final ICitizenD { citizenData.getJob().getAsyncRequests().add(requestToken); citizenData.triggerInteraction(new RequestBasedInteraction(Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_ASYNC, - request.getShortDisplayString()), ChatPriority.PENDING, Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_NORMAL), request.getId())); + request.getLongDisplayString()), ChatPriority.PENDING, Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_ASYNC), request.getId())); } else { citizenData.triggerInteraction(new RequestBasedInteraction(Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_NORMAL, - request.getShortDisplayString()), ChatPriority.BLOCKING, Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_NORMAL), request.getId())); + request.getLongDisplayString()), ChatPriority.BLOCKING, Component.translatable(RequestSystemTranslationConstants.REQUEST_RESOLVER_NORMAL), request.getId())); } addRequestToMaps(citizenData.getId(), requestToken, TypeToken.of(requested.getClass())); @@ -1802,7 +1784,7 @@ public boolean overruleNextOpenRequestOfCitizenWithStack(@NotNull final ICitizen } catch (final Exception ex) { - Log.getLogger().error("Error during overruling", ex); + Log.getLogger().error("Error during overruling at Building:"+getBuildingType().getTranslationKey()+" pos:"+getID().toShortString(), ex); Log.getLogger().error(target.getId().toString() + " " + target.getState().name() + " " + target.getShortDisplayString().toString()); return false; } @@ -2009,12 +1991,12 @@ public Optional getCitizenForRequest(@NotNull final IToken toke } @Override - public Map reservedStacks() + public Map reservedStacksExcluding(@NotNull final IRequest excluded) { final Map map = new HashMap<>(); for (final IHasRequiredItemsModule module : getModules(IHasRequiredItemsModule.class)) { - for (final Map.Entry content : module.reservedStacks().entrySet()) + for (final Map.Entry content : module.reservedStacksExcluding(excluded).entrySet()) { final int current = map.getOrDefault(content.getKey(), 0); map.put(content.getKey(), current + content.getValue()); diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingContainer.java b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingContainer.java index cc99f19dec7..38f17331ce3 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingContainer.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingContainer.java @@ -82,11 +82,11 @@ public void deserializeNBT(final CompoundTag compound) final CompoundTag containerCompound = containerTagList.getCompound(i); containerList.add(NbtUtils.readBlockPos(containerCompound)); } - if (compound.getAllKeys().contains(TAG_PRIO)) + if (compound.contains(TAG_PRIO)) { this.unscaledPickUpPriority = compound.getInt(TAG_PRIO); } - if (compound.getAllKeys().contains(TAG_PRIO_STATE)) + if (compound.contains(TAG_PRIO_STATE)) { // This was the old int representation of Pickup:Never if (compound.getInt(TAG_PRIO_STATE) == 0) @@ -157,16 +157,15 @@ public void registerBlockPosition(@NotNull final Block block, @NotNull final Blo if (block instanceof AbstractBlockHut) { final BlockEntity entity = world.getBlockEntity(pos); - if (entity instanceof TileEntityColonyBuilding) + if (entity instanceof TileEntityColonyBuilding buildingEntity) { - ((TileEntityColonyBuilding) entity).setStructurePack(StructurePacks.getStructurePack(this.getStructurePack())); - ((TileEntityColonyBuilding) entity).setMirror(isMirrored()); + buildingEntity.setStructurePack(StructurePacks.getStructurePack(getStructurePack())); + buildingEntity.setMirror(isMirrored()); final IBuilding building = colony.getBuildingManager().getBuilding(pos); if (building != null) { - building.setStructurePack(this.getStructurePack()); + building.setStructurePack(getStructurePack()); building.setParent(getID()); - addChild(pos); } } } @@ -174,9 +173,9 @@ else if (block instanceof BlockMinecoloniesRack) { addContainerPosition(pos); final BlockEntity entity = world.getBlockEntity(pos); - if (entity instanceof TileEntityRack) + if (entity instanceof TileEntityRack rackEntity) { - ((TileEntityRack) entity).setBuildingPos(this.getID()); + rackEntity.setBuildingPos(this.getID()); } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingGuards.java b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingGuards.java index 06db313c325..98f65426f35 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingGuards.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractBuildingGuards.java @@ -40,7 +40,6 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,13 +64,13 @@ public abstract class AbstractBuildingGuards extends AbstractBuilding implements */ public static final ISettingKey RETREAT = new SettingKey<>(BoolSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "retreat")); - public static final ISettingKey HIRE_TRAINEE = + public static final ISettingKey HIRE_TRAINEE = new SettingKey<>(BoolSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "hiretrainee")); - public static final ISettingKey PATROL_MODE = - new SettingKey<>(PatrolModeSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "patrolmode")); - public static final ISettingKey FOLLOW_MODE = - new SettingKey<>(FollowModeSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "followmode")); - public static final ISettingKey GUARD_TASK = + public static final ISettingKey PATROL_MODE = + new SettingKey<>(GuardPatrolModeSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "patrolmode")); + public static final ISettingKey FOLLOW_MODE = + new SettingKey<>(GuardFollowModeSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "followmode")); + public static final ISettingKey GUARD_TASK = new SettingKey<>(GuardTaskSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "guardtask")); @@ -385,9 +384,9 @@ private void startPatrolNext() { if (curguard.getEntity().isPresent()) { - if (curguard.getEntity().get().getCitizenJobHandler().getColonyJob() instanceof AbstractJobGuard) + if (curguard.getEntity().get().getCitizenJobHandler().getColonyJob() instanceof AbstractJobGuard guardEntity) { - ((AbstractEntityAIGuard) curguard.getEntity().get().getCitizenJobHandler().getColonyJob().getWorkerAI()).setNextPatrolTarget(lastPatrolPoint); + ((AbstractEntityAIGuard) guardEntity.getWorkerAI()).setNextPatrolTarget(lastPatrolPoint); } } } @@ -416,7 +415,7 @@ public BlockPos getNextPatrolTarget(final boolean newTarget) return lastPatrolPoint; } - if (!getSetting(PATROL_MODE).getValue().equals(PatrolModeSetting.MANUAL) || patrolTargets == null || patrolTargets.isEmpty()) + if (!getSetting(PATROL_MODE).getValue().equals(GuardPatrolModeSetting.MANUAL) || patrolTargets == null || patrolTargets.isEmpty()) { BlockPos pos = null; if (this.pathResult != null) @@ -475,11 +474,7 @@ public int getPatrolDistance() return PATROL_BASE_DIST + this.getBuildingLevel() * PATROL_DISTANCE; } - /** - * Sets a one time consumed temporary next position to patrol towards - * - * @param pos Position to set - */ + @Override public void setTempNextPatrolPoint(final BlockPos pos) { tempNextPatrolPoint = pos; @@ -521,13 +516,13 @@ public boolean shallRetrieveOnLowHealth() @Override public boolean shallPatrolManually() { - return getSetting(PATROL_MODE).getValue().equals(PatrolModeSetting.MANUAL); + return getSetting(PATROL_MODE).getValue().equals(GuardPatrolModeSetting.MANUAL); } @Override public boolean isTightGrouping() { - return getSetting(FOLLOW_MODE).getValue().equals(FollowModeSetting.TIGHT); + return getSetting(FOLLOW_MODE).getValue().equals(GuardFollowModeSetting.TIGHT); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractSchematicProvider.java b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractSchematicProvider.java index 90501fe2543..ea0a1effd50 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractSchematicProvider.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/AbstractSchematicProvider.java @@ -1,6 +1,5 @@ package com.minecolonies.coremod.colony.buildings; -import com.google.common.collect.ImmutableSet; import com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE; import com.ldtteam.structurize.blueprints.v1.Blueprint; import com.ldtteam.structurize.storage.StructurePacks; @@ -11,10 +10,12 @@ import com.minecolonies.api.colony.buildings.ISchematicProvider; import com.minecolonies.api.colony.buildings.modules.IAltersBuildingFootprint; import com.minecolonies.api.colony.buildings.registry.BuildingEntry; -import com.minecolonies.api.colony.managers.interfaces.IRegisteredStructureManager; import com.minecolonies.api.compatibility.newstruct.BlueprintMapping; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; -import com.minecolonies.api.util.*; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.FireworkUtils; +import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.MessageUtils; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Tuple; @@ -23,12 +24,9 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; import java.util.Set; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.stream.Collectors; import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; import static com.minecolonies.api.util.constant.NbtTagConstants.*; @@ -84,8 +82,8 @@ public abstract class AbstractSchematicProvider implements ISchematicProvider, I /** * Corners of the building. */ - private BlockPos lowerCorner = null; - private BlockPos higherCorner = null; + private BlockPos lowerCorner = BlockPos.ZERO; + private BlockPos higherCorner = BlockPos.ZERO; /** * Cached rotation. @@ -97,18 +95,20 @@ public abstract class AbstractSchematicProvider implements ISchematicProvider, I */ private BlockPos parentSchematic = BlockPos.ZERO; - /** - * Child schematics within this - */ - private Set childSchematics = ImmutableSet.of(); - /** * Blueprint future for delayed info reading. */ private Future blueprintFuture; + private String blueprintFuturePack = ""; + private String blueprintFutureName = ""; public AbstractSchematicProvider(final BlockPos pos, final IColony colony) { + if (pos.equals(BlockPos.ZERO)) + { + Log.getLogger().warn("Creating building at zero pos!:", new Exception()); + } + this.location = pos; this.colony = colony; } @@ -175,7 +175,6 @@ public CompoundTag serializeNBT() compound.putBoolean(TAG_DECONSTRUCTED, isDeconstructed); BlockPosUtil.write(compound, TAG_PARENT_SCHEM, parentSchematic); - BlockPosUtil.writePosListToNBT(compound, TAG_CHILD_SCHEM, new ArrayList<>(childSchematics)); return compound; } @@ -188,7 +187,7 @@ public void deserializeNBT(final CompoundTag compound) isBuildingMirrored = compound.getBoolean(TAG_MIRROR); - if (compound.getAllKeys().contains(TAG_CORNER1) && compound.getAllKeys().contains(TAG_CORNER2)) + if (compound.contains(TAG_CORNER1) && compound.contains(TAG_CORNER2)) { setCorners(BlockPosUtil.read(compound, TAG_CORNER1), BlockPosUtil.read(compound, TAG_CORNER2)); } @@ -213,7 +212,6 @@ public void deserializeNBT(final CompoundTag compound) } parentSchematic = BlockPosUtil.read(compound, TAG_PARENT_SCHEM); - childSchematics = ImmutableSet.copyOf(BlockPosUtil.readPosListFromNBT(compound, TAG_CHILD_SCHEM)); } private void deserializerStructureInformationFrom(final CompoundTag compound) @@ -223,7 +221,7 @@ private void deserializerStructureInformationFrom(final CompoundTag compound) if (compound.contains(TAG_STYLE) && !compound.getString(TAG_STYLE).isEmpty()) { packName = BlueprintMapping.getStyleMapping(compound.getString(TAG_STYLE)); - path = BlueprintMapping.getPathMapping(compound.getString(TAG_STYLE), this.getSchematicName()) + buildingLevel + ".blueprint"; + path = BlueprintMapping.getPathMapping(compound.getString(TAG_STYLE), this.getSchematicName()) + buildingLevel + ".blueprint"; } else { @@ -263,19 +261,21 @@ public void setCorners(final BlockPos pos1, final BlockPos pos2) { this.lowerCorner = new BlockPos(Math.min(pos1.getX(), pos2.getX()), Math.min(pos1.getY(), pos2.getY()), Math.min(pos1.getZ(), pos2.getZ())); this.higherCorner = new BlockPos(Math.max(pos1.getX(), pos2.getX()), Math.max(pos1.getY(), pos2.getY()), Math.max(pos1.getZ(), pos2.getZ())); - if (this.getTileEntity() != null && !lowerCorner.equals(higherCorner)) - { - this.getTileEntity().setSchematicCorners(lowerCorner.subtract(getPosition()), higherCorner.subtract(getPosition())); - } } @Override public Tuple getCorners() { - if (lowerCorner == null || higherCorner == null) + if (lowerCorner.equals(BlockPos.ZERO) || higherCorner.equals(BlockPos.ZERO)) { this.calculateCorners(); + + if (lowerCorner.equals(BlockPos.ZERO) || higherCorner.equals(BlockPos.ZERO)) + { + return new Tuple<>(getPosition(), getPosition()); + } } + return new Tuple<>(lowerCorner, higherCorner); } @@ -289,16 +289,7 @@ public BlockPos getID() @Override public BlockPos getParent() { - final IBuilding building = colony.getBuildingManager().getBuilding(parentSchematic); - if (building != null) - { - if (!building.getChildren().contains(getID())) - { - building.addChild(getID()); - } - } - - return parentSchematic; + return isParentValid(parentSchematic) ? parentSchematic : BlockPos.ZERO; } @Override @@ -310,53 +301,25 @@ public boolean hasParent() @Override public void setParent(final BlockPos pos) { - if (!pos.equals(getID())) + if (isParentValid(pos)) { parentSchematic = pos; } } - @Override - public Set getChildren() - { - // Validate childs existance - final IRegisteredStructureManager manager = colony.getBuildingManager(); - List toRemove = null; - - for (final BlockPos pos : childSchematics) - { - if (manager.getBuilding(pos) == null) - { - if (toRemove == null) - { - toRemove = new ArrayList<>(); - } - toRemove.add(pos); - } - } - - if (toRemove != null) - { - final Set oldPositions = new HashSet<>(this.childSchematics); - oldPositions.removeAll(toRemove); - this.childSchematics = ImmutableSet.copyOf(oldPositions); - } - - return childSchematics; - } - - @Override - public void addChild(final BlockPos pos) + private boolean isParentValid(BlockPos position) { - childSchematics = ImmutableSet.builder().addAll(childSchematics).add(pos).build(); + final IBuilding building = colony.getBuildingManager().getBuilding(position); + return building != null && !building.getID().equals(getID()) && !building.hasParent(); } @Override - public void removeChild(final BlockPos pos) + public Set getChildren() { - final Set oldPositions = new HashSet<>(childSchematics); - oldPositions.remove(pos); - childSchematics = ImmutableSet.copyOf(oldPositions); + return colony.getBuildingManager().getBuildings().values().stream() + .filter(f -> f.getParent().equals(getID())) + .map(ISchematicProvider::getID) + .collect(Collectors.toUnmodifiableSet()); } @Override @@ -401,12 +364,14 @@ public int getRotation() } else { - Log.getLogger().error(String.format("Failed to get rotation for %s: ", this.path)); + Log.getLogger() + .error(String.format("Failed to get rotation of building %s at pos: %s with path: %s", getBuildingDisplayName(), getPosition().toShortString(), this.path)); } } catch (Exception e) { - Log.getLogger().error(String.format("Failed to get rotation for %s: ", this.path), e); + Log.getLogger() + .error(String.format("Failed to get rotation of building %s at pos: %s with path: %s", getBuildingDisplayName(), getPosition().toShortString(), this.path), e); return 0; } @@ -470,9 +435,10 @@ public void onColonyTick(final IColony colony) } } } - catch (InterruptedException | ExecutionException e) + catch (Exception e) { - e.printStackTrace(); + Log.getLogger().info("Failed to load blueprintfuture for: pack:" + blueprintFuturePack + " name:" + blueprintFutureName, e); + blueprintFuture = null; } } } @@ -497,14 +463,17 @@ private void unsafeUpdateTEDataFromSchematic(final TileEntityColonyBuilding te) } blueprintFuture = StructurePacks.getBlueprintFuture(packName, structureName); + blueprintFuturePack = packName; + blueprintFutureName = structureName; } @Override public String getStructurePack() { - if (parentSchematic != BlockPos.ZERO) + final BlockPos parent = getParent(); + if (parent != BlockPos.ZERO) { - final IBuilding building = colony.getBuildingManager().getBuilding(parentSchematic); + final IBuilding building = colony.getBuildingManager().getBuilding(parent); if (building != null) { return building.getStructurePack(); @@ -597,15 +566,16 @@ public void upgradeBuildingLevelToSchematicData() } - if (level > 0 && level >= getBuildingLevel() && level <= getMaxBuildingLevel()) + if (level > 0 && (level > getBuildingLevel() || isDeconstructed) && level <= getMaxBuildingLevel()) { if (level > getBuildingLevel()) { FireworkUtils.spawnFireworksAtAABBCorners(getCorners(), colony.getWorld(), level); } - + setBuildingLevel(level); onUpgradeComplete(level); + isDeconstructed = false; } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractAssignedCitizenModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractAssignedCitizenModule.java index 2a0b3294be8..47fb38256c0 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractAssignedCitizenModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractAssignedCitizenModule.java @@ -1,10 +1,12 @@ package com.minecolonies.coremod.colony.buildings.modules; import com.google.common.collect.Lists; +import com.minecolonies.api.colony.ICitizen; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.buildings.HiringMode; import com.minecolonies.api.colony.buildings.modules.*; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.coremod.colony.CitizenData; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import org.jetbrains.annotations.NotNull; @@ -22,7 +24,7 @@ /** * Abstract assignment module. */ -public abstract class AbstractAssignedCitizenModule extends AbstractBuildingModule implements IAssignsCitizen, IPersistentModule +public abstract class AbstractAssignedCitizenModule extends AbstractBuildingModule implements IAssignsCitizen, IPersistentModule, IBuildingEventsModule { /** * List of worker assosiated to the building. @@ -74,6 +76,15 @@ public boolean assignCitizen(final ICitizenData citizen) */ abstract void onRemoval(final ICitizenData citizen); + @Override + public void onDestroyed() + { + for(final ICitizenData citizenData: new ArrayList<>(assignedCitizen)) + { + removeCitizen(citizenData); + } + } + @Override public List getAssignedCitizen() { diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractCraftingBuildingModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractCraftingBuildingModule.java index 8f08b952ca0..e083aa74666 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractCraftingBuildingModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AbstractCraftingBuildingModule.java @@ -13,6 +13,7 @@ import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; +import com.minecolonies.api.colony.requestsystem.manager.IRequestManager; import com.minecolonies.api.colony.requestsystem.request.IRequest; import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.colony.requestsystem.requestable.crafting.PublicCrafting; @@ -37,12 +38,9 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Tuple; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.LootContext; @@ -54,8 +52,10 @@ import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.minecolonies.api.research.util.ResearchConstants.RECIPES; +import static com.minecolonies.api.util.constant.BuildingConstants.*; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_DISABLED_RECIPES; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_RECIPES; import static com.minecolonies.api.util.constant.TagConstants.CRAFTING_REDUCEABLE; @@ -173,7 +173,7 @@ protected boolean isRecipeCompatibleWithCraftingModule(final IToken token) * @param crafterRecipes the list of custom recipes. * @return true if so. */ - private boolean isPreTaughtRecipe( + protected boolean isPreTaughtRecipe( final IRecipeStorage storage, final Map crafterRecipes) { @@ -310,7 +310,7 @@ public void serializeToView(@NotNull final FriendlyByteBuf buf) public Map, Tuple> getRequiredItemsAndAmount() { final Map> requiredItems = new HashMap<>(); - for (final Tuple recipeStorage : getPendingRequestQueue()) + for (final Tuple recipeStorage : getPendingRequestQueueExcluding(null)) { for (final ItemStorage itemStorage : recipeStorage.getA().getCleanedInput()) { @@ -337,10 +337,10 @@ public Map, Tuple> getRequiredItemsAndAmo } @Override - public Map reservedStacks() + public Map reservedStacksExcluding(@Nullable final IRequest request) { final Map recipeOutputs = new HashMap<>(); - for (final Tuple recipeStorage : getPendingRequestQueue()) + for (final Tuple recipeStorage : getPendingRequestQueueExcluding(request)) { for (final ItemStorage itemStorage : recipeStorage.getA().getCleanedInput()) { @@ -357,9 +357,10 @@ public Map reservedStacks() /** * Get a list of all recipeStorages of the pending requests in the crafters queues. + * @param excluded ignore this request (and its parents). * @return the list. */ - private List> getPendingRequestQueue() + private List> getPendingRequestQueueExcluding(@Nullable final IRequest excluded) { final List> recipes = new ArrayList<>(); for (final ICitizenData citizen : building.getAllAssignedCitizen()) @@ -372,6 +373,11 @@ private List> getPendingRequestQueue() for (final IToken taskToken : assignedTasks) { final IRequest request = (IRequest) building.getColony().getRequestManager().getRequestForToken(taskToken); + if (request == null || (excluded != null && anyChildRequestIs(building.getColony().getRequestManager(), request, excluded))) + { + continue; + } + final IRecipeStorage recipeStorage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(request.getRequest().getRecipeID()); if (holdsRecipe(request.getRequest().getRecipeID()) && recipeStorage != null) { @@ -383,6 +389,25 @@ private List> getPendingRequestQueue() return recipes; } + private static boolean anyChildRequestIs(@NotNull final IRequestManager requestManager, + @NotNull final IRequest parent, + @NotNull final IRequest target) + { + return parent.getChildren().stream().anyMatch(childToken -> + { + final IRequest childRequest = requestManager.getRequestForToken(childToken); + if (childRequest == target) + { + return true; + } + else if (childRequest != null) + { + return anyChildRequestIs(requestManager, childRequest, target); + } + return false; + }); + } + @Override public boolean isVisible() { @@ -405,7 +430,17 @@ public boolean addRecipe(final IToken token) final IRecipeStorage recipeStorage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(token); if (recipeStorage != null) { - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).matches(recipeStorage.getPrimaryOutput())); + if (recipeStorage.getAlternateOutputs().isEmpty()) + { + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); + return true; + } + + final Stream allOutputs = Stream.concat(Stream.of(recipeStorage.getPrimaryOutput()), + recipeStorage.getAlternateOutputs().stream()).filter(stack -> !stack.isEmpty()); + + building.getColony().getRequestManager().onColonyUpdate(request -> + request.getRequest() instanceof IDeliverable delivery && allOutputs.anyMatch(delivery::matches)); } return true; } @@ -486,14 +521,14 @@ public void checkForWorkerSpecificRecipes() if(duplicateFound == null) { addRecipeToList(recipeToken, true); - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).matches(recipeStorage.getPrimaryOutput())); + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); markDirty(); } else if((forceReplace || newRecipe.getMustExist()) && !(duplicateFound.equals(recipeToken))) { //We found the base recipe for a multi-recipe, replace it with the multi-recipe replaceRecipe(duplicateFound, recipeToken); - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).matches(recipeStorage.getPrimaryOutput())); + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); //Clean up old 'classic' recipes that the new multi-recipe replaces final List alternates = recipeStorage.getAlternateOutputs(); @@ -505,7 +540,7 @@ else if((forceReplace || newRecipe.getMustExist()) && !(duplicateFound.equals(re removeRecipe(token); } } - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && recipeStorage.getAlternateOutputs().stream().anyMatch(i -> ((IDeliverable) request.getRequest()).matches(i))); + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); markDirty(); } } @@ -567,16 +602,20 @@ public void improveRecipe(IRecipeStorage recipe, int count, ICitizenData citizen recipe.getPrimaryOutput(), Blocks.AIR); - replaceRecipe(recipe.getToken(), IColonyManager.getInstance().getRecipeManager().checkOrAddRecipe(storage)); - - // Expected parameters for RECIPE_IMPROVED are Job, Result, Ingredient, Citizen - Component jobComponent = MessageUtils.format(citizen.getJob().getJobRegistryEntry().getTranslationKey()).create(); - MessageUtils.format(RECIPE_IMPROVED + citizen.getRandom().nextInt(3), - jobComponent, - recipe.getPrimaryOutput().getHoverName(), - reducedItem.getItemStack().getHoverName(), - citizen.getName() - ).sendTo(building.getColony()).forAllPlayers(); + final IToken token = IColonyManager.getInstance().getRecipeManager().checkOrAddRecipe(storage); + if (isRecipeCompatibleWithCraftingModule(token)) + { + replaceRecipe(recipe.getToken(), token); + + // Expected parameters for RECIPE_IMPROVED are Job, Result, Ingredient, Citizen + Component jobComponent = MessageUtils.format(citizen.getJob().getJobRegistryEntry().getTranslationKey()).create(); + MessageUtils.format(RECIPE_IMPROVED + citizen.getRandom().nextInt(3), + jobComponent, + recipe.getPrimaryOutput().getHoverName(), + reducedItem.getItemStack().getHoverName(), + citizen.getName() + ).sendTo(building.getColony()).forAllPlayers(); + } } } } @@ -775,7 +814,7 @@ public void updateWorkerAvailableForRecipes() final IRecipeStorage recipeStorage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(token); if (recipeStorage != null) { - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).matches(recipeStorage.getPrimaryOutput())); + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); } } } @@ -857,7 +896,7 @@ public void toggle(int recipeLocation) final IRecipeStorage recipeStorage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(key); if (recipeStorage != null) { - building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).matches(recipeStorage.getPrimaryOutput())); + building.getColony().getRequestManager().onColonyUpdate(request -> request.getRequest() instanceof IDeliverable iDeliverable && iDeliverable.matches(recipeStorage.getPrimaryOutput())); } } else @@ -913,6 +952,12 @@ public boolean canLearnManyRecipes() return true; } + @Override + public boolean isDisabled(final IToken token) + { + return disabledRecipes.contains(token); + } + /** This module is for standard crafters (3x3 by default) */ public abstract static class Crafting extends AbstractCraftingBuildingModule { @@ -946,7 +991,7 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) @NotNull public String getId() { - return "crafting"; + return MODULE_CRAFTING; } } @@ -983,7 +1028,7 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) @NotNull public String getId() { - return "smelting"; + return MODULE_SMELTING; } } @@ -1020,7 +1065,7 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) @NotNull public String getId() { - return "brewing"; + return MODULE_BREWING; } } @@ -1053,7 +1098,7 @@ public Set getSupportedCraftingTypes() @NotNull public String getId() { - return "custom"; + return MODULE_CUSTOM; } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AnimalHerdingModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AnimalHerdingModule.java index ec4baadb2f8..c2e96c130b6 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AnimalHerdingModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/AnimalHerdingModule.java @@ -3,32 +3,35 @@ import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModule; import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.colony.jobs.registry.JobEntry; -import com.minecolonies.coremod.colony.crafting.CustomRecipeManager; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; +import com.minecolonies.api.crafting.GenericRecipe; +import com.minecolonies.api.crafting.IGenericRecipe; +import com.minecolonies.api.util.constant.ToolType; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import java.util.function.Predicate; /** - * Currently this module is only used to provide some metadata for JEI, but - * in the future it could be accessed by animal herding AI too. + * Provides some basic definitions used by the animal herding AI (and JEI). */ public class AnimalHerdingModule extends AbstractBuildingModule { private final JobEntry jobEntry; - private final EntityType animalType; + private final Predicate animalPredicate; private final ItemStack breedingItem; public AnimalHerdingModule(@NotNull final JobEntry jobEntry, - @NotNull final EntityType animalType, + @NotNull final Predicate animalPredicate, @NotNull final ItemStack breedingItem) { this.jobEntry = jobEntry; - this.animalType = animalType; + this.animalPredicate = animalPredicate; this.breedingItem = breedingItem; } @@ -44,14 +47,14 @@ public IJob getHerdingJob() } /** - * Gets the animal type managed by this herder. + * Check if this module handles the particular animal. * - * @return The animal entity type. + * @param animal the animal to check. + * @return true if so. */ - @NotNull - public EntityType getAnimalType() + public boolean isCompatible(@NotNull final Animal animal) { - return animalType; + return animalPredicate.test(animal); } /** @@ -66,26 +69,42 @@ public List getBreedingItems() } /** - * The loot table for killing the animal. + * Gets a list of loot tables that should be available for drop + * analysis. This is not intended for actually generating loot, + * just for display purposes such as in JEI (e.g. via {@link #getRecipesForDisplayPurposesOnly}). * - * @return The resource location of the loot table. + * @param animal An example animal. (Don't use specific properties of this; it's only for checking type.) + * @return The list of loot table ids */ @NotNull - public ResourceLocation getDefaultLootTable() + public List getLootTables(@NotNull final Animal animal) { - return getAnimalType().getDefaultLootTable(); + return Collections.singletonList(animal.getLootTable()); } /** - * Returns a list of expected loot from farming the animals. - * Can be overridden if something other than just killing the animals happens. - * This should *not* be used to actually generate loot; it's just informative. + * Get a list of "recipes" for items obtainable by herding the given animal. This can include loot drops + * for killing the animal as well as anything else acquired through other means. + * + * These are purely for JEI display purposes and don't have to represent actual crafting recipes. * - * @return The list of expected loot. + * @param animal An example animal. (Don't use specific properties of this; it's only for checking type.) + * @return the list of additional display recipes. */ @NotNull - public List getExpectedLoot() + public List getRecipesForDisplayPurposesOnly(@NotNull final Animal animal) { - return CustomRecipeManager.getInstance().getLootDrops(getDefaultLootTable()); + return Collections.singletonList(new GenericRecipe(ForgeRegistries.ENTITY_TYPES.getKey(animal.getType()), + ItemStack.EMPTY, + Collections.emptyList(), + Collections.emptyList(), + Collections.singletonList(getBreedingItems()), + 0, + Blocks.AIR, + animal.getLootTable(), + ToolType.AXE, + animal, + Collections.emptyList(), + 0)); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerAssignmentModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerAssignmentModule.java deleted file mode 100644 index 2a6e3605cb4..00000000000 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerAssignmentModule.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.modules; - -import com.minecolonies.api.colony.ICitizenData; -import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.buildings.IBuildingWorkerModule; -import com.minecolonies.api.colony.buildings.modules.*; -import com.minecolonies.api.colony.jobs.registry.JobEntry; -import com.minecolonies.api.entity.citizen.Skill; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.entity.BlockEntity; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Function; - -/** - * Assignment module for couriers - */ -public class FarmerAssignmentModule extends CraftingWorkerBuildingModule implements IBuildingEventsModule, ITickingModule, IPersistentModule, IBuildingWorkerModule, ICreatesResolversModule -{ - public FarmerAssignmentModule(final JobEntry entry, - final Skill primary, - final Skill secondary, - final boolean canWorkingDuringRain, - final Function sizeLimit) - { - super(entry, primary, secondary, canWorkingDuringRain, sizeLimit); - } - - @Override - void onAssignment(final ICitizenData citizen) - { - super.onAssignment(citizen); - for (FarmerFieldModule module : building.getModules(FarmerFieldModule.class)) - { - if (!module.getFarmerFields().isEmpty()) - { - for (@NotNull final BlockPos field : module.getFarmerFields()) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity) - { - ((ScarecrowTileEntity) scareCrow).setOwner(citizen.getId()); - } - } - } - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerFieldModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerFieldModule.java index 49e381052e0..e69de29bb2d 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerFieldModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FarmerFieldModule.java @@ -1,394 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.modules; - -import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModule; -import com.minecolonies.api.colony.buildings.modules.IBuildingEventsModule; -import com.minecolonies.api.colony.buildings.modules.IBuildingModule; -import com.minecolonies.api.colony.buildings.modules.IPersistentModule; -import com.minecolonies.api.util.BlockPosUtil; -import com.minecolonies.api.util.WorldUtil; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * Abstract class for all buildings which require a filterable list of allowed/blocked items. - */ -public class FarmerFieldModule extends AbstractBuildingModule implements IPersistentModule, IBuildingEventsModule, IBuildingModule -{ - /** - * NBTTag to store the fields. - */ - private static final String TAG_FIELDS = "fields"; - - /** - * NBTTag to store the field BlockPos. - */ - private static final String TAG_FIELDS_BLOCKPOS = "fieldsPos"; - - /** - * NBT tag to store assign manually. - */ - private static final String TAG_ASSIGN_MANUALLY = "assign"; - - /** - * Flag used to be notified about block updates. - */ - private static final int BLOCK_UPDATE_FLAG = 3; - - /** - * The last field tag. - */ - private static final String LAST_FIELD_TAG = "lastField"; - - /** - * The field the farmer is currently working on. - */ - @Nullable - private BlockPos currentField; - - /** - * The field the farmer worked on the last morning (first). - */ - @Nullable - private BlockPos lastField; - - /** - * The list of the fields the farmer manages. - */ - private final Set farmerFields = new HashSet<>(); - - /** - * Fields should be assigned manually to the farmer. - */ - private boolean shouldAssignManually = false; - - - /** - * Construct a new grouped itemlist module with the unique list identifier. - */ - public FarmerFieldModule() - { - super(); - } - - @Override - public void deserializeNBT(final CompoundTag compound) - { - final ListTag fieldTagList = compound.getList(TAG_FIELDS, Tag.TAG_COMPOUND); - for (int i = 0; i < fieldTagList.size(); ++i) - { - final CompoundTag fieldCompound = fieldTagList.getCompound(i); - final BlockPos fieldLocation = BlockPosUtil.read(fieldCompound, TAG_FIELDS_BLOCKPOS); - farmerFields.add(fieldLocation); - } - shouldAssignManually = compound.getBoolean(TAG_ASSIGN_MANUALLY); - - if (compound.getAllKeys().contains(LAST_FIELD_TAG)) - { - lastField = BlockPosUtil.read(compound, LAST_FIELD_TAG); - } - } - - @Override - public void serializeNBT(final CompoundTag compound) - { - @NotNull final ListTag fieldTagList = new ListTag(); - for (@NotNull final BlockPos f : farmerFields) - { - @NotNull final CompoundTag fieldCompound = new CompoundTag(); - BlockPosUtil.write(fieldCompound, TAG_FIELDS_BLOCKPOS, f); - fieldTagList.add(fieldCompound); - } - compound.put(TAG_FIELDS, fieldTagList); - compound.putBoolean(TAG_ASSIGN_MANUALLY, shouldAssignManually); - - if (lastField != null) - { - BlockPosUtil.write(compound, LAST_FIELD_TAG, lastField); - } - } - - @Override - public void serializeToView(@NotNull final FriendlyByteBuf buf) - { - buf.writeBoolean(shouldAssignManually); - - int size = 0; - - final List fields = new ArrayList<>(building.getColony().getBuildingManager().getFields()); - final List cleanList = new ArrayList<>(); - - final WorkerBuildingModule module = building.getFirstModuleOccurance(WorkerBuildingModule.class); - for (@NotNull final BlockPos field : fields) - { - if (WorldUtil.isBlockLoaded(building.getColony().getWorld(), field)) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity) - { - if (((ScarecrowTileEntity) scareCrow).isTaken()) - { - if (module.getAssignedCitizen().isEmpty() || ((ScarecrowTileEntity) scareCrow).getOwnerId() == module.getFirstCitizen().getId()) - { - cleanList.add(field); - size++; - } - } - else - { - size++; - cleanList.add(field); - } - } - } - } - - buf.writeInt(size); - for (@NotNull final BlockPos field : cleanList) - { - buf.writeBlockPos(field); - } - - buf.writeInt(farmerFields.size()); - } - - /** - * Getter of the current field. - * - * @return a field object. - */ - @Nullable - public BlockPos getCurrentField() - { - return currentField; - } - - /** - * Sets the field the farmer is currently working on. - * - * @param currentField the field to work on. - */ - public void setCurrentField(@Nullable final BlockPos currentField) - { - this.currentField = currentField; - } - - /** - * Retrieves a random field to work on for the farmer. - * - * @param world the world it is in. - * @return a field to work on. - */ - @Nullable - public BlockPos getFieldToWorkOn(final Level world) - { - final List fields = new ArrayList<>(farmerFields); - Collections.shuffle(fields); - - if (!fields.isEmpty()) - { - if (fields.get(0).equals(lastField)) - { - Collections.shuffle(fields); - } - lastField = fields.get(0); - } - for (@NotNull final BlockPos field : fields) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity && ((ScarecrowTileEntity) scareCrow).needsWork()) - { - currentField = field; - return field; - } - } - return null; - } - - - /** - * Synchronize field list with colony. - * - * @param world the world the building is in. - */ - public void syncWithColony(@NotNull final Level world) - { - if (!farmerFields.isEmpty()) - { - @NotNull final ArrayList tempFields = new ArrayList<>(farmerFields); - final WorkerBuildingModule module = building.getFirstModuleOccurance(WorkerBuildingModule.class); - for (@NotNull final BlockPos field : tempFields) - { - final BlockEntity scarecrow = world.getBlockEntity(field); - if (scarecrow instanceof ScarecrowTileEntity) - { - building.getColony().getWorld() - .sendBlockUpdated(scarecrow.getBlockPos(), - building.getColony().getWorld().getBlockState(scarecrow.getBlockPos()), - building.getColony().getWorld().getBlockState(scarecrow.getBlockPos()), - BLOCK_UPDATE_FLAG); - ((ScarecrowTileEntity) scarecrow).setTaken(true); - ((ScarecrowTileEntity) scarecrow).setOwner(module.getFirstCitizen() != null? module.getFirstCitizen().getId() : 0); - ((ScarecrowTileEntity) scarecrow).setColony(building.getColony()); - } - else - { - farmerFields.remove(field); - if (currentField != null && currentField.equals(field)) - { - currentField = null; - } - } - } - } - } - - /** - * Returns list of fields of the farmer. - * - * @return a list of field objects. - */ - @NotNull - public List getFarmerFields() - { - return new ArrayList<>(farmerFields); - } - - /** - * Checks if the farmer has any fields. - * - * @return true if he has none. - */ - public boolean hasNoFields() - { - return farmerFields.isEmpty(); - } - - /** - * Assigns a field list to the field list. - * - * @param field the field to add. - */ - public void addFarmerFields(final BlockPos field) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity) - { - farmerFields.add(field); - this.markDirty(); - } - } - - /** - * Getter for the assign manually. - * - * @return true if he should. - */ - public boolean assignManually() - { - return shouldAssignManually; - } - - /** - * Switches the assignManually of the farmer. - * - * @param assignManually true if assignment should be manual. - */ - public void setAssignManually(final boolean assignManually) - { - this.shouldAssignManually = assignManually; - } - - /** - * Resets the fields to need work again. - */ - public void resetFields() - { - for (@NotNull final BlockPos field : farmerFields) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity) - { - ((ScarecrowTileEntity) scareCrow).setNeedsWork(true); - } - } - } - - /** - * Method called to free a field. - * - * @param position id of the field. - */ - public void freeField(final BlockPos position) - { - final BlockEntity scarecrow = building.getColony().getWorld().getBlockEntity(position); - if (scarecrow instanceof ScarecrowTileEntity) - { - farmerFields.remove(position); - ((ScarecrowTileEntity) scarecrow).setTaken(false); - ((ScarecrowTileEntity) scarecrow).setOwner(0); - building.getColony().getWorld() - .sendBlockUpdated(scarecrow.getBlockPos(), - building.getColony().getWorld().getBlockState(scarecrow.getBlockPos()), - building.getColony().getWorld().getBlockState(scarecrow.getBlockPos()), - BLOCK_UPDATE_FLAG); - } - } - - /** - * Method called to assign a field to the farmer. - * - * @param position id of the field. - */ - public void assignField(final BlockPos position) - { - final BlockEntity scarecrow = building.getColony().getWorld().getBlockEntity(position); - if (scarecrow instanceof ScarecrowTileEntity) - { - ((ScarecrowTileEntity) scarecrow).setTaken(true); - final WorkerBuildingModule module = building.getFirstModuleOccurance(WorkerBuildingModule.class); - if (module.getFirstCitizen() != null) - { - ((ScarecrowTileEntity) scarecrow).setOwner(module.getFirstCitizen().getId()); - } - farmerFields.add(position); - markDirty(); - } - } - - @Override - public void onWakeUp() - { - resetFields(); - } - - @Override - public void onDestroyed() - { - for (@NotNull final BlockPos field : farmerFields) - { - final BlockEntity scareCrow = building.getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity) - { - ((ScarecrowTileEntity) scareCrow).setTaken(false); - ((ScarecrowTileEntity) scareCrow).setOwner(0); - - building.getColony().getWorld() - .sendBlockUpdated(scareCrow.getBlockPos(), - building.getColony().getWorld().getBlockState(scareCrow.getBlockPos()), - building.getColony().getWorld().getBlockState(scareCrow.getBlockPos()), - BLOCK_UPDATE_FLAG); - } - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FieldsModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FieldsModule.java new file mode 100644 index 00000000000..2923b27e766 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/FieldsModule.java @@ -0,0 +1,263 @@ +package com.minecolonies.coremod.colony.buildings.modules; + +import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModule; +import com.minecolonies.api.colony.buildings.modules.IBuildingModule; +import com.minecolonies.api.colony.buildings.modules.IPersistentModule; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.util.CollectorUtils; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Abstract class to list all fields (assigned) to a building. + */ +public abstract class FieldsModule extends AbstractBuildingModule implements IPersistentModule, IBuildingModule +{ + /** + * NBT tag to store assign manually. + */ + private static final String TAG_ASSIGN_MANUALLY = "assign"; + + /** + * A map of fields, along with their unix timestamp of when they can next be checked again. + */ + private final Map checkedFields = new HashMap<>(); + + /** + * The field the citizen is currently working on. + */ + @Nullable + private IField currentField; + + /** + * Fields should be assigned manually to the citizen. + */ + private boolean shouldAssignManually = false; + + @Override + public void deserializeNBT(final CompoundTag compound) + { + shouldAssignManually = compound.getBoolean(TAG_ASSIGN_MANUALLY); + } + + @Override + public void serializeNBT(final CompoundTag compound) + { + compound.putBoolean(TAG_ASSIGN_MANUALLY, shouldAssignManually); + } + + @Override + public void serializeToView(@NotNull final FriendlyByteBuf buf) + { + buf.writeBoolean(shouldAssignManually); + buf.writeInt(getMaxFieldCount()); + } + + /** + * Getter to obtain the maximum field count. + * + * @return an integer stating the maximum field count. + */ + protected abstract int getMaxFieldCount(); + + /** + * Get the class type which is expected for the fields to have. + * + * @return the class type. + */ + public abstract Class getExpectedFieldType(); + + /** + * Getter of the current field. + * + * @return a field object. + */ + @Nullable + public IField getCurrentField() + { + return currentField; + } + + /** + * Retrieves the field to work on for the citizen, as long as the current field has work, it will keep returning that field. + * Else it will retrieve a random field to work on for the citizen. + * This method will also automatically claim any fields that are not in use if the building is on automatic assignment mode. + * + * @return a field to work on. + */ + @Nullable + public IField getFieldToWorkOn() + { + if (currentField != null) + { + return currentField; + } + + Instant now = Instant.now(); + for (IField field : getOwnedFields().stream().collect(CollectorUtils.toShuffledList())) + { + if (!checkedFields.containsKey(field) || now.isAfter(checkedFields.get(field))) + { + checkedFields.remove(field); + currentField = field; + return field; + } + } + return null; + } + + /** + * Returns list of owned fields. + * + * @return a list of field objects. + */ + @NotNull + public final List getOwnedFields() + { + return getFields().stream().filter(f -> building.getID().equals(f.getBuildingId())).toList(); + } + + /** + * Returns list of fields. + * + * @return a list of field objects. + */ + @NotNull + public abstract List getFields(); + + /** + * Attempt to automatically claim free fields, if possible and if any fields are available. + */ + public void claimFields() + { + if (!shouldAssignManually) + { + for (IField field : getFreeFields()) + { + assignField(field); + } + } + } + + /** + * Returns list of free fields. + * + * @return a list of field objects. + */ + public final List getFreeFields() + { + return getFields().stream().filter(field -> !field.isTaken()).toList(); + } + + /** + * Method called to assign a field to the building. + * + * @param field the field to add. + */ + public void assignField(final IField field) + { + if (canAssignField(field)) + { + field.setBuilding(building.getID()); + markDirty(); + } + } + + /** + * Check to see if a new field can be assigned to the worker. + * + * @param field the field which is being added. + * @return true if so. + */ + public final boolean canAssignField(IField field) + { + return getOwnedFields().size() < getMaxFieldCount() && canAssignFieldOverride(field); + } + + @Override + public void markDirty() + { + super.markDirty(); + building.getColony().getBuildingManager().markFieldsDirty(); + } + + /** + * Additional checks to see if this field can be assigned to the building. + * + * @param field the field which is being added. + * @return true if so. + */ + protected abstract boolean canAssignFieldOverride(IField field); + + /** + * Getter for the assign manually. + * + * @return true if he should. + */ + public final boolean assignManually() + { + return shouldAssignManually; + } + + /** + * Checks if the building has any fields. + * + * @return true if he has none. + */ + public final boolean hasNoFields() + { + return getOwnedFields().isEmpty(); + } + + /** + * Switches the assign manually of the building. + * + * @param assignManually true if assignment should be manual. + */ + public final void setAssignManually(final boolean assignManually) + { + this.shouldAssignManually = assignManually; + } + + /** + * Method called to free a field. + * + * @param field the field to be freed. + */ + public void freeField(final IField field) + { + field.resetOwningBuilding(); + markDirty(); + + if (Objects.equals(currentField, field)) + { + resetCurrentField(); + } + } + + /** + * Resets the current field if the worker indicates this field should no longer be worked on. + */ + public void resetCurrentField() + { + if (currentField != null) + { + checkedFields.put(currentField, Instant.now().plus(getFieldCheckTimeoutSeconds(), ChronoUnit.SECONDS)); + } + currentField = null; + } + + /** + * Get the timeout for fields to be allowed to be checked again. + */ + protected abstract int getFieldCheckTimeoutSeconds(); +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GraveyardManagementModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GraveyardManagementModule.java index f9dceab8437..900a3d9d736 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GraveyardManagementModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GraveyardManagementModule.java @@ -57,7 +57,7 @@ public class GraveyardManagementModule extends AbstractBuildingModule implements public void deserializeNBT(final CompoundTag compound) { restingCitizen.clear(); - if (compound.getAllKeys().contains(TAG_RIP_CITIZEN_LIST)) + if (compound.contains(TAG_RIP_CITIZEN_LIST)) { final ListTag ripCitizen = compound.getList(TAG_RIP_CITIZEN_LIST, TAG_STRING); for (int i = 0; i < ripCitizen.size(); i++) @@ -67,7 +67,7 @@ public void deserializeNBT(final CompoundTag compound) } } - if (compound.getAllKeys().contains(TAG_GRAVE_DATA)) + if (compound.contains(TAG_GRAVE_DATA)) { lastGraveData = new GraveData(); lastGraveData.read(compound.getCompound(TAG_GRAVE_DATA)); diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GuardBuildingModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GuardBuildingModule.java index d9b24f5db0f..9889fb65f6b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GuardBuildingModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/GuardBuildingModule.java @@ -14,8 +14,6 @@ import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; -import com.minecolonies.coremod.colony.jobs.JobArcherTraining; -import com.minecolonies.coremod.colony.jobs.JobCombatTraining; import com.minecolonies.coremod.util.AttributeModifierUtils; import net.minecraft.world.entity.EquipmentSlot; import org.jetbrains.annotations.NotNull; @@ -49,16 +47,20 @@ void onRemoval(final ICitizenData citizen) { super.onRemoval(citizen); final Optional optCitizen = citizen.getEntity(); - if (optCitizen.isPresent()) - { - AttributeModifierUtils.removeAllHealthModifiers(optCitizen.get()); - optCitizen.get().setItemSlot(EquipmentSlot.CHEST, ItemStackUtils.EMPTY); - optCitizen.get().setItemSlot(EquipmentSlot.FEET, ItemStackUtils.EMPTY); - optCitizen.get().setItemSlot(EquipmentSlot.HEAD, ItemStackUtils.EMPTY); - optCitizen.get().setItemSlot(EquipmentSlot.LEGS, ItemStackUtils.EMPTY); - optCitizen.get().setItemSlot(EquipmentSlot.MAINHAND, ItemStackUtils.EMPTY); - optCitizen.get().setItemSlot(EquipmentSlot.OFFHAND, ItemStackUtils.EMPTY); - } + optCitizen.ifPresent(cit -> { + AttributeModifierUtils.removeAllHealthModifiers(cit); + cit.setItemSlot(EquipmentSlot.CHEST, ItemStackUtils.EMPTY); + cit.setItemSlot(EquipmentSlot.FEET, ItemStackUtils.EMPTY); + cit.setItemSlot(EquipmentSlot.HEAD, ItemStackUtils.EMPTY); + cit.setItemSlot(EquipmentSlot.LEGS, ItemStackUtils.EMPTY); + cit.setItemSlot(EquipmentSlot.MAINHAND, ItemStackUtils.EMPTY); + cit.setItemSlot(EquipmentSlot.OFFHAND, ItemStackUtils.EMPTY); + + cit.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.CHEST); + cit.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.LEGS); + cit.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.HEAD); + cit.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.FEET); + }); } @Override @@ -71,7 +73,7 @@ public boolean isFull() public void onColonyTick(@NotNull final IColony colony) { // Give the other assignment module also a chance. - if (random.nextInt(building.getModules(GuardBuildingModule.class).size()) > 0) + if (random.nextInt(building.getModules(GuardBuildingModule.class).size()) == 0) { return; } @@ -87,9 +89,13 @@ public void onColonyTick(@NotNull final IColony colony) for (ICitizenData trainee : colony.getCitizenManager().getCitizens()) { - if ((getJobEntry() == ModJobs.archer.get() && trainee.getJob() instanceof JobArcherTraining - || getJobEntry() == ModJobs.knight.get() && trainee.getJob() instanceof JobCombatTraining) - && trainee.getCitizenSkillHandler().getLevel(getPrimarySkill()) > maxSkill) + if (trainee.getJob() == null) + { + continue; + } + if ((getJobEntry().equals(ModJobs.archer.get()) && trainee.getJob().getJobRegistryEntry().equals(ModJobs.archerInTraining.get()) + || getJobEntry().equals(ModJobs.knight.get()) && trainee.getJob().getJobRegistryEntry().equals(ModJobs.knightInTraining.get())) + && trainee.getCitizenSkillHandler().getLevel(getPrimarySkill()) > maxSkill) { maxSkill = trainee.getCitizenSkillHandler().getLevel(getPrimarySkill()); trainingCitizen = trainee; @@ -99,6 +105,7 @@ public void onColonyTick(@NotNull final IColony colony) if (trainingCitizen != null) { hiredFromTraining = true; + trainingCitizen.setJob(null); assignCitizen(trainingCitizen); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinerLevelManagementModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinerLevelManagementModule.java index 5ad7b502351..5ce1a79887b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinerLevelManagementModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinerLevelManagementModule.java @@ -65,11 +65,11 @@ public void deserializeNBT(final CompoundTag compound) this.levels.add(new MinerLevel(levelTagList.getCompound(i))); } - if (compound.getAllKeys().contains(TAG_ACTIVE)) + if (compound.contains(TAG_ACTIVE)) { activeNode = Node.createFromNBT(compound.getCompound(TAG_ACTIVE)); } - else if (compound.getAllKeys().contains(TAG_OLD)) + else if (compound.contains(TAG_OLD)) { oldNode = Node.createFromNBT(compound.getCompound(TAG_OLD)); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinimumStockModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinimumStockModule.java index 2c3017acb90..95a05b23a61 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinimumStockModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/MinimumStockModule.java @@ -130,6 +130,7 @@ public void onColonyTick(@NotNull final IColony colony) { itemStack.setCount(Math.min(itemStack.getMaxStackSize(), delta)); final Stack stack = new Stack(itemStack, false); + stack.setCanBeResolvedByBuilding(false); building.createRequest(stack, false); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/QuarryModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/QuarryModule.java index b8b12e627f2..b9233674a3e 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/QuarryModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/QuarryModule.java @@ -52,7 +52,8 @@ public QuarryModule(final int height) public void onColonyTick(@NotNull final IColony colony) { // If we have no active worker, grab one from the Colony - if (!isFull() && (this.getHiringMode() == HiringMode.DEFAULT && !building.getColony().isManualHiring() || this.getHiringMode() == HiringMode.AUTO)) + if (!isFull() && building.getBuildingLevel() > 0 && building.isBuilt() && + (this.getHiringMode() == HiringMode.DEFAULT && !building.getColony().isManualHiring() || this.getHiringMode() == HiringMode.AUTO)) { for (final ICitizenData data : colony.getCitizenManager().getCitizens()) { diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkAtHomeBuildingModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkAtHomeBuildingModule.java index e2b2bdd3c70..077e6205636 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkAtHomeBuildingModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkAtHomeBuildingModule.java @@ -47,7 +47,11 @@ public boolean assignCitizen(final ICitizenData citizen) BlockPosUtil.getString(oldHome.getID())) .sendTo(oldHome.getColony()).forAllPlayers(); } - oldHome.getFirstModuleOccurance(LivingBuildingModule.class).removeCitizen(citizen); + + if (oldHome.hasModule(LivingBuildingModule.class)) + { + oldHome.getFirstModuleOccurance(LivingBuildingModule.class).removeCitizen(citizen); + } } citizen.setHomeBuilding(building); return true; diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkerBuildingModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkerBuildingModule.java index 850bb561c6f..fe387222d16 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkerBuildingModule.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/WorkerBuildingModule.java @@ -24,7 +24,6 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; - import org.jetbrains.annotations.NotNull; import java.util.List; @@ -37,7 +36,8 @@ /** * The worker module for citizen where they are assigned to if they work at it. */ -public class WorkerBuildingModule extends AbstractAssignedCitizenModule implements IAssignsJob, IBuildingEventsModule, ITickingModule, IPersistentModule, IBuildingWorkerModule, ICreatesResolversModule +public class WorkerBuildingModule extends AbstractAssignedCitizenModule + implements IAssignsJob, IBuildingEventsModule, ITickingModule, IPersistentModule, IBuildingWorkerModule, ICreatesResolversModule { /** * Module specific skills. @@ -77,30 +77,30 @@ public WorkerBuildingModule( @Override public boolean assignCitizen(final ICitizenData citizen) { - if (citizen.getWorkBuilding() != null && citizen.getEntity().isPresent() && !citizen.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (assignedCitizen.contains(citizen) || isFull() || citizen == null) { - for (final WorkerBuildingModule module : citizen.getWorkBuilding().getModules(WorkerBuildingModule.class)) - { - if (module.hasAssignedCitizen(citizen)) - { - module.removeCitizen(citizen); - } - } + return false; + } + + IJob job = citizen.getJob(); + if (job == null) + { + job = createJob(citizen); } - if (!super.assignCitizen(citizen)) + if (!job.assignTo(this)) { - Log.getLogger().warn("Unable to assign citizen:" + citizen.getName() + " to building:" + building.getSchematicName() + " jobname:" + getJobDisplayName()); return false; } - return true; + + return super.assignCitizen(citizen); } @Override public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_WORKER)) + if (compound.contains(TAG_WORKER)) { final ListTag workersTagList = compound.getList(TAG_WORKER, Tag.TAG_COMPOUND); for (int i = 0; i < workersTagList.size(); ++i) @@ -124,7 +124,6 @@ else if (compound.contains(jobEntry.getKey().toString())) assignCitizen(citizen); } } - } } @@ -172,7 +171,6 @@ public void serializeToView(@NotNull final FriendlyByteBuf buf) @Override void onAssignment(final ICitizenData citizen) { - citizen.setWorkBuilding(building); for (final AbstractCraftingBuildingModule module : building.getModules(AbstractCraftingBuildingModule.class)) { module.updateWorkerAvailableForRecipes(); @@ -186,7 +184,11 @@ void onAssignment(final ICitizenData citizen) @Override void onRemoval(final ICitizenData citizen) { - citizen.setWorkBuilding(null); + if (citizen.getJob() != null) + { + citizen.getJob().onRemoval(); + } + building.cancelAllRequestsOfCitizen(citizen); citizen.setVisibleStatus(null); } @@ -250,11 +252,11 @@ public List> createResolvers() { final ImmutableList.Builder> builder = ImmutableList.builder(); builder.add(new BuildingRequestResolver(building.getRequester().getLocation(), building.getColony().getRequestManager() - .getFactoryController().getNewInstance(TypeConstants.ITOKEN)), + .getFactoryController().getNewInstance(TypeConstants.ITOKEN)), new PrivateWorkerCraftingRequestResolver(building.getRequester().getLocation(), building.getColony().getRequestManager() - .getFactoryController().getNewInstance(TypeConstants.ITOKEN), jobEntry), + .getFactoryController().getNewInstance(TypeConstants.ITOKEN), jobEntry), new PrivateWorkerCraftingProductionResolver(building.getRequester().getLocation(), building.getColony().getRequestManager() - .getFactoryController().getNewInstance(TypeConstants.ITOKEN), jobEntry)); + .getFactoryController().getNewInstance(TypeConstants.ITOKEN), jobEntry)); return builder.build(); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BeekeeperCollectionSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BeekeeperCollectionSetting.java index aff837ef0d0..57e740a4386 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BeekeeperCollectionSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BeekeeperCollectionSetting.java @@ -1,17 +1,12 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.BOWindow; -import com.ldtteam.blockui.views.View; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBeekeeper; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -19,6 +14,9 @@ import static com.minecolonies.api.research.util.ResearchConstants.BEEKEEP_2; +/** + * Stores the beekeeper collection setting. + */ public class BeekeeperCollectionSetting extends StringSetting { /** @@ -53,11 +51,10 @@ public void setupHandler( final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window) + final IBuildingView building, + final BOWindow window) { hasResearch = building.getColony().getResearchManager().getResearchEffects().getEffectStrength(BEEKEEP_2) > 0; - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutstringsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BlockSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BlockSetting.java index 9b3e4de02ae..5f518267bf4 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BlockSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BlockSetting.java @@ -1,11 +1,8 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.ButtonImage; import com.ldtteam.blockui.controls.ItemIcon; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.modules.settings.ISetting; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; @@ -13,12 +10,12 @@ import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.coremod.client.gui.WindowSelectRes; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -35,7 +32,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static com.minecolonies.api.util.constant.WindowConstants.*; +import static com.minecolonies.api.util.constant.WindowConstants.SWITCH; /** * Stores a solid block setting. @@ -43,14 +40,14 @@ public class BlockSetting implements ISetting { /** - * The value of the setting. + * Default value of the setting. */ - private BlockItem value; + private final BlockItem defaultValue; /** - * Default value of the setting. + * The value of the setting. */ - private BlockItem defaultValue; + private BlockItem value; /** * Create a new boolean setting. @@ -98,30 +95,31 @@ public BlockItem getDefault() /** * Set a new block value. * - * @param value the itemblock to set. + * @param value the item block to set. */ public void setValue(final BlockItem value) { this.value = value; } + @Override + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutblocksetting.xml"); + } + @OnlyIn(Dist.CLIENT) @Override public void setupHandler( final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window) + final IBuildingView building, + final BOWindow window) { - - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutblocksetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("desc", Text.class).setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> new WindowSelectRes( window, - building, - (stack) -> { + stack -> { final Item item = stack.getItem(); if (!( item instanceof BlockItem )) { @@ -137,6 +135,10 @@ public void setupHandler( return block.getShape(state, new SingleStateBlockGetter(state), BlockPos.ZERO, CollisionContext.empty()).equals(Shapes.block()) && state.getMaterial().blocksMotion(); }, (stack, qty) -> { + if (stack.isEmpty()) + { + return; + } value = (BlockItem) stack.getItem(); settingsModuleView.getSetting(new SettingKey(key.getType(), key.getUniqueId())).updateSetting(this); settingsModuleView.trigger(key); @@ -144,16 +146,27 @@ public void setupHandler( } @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) + public void render( + final ISettingKey key, + final Pane pane, + final ISettingsModuleView settingsModuleView, + final IBuildingView building, + final BOWindow window) { pane.findPaneOfTypeByID("icon", ItemIcon.class).setItem(new ItemStack(value)); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(SWITCH)); + ButtonImage triggerButton = pane.findPaneOfTypeByID("trigger", ButtonImage.class); + triggerButton.setEnabled(isActive(settingsModuleView)); + triggerButton.setText(Component.translatable(SWITCH)); + setInActiveHoverPane(triggerButton, settingsModuleView); } @Override - public void trigger() + public void copyValue(final ISetting setting) { - + if (setting instanceof final BlockSetting other) + { + setValue(other.getValue()); + } } /** diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BoolSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BoolSetting.java index 228164c8c50..779a44edbaf 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BoolSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BoolSetting.java @@ -1,10 +1,7 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.modules.settings.ISetting; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; @@ -24,17 +21,18 @@ public class BoolSetting implements ISetting { /** - * The value of the setting. + * Default value of the setting. */ - private boolean value; + private final boolean defaultValue; /** - * Default value of the setting. + * The value of the setting. */ - private boolean defaultValue; + private boolean value; /** * Create a new boolean setting. + * * @param init the initial value. */ public BoolSetting(final boolean init) @@ -45,8 +43,9 @@ public BoolSetting(final boolean init) /** * Create a new boolean setting. + * * @param value the value. - * @param def the default value. + * @param def the default value. */ public BoolSetting(final boolean value, final boolean def) { @@ -56,6 +55,7 @@ public BoolSetting(final boolean value, final boolean def) /** * Get the setting value. + * * @return the set value. */ public boolean getValue() @@ -65,6 +65,7 @@ public boolean getValue() /** * Get the default value. + * * @return the default value. */ public boolean getDefault() @@ -72,6 +73,12 @@ public boolean getDefault() return defaultValue; } + @Override + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutboolsetting.xml"); + } + @OnlyIn(Dist.CLIENT) @Override public void setupHandler( @@ -80,16 +87,21 @@ public void setupHandler( final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutboolsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("desc", Text.class).setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); } @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) + public void render( + final ISettingKey key, + final Pane pane, + final ISettingsModuleView settingsModuleView, + final IBuildingView building, + final BOWindow window) { - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(value ? ON : OFF)); + ButtonImage triggerButton = pane.findPaneOfTypeByID("trigger", ButtonImage.class); + triggerButton.setEnabled(isActive(settingsModuleView)); + triggerButton.setText(Component.translatable(value ? ON : OFF)); + setInActiveHoverPane(triggerButton, settingsModuleView); } @Override @@ -97,4 +109,13 @@ public void trigger() { this.value = !this.value; } + + @Override + public void copyValue(final ISetting setting) + { + if (setting instanceof final BoolSetting other) + { + this.value = other.value; + } + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BuilderModeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BuilderModeSetting.java index ebe1701231e..ee7823f323b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BuilderModeSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/BuilderModeSetting.java @@ -6,9 +6,10 @@ import com.minecolonies.api.colony.buildings.modules.ISettingsModule; import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBuilder; +import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; import static com.minecolonies.api.research.util.ResearchConstants.BUILDER_MODE; @@ -18,26 +19,47 @@ */ public class BuilderModeSetting extends StringSetting { + /** + * Reason display constants. + */ + public static final String NEEDS_RESEARCH_REASON = "com.minecolonies.coremod.settings.reason.needsresearch"; + public static final String BUILDER_MODES_RESEARCH = "com.minecolonies.research.technology.buildermodes.name"; + /** * Create the builder mode setting. */ public BuilderModeSetting() { - super(new ArrayList<>(StructureIterators.getKeySet()), 0); + super(StructureIterators.getKeySet().stream().sorted(String::compareToIgnoreCase).toList(), 0); set(Structurize.getConfig().getServer().iteratorType.get()); } /** * Create the builder mode setting. + * * @param value the list of possible settings. - * @param curr the current setting. + * @param curr the current setting. */ public BuilderModeSetting(final List value, final int curr) { - super(new ArrayList<>(StructureIterators.getKeySet()), 0); + super(StructureIterators.getKeySet().stream().sorted(String::compareToIgnoreCase).toList(), 0); set(value.get(curr)); } + @NotNull + public static String getActualValue(@NotNull final IBuilding building) + { + return building.getOptionalSetting(BuildingBuilder.BUILDING_MODE) + .map(StringSetting::getValue) + .orElse(Structurize.getConfig().getServer().iteratorType.get()); + } + + @Override + protected Component getDisplayText() + { + return Component.translatable("com.ldtteam.structurize.iterators." + getSettings().get(getCurrentIndex())); + } + @Override public boolean isActive(final ISettingsModule module) { @@ -50,11 +72,9 @@ public boolean isActive(final ISettingsModuleView module) return module.getColony().getResearchManager().getResearchEffects().getEffectStrength(BUILDER_MODE) > 0; } - @NotNull - public static String getActualValue(@NotNull final IBuilding building) + @Override + public @Nullable Component getInactiveReason() { - return building.getOptionalSetting(BuildingBuilder.BUILDING_MODE) - .map(StringSetting::getValue) - .orElse(Structurize.getConfig().getServer().iteratorType.get()); + return Component.translatable(NEEDS_RESEARCH_REASON, Component.translatable(BUILDER_MODES_RESEARCH)); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/CrafterRecipeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/CrafterRecipeSetting.java index bb8d3934eff..c379bc726ef 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/CrafterRecipeSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/CrafterRecipeSetting.java @@ -2,21 +2,29 @@ import com.minecolonies.api.colony.buildings.modules.ISettingsModule; import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.Nullable; import java.util.List; import static com.minecolonies.api.research.util.ResearchConstants.RECIPE_MODE; /** - * Stores the recipe setting for crafters. + * Stores the recipe setting for crafter workers. */ public class CrafterRecipeSetting extends StringSettingWithDesc { + /** + * Reason display constants. + */ + public static final String NEEDS_RESEARCH_REASON = "com.minecolonies.coremod.settings.reason.needsresearch"; + public static final String WAREHOUSE_MASTER_RESEARCH = "com.minecolonies.research.technology.warehousemaster.name"; + /** * Different setting possibilities. */ - public static final String PRIORITY = "com.minecolonies.core.crafting.setting.priority"; - public static final String MAX_STOCK = "com.minecolonies.core.crafting.setting.maxstock"; + public static final String PRIORITY = "com.minecolonies.core.crafting.setting.priority"; + public static final String MAX_STOCK = "com.minecolonies.core.crafting.setting.maxstock"; /** * Create a new guard task list setting. @@ -28,7 +36,8 @@ public CrafterRecipeSetting() /** * Create a new string list setting. - * @param settings the overall list of settings. + * + * @param settings the overall list of settings. * @param currentIndex the current selected index. */ public CrafterRecipeSetting(final List settings, final int currentIndex) @@ -42,6 +51,12 @@ public boolean isActive(final ISettingsModule module) return module.getBuilding().getColony().getResearchManager().getResearchEffects().getEffectStrength(RECIPE_MODE) > 0; } + @Override + public @Nullable Component getInactiveReason() + { + return Component.translatable(NEEDS_RESEARCH_REASON, Component.translatable(WAREHOUSE_MASTER_RESEARCH)); + } + @Override public boolean isActive(final ISettingsModuleView module) { diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/DynamicTreesSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/DynamicTreesSetting.java index 5d42345a707..4e047e6d581 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/DynamicTreesSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/DynamicTreesSetting.java @@ -17,6 +17,7 @@ public DynamicTreesSetting() /** * Create a new dynamic tree setting + * * @param value the current value * @param defaultValue the default value */ @@ -31,9 +32,12 @@ public boolean isActive(final ISettingsModule module) return ModList.get().isLoaded("dynamictrees"); } - /** - * @return whether the setting is active (i.e. whether dynamic trees is loaded) - */ + @Override + public boolean shouldHideWhenInactive() + { + return true; + } + @Override public boolean isActive(ISettingsModuleView module) { diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/FollowModeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/FollowModeSetting.java deleted file mode 100644 index d907f91b608..00000000000 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/FollowModeSetting.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.modules.settings; - -import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; -import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; - -import java.util.List; - -/** - * Stores the follow mode setting. - */ -public class FollowModeSetting extends StringSettingWithDesc -{ - /** - * Different setting possibilities. - */ - public static String TIGHT = "com.minecolonies.core.guard.setting.follow.tight"; - public static String LOOSE = "com.minecolonies.core.guard.setting.follow.loose"; - - /** - * Create a new follow mode setting. - */ - public FollowModeSetting() - { - super(TIGHT, LOOSE); - } - - /** - * Create a new follow mode setting. - * @param settings the overall list of settings. - * @param currentIndex the current selected index. - */ - public FollowModeSetting(final List settings, final int currentIndex) - { - super(settings, currentIndex); - } - - @Override - public boolean isActive(final ISettingsModuleView module) - { - return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(GuardTaskSetting.FOLLOW); - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardFollowModeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardFollowModeSetting.java new file mode 100644 index 00000000000..abd18b5be13 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardFollowModeSetting.java @@ -0,0 +1,56 @@ +package com.minecolonies.coremod.colony.buildings.modules.settings; + +import com.minecolonies.api.colony.buildings.modules.ISettingsModule; +import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; +import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; + +import java.util.List; + +/** + * Stores the follow mode setting. + */ +public class GuardFollowModeSetting extends StringSettingWithDesc +{ + /** + * Different setting possibilities. + */ + public static final String TIGHT = "com.minecolonies.core.guard.setting.follow.tight"; + public static final String LOOSE = "com.minecolonies.core.guard.setting.follow.loose"; + + /** + * Create a new follow mode setting. + */ + public GuardFollowModeSetting() + { + super(TIGHT, LOOSE); + } + + /** + * Create a new follow mode setting. + * + * @param settings the overall list of settings. + * @param currentIndex the current selected index. + */ + public GuardFollowModeSetting(final List settings, final int currentIndex) + { + super(settings, currentIndex); + } + + @Override + public boolean isActive(final ISettingsModule module) + { + return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(GuardTaskSetting.FOLLOW); + } + + @Override + public boolean isActive(final ISettingsModuleView module) + { + return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(GuardTaskSetting.FOLLOW); + } + + @Override + public boolean shouldHideWhenInactive() + { + return true; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardPatrolModeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardPatrolModeSetting.java new file mode 100644 index 00000000000..2d34fbb0b3d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardPatrolModeSetting.java @@ -0,0 +1,58 @@ +package com.minecolonies.coremod.colony.buildings.modules.settings; + +import com.minecolonies.api.colony.buildings.modules.ISettingsModule; +import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; +import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; + +import java.util.List; + +import static com.minecolonies.coremod.colony.buildings.modules.settings.GuardTaskSetting.PATROL; + +/** + * Stores the patrol mode setting. + */ +public class GuardPatrolModeSetting extends StringSettingWithDesc +{ + /** + * Different setting possibilities. + */ + public static final String AUTO = "com.minecolonies.core.guard.setting.patrol.auto"; + public static final String MANUAL = "com.minecolonies.core.guard.setting.patrol.manual"; + + /** + * Create a new patrol mode list setting. + */ + public GuardPatrolModeSetting() + { + super(AUTO, MANUAL); + } + + /** + * Create a new patrol mode list setting. + * + * @param settings the overall list of settings. + * @param currentIndex the current selected index. + */ + public GuardPatrolModeSetting(final List settings, final int currentIndex) + { + super(settings, currentIndex); + } + + @Override + public boolean isActive(final ISettingsModule module) + { + return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(PATROL); + } + + @Override + public boolean isActive(final ISettingsModuleView module) + { + return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(PATROL); + } + + @Override + public boolean shouldHideWhenInactive() + { + return true; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardTaskSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardTaskSetting.java index 593675de53b..dc79f2767fe 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardTaskSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/GuardTaskSetting.java @@ -1,10 +1,8 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; +import com.ldtteam.blockui.PaneBuilders; import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; @@ -12,26 +10,33 @@ import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; import com.minecolonies.coremod.colony.buildings.moduleviews.ToolModuleView; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; +import static com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards.PATROL_MODE; +import static com.minecolonies.coremod.colony.buildings.modules.settings.GuardPatrolModeSetting.MANUAL; + /** - * Stores a gurd task setting. + * Stores a guard task setting. */ public class GuardTaskSetting extends StringSettingWithDesc { /** * Different setting possibilities. */ - public static final String PATROL = "com.minecolonies.core.guard.setting.patrol"; - public static final String GUARD = "com.minecolonies.core.guard.setting.guard"; - public static final String FOLLOW = "com.minecolonies.core.guard.setting.follow"; - public static final String PATROL_MINE = "com.minecolonies.core.guard.setting.patrol_mine"; + public static final String PATROL = "com.minecolonies.core.guard.setting.patrol"; + public static final String GUARD = "com.minecolonies.core.guard.setting.guard"; + public static final String FOLLOW = "com.minecolonies.core.guard.setting.follow"; + public static final String PATROL_MINE = "com.minecolonies.core.guard.setting.patrol_mine"; + + /** + * Different trigger button widths. + */ + private static final int SET_POS_BUTTON_WIDTH = 60; + private static final int HELP_BUTTON_WIDTH = 125; /** * Create a new guard task list setting. @@ -59,75 +64,97 @@ public GuardTaskSetting(final List settings, final int currentIndex) super(settings, currentIndex); } - @OnlyIn(Dist.CLIENT) @Override - public void setupHandler( - final ISettingKey key, - final Pane pane, - final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window) + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutguardtasksetting.xml"); + } + + @Override + public void onUpdate(final IBuilding building, final ServerPlayer sender) + { + if (building instanceof AbstractBuildingGuards guardBuilding && getValue().equals(FOLLOW)) + { + guardBuilding.setPlayerToFollow(sender); + } + } + + @Override + public void setupHandler(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutguardtasksetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("desc", Text.class).setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); + super.setupHandler(key, pane, settingsModuleView, building, window); + + final ButtonImage setPositionsButton = pane.findPaneOfTypeByID("setPositions", ButtonImage.class); + setPositionsButton.setHandler(button -> building.getModuleView(ToolModuleView.class).getWindow().open()); } @Override public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) { - final String setting = getSettings().get(getCurrentIndex()); - final ButtonImage targetButton = pane.findPaneOfTypeByID("setTarget", ButtonImage.class); - final Text mineLabel = pane.findPaneOfTypeByID("minePos", Text.class); - if (setting.equals(PATROL_MINE) && building instanceof AbstractBuildingGuards.View ) + super.render(key, pane, settingsModuleView, building, window); + + final ButtonImage setPositionsButton = pane.findPaneOfTypeByID("setPositions", ButtonImage.class); + final ButtonImage helpButton = pane.findPaneOfTypeByID("helpButton", ButtonImage.class); + + switch (getValue()) { - mineLabel.setVisible(true); - if (((AbstractBuildingGuards.View) building).getMinePos() != null) + case PATROL -> { - mineLabel.setText(Component.translatable("com.minecolonies.coremod.gui.worherhuts.patrollingmine", ((AbstractBuildingGuards.View) building).getMinePos().toShortString())); + final String patrolMode = settingsModuleView.getSetting(PATROL_MODE).getValue(); + setPositionsButton.setVisible(patrolMode.equals(MANUAL)); + helpButton.setVisible(false); } - else + case GUARD -> setPositionsButton.setVisible(true); + case PATROL_MINE -> { - mineLabel.setText(Component.translatable("com.minecolonies.coremod.job.guard.assignmine")); + setPositionsButton.setVisible(false); + helpButton.setVisible(true); + setPatrolMineHelpLabel(helpButton, (AbstractBuildingGuards.View) building); } - targetButton.setVisible(false); - } - else if (!setting.equals(FOLLOW)) - { - mineLabel.setVisible(false); - targetButton.setVisible(true); - if (setting.equals(PATROL)) + default -> { - if (!settingsModuleView.getSetting(AbstractBuildingGuards.PATROL_MODE).getValue().equals(PatrolModeSetting.MANUAL)) - { - targetButton.setVisible(false); - } - else - { - targetButton.setText(Component.translatable("com.minecolonies.coremod.gui.workerhuts.targetpatrol")); - } + setPositionsButton.setVisible(false); + helpButton.setVisible(false); } - else - { - targetButton.setText(Component.translatable("com.minecolonies.coremod.gui.workerhuts.targetguard")); - } - - targetButton.setHandler(button -> building.getModuleView(ToolModuleView.class).getWindow().open()); } - else - { - mineLabel.setVisible(false); - targetButton.setVisible(false); - } - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(setting)); } @Override - public void onUpdate(final IBuilding building, final ServerPlayer sender) + protected int getButtonWidth(final ISettingsModuleView settingsModuleView) + { + return switch (getValue()) + { + case PATROL -> + { + final String patrolMode = settingsModuleView.getSetting(PATROL_MODE).getValue(); + yield patrolMode.equals(MANUAL) ? SET_POS_BUTTON_WIDTH : MAX_BUTTON_WIDTH; + } + case GUARD -> SET_POS_BUTTON_WIDTH; + case PATROL_MINE -> HELP_BUTTON_WIDTH; + default -> MAX_BUTTON_WIDTH; + }; + } + + /** + * Set the correct text on the patrol mine help button. + * + * @param button the button instance. + * @param building the building. + */ + private void setPatrolMineHelpLabel(final ButtonImage button, final AbstractBuildingGuards.View building) { - if (building instanceof AbstractBuildingGuards && getValue().equals(FOLLOW)) + Component component; + if (building.getMinePos() != null) + { + component = Component.translatable("com.minecolonies.coremod.gui.worherhuts.patrollingmine", building.getMinePos().toShortString()); + } + else { - ((AbstractBuildingGuards) building).setPlayerToFollow(sender); + component = Component.translatable("com.minecolonies.coremod.job.guard.assignmine"); } + PaneBuilders.tooltipBuilder() + .append(component) + .hoverPane(button) + .build(); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/IntSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/IntSetting.java index 3974e599fdd..92f8ba28a77 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/IntSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/IntSetting.java @@ -1,16 +1,12 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.controls.TextField; -import com.ldtteam.blockui.views.View; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.modules.settings.ISetting; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; import com.minecolonies.api.colony.buildings.views.IBuildingView; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -21,14 +17,14 @@ public class IntSetting implements ISetting { /** - * The value of the setting. + * Default value of the setting. */ - private int value; + private final int defaultValue; /** - * Default value of the setting. + * The value of the setting. */ - private int defaultValue; + private int value; /** * Create a new boolean setting. @@ -69,6 +65,12 @@ public int getDefault() return defaultValue; } + @Override + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutintsetting.xml"); + } + @OnlyIn(Dist.CLIENT) @Override public void setupHandler( @@ -77,11 +79,7 @@ public void setupHandler( final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutintsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("desc", Text.class).setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); pane.findPaneOfTypeByID("trigger", TextField.class).setHandler(input -> { - try { if (input.getText().isEmpty()) @@ -102,9 +100,16 @@ public void setupHandler( } @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) + public void render( + final ISettingKey key, + final Pane pane, + final ISettingsModuleView settingsModuleView, + final IBuildingView building, + final BOWindow window) { final TextField field = pane.findPaneOfTypeByID("trigger", TextField.class); + field.setEnabled(isActive(settingsModuleView)); + setInActiveHoverPane(field, settingsModuleView); if (!field.getText().equals(String.valueOf(this.value))) { field.setText(String.valueOf(value)); @@ -112,9 +117,12 @@ public void render(final ISettingKey key, final Pane pane, final ISettingsMod } @Override - public void trigger() + public void copyValue(final ISetting setting) { - + if (setting instanceof final IntSetting other) + { + setValue(other.getValue()); + } } /** diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PatrolModeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PatrolModeSetting.java deleted file mode 100644 index 80b6d04e68e..00000000000 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PatrolModeSetting.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.modules.settings; - -import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; -import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; - -import java.util.List; - -/** - * Stores the patrol mode setting. - */ -public class PatrolModeSetting extends StringSettingWithDesc -{ - /** - * Different setting possibilities. - */ - public static String AUTO = "com.minecolonies.core.guard.setting.patrol.auto"; - public static String MANUAL = "com.minecolonies.core.guard.setting.patrol.manual"; - - /** - * Create a new patrol mode list setting. - */ - public PatrolModeSetting() - { - super(AUTO, MANUAL); - } - - /** - * Create a new patrol mode list setting. - * @param settings the overall list of settings. - * @param currentIndex the current selected index. - */ - public PatrolModeSetting(final List settings, final int currentIndex) - { - super(settings, currentIndex); - } - - @Override - public boolean isActive(final ISettingsModuleView module) - { - return module.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(GuardTaskSetting.PATROL); - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PlantationSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PlantationSetting.java deleted file mode 100644 index d714135f229..00000000000 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/PlantationSetting.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.modules.settings; - -import com.ldtteam.blockui.Loader; -import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; -import com.ldtteam.blockui.views.BOWindow; -import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; -import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; -import com.minecolonies.api.colony.buildings.views.IBuildingView; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import java.util.List; - -import static com.minecolonies.api.research.util.ResearchConstants.PLANT_2; - -/** - * Stores the string-list setting (Like enum, but easily serializable). - */ -public class PlantationSetting extends StringSetting -{ - public static final String SUGAR_CANE_AND_CACTUS = Items.SUGAR_CANE.getDescriptionId() + PlantationSetting.SPLIT_TOKEN + Items.CACTUS.getDescriptionId(); - public static final String CACTUS_AND_BAMBOO = Items.CACTUS.getDescriptionId() + PlantationSetting.SPLIT_TOKEN + Items.BAMBOO.getDescriptionId(); - public static final String BAMBOO_AND_SUGAR_CANE = Items.BAMBOO.getDescriptionId() + PlantationSetting.SPLIT_TOKEN + Items.SUGAR_CANE.getDescriptionId(); - - private final static String SPLIT_TOKEN = "/"; - - /** - * Cached research. - */ - private boolean hasResearch; - - /** - * Create a new string list setting. - * - * @param settings the overall list of settings. - */ - public PlantationSetting(final String... settings) - { - super(settings); - } - - /** - * Create a new string list setting. - * - * @param settings the overall list of settings. - * @param currentIndex the current selected index. - */ - public PlantationSetting(final List settings, final int currentIndex) - { - super(settings, currentIndex); - } - - @OnlyIn(Dist.CLIENT) - @Override - public void setupHandler( - final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) - { - hasResearch = building.getColony().getResearchManager().getResearchEffects().getEffectStrength(PLANT_2) > 0; - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutstringsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); - } - - @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) - { - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(getCombinedSetting()); - } - - @Override - public boolean isIndexAllowed(final int index) - { - boolean isAllowed = super.isIndexAllowed(index); - if (!isAllowed) - { - return false; - } - - int maxSplitTokens = hasResearch ? 1 : 0; - final String[] split = getSettings().get(index).split(SPLIT_TOKEN); - return (split.length - 1) <= maxSplitTokens; - } - - /** - * Get the setting when the research exists. - * - * @return the combined setting. - */ - private MutableComponent getCombinedSetting() - { - final String[] inputSplit = getSettings().get(getCurrentIndex()).split(SPLIT_TOKEN); - - MutableComponent component = Component.translatable(""); - for (int idx = 0; idx < inputSplit.length; idx++) - { - component.append(Component.translatable(inputSplit[idx])); - if (idx != (inputSplit.length - 1)) - { - component.append(" & "); - } - } - return component; - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/RecipeSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/RecipeSetting.java index d0afad3039f..c50278c86cf 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/RecipeSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/RecipeSetting.java @@ -1,17 +1,17 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.ButtonImage; import com.ldtteam.blockui.controls.ItemIcon; -import com.ldtteam.blockui.controls.Text; import com.ldtteam.blockui.views.BOWindow; -import com.ldtteam.blockui.views.View; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule; import com.minecolonies.api.colony.buildings.modules.ISettingsModule; -import com.minecolonies.api.colony.buildings.modules.settings.*; +import com.minecolonies.api.colony.buildings.modules.settings.ICraftingSetting; +import com.minecolonies.api.colony.buildings.modules.settings.ISetting; +import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; +import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.colony.requestsystem.token.IToken; import com.minecolonies.api.crafting.IRecipeStorage; @@ -116,18 +116,22 @@ public List getSettings(final IBuildingView building) return new ArrayList<>(settings); } + @Override + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutcraftingsetting.xml"); + } + @OnlyIn(Dist.CLIENT) @Override public void setupHandler( final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window) + final IBuildingView building, + final BOWindow window) { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutcraftingsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(input -> { - final List list = building.getModuleView(CraftingModuleView.class).getRecipes(); int currentIntIndex = 0; @@ -153,20 +157,22 @@ public void setupHandler( } @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) + public void render( + final ISettingKey key, + final Pane pane, + final ISettingsModuleView settingsModuleView, + final IBuildingView building, + final BOWindow window) { final IRecipeStorage stack = getValue(building); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(stack.getPrimaryOutput().getDescriptionId())); + ButtonImage triggerButton = pane.findPaneOfTypeByID("trigger", ButtonImage.class); + triggerButton.setEnabled(isActive(settingsModuleView)); + triggerButton.setText(Component.translatable(stack.getPrimaryOutput().getDescriptionId())); + setInActiveHoverPane(triggerButton, settingsModuleView); pane.findPaneOfTypeByID("iconto", ItemIcon.class).setItem(stack.getPrimaryOutput()); pane.findPaneOfTypeByID("iconfrom", ItemIcon.class).setItem(stack.getCleanedInput().get(0).getItemStack()); } - @Override - public void trigger() - { - - } - @Override public void set(final IRecipeStorage value) { @@ -177,13 +183,28 @@ public void set(final IRecipeStorage value) public boolean isActive(final ISettingsModule module) { final ICraftingBuildingModule craftingModule = module.getBuilding().getModuleMatching(ICraftingBuildingModule.class, m -> m.getId().equals(craftingModuleId)); - return craftingModule != null && !craftingModule.getRecipes().isEmpty() ; + return !craftingModule.getRecipes().isEmpty(); } @Override public boolean isActive(final ISettingsModuleView module) { final CraftingModuleView craftingModule = module.getBuildingView().getModuleViewMatching(CraftingModuleView.class, m -> m.getId().equals(craftingModuleId)); - return craftingModule != null && !craftingModule.getRecipes().isEmpty() ; + return craftingModule != null && !craftingModule.getRecipes().isEmpty(); + } + + @Override + public boolean shouldHideWhenInactive() + { + return true; + } + + @Override + public void copyValue(final ISetting setting) + { + if (setting instanceof final RecipeSetting other) + { + currentIndex = other.currentIndex; + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingKey.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingKey.java index ed6350bab6f..f3563a48305 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingKey.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingKey.java @@ -7,7 +7,7 @@ import java.util.Objects; /** - * Specific Settingskey implementation. + * Specific Settings key implementation. */ public class SettingKey implements ISettingKey { @@ -55,7 +55,7 @@ public boolean equals(final Object o) { return false; } - final SettingKey that = (SettingKey) o; + final SettingKey that = (SettingKey) o; return Objects.equals(type, that.type) && Objects.equals(id, that.id); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingsFactories.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingsFactories.java index 9b7863b234d..2b96d347546 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingsFactories.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/SettingsFactories.java @@ -369,34 +369,9 @@ public short getSerializationId() } } - /** - * Specific factory for the plantation setting. - */ - public static class PlantationSettingsFactory extends AbstractStringSettingsFactory - { - @NotNull - @Override - public TypeToken getFactoryOutputType() - { - return TypeToken.of(PlantationSetting.class); - } - - @NotNull - @Override - public PlantationSetting getNewInstance(final List value, final int curr) - { - return new PlantationSetting(value, curr); - } - - @Override - public short getSerializationId() - { - return SerializationIdentifierConstants.PLANTATION_SETTINGS_ID; - } - } - /** * Specific factory for the string setting with desc. + * TODO: Remove in future versions as this only exists right now for settings parsing purposes, this one is not necessary anymore because {@link StringSetting} contains a description by default now. */ public static class StringWithDescSettingsFactory extends AbstractStringSettingsFactory { @@ -422,22 +397,22 @@ public short getSerializationId() } /** - * Specific factory for the string setting with desc. + * Specific factory for the guard patrol mode setting. */ - public static class PatrolModeSettingFactory extends AbstractStringSettingsFactory + public static class GuardPatrolModeSettingFactory extends AbstractStringSettingsFactory { @NotNull @Override - public TypeToken getFactoryOutputType() + public TypeToken getFactoryOutputType() { - return TypeToken.of(PatrolModeSetting.class); + return TypeToken.of(GuardPatrolModeSetting.class); } @NotNull @Override - public PatrolModeSetting getNewInstance(final List value, final int curr) + public GuardPatrolModeSetting getNewInstance(final List value, final int curr) { - return new PatrolModeSetting(value, curr); + return new GuardPatrolModeSetting(value, curr); } @Override @@ -474,22 +449,22 @@ public short getSerializationId() } /** - * Specific factory for the string setting with desc. + * Specific factory for the guard follow mode setting. */ - public static class FollowModeSettingFactory extends AbstractStringSettingsFactory + public static class GuardFollowModeSettingFactory extends AbstractStringSettingsFactory { @NotNull @Override - public TypeToken getFactoryOutputType() + public TypeToken getFactoryOutputType() { - return TypeToken.of(FollowModeSetting.class); + return TypeToken.of(GuardFollowModeSetting.class); } @NotNull @Override - public FollowModeSetting getNewInstance(final List value, final int curr) + public GuardFollowModeSetting getNewInstance(final List value, final int curr) { - return new FollowModeSetting(value, curr); + return new GuardFollowModeSetting(value, curr); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSetting.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSetting.java index f2b8424aa22..165b3ffcd9b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSetting.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSetting.java @@ -1,10 +1,7 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; import com.ldtteam.blockui.Pane; import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.buildings.modules.settings.ISetting; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; @@ -12,6 +9,7 @@ import com.minecolonies.api.colony.buildings.modules.settings.IStringSetting; import com.minecolonies.api.colony.buildings.views.IBuildingView; import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.MathUtils; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -26,6 +24,11 @@ */ public class StringSetting implements IStringSetting { + /** + * The maximum possible width of the trigger button. + */ + public static final int MAX_BUTTON_WIDTH = 145; + /** * The value of the setting. */ @@ -43,7 +46,7 @@ public class StringSetting implements IStringSetting */ public StringSetting(final String... settings) { - this.settings = Arrays.asList(settings); + this.settings = new ArrayList<>(Arrays.asList(settings)); this.currentIndex = 0; } @@ -55,7 +58,7 @@ public StringSetting(final String... settings) */ public StringSetting(final List settings, final int currentIndex) { - this.settings = settings; + this.settings = new ArrayList<>(settings); this.currentIndex = currentIndex; } @@ -83,6 +86,12 @@ public List getSettings() return new ArrayList<>(settings); } + @Override + public ResourceLocation getLayoutItem() + { + return new ResourceLocation("minecolonies:gui/layouthuts/layoutstringsetting.xml"); + } + @OnlyIn(Dist.CLIENT) @Override public void setupHandler( @@ -91,15 +100,33 @@ public void setupHandler( final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutstringsetting.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); } @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) + public void render( + final ISettingKey key, + final Pane pane, + final ISettingsModuleView settingsModuleView, + final IBuildingView building, + final BOWindow window) + { + int buttonWidth = MathUtils.clamp(getButtonWidth(settingsModuleView), 0, MAX_BUTTON_WIDTH); + ButtonImage triggerButton = pane.findPaneOfTypeByID("trigger", ButtonImage.class); + triggerButton.setSize(buttonWidth, triggerButton.getHeight()); + triggerButton.setEnabled(isActive(settingsModuleView)); + triggerButton.setText(getDisplayText()); + setInActiveHoverPane(triggerButton, settingsModuleView); + } + + /** + * Get the text to render on the button, defaults to the stored index value. + * + * @return the component to render on the button. + */ + protected Component getDisplayText() { - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(settings.get(currentIndex))); + return Component.translatable(settings.get(currentIndex)); } @Override @@ -134,12 +161,12 @@ public boolean isIndexAllowed(int index) } @Override - public void updateSetting(final ISetting iSetting) + public void updateSetting(final ISetting setting) { - if (iSetting instanceof StringSetting) + if (setting instanceof StringSetting stringSetting) { this.settings.clear(); - this.settings.addAll(((StringSetting) iSetting).settings); + this.settings.addAll(stringSetting.settings); if (currentIndex >= this.settings.size()) { currentIndex = this.settings.size() - 1; @@ -152,4 +179,15 @@ public void set(final String value) { currentIndex = getSettings().indexOf(value); } + + /** + * Get the width to render the button at. This can be at most 145, to leave adequate spacing. + * + * @param settingsModuleView the module view that holds the setting. + * @return the width. + */ + protected int getButtonWidth(final ISettingsModuleView settingsModuleView) + { + return MAX_BUTTON_WIDTH; + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSettingWithDesc.java b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSettingWithDesc.java index e37abd9b98c..11e3fa24f32 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSettingWithDesc.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/modules/settings/StringSettingWithDesc.java @@ -1,23 +1,10 @@ package com.minecolonies.coremod.colony.buildings.modules.settings; -import com.ldtteam.blockui.Loader; -import com.ldtteam.blockui.Pane; -import com.ldtteam.blockui.controls.ButtonImage; -import com.ldtteam.blockui.controls.Text; -import com.ldtteam.blockui.views.View; -import com.ldtteam.blockui.views.BOWindow; -import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; -import com.minecolonies.api.colony.buildings.modules.settings.ISettingsModuleView; -import com.minecolonies.api.colony.buildings.views.IBuildingView; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - import java.util.List; /** * Stores a string-list setting (Like enum, but easily serializable). + * TODO: Remove in future versions as this only exists right now for settings parsing purposes, this one is not necessary anymore because {@link StringSetting} contains a description by default now. */ public class StringSettingWithDesc extends StringSetting { @@ -41,24 +28,4 @@ public StringSettingWithDesc(final List settings, final int currentIndex { super(settings, currentIndex); } - - @OnlyIn(Dist.CLIENT) - @Override - public void setupHandler( - final ISettingKey key, - final Pane pane, - final ISettingsModuleView settingsModuleView, - final IBuildingView building, final BOWindow window) - { - Loader.createFromXMLFile(new ResourceLocation("minecolonies:gui/layouthuts/layoutstringsettingdesc.xml"), (View) pane); - pane.findPaneOfTypeByID("id", Text.class).setText(Component.literal(key.getUniqueId().toString())); - pane.findPaneOfTypeByID("desc", Text.class).setText(Component.translatable("com.minecolonies.coremod.setting." + key.getUniqueId().toString())); - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setHandler(button -> settingsModuleView.trigger(key)); - } - - @Override - public void render(final ISettingKey key, final Pane pane, final ISettingsModuleView settingsModuleView, final IBuildingView building, final BOWindow window) - { - pane.findPaneOfTypeByID("trigger", ButtonImage.class).setText(Component.translatable(getSettings().get(getCurrentIndex()))); - } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/ArcherSquireModuleView.java b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/ArcherSquireModuleView.java index 7d12266f87d..2fcb21b62e1 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/ArcherSquireModuleView.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/ArcherSquireModuleView.java @@ -11,6 +11,6 @@ public class ArcherSquireModuleView extends WorkerBuildingModuleView @Override public boolean canBeHiredAs(final JobEntry jobEntry) { - return jobEntry == ModJobs.ranger.get(); + return jobEntry == ModJobs.archer.get(); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FarmerFieldModuleView.java b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FarmerFieldModuleView.java deleted file mode 100644 index c8e0d969284..00000000000 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FarmerFieldModuleView.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.minecolonies.coremod.colony.buildings.moduleviews; - -import com.ldtteam.blockui.views.BOWindow; -import com.minecolonies.api.colony.buildings.IBuildingWorkerView; -import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModuleView; -import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.client.gui.modules.FarmerFieldsModuleWindow; -import com.minecolonies.coremod.network.messages.server.colony.building.farmer.AssignFieldMessage; -import com.minecolonies.coremod.network.messages.server.colony.building.farmer.AssignmentModeMessage; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.core.BlockPos; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -/** - * Client side version of the abstract class for all buildings which require a filterable list of allowed items. - */ -public class FarmerFieldModuleView extends AbstractBuildingModuleView -{ - /** - * Checks if fields should be assigned manually. - */ - private boolean shouldAssignFieldManually; - - /** - * Contains a view object of all the fields in the colony. - */ - @NotNull - private List fields = new ArrayList<>(); - - /** - * The amount of fields the farmer owns. - */ - private int amountOfFields; - - @Override - public String getDesc() - { - return "com.minecolonies.coremod.gui.workerhuts.farmerhut.fields"; - } - - @Override - public void deserialize(@NotNull final FriendlyByteBuf buf) - { - fields = new ArrayList<>(); - - shouldAssignFieldManually = buf.readBoolean(); - final int size = buf.readInt(); - for (int i = 1; i <= size; i++) - { - @NotNull final BlockPos pos = buf.readBlockPos(); - fields.add(pos); - } - amountOfFields = buf.readInt(); - } - - /** - * Should the farmer be assigned manually to the fields. - * - * @return true if yes. - */ - public boolean assignFieldManually() - { - return shouldAssignFieldManually; - } - - /** - * Getter of the fields list. - * - * @return an unmodifiable List. - */ - @NotNull - public List getFields() - { - return fields; - } - - /** - * Getter for amount of fields. - * - * @return the amount of fields. - */ - public int getAmountOfFields() - { - return amountOfFields; - } - - /** - * Sets the assignedFieldManually in the view. - * - * @param assignFieldManually variable to set. - */ - public void setAssignFieldManually(final boolean assignFieldManually) - { - Network.getNetwork().sendToServer(new AssignmentModeMessage(buildingView, assignFieldManually)); - this.shouldAssignFieldManually = assignFieldManually; - } - - /** - * Change a field at a certain position. - * - * @param id the position of the field. - * @param addNewField should new field be added. - * @param scarecrowTileEntity the tileEntity. - */ - public void changeFields(final BlockPos id, final boolean addNewField, final ScarecrowTileEntity scarecrowTileEntity) - { - if (buildingView != null && (!addNewField || amountOfFields < buildingView.getBuildingLevel())) - { - Network.getNetwork().sendToServer(new AssignFieldMessage(buildingView, addNewField, id)); - scarecrowTileEntity.setTaken(addNewField); - - final WorkerBuildingModuleView view = buildingView.getModuleViewMatching(WorkerBuildingModuleView.class, m -> m.getJobEntry() == ModJobs.farmer.get()); - if (addNewField) - { - if (!view.getAssignedCitizens().isEmpty()) - { - scarecrowTileEntity.setOwner(view.getAssignedCitizens().get(0), getColony()); - } - amountOfFields++; - } - else - { - scarecrowTileEntity.setOwner(0, getColony()); - amountOfFields--; - } - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public BOWindow getWindow() - { - return new FarmerFieldsModuleWindow(buildingView, this); - } - - @Override - public String getIcon() - { - return "field"; - } -} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FieldsModuleView.java b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FieldsModuleView.java new file mode 100644 index 00000000000..7bf5b592c14 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/FieldsModuleView.java @@ -0,0 +1,235 @@ +package com.minecolonies.coremod.colony.buildings.moduleviews; + +import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModuleView; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.AssignFieldMessage; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.AssignmentModeMessage; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.List; + +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.BUILDING_TAB_FIELDS; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_WARN_EXCEEDS_FIELD_COUNT; + +/** + * Client side version of the abstract class to list all fields (assigned) to a building. + */ +public abstract class FieldsModuleView extends AbstractBuildingModuleView +{ + /** + * Checks if fields should be assigned manually. + */ + private boolean shouldAssignFieldManually; + + /** + * The maximum amount of fields the building can support. + */ + private int maxFieldCount; + + @Override + public void deserialize(@NotNull final FriendlyByteBuf buf) + { + shouldAssignFieldManually = buf.readBoolean(); + maxFieldCount = buf.readInt(); + } + + @Override + public String getIcon() + { + return "field"; + } + + @Override + public String getDesc() + { + return BUILDING_TAB_FIELDS; + } + + /** + * Should the citizen be assigned manually to the fields. + * + * @return true if yes. + */ + public boolean assignFieldManually() + { + return shouldAssignFieldManually; + } + + /** + * Sets the assignedFieldManually in the view. + * + * @param assignFieldManually variable to set. + */ + public void setAssignFieldManually(final boolean assignFieldManually) + { + this.shouldAssignFieldManually = assignFieldManually; + Network.getNetwork().sendToServer(new AssignmentModeMessage(buildingView, assignFieldManually)); + } + + /** + * Assign a given field to the current worker. + * + * @param field the field to assign. + */ + public void assignField(final IField field) + { + if (buildingView != null && canAssignField(field)) + { + Network.getNetwork().sendToServer(new AssignFieldMessage(buildingView, field, true)); + + final WorkerBuildingModuleView buildingModuleView = buildingView.getModuleViewMatching(WorkerBuildingModuleView.class, view -> true); + if (buildingModuleView != null) + { + field.setBuilding(buildingView.getID()); + } + } + } + + /** + * Check to see if a new field can be assigned to the worker. + * + * @param field the field which is being added. + * @return true if so. + */ + public final boolean canAssignField(IField field) + { + return getOwnedFields().size() < maxFieldCount && canAssignFieldOverride(field); + } + + /** + * Getter of all owned fields. + * + * @return an unmodifiable list. + */ + @NotNull + public List getOwnedFields() + { + return getFields().stream() + .filter(field -> buildingView.getID().equals(field.getBuildingId())) + .distinct() + .sorted(new FieldsComparator(buildingView)) + .toList(); + } + + /** + * Additional checks to see if this field can be assigned to the building. + * + * @param field the field which is being added. + * @return true if so. + */ + protected abstract boolean canAssignFieldOverride(IField field); + + /** + * Getter of all fields that are either free, or taken by the current building. + * + * @return an unmodifiable list. + */ + @NotNull + public List getFields() + { + return getFieldsInColony().stream() + .filter(field -> !field.isTaken() || buildingView.getID().equals(field.getBuildingId())) + .distinct() + .sorted(new FieldsComparator(buildingView)) + .toList(); + } + + /** + * Obtains the list of fields from the colony. + * + * @return the list of field instances. + */ + protected abstract List getFieldsInColony(); + + /** + * Free a field from the current worker. + * + * @param field the field to free. + */ + public void freeField(final IField field) + { + if (buildingView != null) + { + Network.getNetwork().sendToServer(new AssignFieldMessage(buildingView, field, false)); + + final WorkerBuildingModuleView buildingModuleView = buildingView.getModuleViewMatching(WorkerBuildingModuleView.class, view -> true); + if (buildingModuleView != null) + { + field.resetOwningBuilding(); + } + } + } + + /** + * Get a warning text component for the specific field whenever this field cannot be assigned for any reason. + * + * @param field the field in question. + * @return a text component that should be shown if there is a problem for the specific field, else null. + */ + @Nullable + public MutableComponent getFieldWarningTooltip(IField field) + { + if (getOwnedFields().size() >= maxFieldCount) + { + return Component.translatable(FIELD_LIST_WARN_EXCEEDS_FIELD_COUNT); + } + return null; + } + + /** + * Get the maximum allowed field count. + * + * @return the max field count. + */ + public int getMaxFieldCount() + { + return maxFieldCount; + } + + /** + * Comparator class for sorting fields in a predictable order in the window. + */ + static class FieldsComparator implements Comparator + { + /** + * The building this comparator is running on. + */ + private final IBuildingView assignedBuilding; + + /** + * Default constructor. + * + * @param assignedBuilding the building this comparator is running on. + */ + public FieldsComparator(IBuildingView assignedBuilding) + { + this.assignedBuilding = assignedBuilding; + } + + @Override + public int compare(final IField field1, final IField field2) + { + if (field1.isTaken() && field2.isTaken()) + { + return field1.getSqDistance(assignedBuilding) - field2.getSqDistance(assignedBuilding); + } + else if (field1.isTaken()) + { + return -1; + } + else if (field2.isTaken()) + { + return 1; + } + + return field1.getSqDistance(assignedBuilding) - field2.getSqDistance(assignedBuilding); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/SettingsModuleView.java b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/SettingsModuleView.java index 7a0f00cd9d2..1513dcf9235 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/SettingsModuleView.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/SettingsModuleView.java @@ -16,6 +16,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -27,7 +28,7 @@ public class SettingsModuleView extends AbstractBuildingModuleView implements IS /** * Map of setting id (string) to generic setting. */ - final Map, ISetting> settings = new LinkedHashMap<>(); + final Map, ISetting> settings = new LinkedHashMap<>(); @Override public void deserialize(@NotNull final FriendlyByteBuf buf) @@ -38,15 +39,15 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) { final ResourceLocation key = buf.readResourceLocation(); final ISetting setting = StandardFactoryController.getInstance().deserialize(buf); - final SettingKey settingsKey = new SettingKey<>(setting.getClass(), key); - tempSettings.put(settingsKey, setting); - if (!settings.containsKey(settingsKey)) + if (setting != null) { - settings.put(settingsKey, setting); + final SettingKey settingsKey = new SettingKey<>(setting.getClass(), key); + tempSettings.put(settingsKey, setting); + settings.putIfAbsent(settingsKey, setting); } } - for (final Map.Entry, ISetting> entry : new ArrayList<>(settings.entrySet())) + for (final Map.Entry, ISetting> entry : new ArrayList<>(settings.entrySet())) { final ISetting syncSetting = tempSettings.get(entry.getKey()); if (syncSetting == null) @@ -56,38 +57,32 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) else if (entry.getValue() != syncSetting) { entry.getValue().updateSetting(syncSetting); + entry.getValue().copyValue(syncSetting); } } } /** * Get the full settings map. - * @return the map of string key and ISetting value. + * + * @return the list of string key and ISetting value. */ - public Map, ISetting> getSettings() + public List> getSettingsToShow() { - return settings; - } - - /** - * Get a list of all valid settings. - * @return the list of settings. - */ - public List> getActiveSettings() - { - final List> activeSettings = new ArrayList<>(); - for (final Map.Entry, ISetting> setting : settings.entrySet()) + List> filteredSettings = new ArrayList<>(); + for (Map.Entry, ISetting> setting : settings.entrySet()) { - if (setting.getValue().isActive(this)) + if (setting.getValue().isActive(this) || !setting.getValue().shouldHideWhenInactive()) { - activeSettings.add(setting.getKey()); + filteredSettings.add(setting.getKey()); } } - - return activeSettings; + return filteredSettings; } @Override + @Nullable + @SuppressWarnings("unchecked") public T getSetting(final ISettingKey key) { return (T) settings.getOrDefault(key, null); @@ -116,7 +111,10 @@ public String getDesc() public void trigger(final ISettingKey key) { final ISetting setting = settings.get(key); - setting.trigger(); - Network.getNetwork().sendToServer(new TriggerSettingMessage(buildingView, key, setting)); + if (setting.isActive(this)) + { + setting.trigger(); + Network.getNetwork().sendToServer(new TriggerSettingMessage(buildingView, key, setting)); + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/WorkerBuildingModuleView.java b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/WorkerBuildingModuleView.java index fcfdc5912e6..25927e1211b 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/WorkerBuildingModuleView.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/moduleviews/WorkerBuildingModuleView.java @@ -145,7 +145,7 @@ public boolean canAssign(final ICitizenDataView citizen) return !citizen.isChild() && (citizen.getWorkBuilding() == null || workerIDs.contains(citizen.getId()) - || buildingView.getColony().getBuilding(citizen.getWorkBuilding()).getModuleViewMatching(WorkerBuildingModuleView.class, m -> m.canBeHiredAs(getJobEntry())) + || buildingView.getColony().getBuilding(citizen.getWorkBuilding()) != null && buildingView.getColony().getBuilding(citizen.getWorkBuilding()).getModuleViewMatching(WorkerBuildingModuleView.class, m -> m.canBeHiredAs(getJobEntry())) != null); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingAlchemist.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingAlchemist.java index 13657018599..990eaf52ac6 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingAlchemist.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingAlchemist.java @@ -18,7 +18,6 @@ import net.minecraft.util.Tuple; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.ShearsItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -67,7 +66,7 @@ public class BuildingAlchemist extends AbstractBuilding public BuildingAlchemist(final IColony c, final BlockPos l) { super(c, l); - keepX.put(itemStack -> itemStack.getItem() instanceof ShearsItem, new Tuple<>(1, true)); + keepX.put(itemStack -> ItemStackUtils.hasToolLevel(itemStack, ToolType.SHEARS, TOOL_LEVEL_WOOD_OR_GOLD, getMaxToolLevel()), new Tuple<>(1, true)); keepX.put(itemStack -> itemStack.getItem() == Items.NETHER_WART, new Tuple<>(16, false)); keepX.put(itemStack -> ItemStackUtils.hasToolLevel(itemStack, ToolType.AXE, TOOL_LEVEL_WOOD_OR_GOLD, getMaxToolLevel()), new Tuple<>(1, true)); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBarracksTower.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBarracksTower.java index 20f4c3822c6..6e2be7ec1ed 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBarracksTower.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBarracksTower.java @@ -4,7 +4,6 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.workorders.WorkOrderType; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; import com.minecolonies.coremod.util.AdvancementUtils; @@ -113,7 +112,6 @@ public void onUpgradeComplete(final int newLevel) boolean allUpgraded = true; for (BlockPos tower : ((BuildingBarracks) barrack).getTowers()) { - Log.getLogger().info("Upgraded: " + allUpgraded); if (colony.getBuildingManager().getBuilding(tower).getBuildingLevel() != barrack.getMaxBuildingLevel()) { allUpgraded = false; diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBeekeeper.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBeekeeper.java index 16ef0a2275e..50a8a6faa8a 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBeekeeper.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBeekeeper.java @@ -1,17 +1,20 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.compatibility.CompatibilityManager; +import com.minecolonies.api.crafting.GenericRecipe; +import com.minecolonies.api.crafting.IGenericRecipe; import com.minecolonies.api.util.NBTUtils; import com.minecolonies.api.util.constant.NbtTagConstants; +import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import com.minecolonies.coremod.colony.buildings.modules.settings.BeekeeperCollectionSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; -import com.minecolonies.coremod.colony.buildings.modules.settings.StringSetting; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; +import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -20,10 +23,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.util.Tuple; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Bee; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; - +import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -118,6 +122,12 @@ public CompoundTag serializeNBT() public void serializeToView(@NotNull final FriendlyByteBuf buf) { super.serializeToView(buf); + + buf.writeVarInt(hives.size()); + for (final BlockPos hive : hives) + { + buf.writeBlockPos(hive); + } } /** @@ -170,6 +180,43 @@ public int getMaximumHives() return (int) Math.pow(2, getBuildingLevel() - 1); } + /** + * The client side representation of the building. + */ + public static class View extends AbstractBuildingView + { + private Set hives; + + /** + * Instantiates the view of the building. + * + * @param c the colonyView. + * @param l the location of the block. + */ + public View(final IColonyView c, final BlockPos l) + { + super(c, l); + } + + @Override + public void deserialize(@NotNull FriendlyByteBuf buf) + { + super.deserialize(buf); + + final int hiveCount = buf.readVarInt(); + this.hives = new HashSet<>(); + for (int i = 0; i < hiveCount; ++i) + { + this.hives.add(buf.readBlockPos()); + } + } + + public Set getHives() + { + return Collections.unmodifiableSet(new HashSet<>(hives)); + } + } + /** * Bee herding module */ @@ -182,7 +229,7 @@ public static class HerdingModule extends AnimalHerdingModule public HerdingModule() { - super(ModJobs.beekeeper.get(), EntityType.BEE, ItemStack.EMPTY); + super(ModJobs.beekeeper.get(), a -> a instanceof Bee, ItemStack.EMPTY); } @NotNull @@ -194,21 +241,27 @@ public List getBreedingItems() // todo: if we use this in AI then it should use the item list module settings from the building instead. } - return CompatibilityManager.getAllBeekeeperFlowers().stream() + return IColonyManager.getInstance().getCompatibilityManager().getImmutableFlowers().stream() .map(flower -> new ItemStack(flower.getItem(), 2)) .collect(Collectors.toList()); } @NotNull @Override - public List getExpectedLoot() + public List getRecipesForDisplayPurposesOnly(@NotNull Animal animal) { - final List drops = new ArrayList<>(super.getExpectedLoot()); + final List recipes = new ArrayList<>(); // we don't kill the bees so don't use the default + + recipes.add(new GenericRecipe(null, new ItemStack(Items.HONEYCOMB), + Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + 0, Blocks.AIR, null, ToolType.SHEARS, animal, Collections.emptyList(), 0)); - drops.add(new LootTableAnalyzer.LootDrop(Collections.singletonList(new ItemStack(Items.HONEYCOMB, 3)), 1, 0, false)); - drops.add(new LootTableAnalyzer.LootDrop(Collections.singletonList(new ItemStack(Items.HONEY_BOTTLE)), 1, 0, false)); + recipes.add(new GenericRecipe(null, new ItemStack(Items.HONEY_BOTTLE), + Collections.emptyList(), Collections.emptyList(), + Collections.singletonList(Collections.singletonList(new ItemStack(Items.GLASS_BOTTLE))), + 0, Blocks.AIR, null, ToolType.NONE, animal, Collections.emptyList(), 0)); - return drops; + return recipes; } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBlacksmith.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBlacksmith.java index 2a13a95be06..41e2404c7ac 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBlacksmith.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingBlacksmith.java @@ -5,7 +5,9 @@ import com.minecolonies.api.compatibility.Compatibility; import com.minecolonies.api.crafting.IGenericRecipe; import com.minecolonies.api.util.CraftingUtils; +import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.OptionalPredicate; +import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AbstractCraftingBuildingModule; import net.minecraft.core.BlockPos; @@ -83,12 +85,19 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) return false; } if (recipe.matchesOutput(OptionalPredicate.passIf(output -> - output.getItem() instanceof DiggerItem || - output.getItem() instanceof SwordItem || - output.getItem() instanceof ArmorItem || - output.getItem() instanceof HoeItem || - output.getItem() instanceof ShieldItem || - Compatibility.isTinkersWeapon(output))) + ItemStackUtils.isTool(output, ToolType.AXE) || + ItemStackUtils.isTool(output, ToolType.PICKAXE) || + ItemStackUtils.isTool(output, ToolType.SHOVEL) || + ItemStackUtils.isTool(output, ToolType.HOE) || + ItemStackUtils.isTool(output, ToolType.SHEARS) || + ItemStackUtils.isTool(output, ToolType.SWORD) || + ItemStackUtils.isTool(output, ToolType.SHIELD) || + ItemStackUtils.isTool(output, ToolType.HELMET) || + ItemStackUtils.isTool(output, ToolType.CHESTPLATE) || + ItemStackUtils.isTool(output, ToolType.LEGGINGS) || + ItemStackUtils.isTool(output, ToolType.BOOTS) || + // deliberately excluding FISHINGROD and FLINT_N_STEEL + Compatibility.isTinkersWeapon(output))) .equals(Optional.of(true))) { // allow any other tool/armor even if it uses an excluded ingredient diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingChickenHerder.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingChickenHerder.java index f149aa9f6a2..155aab9abf5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingChickenHerder.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingChickenHerder.java @@ -2,13 +2,17 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.GenericRecipe; +import com.minecolonies.api.crafting.IGenericRecipe; +import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Chicken; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -60,15 +64,19 @@ public static class HerdingModule extends AnimalHerdingModule { public HerdingModule() { - super(ModJobs.chickenHerder.get(), EntityType.CHICKEN, new ItemStack(Items.WHEAT_SEEDS, 2)); + super(ModJobs.chickenHerder.get(), a -> a instanceof Chicken, new ItemStack(Items.WHEAT_SEEDS, 2)); } + @NotNull @Override - public @NotNull List getExpectedLoot() + public List getRecipesForDisplayPurposesOnly(@NotNull Animal animal) { - final List drops = new ArrayList<>(super.getExpectedLoot()); - drops.add(new LootTableAnalyzer.LootDrop(Collections.singletonList(new ItemStack(Items.EGG)), 1, 0, false)); - return drops; + final List recipes = new ArrayList<>(super.getRecipesForDisplayPurposesOnly(animal)); + + recipes.add(new GenericRecipe(null, new ItemStack(Items.EGG), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), 0, Blocks.AIR, null, ToolType.NONE, animal, Collections.emptyList(), 0)); + + return recipes; } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingConcreteMixer.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingConcreteMixer.java index 631db8621b3..b1c4f848c7f 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingConcreteMixer.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingConcreteMixer.java @@ -188,7 +188,8 @@ public BlockPos getBlockToPlace() { for (final BlockPos pos : waterPos.getOrDefault(i, Collections.emptyList())) { - if (!colony.getWorld().getBlockState(pos).getFluidState().isEmpty() && !colony.getWorld().getBlockState(pos).getMaterial().isSolid()) + final BlockState state = colony.getWorld().getBlockState(pos); + if (!state.getFluidState().isEmpty() && state.getBlock() == Blocks.WATER) { return pos; } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingCowboy.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingCowboy.java index c41c532cfb7..c1e4046c620 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingCowboy.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingCowboy.java @@ -1,25 +1,36 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.modules.IBuildingEventsModule; +import com.minecolonies.api.colony.buildings.modules.IHasRequiredItemsModule; +import com.minecolonies.api.colony.buildings.modules.IPersistentModule; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.crafting.GenericRecipe; import com.minecolonies.api.crafting.IGenericRecipe; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; -import com.minecolonies.coremod.colony.buildings.modules.AbstractCraftingBuildingModule; -import com.minecolonies.coremod.colony.buildings.modules.settings.BoolSetting; +import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; +import com.minecolonies.coremod.colony.buildings.modules.settings.IntSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.MushroomCow; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.function.Predicate; import static com.minecolonies.api.util.constant.Constants.MOD_ID; @@ -44,9 +55,19 @@ public class BuildingCowboy extends AbstractBuilding private static final int MAX_BUILDING_LEVEL = 5; /** - * Milking setting. + * Milking amount setting. */ - public static final ISettingKey MILKING = new SettingKey<>(BoolSetting.class, new ResourceLocation(MOD_ID, "milking")); + public static final ISettingKey MILKING_AMOUNT = new SettingKey<>(IntSetting.class, new ResourceLocation(MOD_ID, "milking_amount")); + + /** + * Stewing amount setting. + */ + public static final ISettingKey STEWING_AMOUNT = new SettingKey<>(IntSetting.class, new ResourceLocation(MOD_ID, "stewing_amount")); + + /** + * Milking days setting. + */ + public static final ISettingKey MILKING_DAYS = new SettingKey<>(IntSetting.class, new ResourceLocation(MOD_ID, "milking_days")); /** * Instantiates the building. @@ -83,27 +104,131 @@ public boolean canEat(final ItemStack stack) } /** - * Custom crafting module to indicate that we produce milk buckets. - * (This is just for JEI and does not mean they're crafted on demand... although that could be changed.) + * Cow (and Mooshroom) herding module */ - public static class MilkingModule extends AbstractCraftingBuildingModule.Custom + public static class HerdingModule extends AnimalHerdingModule implements IBuildingEventsModule, IHasRequiredItemsModule, IPersistentModule { - public MilkingModule() + private int currentMilk; + private int currentStew; + private int currentMilkDays; + + public HerdingModule() { - super(ModJobs.cowboy.get()); + super(ModJobs.cowboy.get(), a -> a instanceof Cow, new ItemStack(Items.WHEAT, 2)); + } + + @Override + public Map, Tuple> getRequiredItemsAndAmount() + { + final int days = Math.max(1, getBuilding().getSetting(MILKING_DAYS).getValue()); + final int bucketsToKeep = (int) Math.ceil(2D * getBuilding().getSetting(MILKING_AMOUNT).getValue() / days); + final int bowlsToKeep = (int) Math.ceil(2D * getBuilding().getSetting(STEWING_AMOUNT).getValue() / days); + + final Map, Tuple> requiredItems = new HashMap<>(); + if (bucketsToKeep > 0) + { + requiredItems.put(s -> s.is(Items.BUCKET), new Tuple<>(bucketsToKeep, false)); + } + if (bowlsToKeep > 0) + { + requiredItems.put(s -> s.is(Items.BOWL), new Tuple<>(bowlsToKeep, false)); + } + return requiredItems; + } + + @Override + public Map reservedStacksExcluding(@Nullable IRequest excluded) + { + return Collections.emptyMap(); } @NotNull @Override - public List getAdditionalRecipesForDisplayPurposesOnly() + public List getRecipesForDisplayPurposesOnly(@NotNull Animal animal) { - final List recipes = new ArrayList<>(super.getAdditionalRecipesForDisplayPurposesOnly()); + final List recipes = new ArrayList<>(super.getRecipesForDisplayPurposesOnly(animal)); - final ShapelessRecipe milk = new ShapelessRecipe(new ResourceLocation(""), "", - new ItemStack(Items.MILK_BUCKET), NonNullList.of(Ingredient.EMPTY, Ingredient.of(Items.BUCKET))); - recipes.add(GenericRecipe.of(milk, null)); + if (animal instanceof MushroomCow) + { + recipes.add(new GenericRecipe(null, + new ItemStack(Items.MUSHROOM_STEW), // output + Collections.singletonList(new ItemStack(Items.SUSPICIOUS_STEW)), // alt output + Collections.emptyList(), // extra output + Collections.singletonList(Collections.singletonList(new ItemStack(Items.BOWL))), // input + 1, Blocks.AIR, null, ToolType.NONE, animal, Collections.emptyList(), 0)); + } + else if (animal instanceof Cow) + { + recipes.add(new GenericRecipe(null, + new ItemStack(Items.MILK_BUCKET), // output + Collections.emptyList(), // alt output + Collections.emptyList(), // extra output + Collections.singletonList(Collections.singletonList(new ItemStack(Items.BUCKET))), // input + 1, Blocks.AIR, null, ToolType.NONE, animal, Collections.emptyList(), 0)); + } return recipes; } + + @Override + public void serializeNBT(@NotNull CompoundTag compound) + { + compound.putInt("milkValue", currentMilk); + compound.putInt("stewValue", currentStew); + compound.putInt("milkDays", currentMilkDays); + } + + @Override + public void deserializeNBT(CompoundTag compound) + { + this.currentMilk = compound.getInt("milkValue"); + this.currentStew = compound.getInt("stewValue"); + this.currentMilkDays = compound.getInt("milkDays"); + } + + @Override + public void onWakeUp() + { + ++this.currentMilkDays; + + if (this.currentMilkDays >= getBuilding().getSetting(MILKING_DAYS).getValue()) + { + this.currentMilk = 0; + this.currentStew = 0; + this.currentMilkDays = 0; + } + } + + /** + * @return true if the cowboy should be allowed to try to milk (not yet reached limit) + */ + public boolean canTryToMilk() + { + return this.currentMilk < getBuilding().getSetting(MILKING_AMOUNT).getValue(); + } + + /** + * @return true if the cowboy should be allowed to try to collect stew (not yet reached limit) + */ + public boolean canTryToStew() + { + return this.currentStew < getBuilding().getSetting(STEWING_AMOUNT).getValue(); + } + + /** + * Called to record successful milking. + */ + public void onMilked() + { + ++this.currentMilk; + } + + /** + * Called to record successful stewing. + */ + public void onStewed() + { + ++this.currentStew; + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingDyer.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingDyer.java index bcc938bf7db..6af7dfa4137 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingDyer.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingDyer.java @@ -97,7 +97,13 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) if (!super.isRecipeCompatible(recipe)) return false; return CraftingUtils.isRecipeCompatibleBasedOnTags(recipe, CRAFTING_DYER).orElse(false); } - + + @Override + public void improveRecipe(final IRecipeStorage recipe, final int count, final ICitizenData citizen) + { + // don't improve any dyeing recipes + } + @Override public IRecipeStorage getFirstRecipe(Predicate stackPredicate) { @@ -137,7 +143,13 @@ public boolean holdsRecipe(final IToken token) return true; } - return IColonyManager.getInstance().getRecipeManager().getRecipe(token).getPrimaryOutput().getItem() == Items.WHITE_WOOL; + final IRecipeStorage recipe = IColonyManager.getInstance().getRecipeManager().getRecipe(token); + if (recipe == null) + { + return false; + } + + return recipe.getPrimaryOutput().getItem() == Items.WHITE_WOOL; } @Override @@ -231,5 +243,11 @@ public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) } return CraftingUtils.isRecipeCompatibleBasedOnTags(recipe, CRAFTING_DYER_SMELTING).orElse(false); } + + @Override + public void improveRecipe(final IRecipeStorage recipe, final int count, final ICitizenData citizen) + { + // don't improve any dyeing recipes + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFarmer.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFarmer.java index c1d1433279e..129972c97a5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFarmer.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFarmer.java @@ -1,33 +1,44 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; +import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.crafting.IGenericRecipe; import com.minecolonies.api.util.CraftingUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.OptionalPredicate; import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.client.gui.modules.FarmFieldsModuleWindow; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AbstractCraftingBuildingModule; -import com.minecolonies.coremod.colony.buildings.modules.FarmerFieldModule; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; import com.minecolonies.coremod.colony.buildings.modules.settings.BoolSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; +import com.minecolonies.coremod.colony.buildings.moduleviews.FieldsModuleView; +import com.minecolonies.coremod.colony.fields.FarmField; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Tuple; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Predicate; import static com.minecolonies.api.util.constant.TagConstants.CRAFTING_FARMER; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_FARMER_NO_SEED; /** * Class which handles the farmer building. @@ -37,7 +48,8 @@ public class BuildingFarmer extends AbstractBuilding /** * The beekeeper mode. */ - public static final ISettingKey FERTILIZE = new SettingKey<>(BoolSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "fertilize")); + public static final ISettingKey FERTILIZE = + new SettingKey<>(BoolSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "fertilize")); /** * Descriptive string of the profession. @@ -74,32 +86,44 @@ public boolean canBeGathered() * Override this method if you want to keep an amount of items in inventory. When the inventory is full, everything get's dumped into the building chest. But you can use this * method to hold some stacks back. * - * @return a list of objects which should be kept. + * @return a map of objects which should be kept. */ @Override public Map, Tuple> getRequiredItemsAndAmount() { final Map, Tuple> toKeep = new HashMap<>(super.getRequiredItemsAndAmount()); - for (FarmerFieldModule module : getModules(FarmerFieldModule.class)) + for (FieldsModule module : getModules(FieldsModule.class)) { - for (final BlockPos field : module.getFarmerFields()) + for (final IField field : module.getOwnedFields()) { - final BlockEntity scareCrow = getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity && !ItemStackUtils.isEmpty(((ScarecrowTileEntity) scareCrow).getSeed())) + if (field instanceof FarmField farmField && !farmField.getSeed().isEmpty()) { - final ItemStack seedStack = ((ScarecrowTileEntity) scareCrow).getSeed(); - toKeep.put(seedStack::sameItem, new Tuple<>(64, true)); + toKeep.put(farmField.getSeed()::sameItem, new Tuple<>(64, true)); } } } return toKeep; } - @NotNull @Override - public String getSchematicName() + public boolean canEat(final ItemStack stack) { - return FARMER; + for (FieldsModule module : getModules(FieldsModule.class)) + { + for (final IField field : module.getOwnedFields()) + { + if (field instanceof FarmField farmField && !farmField.getSeed().isEmpty() && ItemStackUtils.compareItemStacksIgnoreStackSize(farmField.getSeed(), stack)) + { + return false; + } + } + } + + if (stack.getItem() == Items.WHEAT) + { + return false; + } + return super.canEat(stack); } @Override @@ -108,6 +132,13 @@ public int getMaxBuildingLevel() return MAX_BUILDING_LEVEL; } + @NotNull + @Override + public String getSchematicName() + { + return FARMER; + } + /** * Getter for request fertilizer */ @@ -116,29 +147,82 @@ public boolean requestFertilizer() return getSetting(FERTILIZE).getValue(); } - @Override - public boolean canEat(final ItemStack stack) + /** + * Field module implementation for the farmer. + */ + public static class FarmerFieldsModule extends FieldsModule { - for (FarmerFieldModule module : getModules(FarmerFieldModule.class)) + @Override + protected int getMaxFieldCount() { - for (final BlockPos field : module.getFarmerFields()) - { - final BlockEntity scareCrow = getColony().getWorld().getBlockEntity(field); - if (scareCrow instanceof ScarecrowTileEntity && !ItemStackUtils.isEmpty(((ScarecrowTileEntity) scareCrow).getSeed())) - { - if (ItemStackUtils.compareItemStacksIgnoreStackSize(((ScarecrowTileEntity) scareCrow).getSeed(), stack)) - { - return false; - } - } - } + return building.getBuildingLevel(); } - if (stack.getItem() == Items.WHEAT) + @Override + public Class getExpectedFieldType() { - return false; + return FarmField.class; + } + + @Override + public @NotNull List getFields() + { + return building.getColony().getBuildingManager().getFields(field -> field.getFieldType().equals(FieldRegistries.farmField.get())).stream().toList(); + } + + @Override + public boolean canAssignFieldOverride(final IField field) + { + return field instanceof FarmField farmField && !farmField.getSeed().isEmpty(); + } + + @Override + protected int getFieldCheckTimeoutSeconds() + { + return 60; + } + } + + /** + * Field module view implementation for the farmer. + */ + public static class FarmerFieldsModuleView extends FieldsModuleView + { + @Override + @OnlyIn(Dist.CLIENT) + public BOWindow getWindow() + { + return new FarmFieldsModuleWindow(buildingView, this); + } + + @Override + public boolean canAssignFieldOverride(final IField field) + { + return field instanceof FarmField farmField && !farmField.getSeed().isEmpty(); + } + + @Override + protected List getFieldsInColony() + { + return getColony().getFields(field -> field.getFieldType().equals(FieldRegistries.farmField.get())); + } + + @Override + public @Nullable MutableComponent getFieldWarningTooltip(final IField field) + { + MutableComponent result = super.getFieldWarningTooltip(field); + if (result != null) + { + return result; + } + + if (field instanceof FarmField farmField && farmField.getSeed().isEmpty()) + { + return Component.translatable(FIELD_LIST_FARMER_NO_SEED); + } + + return null; } - return super.canEat(stack); } public static class CraftingModule extends AbstractCraftingBuildingModule.Crafting @@ -158,13 +242,16 @@ public CraftingModule(final JobEntry jobEntry) public OptionalPredicate getIngredientValidator() { return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_FARMER) - .combine(super.getIngredientValidator()); + .combine(super.getIngredientValidator()); } @Override public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) { - if (!super.isRecipeCompatible(recipe)) return false; + if (!super.isRecipeCompatible(recipe)) + { + return false; + } return CraftingUtils.isRecipeCompatibleBasedOnTags(recipe, CRAFTING_FARMER).orElse(false); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFletcher.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFletcher.java index de0ae159a88..5f1f8176b76 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFletcher.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingFletcher.java @@ -105,7 +105,7 @@ public DOCraftingModule(final JobEntry jobEntry) */ public @NotNull static OptionalPredicate getStaticIngredientValidator() { - return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_FLETCHER); + return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_FLETCHER, true); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGlassblower.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGlassblower.java index 57ba300ca53..7a07c31de26 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGlassblower.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGlassblower.java @@ -131,7 +131,7 @@ public DOCraftingModule(final JobEntry jobEntry) */ public @NotNull static OptionalPredicate getStaticIngredientValidator() { - return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_GLASSBLOWER); + return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_GLASSBLOWER, true); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGraveyard.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGraveyard.java index 93d43400ac5..4a28b20ea12 100644 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGraveyard.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingGraveyard.java @@ -130,7 +130,7 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_CURRENT_GRAVE)) + if (compound.contains(TAG_CURRENT_GRAVE)) { currentGrave = BlockPosUtil.read(compound, TAG_CURRENT_GRAVE); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLibrary.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLibrary.java index 608198682c3..6be6239f530 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLibrary.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLibrary.java @@ -1,14 +1,10 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; -import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.entity.ai.util.StudyItem; import com.minecolonies.api.util.Log; import com.minecolonies.coremod.MineColonies; -import com.minecolonies.coremod.client.gui.huts.WindowHutWorkerModulePlaceholder; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; -import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -19,8 +15,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; - +import net.minecraftforge.common.Tags; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -160,8 +155,7 @@ public CompoundTag serializeNBT() public void registerBlockPosition(@NotNull final Block block, @NotNull final BlockPos pos, @NotNull final Level world) { super.registerBlockPosition(block, pos, world); - //todo we might in the future want to add our own oredict tag to this. - if (block == Blocks.BOOKSHELF) + if (block.defaultBlockState().is(Tags.Blocks.BOOKSHELVES)) { bookCases.add(pos); } @@ -179,7 +173,7 @@ public BlockPos getRandomBookShelf() return getPosition(); } final BlockPos returnPos = bookCases.get(random.nextInt(bookCases.size())); - if (colony.getWorld().getBlockState(returnPos).getBlock() == Blocks.BOOKSHELF) + if (colony.getWorld().getBlockState(returnPos).is(Tags.Blocks.BOOKSHELVES)) { return returnPos; } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLumberjack.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLumberjack.java index 64617c8db90..53ef5ea3ca5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLumberjack.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingLumberjack.java @@ -3,6 +3,7 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.modules.IItemListModule; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.jobs.registry.JobEntry; @@ -19,11 +20,13 @@ import com.minecolonies.coremod.colony.buildings.modules.settings.BoolSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.DynamicTreesSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; +import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Tuple; @@ -33,7 +36,6 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.state.BlockState; - import org.jetbrains.annotations.NotNull; import java.util.*; @@ -154,7 +156,7 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_RESTRICT_START)) + if (compound.contains(TAG_RESTRICT_START)) { startRestriction = NbtUtils.readBlockPos(compound.getCompound(TAG_RESTRICT_START)); } @@ -163,7 +165,7 @@ public void deserializeNBT(final CompoundTag compound) startRestriction = null; } - if (compound.getAllKeys().contains(TAG_RESTRICT_END)) + if (compound.contains(TAG_RESTRICT_END)) { endRestriction = NbtUtils.readBlockPos(compound.getCompound(TAG_RESTRICT_END)); } @@ -245,6 +247,13 @@ public void setRestrictedArea(final BlockPos startPosition, final BlockPos endPo { this.startRestriction = startPosition; this.endRestriction = endPosition; + + final boolean areaIsDefined = startPosition != null && endPosition != null; + if (getSetting(RESTRICT).getValue() != areaIsDefined) + { + getSetting(RESTRICT).trigger(); + } + markDirty(); } public BlockPos getStartRestriction() @@ -343,6 +352,70 @@ public void onColonyTick(@NotNull final IColony colony) bonemealFungi(); } + @Override + public void serializeToView(@NotNull FriendlyByteBuf buf) + { + super.serializeToView(buf); + + buf.writeBoolean(shouldRestrict()); + if (startRestriction != null && endRestriction != null) + { + buf.writeBlockPos(startRestriction); + buf.writeBlockPos(endRestriction); + } + else + { + buf.writeBlockPos(BlockPos.ZERO); + buf.writeBlockPos(BlockPos.ZERO); + } + } + + /** + * The client side representation of the building. + */ + public static class View extends AbstractBuildingView + { + private boolean restrict; + private BlockPos startRestriction; + private BlockPos endRestriction; + + /** + * Instantiates the view of the building. + * + * @param c the colonyView. + * @param l the location of the block. + */ + public View(final IColonyView c, final BlockPos l) + { + super(c, l); + } + + @Override + public void deserialize(@NotNull FriendlyByteBuf buf) + { + super.deserialize(buf); + + this.restrict = buf.readBoolean(); + this.startRestriction = buf.readBlockPos(); + this.endRestriction = buf.readBlockPos(); + } + + public boolean shouldRestrict() + { + return this.restrict; + } + + public BlockPos getStartRestriction() + { + return this.startRestriction; + } + + public BlockPos getEndRestriction() + { + return this.endRestriction; + } + } + public static class CraftingModule extends AbstractCraftingBuildingModule.Custom { /** diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingMiner.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingMiner.java index 474e1f5b6f3..d5c01cb0628 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingMiner.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingMiner.java @@ -1,6 +1,5 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; -import com.ldtteam.structurize.storage.StructurePacks; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; @@ -32,7 +31,6 @@ import java.util.Set; import static com.minecolonies.api.util.constant.BuildingConstants.*; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; import static com.minecolonies.api.util.constant.Constants.STACKSIZE; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; @@ -261,6 +259,7 @@ public void searchWorkOrder() { citizen.getJob(JobMiner.class).setWorkOrder(wo); wo.setClaimedBy(citizen); + getColony().getWorkManager().setDirty(true); return; } } @@ -277,26 +276,22 @@ public static void initStructure(final Node mineNode, final int rotateTimes, fin { final String structurePack = buildingMiner.getStructurePack(); int rotateCount; - final boolean needsFallback; final String style; if (mineNode == null) { rotateCount = getRotationFromVector(buildingMiner); style = Node.NodeType.SHAFT.getSchematicName(); - needsFallback = needsFallBack(structurePack, style) ; } - else { rotateCount = rotateTimes; style = mineNode.getStyle().getSchematicName(); - needsFallback = needsFallBack(structurePack, style); } if (job == null || job.getWorkOrder() == null) { - final WorkOrderMiner wo = new WorkOrderMiner(needsFallback ? DEFAULT_STYLE : structurePack, style + ".blueprint", style, rotateCount, structurePos, false, buildingMiner.getPosition()); + final WorkOrderMiner wo = new WorkOrderMiner(structurePack, style + ".blueprint", style, rotateCount, structurePos, false, buildingMiner.getPosition()); wo.setClaimedBy(buildingMiner.getPosition()); buildingMiner.getColony().getWorkManager().addWorkOrder(wo, false); if (job != null) @@ -338,16 +333,4 @@ else if (vector.getZ() == -1) } return 0; } - - /** - * Get the correct style for the shaft. Return default back. - * - * @param structurePacks the structurePacks to check. - * @param shaft the shaft. - * @return the correct location. - */ - private static boolean needsFallBack(final String structurePacks, final String shaft) - { - return StructurePacks.getBlueprint(structurePacks, shaft + ".blueprint", true) == null; - } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingPlantation.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingPlantation.java index acc332f6296..e3c9f4a6e10 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingPlantation.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingPlantation.java @@ -1,80 +1,65 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; -import com.google.common.collect.ImmutableMap; +import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.crafting.GenericRecipe; import com.minecolonies.api.crafting.IGenericRecipe; +import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; import com.minecolonies.api.util.CraftingUtils; import com.minecolonies.api.util.ItemStackUtils; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.OptionalPredicate; import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.client.gui.modules.PlantationFieldsModuleWindow; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AbstractCraftingBuildingModule; -import com.minecolonies.coremod.colony.buildings.modules.settings.PlantationSetting; -import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; +import com.minecolonies.coremod.colony.buildings.moduleviews.FieldsModuleView; +import com.minecolonies.coremod.colony.fields.PlantationField; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Tuple; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; - +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.BiPredicate; +import java.util.function.Predicate; import java.util.stream.Collectors; -import static com.minecolonies.api.util.constant.BuildingConstants.CONST_DEFAULT_MAX_BUILDING_LEVEL; +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_LARGE; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_PLANTGROUND; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS; import static com.minecolonies.api.util.constant.TagConstants.CRAFTING_PLANTATION; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_PLANTATION_RESEARCH_REQUIRED; +import static com.minecolonies.api.util.constant.translation.GuiTranslationConstants.FIELD_LIST_WARN_EXCEEDS_PLANT_COUNT; /** * Class of the plantation building. Worker will grow sugarcane/bamboo/cactus + craft paper and books. */ public class BuildingPlantation extends AbstractBuilding { - /** - * Settings key for the building mode. - */ - public static final ISettingKey MODE = - new SettingKey<>(PlantationSetting.class, new ResourceLocation(com.minecolonies.api.util.constant.Constants.MOD_ID, "mode")); - - /** - * The combinations of items/blocks/tags. - */ - public static final Map COMBINATIONS = ImmutableMap.builder() - .put(Items.SUGAR_CANE, new PlantationItem(Items.SUGAR_CANE, Blocks.SUGAR_CANE, "sugar", 3)) - .put(Items.CACTUS, new PlantationItem(Items.CACTUS, Blocks.CACTUS, "cactus", 3)) - .put(Items.BAMBOO, new PlantationItem(Items.BAMBOO, Blocks.BAMBOO, "bamboo", 3)) - .build(); - /** * Description string of the building. */ private static final String PLANTATION = "plantation"; /** - * List of sand blocks to grow onto. - */ - private final List sand = new ArrayList<>(); - - /** - * Cached list of soil positions + * TODO: future + * Legacy code, can be removed when plantations will no longer have to support fields + * directly from the hut building. + * Whether field migration from the old system to the new system should occur. */ - private List soilPositions = null; + private boolean triggerFieldMigration = false; /** * Instantiates a new plantation building. @@ -86,317 +71,415 @@ public BuildingPlantation(final IColony c, final BlockPos l) { super(c, l); keepX.put(itemStack -> ItemStackUtils.hasToolLevel(itemStack, ToolType.AXE, TOOL_LEVEL_WOOD_OR_GOLD, getMaxToolLevel()), new Tuple<>(1, true)); + keepX.put(itemStack -> ItemStackUtils.hasToolLevel(itemStack, ToolType.SHEARS, TOOL_LEVEL_WOOD_OR_GOLD, getMaxToolLevel()), new Tuple<>(1, true)); } - @NotNull @Override - public String getSchematicName() + public void onPlacement() { - return PLANTATION; + super.onPlacement(); + updateFields(); } - @Override - public int getMaxBuildingLevel() + private void updateFields() { - return CONST_DEFAULT_MAX_BUILDING_LEVEL; + updateField(FieldRegistries.plantationSugarCaneField.get()); + updateField(FieldRegistries.plantationCactusField.get()); + updateField(FieldRegistries.plantationBambooField.get()); } - @Override - public void registerBlockPosition(@NotNull final Block block, @NotNull final BlockPos pos, @NotNull final Level world) + /** + * TODO: future + * Legacy code, can be removed when plantations will no longer have to support fields + * directly from the hut building. + */ + private void updateField(FieldRegistries.FieldEntry type) { - super.registerBlockPosition(block, pos, world); - if (block == Blocks.SAND) + final PlantationField plantationField = PlantationField.create(type, getPosition()); + final List workingPositions = + plantationField.getModule().getValidWorkingPositions(colony.getWorld(), getLocationsFromTag(plantationField.getModule().getWorkTag())); + if (workingPositions.isEmpty()) { - final Block down = world.getBlockState(pos.below()).getBlock(); - if (down == Blocks.COBBLESTONE || down == Blocks.STONE_BRICKS) + colony.getBuildingManager().removeField(field -> field.equals(plantationField)); + return; + } + + if (colony.getBuildingManager().addField(plantationField)) + { + plantationField.setWorkingPositions(workingPositions); + } + else + { + final Optional existingField = colony.getBuildingManager().getField(field -> field.equals(plantationField)); + if (existingField.isPresent() && existingField.get() instanceof PlantationField existingPlantationField) { - sand.add(pos); + existingPlantationField.setWorkingPositions(workingPositions); } } } + /** + * TODO: future + * Legacy code, can be removed when plantations will no longer have to support fields + * directly from the hut building. + *

+ * This is used for initial migration to the new plantation field system. + * This will register the fields on colony load, only when the building still contains old NBT data. + */ @Override public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - final ListTag sandPos = compound.getList(TAG_PLANTGROUND, Tag.TAG_COMPOUND); - for (int i = 0; i < sandPos.size(); ++i) + if (compound.contains(TAG_PLANTGROUND)) { - sand.add(NbtUtils.readBlockPos(sandPos.getCompound(i).getCompound(TAG_POS))); + triggerFieldMigration = true; } } - @Override - public CompoundTag serializeNBT() - { - final CompoundTag compound = super.serializeNBT(); - @NotNull final ListTag sandCompoundList = new ListTag(); - for (@NotNull final BlockPos entry : sand) - { - @NotNull final CompoundTag sandCompound = new CompoundTag(); - sandCompound.put(TAG_POS, NbtUtils.writeBlockPos(entry)); - sandCompoundList.add(sandCompound); - } - compound.put(TAG_PLANTGROUND, sandCompoundList); - return compound; - } - @Override public void onUpgradeComplete(final int newLevel) { super.onUpgradeComplete(newLevel); - soilPositions = null; + updateFields(); } - /** - * Get a list of all the available working positions. - * - * @return the list of positions. - */ - public List getAllSoilPositions() + @Override + public Map, Tuple> getRequiredItemsAndAmount() { - if (soilPositions == null) + final Map, Tuple> toKeep = super.getRequiredItemsAndAmount(); + for (FieldsModule module : getModules(FieldsModule.class)) { - soilPositions = getSoilPositions((tag, item) -> true); + for (final IField field : module.getOwnedFields()) + { + if (field instanceof PlantationField plantationField) + { + final IPlantationModule plantationModule = plantationField.getFirstModuleOccurance(IPlantationModule.class); + toKeep.put(new ItemStack(plantationModule.getItem())::sameItem, new Tuple<>(plantationModule.getPlantsToRequest(), true)); + } + } } - - return soilPositions; + return toKeep; } /** - * Get a list of all the available working positions. + * Check if the assigned citizens are allowed to eat the following stack. + * Additionally, if the stack is even edible in the first place, then it also checks if the fields aren't producing these items. + * If this item is being produced here, the planter is not allowed to eat his own products in that case. (Although most items the planter produces won't be edible to begin with). * - * @param filter a predicate to filter against, contains the tag of a building. - * @return the list of positions. + * @param stack the stack to test. + * @return true if so. */ - private List getSoilPositions(BiPredicate filter) + @Override + public boolean canEat(final ItemStack stack) { - final List filtered = new ArrayList<>(); - if (tileEntity != null && !tileEntity.getPositionedTags().isEmpty()) + if (!super.canEat(stack)) { - Map availableTags = COMBINATIONS.entrySet().stream().collect(Collectors.toMap(k -> k.getValue().getTag(), Map.Entry::getKey)); + return false; + } - for (final Map.Entry> entry : tileEntity.getPositionedTags().entrySet()) + for (FieldsModule module : getModules(FieldsModule.class)) + { + for (final IField field : module.getOwnedFields()) { - final Optional foundTag = entry.getValue().stream().filter(availableTags::containsKey).findFirst(); - if (!foundTag.isPresent()) - { - continue; - } - - Item item = availableTags.get(foundTag.get()); - if (filter.test(foundTag.get(), item)) + if (field instanceof PlantationField plantationField) { - filtered.add(new PlantationSoilPosition(getPosition().offset(entry.getKey()), COMBINATIONS.get(item))); + final IPlantationModule plantationModule = plantationField.getFirstModuleOccurance(IPlantationModule.class); + if (ItemStackUtils.compareItemStacksIgnoreStackSize(new ItemStack(plantationModule.getItem()), stack)) + { + return false; + } } } } - return filtered; + return true; } /** - * Obtain the current list of available plants to use. - * - * @return a list of plants. + * TODO: future + * Legacy code, can be removed when plantations will no longer have to support fields + * directly from the hut building. */ - public List getAvailablePlants() + @Override + public void setTileEntity(final AbstractTileEntityColonyBuilding te) { - final String setting = getSetting(MODE).getValue(); - - List items = new ArrayList<>(); - if (setting.contains(Items.SUGAR_CANE.getDescriptionId())) - { - items.add(Items.SUGAR_CANE); - } - if (setting.contains(Items.CACTUS.getDescriptionId())) - { - items.add(Items.CACTUS); - } - if (setting.contains(Items.BAMBOO.getDescriptionId())) + super.setTileEntity(te); + if (triggerFieldMigration) { - items.add(Items.BAMBOO); + updateFields(); + triggerFieldMigration = false; } + } - // Add sugar cane as the default plant cycle as a fallback in case nothing exists in the settings - if (items.isEmpty()) - { - items.add(Items.SUGAR_CANE); - Log.getLogger().warn("Plantation plant setting contains none of the preconfigured plants, please report this to the developers!"); - } - return items; + @NotNull + @Override + public String getSchematicName() + { + return PLANTATION; } - public static class CraftingModule extends AbstractCraftingBuildingModule.Crafting + /** + * Field module implementation for the plantation. + */ + public static class PlantationFieldsModule extends FieldsModule { + @Override + public void serializeToView(final @NotNull FriendlyByteBuf buf) + { + super.serializeToView(buf); + buf.writeInt(getMaxConcurrentPlants()); + } + /** - * Create a new module. + * Get the maximum allowed plants the plantation can work on simultaneously. * - * @param jobEntry the entry of the job. + * @return the maximum amount of concurrent plants. */ - public CraftingModule(final JobEntry jobEntry) + public int getMaxConcurrentPlants() { - super(jobEntry); + return (int) Math.ceil(building.getBuildingLevel() / 2D); } - @NotNull @Override - public OptionalPredicate getIngredientValidator() + protected int getMaxFieldCount() { - return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_PLANTATION).combine(super.getIngredientValidator()); + int allowedPlants = (int) Math.ceil(building.getBuildingLevel() / 2D); + return building.getColony().getResearchManager().getResearchEffects().getEffectStrength(PLANTATION_LARGE) > 0 + ? allowedPlants + 1 + : allowedPlants; } @Override - public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) + public Class getExpectedFieldType() { - if (!super.isRecipeCompatible(recipe)) - { - return false; - } - final Optional isRecipeAllowed = CraftingUtils.isRecipeCompatibleBasedOnTags(recipe, CRAFTING_PLANTATION); - return isRecipeAllowed.orElse(false); + return PlantationField.class; } @Override - public @NotNull List getAdditionalRecipesForDisplayPurposesOnly() + public @NotNull List getFields() { - final List recipes = new ArrayList<>(super.getAdditionalRecipesForDisplayPurposesOnly()); - - // indicate which plants we can grow - for (final Map.Entry entry : COMBINATIONS.entrySet()) - { - recipes.add(new GenericRecipe(null, - new ItemStack(entry.getKey(), entry.getValue().getMinimumLength() + 1), - Collections.emptyList(), - Collections.singletonList(Collections.singletonList(new ItemStack(entry.getKey()))), - 1, Blocks.AIR, null, ToolType.NONE, Collections.emptyList(), -1)); - } - - return recipes; + return building.getColony().getBuildingManager().getFields(field -> field.hasModule(IPlantationModule.class)); } - } - public static class PlantationSoilPosition - { - /** - * The position. - */ - private final BlockPos position; - - /** - * The item combination data. - */ - private final PlantationItem combination; + @Override + public boolean canAssignFieldOverride(IField field) + { + return getCurrentPlantsPlusField(field) <= getMaxConcurrentPlants() && hasRequiredResearchForField(field); + } - /** - * Default constructor. - * - * @param position the position. - * @param combination the item combination data. - */ - private PlantationSoilPosition(final BlockPos position, final PlantationItem combination) + @Override + protected int getFieldCheckTimeoutSeconds() { - this.position = position; - this.combination = combination; + return 60; } /** - * Get the position. + * Getter of the worked plants. * - * @return the position. + * @param extraField the extra field to calculate. + * @return the amount of worked plants. */ - public BlockPos getPosition() + private int getCurrentPlantsPlusField(final IField extraField) { - return position; + final Set plants = getOwnedFields().stream() + .map(field -> field.getFirstModuleOccurance(IPlantationModule.class)) + .collect(Collectors.toSet()); + plants.add(extraField.getFirstModuleOccurance(IPlantationModule.class)); + return plants.size(); } /** - * Get the plantation item. + * Checks if the passed field has the research required. * - * @return the plantation item. + * @param field the field in question. + * @return true if the research is handled. */ - public PlantationItem getCombination() + private boolean hasRequiredResearchForField(final IField field) { - return combination; + if (field instanceof PlantationField plantationField) + { + final IPlantationModule plantationModule = plantationField.getFirstModuleOccurance(IPlantationModule.class); + if (plantationModule.getRequiredResearchEffect() != null) + { + return building.getColony().getResearchManager().getResearchEffects().getEffectStrength(plantationModule.getRequiredResearchEffect()) > 0; + } + return true; + } + return false; } } - public static class PlantationItem + /** + * Field module view implementation for the plantation. + */ + public static class PlantationFieldsModuleView extends FieldsModuleView { /** - * The item of the combination. + * The maximum amount of concurrent plants the planter can work on. */ - private final Item item; + private int maxConcurrentPlants = 0; - /** - * The block of the combination. - */ - private final Block block; + @Override + public void deserialize(final @NotNull FriendlyByteBuf buf) + { + super.deserialize(buf); + maxConcurrentPlants = buf.readInt(); + } - /** - * The tag of the combination. - */ - private final String tag; + @Override + protected boolean canAssignFieldOverride(final IField field) + { + return getCurrentPlantsPlusField(field) <= maxConcurrentPlants && hasRequiredResearchForField(field); + } - /** - * The minimum length of this combination. - */ - private final int minimumLength; + @Override + protected List getFieldsInColony() + { + return getColony().getFields(field -> field.hasModule(IPlantationModule.class)); + } + + @Override + public @Nullable MutableComponent getFieldWarningTooltip(final IField field) + { + MutableComponent result = super.getFieldWarningTooltip(field); + if (result != null) + { + return result; + } + + if (getCurrentPlantsPlusField(field) > maxConcurrentPlants) + { + return Component.translatable(FIELD_LIST_WARN_EXCEEDS_PLANT_COUNT); + } + + if (!hasRequiredResearchForField(field)) + { + return Component.translatable(FIELD_LIST_PLANTATION_RESEARCH_REQUIRED); + } + return null; + } /** - * Default constructor. + * Getter of the worked plants. * - * @param item the item. - * @param block the block. - * @param tag the tag. - * @param minimumLength the minimum length. + * @param extraField the extra field to calculate. + * @return the amount of worked plants. */ - private PlantationItem(Item item, Block block, String tag, int minimumLength) + private int getCurrentPlantsPlusField(final IField extraField) { - this.item = item; - this.block = block; - this.tag = tag; - this.minimumLength = minimumLength; + final Set plants = getOwnedFields().stream() + .map(field -> field.getFirstModuleOccurance(IPlantationModule.class)) + .collect(Collectors.toSet()); + plants.add(extraField.getFirstModuleOccurance(IPlantationModule.class)); + return plants.size(); } /** - * Get the item of the combination. + * Checks if the passed field has the research required. * - * @return the item. + * @param field the field in question. + * @return true if the research is handled. */ - public Item getItem() + private boolean hasRequiredResearchForField(final IField field) { - return item; + if (field instanceof PlantationField plantationField) + { + final IPlantationModule plantationModule = plantationField.getFirstModuleOccurance(IPlantationModule.class); + if (plantationModule.getRequiredResearchEffect() != null) + { + return getColony().getResearchManager().getResearchEffects().getEffectStrength(plantationModule.getRequiredResearchEffect()) > 0; + } + return true; + } + return false; } /** - * Get the block of the combination. + * Getter of the worked plants. * - * @return the block. + * @return the amount of worked plants. */ - public Block getBlock() + public int getCurrentPlants() { - return block; + return getOwnedFields().stream() + .map(field -> field.getFirstModuleOccurance(IPlantationModule.class)) + .collect(Collectors.toSet()) + .size(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public BOWindow getWindow() + { + return new PlantationFieldsModuleWindow(buildingView, this); } /** - * Get the tag of the combination. + * Get the maximum allowed plants the plantation can work on simultaneously. * - * @return the tag. + * @return the maximum amount of concurrent plants. */ - public String getTag() + public int getMaxConcurrentPlants() { - return tag; + return maxConcurrentPlants; } + } + public static class CraftingModule extends AbstractCraftingBuildingModule.Crafting + { /** - * Get the minimum length of the combination. + * Create a new module. * - * @return the minimum length. + * @param jobEntry the entry of the job. */ - public int getMinimumLength() + public CraftingModule(final JobEntry jobEntry) + { + super(jobEntry); + } + + @Override + public boolean isRecipeCompatible(@NotNull final IGenericRecipe recipe) + { + if (!super.isRecipeCompatible(recipe)) + { + return false; + } + final Optional isRecipeAllowed = CraftingUtils.isRecipeCompatibleBasedOnTags(recipe, CRAFTING_PLANTATION); + return isRecipeAllowed.orElse(false); + } + + @Override + public @NotNull List getAdditionalRecipesForDisplayPurposesOnly() + { + final List recipes = new ArrayList<>(super.getAdditionalRecipesForDisplayPurposesOnly()); + + for (FieldRegistries.FieldEntry type : FieldRegistries.getFieldRegistry().getValues()) + { + type.getFieldModuleProducers().stream() + .map(m -> m.apply(null)) + .filter(IPlantationModule.class::isInstance) + .map(m -> (IPlantationModule) m) + .findFirst() + .ifPresent(module -> recipes.add(new GenericRecipe(null, + new ItemStack(module.getItem()), + Collections.emptyList(), + List.of(module.getRequiredItemsForOperation()), + 1, + Blocks.AIR, + null, + module.getRequiredTool(), + Collections.emptyList(), + -1))); + } + + return recipes; + } + + @NotNull + @Override + public OptionalPredicate getIngredientValidator() { - return minimumLength; + return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_PLANTATION).combine(super.getIngredientValidator()); } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSawmill.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSawmill.java index 85a4e5edb80..d353d56e5d5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSawmill.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSawmill.java @@ -138,7 +138,7 @@ public DOCraftingModule(final JobEntry jobEntry) */ public @NotNull static OptionalPredicate getStaticIngredientValidator() { - return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_SAWMILL) + return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_SAWMILL, true) .combine(stack -> Optional.of(stack.is(ItemTags.PLANKS) || stack.is(ItemTags.LOGS))); } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingShepherd.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingShepherd.java index cbc54b6eb5f..8519b118754 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingShepherd.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingShepherd.java @@ -3,23 +3,27 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.modules.settings.ISettingKey; import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.GenericRecipe; +import com.minecolonies.api.crafting.IGenericRecipe; +import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import com.minecolonies.coremod.colony.buildings.modules.settings.BoolSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.SettingKey; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Sheep; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; /** * Creates a new building for the Shepherd. @@ -92,20 +96,21 @@ public static class HerdingModule extends AnimalHerdingModule { public HerdingModule() { - super(ModJobs.shepherd.get(), EntityType.SHEEP, new ItemStack(Items.WHEAT, 2)); + super(ModJobs.shepherd.get(), a -> a instanceof Sheep, new ItemStack(Items.WHEAT, 2)); } + @NotNull @Override - public @NotNull List getExpectedLoot() + public List getRecipesForDisplayPurposesOnly(@NotNull Animal animal) { - final List drops = new ArrayList<>(super.getExpectedLoot()); + final List recipes = new ArrayList<>(super.getRecipesForDisplayPurposesOnly(animal)); - final List wool = ForgeRegistries.ITEMS.tags().getTag(ItemTags.WOOL).stream() - .map(ItemStack::new) - .collect(Collectors.toList()); - drops.add(new LootTableAnalyzer.LootDrop(wool, 1, 0, false)); + recipes.add(new GenericRecipe(null, ItemStack.EMPTY, + ForgeRegistries.ITEMS.tags().getTag(ItemTags.WOOL).stream().map(ItemStack::new).toList(), + Collections.emptyList(), Collections.emptyList(), + 0, Blocks.AIR, null, ToolType.SHEARS, animal, Collections.emptyList(), 0)); - return drops; + return recipes; } // we *could* add a custom crafting module to show shears -> wool as well, but it's good diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSmeltery.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSmeltery.java index 882e37d4ee5..38296fc9a77 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSmeltery.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingSmeltery.java @@ -6,10 +6,7 @@ import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.colony.requestsystem.token.IToken; import com.minecolonies.api.compatibility.ICompatibilityManager; -import com.minecolonies.api.crafting.GenericRecipe; -import com.minecolonies.api.crafting.IGenericRecipe; -import com.minecolonies.api.crafting.ItemStorage; -import com.minecolonies.api.crafting.RecipeStorage; +import com.minecolonies.api.crafting.*; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.ItemStackUtils; @@ -17,6 +14,7 @@ import com.minecolonies.api.util.constant.TypeConstants; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.AbstractCraftingBuildingModule; +import com.minecolonies.coremod.colony.crafting.CustomRecipe; import com.minecolonies.coremod.util.FurnaceRecipes; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -181,6 +179,17 @@ public List getAdditionalLootTables() return lootTables; } + @Override + protected boolean isPreTaughtRecipe(final IRecipeStorage storage, final Map crafterRecipes) + { + if (storage.getPrimaryOutput().isEmpty() && storage.getLootTable() != null) + { + return true; + } + + return super.isPreTaughtRecipe(storage, crafterRecipes); + } + @NotNull @Override public List getAdditionalRecipesForDisplayPurposesOnly() diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingStonemason.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingStonemason.java index 4ac5410cac7..5bc2fb86c14 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingStonemason.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingStonemason.java @@ -96,7 +96,7 @@ public DOCraftingModule(final JobEntry jobEntry) */ public @NotNull static OptionalPredicate getStaticIngredientValidator() { - return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_STONEMASON); + return CraftingUtils.getIngredientValidatorBasedOnTags(CRAFTING_STONEMASON, true); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingTownHall.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingTownHall.java index 5614b8a40ea..e5125409270 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingTownHall.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingTownHall.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; +import com.google.common.collect.ImmutableList; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.MinecoloniesAPIProxy; import com.minecolonies.api.colony.IColony; @@ -9,19 +10,24 @@ import com.minecolonies.api.colony.colonyEvents.descriptions.IColonyEventDescription; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventDescriptionTypeRegistryEntry; import com.minecolonies.api.colony.permissions.PermissionEvent; +import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.Log; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.client.gui.townhall.WindowMainPage; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jetbrains.annotations.NotNull; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import java.util.*; import static com.minecolonies.api.util.constant.ColonyConstants.MAX_COLONY_EVENTS; import static com.minecolonies.api.util.constant.Constants.MOD_ID; @@ -112,6 +118,36 @@ public void serializeToView(@NotNull final FriendlyByteBuf buf) buf.writeUtf(event.getEventTypeId().getPath()); event.serialize(buf); } + + final List maps = new ArrayList<>(); + for (final ItemStack stack : InventoryUtils.getBuildingInventory(this)) + { + if (!stack.isEmpty() && stack.getItem() == Items.FILLED_MAP) + { + maps.add(stack); + } + } + + final Level level = colony.getWorld(); + + int validMapCount = 0; + for (final ItemStack stack : maps) + { + if(MapItem.getSavedData(stack, level) != null) + { + validMapCount++; + } + } + + buf.writeInt(validMapCount); + for (final ItemStack stack : maps) + { + final MapItemSavedData mapData = MapItem.getSavedData(stack, level); + if(mapData != null) + { + buf.writeNbt(mapData.save(new CompoundTag())); + } + } } @Override @@ -154,13 +190,18 @@ public static class View extends AbstractBuildingView implements ITownHallView /** * List of colony events. */ - private final List colonyEvents = new LinkedList<>(); + private ImmutableList colonyEvents = ImmutableList.of(); /** * If the player is allowed to do townHall teleport. */ private boolean canPlayerUseTP = false; + /** + * List of mapdata. + */ + private List mapDataList = new ArrayList<>(); + /** * Instantiates the view of the building. * @@ -192,7 +233,7 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) permissionEvents.add(new PermissionEvent(buf)); } - colonyEvents.clear(); + final List tempEvents = new ArrayList<>(); final int colonyEventsSize = buf.readInt(); for (int i = 0; i < colonyEventsSize; i++) { @@ -205,7 +246,17 @@ public void deserialize(@NotNull final FriendlyByteBuf buf) continue; } - colonyEvents.add(registryEntry.deserializeEventDescriptionFromFriendlyByteBuf(buf)); + tempEvents.add(registryEntry.deserializeEventDescriptionFromFriendlyByteBuf(buf)); + } + Collections.reverse(tempEvents); + colonyEvents = ImmutableList.copyOf(tempEvents); + + final int size = buf.readInt(); + mapDataList.clear(); + for (int i = 0; i < size; i++) + { + final MapItemSavedData mapData = MapItemSavedData.load(buf.readNbt()); + mapDataList.add(mapData); } } @@ -218,7 +269,7 @@ public List getPermissionEvents() @Override public List getColonyEvents() { - return new LinkedList<>(colonyEvents); + return colonyEvents; } @Override @@ -226,5 +277,14 @@ public boolean canPlayerUseTP() { return canPlayerUseTP; } + + /** + * Getter for the mapdata. + * @return the original list. + */ + public List getMapDataList() + { + return mapDataList; + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingUniversity.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingUniversity.java index adf12d2560f..d0d3b933ed9 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingUniversity.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/BuildingUniversity.java @@ -1,6 +1,5 @@ package com.minecolonies.coremod.colony.buildings.workerbuildings; -import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.ModJobs; @@ -9,7 +8,6 @@ import com.minecolonies.api.util.MessageUtils; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; -import com.minecolonies.coremod.colony.buildings.views.AbstractBuildingView; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -17,11 +15,9 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; - +import net.minecraftforge.common.Tags; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -108,8 +104,7 @@ public CompoundTag serializeNBT() public void registerBlockPosition(@NotNull final Block block, @NotNull final BlockPos pos, @NotNull final Level world) { super.registerBlockPosition(block, pos, world); - //todo we might in the future want to add our own oredict tag to this. - if (block == Blocks.BOOKSHELF) + if (block.defaultBlockState().is(Tags.Blocks.BOOKSHELVES)) { bookCases.add(pos); } @@ -127,7 +122,7 @@ public BlockPos getRandomBookShelf() return getPosition(); } final BlockPos returnPos = bookCases.get(random.nextInt(bookCases.size())); - if (colony.getWorld().getBlockState(returnPos).getBlock() == Blocks.BOOKSHELF) + if (colony.getWorld().getBlockState(returnPos).is(Tags.Blocks.BOOKSHELVES)) { return returnPos; } @@ -158,6 +153,7 @@ public void onColonyTick(@NotNull final IColony colony) { onSuccess(research); } + colony.getResearchManager().markDirty(); i++; } } diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/PostBox.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/PostBox.java index 60b916469f2..023d4eca52d 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/PostBox.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/PostBox.java @@ -81,8 +81,7 @@ public void onRequestedRequestCancelled(@NotNull final IRequestManager manager, @Override public Tuple getCorners() { - this.setCorners(this.getPosition(), this.getPosition()); - return super.getCorners(); + return new Tuple<>(getPosition(),getPosition()); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/Stash.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/Stash.java index 68459bd5483..ae2fb17f2d7 100755 --- a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/Stash.java +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/Stash.java @@ -40,8 +40,7 @@ public ImmutableCollection> createResolvers() @Override public Tuple getCorners() { - this.setCorners(this.getPosition(), this.getPosition()); - return super.getCorners(); + return new Tuple<>(getPosition(),getPosition()); } @NotNull diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/AbstractPlantationModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/AbstractPlantationModule.java new file mode 100644 index 00000000000..cb7aa4bfcd0 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/AbstractPlantationModule.java @@ -0,0 +1,181 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.coremod.colony.fields.PlantationField; +import com.minecolonies.coremod.colony.fields.modules.AbstractFieldModule; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Base class for planter modules that determines how the AI should work specific fields. + */ +public abstract class AbstractPlantationModule extends AbstractFieldModule implements IPlantationModule +{ + /** + * The default maximum amount of plants the field can have. + */ + protected static final int DEFAULT_MAX_PLANTS = 20; + + /** + * The tag that the field anchor block contains in order to select which of these modules to use. + */ + private final String fieldTag; + + /** + * The tag that the individual working positions must contain. + */ + private final String workTag; + + /** + * The block which is harvested in this module. + */ + private final Item item; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected AbstractPlantationModule( + final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field); + this.fieldTag = fieldTag; + this.workTag = workTag; + this.item = item; + } + + @Override + public final String getFieldTag() + { + return fieldTag; + } + + @Override + public final String getWorkTag() + { + return workTag; + } + + @Override + public final Item getItem() + { + return item; + } + + @Override + public int getPlantsToRequest() + { + return (int) Math.ceil(new ItemStack(item).getMaxStackSize() / 4d); + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return null; + } + + @Override + public List getValidWorkingPositions(final @NotNull Level world, final List workingPositions) + { + List result = new ArrayList<>(); + int maxWorkingPositions = getMaxWorkingPositions(); + for (int i = 0; i < maxWorkingPositions; i++) + { + if (workingPositions.size() == i) + { + break; + } + result.add(workingPositions.get(i)); + } + return result; + } + + /** + * Get the maximum amount of working positions this field is allowed to handle. + * Defaults to {@link AbstractPlantationModule#DEFAULT_MAX_PLANTS}. + * + * @return the maximum amount of plants. + */ + protected int getMaxWorkingPositions() + { + return DEFAULT_MAX_PLANTS; + } + + @Override + public List getValidBonemeal() + { + return List.of(); + } + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + return workingPosition; + } + + @Override + public BlockState getPlantingBlockState(final Level world, final BlockPos workPosition, final BlockState blockState) + { + return blockState; + } + + @Override + public void applyBonemeal(AbstractEntityCitizen worker, BlockPos workPosition, ItemStack stackInSlot, Player fakePlayer) + { + BoneMealItem.applyBonemeal(stackInSlot, worker.getLevel(), workPosition, fakePlayer); + BoneMealItem.addGrowthParticles(worker.getLevel(), workPosition, 1); + } + + /** + * Get the working positions on the field. + * + * @return a list of working positions. + */ + protected final List getWorkingPositions() + { + if (field instanceof PlantationField plantationField) + { + return plantationField.getWorkingPositions(); + } + return new ArrayList<>(); + } + + @Override + public int hashCode() + { + return fieldTag.hashCode(); + } + + @Override + public boolean equals(final Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final AbstractPlantationModule that = (AbstractPlantationModule) o; + + return fieldTag.equals(that.fieldTag); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/BoneMealedPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/BoneMealedPlantModule.java new file mode 100644 index 00000000000..6838b55f510 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/BoneMealedPlantModule.java @@ -0,0 +1,191 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.AbstractPlantationModule; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Random; + +/** + * Plantation module for plants that grow on a flat piece of land when bone-mealed. + *
+ * Requirements: + *

    + *
  1. Soil blocks must be the same so plants can grow on them.
  2. + *
  3. Anything that grows on the field will be harvested, but only things that are 1 block high (multi block high things must break completely, else they are ignored).
  4. + *
+ */ +public abstract class BoneMealedPlantModule extends AbstractPlantationModule +{ + /** + * The default percentage chance to be able to work on this field. + */ + private static final int DEFAULT_PERCENTAGE_CHANCE = 50; + + /** + * The maximum amount of plants allowed on this field. (11 x 11 area) + */ + private static final int MAX_PLANTS = 121; + + /** + * The internal random used to decide whether to work this field or not. + */ + private final Random random; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected BoneMealedPlantModule( + final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + this.random = new Random(); + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workingPosition) + { + ActionToPerform action = decideWorkAction(world, workingPosition); + return switch (action) + { + case HARVEST -> new PlantationModuleResult.Builder().harvest(workingPosition.above()).pickNewPosition(); + case BONEMEAL -> new PlantationModuleResult.Builder().bonemeal(workingPosition).pickNewPosition(); + default -> PlantationModuleResult.NONE; + }; + } + + /** + * Responsible for deciding what action the AI is going to perform on the field. + * + * @param world the world reference that can be used for block state lookups. + * @param workPosition the position that has been chosen for work. + * @return the {@link PlantationModuleResult} that the AI is going to perform. + */ + private ActionToPerform decideWorkAction(Level world, BlockPos workPosition) + { + BlockState blockState = world.getBlockState(workPosition.above()); + if (isValidHarvestBlock(blockState)) + { + return ActionToPerform.HARVEST; + } + + if (isValidBonemealLocation(blockState)) + { + return ActionToPerform.BONEMEAL; + } + + return ActionToPerform.NONE; + } + + /** + * Check if the block is a correct block for harvesting. + * Defaults to check if the block state is not air. + * + * @param blockState the block state. + * @return whether the block can be harvested. + */ + protected boolean isValidHarvestBlock(BlockState blockState) + { + return !blockState.isAir(); + } + + /** + * Check if the block is a correct block for planting. + * Defaults to being any air block. + * + * @param blockState the block state. + * @return whether the block can be planted. + */ + protected boolean isValidBonemealLocation(BlockState blockState) + { + return blockState.isAir(); + } + + @Override + public @Nullable BlockPos getNextWorkingPosition(Level world) + { + // If there is anything to harvest, return the first position where a non-air block is present. + BlockPos positionToHarvest = getPositionToHarvest(world); + if (positionToHarvest != null) + { + return positionToHarvest; + } + + // A bone-mealed field has no growth stage, since the growth stage is instant. + // Therefore, we need to prevent the worker from constantly running around on this field only. + // This is achieved by only allowing work when a percentage chance is met, + // so that the field is not often considered as "needing work". + int percentChance = Math.max(Math.min(getPercentageChance(), 100), 1); + boolean willWork = random.nextFloat() < (percentChance / 100F); + if (willWork && !getWorkingPositions().isEmpty()) + { + // Get a random position on the field, which will act as the planting position. + List workingPositions = getWorkingPositions(); + int idx = random.nextInt(0, workingPositions.size()); + return workingPositions.get(idx); + } + return null; + } + + /** + * Get the first position which is harvestable on the ground. + * Defaults to return any non-air position. + * + * @param world the world reference that can be used for block state lookups. + * @return the position to harvest or null if no position needs harvesting. + */ + @Nullable + private BlockPos getPositionToHarvest(Level world) + { + return getWorkingPositions().stream().filter(pos -> isValidHarvestBlock(world.getBlockState(pos.above()))).findFirst().orElse(null); + } + + /** + * Get the chance in percentages of being able to perform work on this field when asked. + * Defaults to {@link BoneMealedPlantModule#DEFAULT_PERCENTAGE_CHANCE}. + * + * @return a number between 1 and 100. + */ + protected int getPercentageChance() + { + return DEFAULT_PERCENTAGE_CHANCE; + } + + @Override + public int getActionLimit() + { + return 1; + } + + @Override + public List getRequiredItemsForOperation() + { + return getValidBonemeal().stream().map(ItemStack::new).toList(); + } + + @Override + protected int getMaxWorkingPositions() + { + return MAX_PLANTS; + } + + @Override + public List getValidBonemeal() + { + return List.of(Items.BONE_MEAL, ModItems.compost); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/DownwardsGrowingPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/DownwardsGrowingPlantModule.java new file mode 100644 index 00000000000..8443b0ffd7c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/DownwardsGrowingPlantModule.java @@ -0,0 +1,230 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.AbstractPlantationModule; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + +/** + * Plantation module for plants that grow vertically downwards, similar to sugar glowberries. + *
+ * Requirements: + *
    + *
  1. Grow vertically downwards without any outcroppings.
  2. + *
  3. Grow uninterrupted (no gaps in between the plant).
  4. + *
  5. Must break all blocks below when an upper block is destroyed.
  6. + *
+ */ +public abstract class DownwardsGrowingPlantModule extends AbstractPlantationModule +{ + /** + * The default minimum plant length. + */ + protected static final int DEFAULT_MINIMUM_PLANT_LENGTH = 3; + + /** + * The internal random used to decide whether to work this field or not. + */ + private final Random random; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected DownwardsGrowingPlantModule( + final IField field, + final String fieldTag, + final String workTag, + final Item item) + { + super(field, fieldTag, workTag, item); + this.random = new Random(); + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workingPosition) + { + ActionToPerform action = decideWorkAction(world, workingPosition, false); + return switch (action) + { + case HARVEST -> new PlantationModuleResult.Builder() + .harvest(workingPosition.below(2)) + .pickNewPosition(); + case PLANT -> new PlantationModuleResult.Builder() + .plant(workingPosition.below()) + .pickNewPosition(); + case CLEAR -> new PlantationModuleResult.Builder() + .clear(workingPosition.below()) + .pickNewPosition(); + default -> PlantationModuleResult.NONE; + }; + } + + /** + * Responsible for deciding what action the AI is going to perform on a specific field position + * depending on the state of the working position. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @param enablePercentChance if the field has a maximum length, ensure a percentage roll is thrown to check if harvesting is allowed. + * @return the {@link PlantationModuleResult} that the AI is going to perform. + */ + private ActionToPerform decideWorkAction(final Level world, final BlockPos plantingPosition, final boolean enablePercentChance) + { + BlockState blockState = world.getBlockState(plantingPosition.below()); + if (isValidPlantingBlock(blockState)) + { + return ActionToPerform.PLANT; + } + + if (isValidClearingBlock(blockState)) + { + return ActionToPerform.CLEAR; + } + + if (canHarvest(world, plantingPosition, enablePercentChance)) + { + return ActionToPerform.HARVEST; + } + + return ActionToPerform.NONE; + } + + /** + * Check if the block is a correct block for planting. + * Defaults to being any air block. + * + * @param blockState the block state. + * @return whether the block can be planted. + */ + protected boolean isValidPlantingBlock(BlockState blockState) + { + return blockState.isAir(); + } + + /** + * Check if the block is a correct block for clearing. + * + * @param blockState the block state. + * @return whether the block can be cleared. + */ + protected boolean isValidClearingBlock(BlockState blockState) + { + return !isValidHarvestBlock(blockState); + } + + /** + * Checks if the provided block at the given location is harvestable. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @param enablePercentChance if the field has a maximum length, ensure a percentage roll is thrown to check if harvesting is allowed. + * @return true if plant is harvestable. + */ + private boolean canHarvest(Level world, BlockPos plantingPosition, boolean enablePercentChance) + { + int minimumPlantLength = getMinimumPlantLength(); + Integer maximumPlantLength = getMaximumPlantLength(); + + if (maximumPlantLength != null && enablePercentChance) + { + float currentHeight = 0; + for (int height = minimumPlantLength; height <= maximumPlantLength; height++) + { + BlockState blockState = world.getBlockState(plantingPosition.below(height)); + if (!isValidHarvestBlock(blockState)) + { + break; + } + currentHeight = height; + } + + float chance = currentHeight / (float) maximumPlantLength; + return random.nextFloat() < chance; + } + else + { + BlockState blockAtMinHeight = world.getBlockState(plantingPosition.below(minimumPlantLength)); + return isValidHarvestBlock(blockAtMinHeight); + } + } + + /** + * Check if the block is a correct block for harvesting. + * + * @param blockState the block state. + * @return whether the block can be harvested. + */ + protected abstract boolean isValidHarvestBlock(BlockState blockState); + + /** + * Get the minimum length this plant should grow to before considered harvestable. + * Defaults to {@link DownwardsGrowingPlantModule#DEFAULT_MINIMUM_PLANT_LENGTH}. + * + * @return the minimum plant length + */ + protected int getMinimumPlantLength() + { + return DEFAULT_MINIMUM_PLANT_LENGTH; + } + + /** + * Get the maximum length this plant can grow. + * Defaults to null. + * + * @return the maximum plant length + */ + @Nullable + protected Integer getMaximumPlantLength() + { + return null; + } + + @Override + public BlockPos getNextWorkingPosition(final Level world) + { + for (BlockPos position : getWorkingPositions()) + { + if (decideWorkAction(world, position, true) != ActionToPerform.NONE) + { + return position; + } + } + + return null; + } + + @Override + public int getActionLimit() + { + return 10; + } + + @Override + public List getRequiredItemsForOperation() + { + return List.of(new ItemStack(getItem())); + } + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + return Stream.of(workingPosition.north(), workingPosition.south(), workingPosition.west(), workingPosition.east()) + .filter(pos -> world.getBlockState(pos).isAir()) + .findFirst() + .orElse(workingPosition); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/PercentageHarvestPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/PercentageHarvestPlantModule.java new file mode 100644 index 00000000000..5ee6d0e1913 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/PercentageHarvestPlantModule.java @@ -0,0 +1,203 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.AbstractPlantationModule; +import com.minecolonies.coremod.util.CollectorUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Plantation module for plants that should always keep an X amount of plants on the ground in order to keep spreading, similar to mushrooms. + *
+ * Requirements: + *
    + *
  1. These plants generally have a random growth logic, mushrooms can spread in any direction, not even attached to next to the other mushroom. Vines can spread into any direction, etc.
  2. + *
  3. All the positions you expect the plants to appear have to be tagged.
  4. + *
+ */ +public abstract class PercentageHarvestPlantModule extends AbstractPlantationModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected PercentageHarvestPlantModule( + final IField field, + final String fieldTag, + final String workTag, + final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workingPosition) + { + ActionToPerform action = decideWorkAction(world, workingPosition); + return switch (action) + { + case HARVEST -> new PlantationModuleResult.Builder() + .harvest(workingPosition) + .pickNewPosition(); + case PLANT -> new PlantationModuleResult.Builder() + .plant(workingPosition) + .pickNewPosition(); + case CLEAR -> new PlantationModuleResult.Builder() + .clear(workingPosition) + .pickNewPosition(); + default -> PlantationModuleResult.NONE; + }; + } + + /** + * Responsible for deciding what action the AI is going to perform on a specific field position + * depending on the state of the working position. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @return the {@link PlantationModuleResult} that the AI is going to perform. + */ + private ActionToPerform decideWorkAction(final Level world, final BlockPos plantingPosition) + { + BlockState blockState = world.getBlockState(plantingPosition); + if (isValidPlantingBlock(blockState)) + { + return ActionToPerform.PLANT; + } + + if (isValidClearingBlock(blockState)) + { + return ActionToPerform.CLEAR; + } + + if (isValidHarvestBlock(blockState)) + { + return ActionToPerform.HARVEST; + } + + return ActionToPerform.NONE; + } + + /** + * Check if the block is a correct block for planting. + * Defaults to being any air block. + * + * @param blockState the block state. + * @return whether the block can be planted. + */ + protected boolean isValidPlantingBlock(BlockState blockState) + { + return blockState.isAir(); + } + + /** + * Check if the block is a correct block for clearing. + * + * @param blockState the block state. + * @return whether the block can be cleared. + */ + protected boolean isValidClearingBlock(BlockState blockState) + { + return !isValidHarvestBlock(blockState); + } + + /** + * Check if the block is a correct block for harvesting. + * + * @param blockState the block state. + * @return whether the block can be harvested. + */ + protected abstract boolean isValidHarvestBlock(BlockState blockState); + + @Override + public @Nullable BlockPos getNextWorkingPosition(Level world) + { + final List workingPositions = getWorkingPositions().stream().collect(CollectorUtils.toShuffledList()); + final List harvestablePositions = new ArrayList<>(); + + final double minimumPlantFraction = Mth.clamp(getMinimumPlantPercentage(), 0, 100) / 100d; + final int minimumPlantCount = (int) Math.ceil(minimumPlantFraction * workingPositions.size()); + + for (BlockPos position : workingPositions) + { + final ActionToPerform action = decideWorkAction(world, position); + if (action == ActionToPerform.CLEAR) + { + return position; + } + if (action == ActionToPerform.HARVEST) + { + harvestablePositions.add(position); + } + } + + if (minimumPlantCount > harvestablePositions.size()) + { + // We want to prevent putting "harvestable" blocks next to one another as much as possible. + Set excludedPositions = harvestablePositions.stream() + .flatMap(f -> Stream.of(f, f.above(), f.below(), f.north(), f.south(), f.west(), f.east())) + .collect(Collectors.toSet()); + return workingPositions.stream() + .filter(f -> !excludedPositions.contains(f)) + .findFirst() + .orElse(null); + } + else if (minimumPlantCount < harvestablePositions.size()) + { + Set duplicateLocator = new HashSet<>(); + return harvestablePositions.stream() + .flatMap(f -> Stream.of(f, f.above(), f.below(), f.north(), f.south(), f.west(), f.east())) + .filter(f -> !duplicateLocator.add(f)) + .findFirst() + .orElse(harvestablePositions.get(0)); + } + + return null; + } + + @Override + public int getActionLimit() + { + return 5; + } + + @Override + public List getRequiredItemsForOperation() + { + return List.of(new ItemStack(getItem())); + } + + /** + * The percentage of positions the planter should always leave present at the bare minimum. + * If this is not reached the planter will plant additional plants to reach this minimum. + * + * @return a percentage of plants to always leave be. + */ + protected abstract int getMinimumPlantPercentage(); + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + return Stream.of(workingPosition.north(), workingPosition.south(), workingPosition.west(), workingPosition.east()) + .filter(pos -> world.getBlockState(pos).isAir()) + .findFirst() + .orElse(workingPosition); + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/TreeSidePlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/TreeSidePlantModule.java new file mode 100644 index 00000000000..919600c82ea --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/TreeSidePlantModule.java @@ -0,0 +1,180 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.CitizenConstants; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.AbstractPlantationModule; +import com.minecolonies.coremod.util.CollectorUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Plantation module for plants that grow attached to any horizontal side of a tree log. + * Similar to plants like cocoa beans. + *
+ * Requirements: + *
    + *
  1. Must grow on the side of a vertically standing log.
  2. + *
  3. Must be harvested by chopping and re-planting the plant of the tree.
  4. + *
  5. Every harvestable must be within {@link CitizenConstants#DEFAULT_RANGE_FOR_DELAY} blocks range of any available walking position, if not the entity will not be able path to the position.
  6. + *
+ */ +public abstract class TreeSidePlantModule extends AbstractPlantationModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected TreeSidePlantModule( + final IField field, + final String fieldTag, + final String workTag, + final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workingPosition) + { + ActionToPerform action = decideWorkAction(world, workingPosition); + return switch (action) + { + case HARVEST -> new PlantationModuleResult.Builder() + .harvest(workingPosition) + .pickNewPosition(); + case PLANT -> new PlantationModuleResult.Builder() + .plant(workingPosition) + .pickNewPosition(); + case CLEAR -> new PlantationModuleResult.Builder() + .clear(workingPosition) + .pickNewPosition(); + default -> PlantationModuleResult.NONE; + }; + } + + /** + * Responsible for deciding what action the AI is going to perform on a specific field position + * depending on the state of the working position. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @return the {@link PlantationModuleResult} that the AI is going to perform. + */ + private ActionToPerform decideWorkAction(final Level world, final BlockPos plantingPosition) + { + BlockState blockState = world.getBlockState(plantingPosition); + if (isValidPlantingBlock(blockState)) + { + return ActionToPerform.PLANT; + } + + if (isValidClearingBlock(blockState)) + { + return ActionToPerform.CLEAR; + } + + if (isValidHarvestBlock(blockState)) + { + return ActionToPerform.HARVEST; + } + + return ActionToPerform.NONE; + } + + /** + * Check if the block is a correct block for planting. + * Defaults to being any air block. + * + * @param blockState the block state. + * @return whether the block can be planted. + */ + protected boolean isValidPlantingBlock(BlockState blockState) + { + return blockState.isAir(); + } + + /** + * Check if the block is a correct block for clearing. + * + * @param blockState the block state. + * @return whether the block can be cleared. + */ + protected boolean isValidClearingBlock(BlockState blockState) + { + return !isValidHarvestBlock(blockState); + } + + /** + * Check if the block is a correct block for harvesting. + * + * @param blockState the block state. + * @return whether the block can be harvested. + */ + protected abstract boolean isValidHarvestBlock(BlockState blockState); + + @Override + public @Nullable BlockPos getNextWorkingPosition(final Level world) + { + for (BlockPos position : getWorkingPositions()) + { + if (decideWorkAction(world, position) != ActionToPerform.NONE) + { + return position; + } + } + + return null; + } + + @Override + public int getActionLimit() + { + return 5; + } + + @Override + public List getRequiredItemsForOperation() + { + return List.of(new ItemStack(getItem())); + } + + @Override + public List getValidWorkingPositions(final @NotNull Level world, final List workingPositions) + { + Set treePositions = new HashSet<>(); + for (BlockPos position : workingPositions) + { + for (BlockPos adjacentPosition : List.of(position.north(), position.south(), position.west(), position.east())) + { + if (world.getBlockState(adjacentPosition).isAir()) + { + treePositions.add(adjacentPosition); + } + } + } + return super.getValidWorkingPositions(world, treePositions.stream().collect(CollectorUtils.toShuffledList())); + } + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + return Stream.of(workingPosition.north(), workingPosition.south(), workingPosition.west(), workingPosition.east()) + .filter(pos -> world.getBlockState(pos).isAir()) + .findFirst() + .orElse(workingPosition); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/UpwardsGrowingPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/UpwardsGrowingPlantModule.java new file mode 100644 index 00000000000..c503fac3db5 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/generic/UpwardsGrowingPlantModule.java @@ -0,0 +1,230 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.AbstractPlantationModule; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + +/** + * Plantation module for plants that grow vertically upwards, similar to sugar cane. + *
+ * Requirements: + *
    + *
  1. Grow vertically upwards without any outcroppings.
  2. + *
  3. Grow uninterrupted (no gaps in between the plant).
  4. + *
  5. Must break all blocks above when a lower block is destroyed.
  6. + *
+ */ +public abstract class UpwardsGrowingPlantModule extends AbstractPlantationModule +{ + /** + * The default minimum plant length. + */ + protected static final int DEFAULT_MINIMUM_PLANT_LENGTH = 3; + + /** + * The internal random used to decide whether to work this field or not. + */ + private final Random random; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + protected UpwardsGrowingPlantModule( + final IField field, + final String fieldTag, + final String workTag, + final Item item) + { + super(field, fieldTag, workTag, item); + this.random = new Random(); + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workingPosition) + { + ActionToPerform action = decideWorkAction(world, workingPosition, false); + return switch (action) + { + case HARVEST -> new PlantationModuleResult.Builder() + .harvest(workingPosition.above(2)) + .pickNewPosition(); + case PLANT -> new PlantationModuleResult.Builder() + .plant(workingPosition.above()) + .pickNewPosition(); + case CLEAR -> new PlantationModuleResult.Builder() + .clear(workingPosition.above()) + .pickNewPosition(); + default -> PlantationModuleResult.NONE; + }; + } + + /** + * Responsible for deciding what action the AI is going to perform on a specific field position + * depending on the state of the working position. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @param enablePercentChance if the field has a maximum length, ensure a percentage roll is thrown to check if harvesting is allowed. + * @return the {@link PlantationModuleResult} that the AI is going to perform. + */ + private ActionToPerform decideWorkAction(final Level world, final BlockPos plantingPosition, final boolean enablePercentChance) + { + BlockState blockState = world.getBlockState(plantingPosition.above()); + if (isValidPlantingBlock(blockState)) + { + return ActionToPerform.PLANT; + } + + if (isValidClearingBlock(blockState)) + { + return ActionToPerform.CLEAR; + } + + if (canHarvest(world, plantingPosition, enablePercentChance)) + { + return ActionToPerform.HARVEST; + } + + return ActionToPerform.NONE; + } + + /** + * Check if the block is a correct block for planting. + * Defaults to being any air block. + * + * @param blockState the block state. + * @return whether the block can be planted. + */ + protected boolean isValidPlantingBlock(BlockState blockState) + { + return blockState.isAir(); + } + + /** + * Check if the block is a correct block for clearing. + * + * @param blockState the block state. + * @return whether the block can be cleared. + */ + protected boolean isValidClearingBlock(BlockState blockState) + { + return !isValidHarvestBlock(blockState); + } + + /** + * Checks if the provided block at the given location is harvestable. + * + * @param world the world reference that can be used for block state lookups. + * @param plantingPosition the specific position to check for. + * @param enablePercentChance if the field has a maximum length, ensure a percentage roll is thrown to check if harvesting is allowed. + * @return true if plant is harvestable. + */ + private boolean canHarvest(final Level world, final BlockPos plantingPosition, final boolean enablePercentChance) + { + int minimumPlantLength = getMinimumPlantLength(); + Integer maximumPlantLength = getMaximumPlantLength(); + + if (maximumPlantLength != null && enablePercentChance) + { + float currentHeight = 0; + for (int height = minimumPlantLength; height <= maximumPlantLength; height++) + { + BlockState blockState = world.getBlockState(plantingPosition.above(height)); + if (!isValidHarvestBlock(blockState)) + { + break; + } + currentHeight = height; + } + + float chance = currentHeight / (float) maximumPlantLength; + return random.nextFloat() < chance; + } + else + { + BlockState blockAtMinHeight = world.getBlockState(plantingPosition.above(minimumPlantLength)); + return isValidHarvestBlock(blockAtMinHeight); + } + } + + /** + * Check if the block is a correct block for harvesting. + * + * @param blockState the block state. + * @return whether the block can be harvested. + */ + protected abstract boolean isValidHarvestBlock(BlockState blockState); + + /** + * Get the minimum length this plant should grow to before considered harvestable. + * Defaults to {@link UpwardsGrowingPlantModule#DEFAULT_MINIMUM_PLANT_LENGTH}. + * + * @return the minimum plant length + */ + protected int getMinimumPlantLength() + { + return DEFAULT_MINIMUM_PLANT_LENGTH; + } + + /** + * Get the maximum length this plant can grow. + * Defaults to null. + * + * @return the maximum plant length + */ + @Nullable + protected Integer getMaximumPlantLength() + { + return null; + } + + @Override + public BlockPos getNextWorkingPosition(final Level world) + { + for (BlockPos position : getWorkingPositions()) + { + if (decideWorkAction(world, position, true) != ActionToPerform.NONE) + { + return position; + } + } + + return null; + } + + @Override + public int getActionLimit() + { + return 10; + } + + @Override + public List getRequiredItemsForOperation() + { + return List.of(new ItemStack(getItem())); + } + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + return Stream.of(workingPosition.north(), workingPosition.south(), workingPosition.west(), workingPosition.east()) + .filter(pos -> world.getBlockState(pos).isAir()) + .findFirst() + .orElse(workingPosition); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/BambooPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/BambooPlantModule.java new file mode 100644 index 00000000000..f0a318152d2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/BambooPlantModule.java @@ -0,0 +1,78 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.UpwardsGrowingPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.BambooBlock; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_JUNGLE; + +/** + * Planter module for growing {@link Items#BAMBOO}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link UpwardsGrowingPlantModule}
  2. + *
+ */ +public class BambooPlantModule extends UpwardsGrowingPlantModule +{ + /** + * The minimum height bamboo can grow to. + */ + private static final int MIN_HEIGHT = 6; + + /** + * The maximum height twisting vines can grow to. + */ + private static final int MAX_HEIGHT = BambooBlock.MAX_HEIGHT; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public BambooPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.BAMBOO || blockState.getBlock() == Blocks.BAMBOO_SAPLING; + } + + @Override + protected int getMinimumPlantLength() + { + return MIN_HEIGHT; + } + + @Override + protected @Nullable Integer getMaximumPlantLength() + { + return MAX_HEIGHT; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_JUNGLE; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.AXE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CactusPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CactusPlantModule.java new file mode 100644 index 00000000000..0dfc68a268e --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CactusPlantModule.java @@ -0,0 +1,45 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.UpwardsGrowingPlantModule; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Planter module for growing {@link Items#CACTUS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link UpwardsGrowingPlantModule}
  2. + *
+ */ +public class CactusPlantModule extends UpwardsGrowingPlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public CactusPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.CACTUS; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CocoaPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CocoaPlantModule.java new file mode 100644 index 00000000000..26e1545bf47 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CocoaPlantModule.java @@ -0,0 +1,85 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.TreeSidePlantModule; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CocoaBlock; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.Optional; +import java.util.stream.Stream; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_JUNGLE; + +/** + * Planter module for growing {@link Items#COCOA_BEANS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link TreeSidePlantModule}
  2. + *
+ */ +public class CocoaPlantModule extends TreeSidePlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public CocoaPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_JUNGLE; + } + + @Override + public BlockState getPlantingBlockState(final Level world, final BlockPos workPosition, final BlockState blockState) + { + return Stream.of(workPosition.north(), workPosition.south(), workPosition.west(), workPosition.east()) + .filter(position -> world.getBlockState(position).getBlock() == Blocks.JUNGLE_LOG) + .map(position -> Optional.ofNullable(Direction.fromNormal(position.subtract(workPosition))).orElse(Direction.NORTH)) + .findFirst() + .map(direction -> blockState.setValue(HorizontalDirectionalBlock.FACING, direction)) + .orElse(blockState); + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.AXE; + } + + @Override + protected boolean isValidClearingBlock(final BlockState blockState) + { + return blockState.getBlock() != Blocks.COCOA; + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + Block block = blockState.getBlock(); + if (block instanceof CocoaBlock cocoa) + { + return !cocoa.isRandomlyTicking(blockState); + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CrimsonPlantsPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CrimsonPlantsPlantModule.java new file mode 100644 index 00000000000..155588fa511 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/CrimsonPlantsPlantModule.java @@ -0,0 +1,57 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.BoneMealedPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_NETHER; + +/** + * Planter module for growing {@link Items#CRIMSON_FUNGUS} and {@link Items#CRIMSON_ROOTS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link BoneMealedPlantModule}
  2. + *
+ */ +public class CrimsonPlantsPlantModule extends BoneMealedPlantModule +{ + /** + * The chance a worker has to work on this field. + */ + private static final int CHANCE = 35; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public CrimsonPlantsPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected int getPercentageChance() + { + return CHANCE; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_NETHER; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/GlowBerriesPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/GlowBerriesPlantModule.java new file mode 100644 index 00000000000..dbbf7e16aa2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/GlowBerriesPlantModule.java @@ -0,0 +1,54 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.DownwardsGrowingPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_EXOTIC; + +/** + * Planter module for growing {@link Items#GLOW_BERRIES}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link DownwardsGrowingPlantModule}
  2. + *
+ */ +public class GlowBerriesPlantModule extends DownwardsGrowingPlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public GlowBerriesPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.CAVE_VINES || blockState.getBlock() == Blocks.CAVE_VINES_PLANT; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_EXOTIC; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/KelpPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/KelpPlantModule.java new file mode 100644 index 00000000000..be054e37624 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/KelpPlantModule.java @@ -0,0 +1,106 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.UpwardsGrowingPlantModule; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.GrowingPlantHeadBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_SEA; + +/** + * Planter module for growing {@link Items#KELP}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link UpwardsGrowingPlantModule}
  2. + *
  3. + * There must be an air block directly above the water at least {@link KelpPlantModule#MAX_HEIGHT} + 1 from the working position block. + * This is where the AI will attempt to walk to. + *
  4. + *
+ */ +public class KelpPlantModule extends UpwardsGrowingPlantModule +{ + /** + * The minimum height kelp can grow to. + */ + private static final int MIN_HEIGHT = 2; + + /** + * The maximum height kelp can grow to. + */ + private static final int MAX_HEIGHT = GrowingPlantHeadBlock.MAX_AGE; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public KelpPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidPlantingBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.WATER; + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.KELP || blockState.getBlock() == Blocks.KELP_PLANT; + } + + @Override + protected int getMinimumPlantLength() + { + return MIN_HEIGHT; + } + + @Override + protected @NotNull Integer getMaximumPlantLength() + { + return MAX_HEIGHT; + } + + @Override + public BlockPos getPositionToWalkTo(final Level world, final BlockPos workingPosition) + { + // Attempt to initially find an air block somewhere above the kelp planting position, so that we have a valid position + // that the AI can actually walk to. + for (int i = 0; i < getMaximumPlantLength() + 1; i++) + { + if (world.getBlockState(workingPosition.above(i)).isAir()) + { + return workingPosition.above(i); + } + } + + return workingPosition; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_SEA; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeagrassPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeagrassPlantModule.java new file mode 100644 index 00000000000..351e4b1767b --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeagrassPlantModule.java @@ -0,0 +1,86 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.BoneMealedPlantModule; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; +import org.checkerframework.checker.nullness.qual.NonNull; + +import java.util.List; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_SEA; + +/** + * Planter module for growing {@link Items#SEAGRASS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link BoneMealedPlantModule}
  2. + *
  3. All working positions must have water directly overhead of them, else the seagrass won't be able to grow.
  4. + *
+ */ +public class SeagrassPlantModule extends BoneMealedPlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public SeagrassPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_SEA; + } + + @Override + public void applyBonemeal(final AbstractEntityCitizen worker, final BlockPos workPosition, final ItemStack stackInSlot, final Player fakePlayer) + { + BoneMealItem.growWaterPlant(stackInSlot, worker.getLevel(), workPosition.above(), Direction.UP); + BoneMealItem.addGrowthParticles(worker.getLevel(), workPosition.above(), 1); + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getFluidState().is(Fluids.WATER) && (blockState.getBlock() == Blocks.SEAGRASS || blockState.getBlock() == Blocks.TALL_SEAGRASS); + } + + @Override + protected boolean isValidBonemealLocation(final BlockState blockState) + { + return blockState.is(Blocks.WATER); + } + + @Override + public @NonNull List getValidBonemeal() + { + // Only base minecraft bonemeal has water growing capabilities. + // Compost (by design) should not inherit this functionality. + return List.of(Items.BONE_MEAL); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeapicklePlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeapicklePlantModule.java new file mode 100644 index 00000000000..f80982b3ce1 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SeapicklePlantModule.java @@ -0,0 +1,116 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.BoneMealedPlantModule; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SeaPickleBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Planter module for growing {@link Items#SEAGRASS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link BoneMealedPlantModule}
  2. + *
  3. All working positions must have water directly overhead of them, else the seagrass won't be able to grow.
  4. + *
+ */ +public class SeapicklePlantModule extends BoneMealedPlantModule +{ + /** + * The maximum amount of sea pickles that can be planted. + */ + private static final int MAX_PLANTS = 10; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public SeapicklePlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } + + @Override + public PlantationModuleResult.Builder decideFieldWork(final Level world, final @NotNull BlockPos workPosition) + { + // Sea pickles do not work entirely the same as regular bonemeal fields, + // because they actually require having manually planted the pickles and then continue to grow them + // by applying additional bonemeal. + BlockState state = world.getBlockState(workPosition.above()); + if (state.getBlock().equals(Blocks.WATER)) + { + return new PlantationModuleResult.Builder().plant(workPosition.above()).pickNewPosition(); + } + else + { + return super.decideFieldWork(world, workPosition); + } + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + if (blockState.getBlock() instanceof SeaPickleBlock) + { + final Integer value = blockState.getValue(SeaPickleBlock.PICKLES); + return value >= SeaPickleBlock.MAX_PICKLES; + } + return super.isValidHarvestBlock(blockState); + } + + @Override + protected boolean isValidBonemealLocation(final BlockState blockState) + { + if (blockState.getBlock() instanceof SeaPickleBlock) + { + final Integer value = blockState.getValue(SeaPickleBlock.PICKLES); + return value < SeaPickleBlock.MAX_PICKLES; + } + return super.isValidBonemealLocation(blockState); + } + + @Override + protected int getMaxWorkingPositions() + { + return MAX_PLANTS; + } + + @Override + public @NonNull List getValidBonemeal() + { + // Only base minecraft bonemeal has water growing capabilities. + // Compost (by design) should not inherit this functionality. + return List.of(Items.BONE_MEAL); + } + + @Override + public void applyBonemeal(final AbstractEntityCitizen worker, final BlockPos workPosition, final ItemStack stackInSlot, final Player fakePlayer) + { + BoneMealItem.applyBonemeal(stackInSlot, worker.getLevel(), workPosition.above(), fakePlayer); + BoneMealItem.addGrowthParticles(worker.getLevel(), workPosition.above(), 1); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SugarCanePlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SugarCanePlantModule.java new file mode 100644 index 00000000000..52483365681 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/SugarCanePlantModule.java @@ -0,0 +1,45 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.UpwardsGrowingPlantModule; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Planter module for growing {@link Items#SUGAR_CANE}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link UpwardsGrowingPlantModule}
  2. + *
+ */ +public class SugarCanePlantModule extends UpwardsGrowingPlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public SugarCanePlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.SUGAR_CANE; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/TwistingVinesPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/TwistingVinesPlantModule.java new file mode 100644 index 00000000000..2bfd35fc6f5 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/TwistingVinesPlantModule.java @@ -0,0 +1,78 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.UpwardsGrowingPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.GrowingPlantHeadBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_NETHER; + +/** + * Planter module for growing {@link Items#TWISTING_VINES}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link UpwardsGrowingPlantModule}
  2. + *
+ */ +public class TwistingVinesPlantModule extends UpwardsGrowingPlantModule +{ + /** + * The minimum height twisting vines can grow to. + */ + private static final int MIN_HEIGHT = 2; + + /** + * The maximum height twisting vines can grow to. + */ + private static final int MAX_HEIGHT = GrowingPlantHeadBlock.MAX_AGE; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public TwistingVinesPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.TWISTING_VINES || blockState.getBlock() == Blocks.TWISTING_VINES_PLANT; + } + + @Override + protected int getMinimumPlantLength() + { + return MIN_HEIGHT; + } + + @Override + protected @Nullable Integer getMaximumPlantLength() + { + return MAX_HEIGHT; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_NETHER; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/VinePlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/VinePlantModule.java new file mode 100644 index 00000000000..546cf2292e9 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/VinePlantModule.java @@ -0,0 +1,78 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.PercentageHarvestPlantModule; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.VineBlock; +import net.minecraft.world.level.block.state.BlockState; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_JUNGLE; + +/** + * Planter module for growing {@link Items#VINE}. + * All possible positions of the vines should be tagged with the vine tag. + * The planter will automatically plant an X amount of vines down, depending on the amount of tagged positions. + * After that any excess that will grow will be harvested. + * The planter will make an attempt to not plant the vines next to one another as much as possible. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link PercentageHarvestPlantModule}
  2. + *
+ */ +public class VinePlantModule extends PercentageHarvestPlantModule +{ + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public VinePlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_JUNGLE; + } + + @Override + public BlockState getPlantingBlockState(final Level world, final BlockPos workPosition, final BlockState blockState) + { + return blockState.setValue(VineBlock.UP, Boolean.valueOf(VineBlock.isAcceptableNeighbour(world, workPosition.above(), Direction.DOWN))) + .setValue(VineBlock.NORTH, Boolean.valueOf(VineBlock.isAcceptableNeighbour(world, workPosition.north(), Direction.SOUTH))) + .setValue(VineBlock.SOUTH, Boolean.valueOf(VineBlock.isAcceptableNeighbour(world, workPosition.south(), Direction.NORTH))) + .setValue(VineBlock.WEST, Boolean.valueOf(VineBlock.isAcceptableNeighbour(world, workPosition.west(), Direction.EAST))) + .setValue(VineBlock.EAST, Boolean.valueOf(VineBlock.isAcceptableNeighbour(world, workPosition.east(), Direction.WEST))); + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.SHEARS; + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.is(Blocks.VINE); + } + + @Override + protected int getMinimumPlantPercentage() + { + return 20; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WarpedPlantsPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WarpedPlantsPlantModule.java new file mode 100644 index 00000000000..de1fc4a12e5 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WarpedPlantsPlantModule.java @@ -0,0 +1,57 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.BoneMealedPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_NETHER; + +/** + * Planter module for growing {@link Items#WARPED_FUNGUS} and {@link Items#WARPED_ROOTS}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link BoneMealedPlantModule}
  2. + *
+ */ +public class WarpedPlantsPlantModule extends BoneMealedPlantModule +{ + /** + * The chance a worker has to work on this field. + */ + private static final int CHANCE = 35; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public WarpedPlantsPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected int getPercentageChance() + { + return CHANCE; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_NETHER; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WeepingVinesPlantModule.java b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WeepingVinesPlantModule.java new file mode 100644 index 00000000000..74e62b2b4e9 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/buildings/workerbuildings/plantation/modules/specific/WeepingVinesPlantModule.java @@ -0,0 +1,78 @@ +package com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.specific; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.colony.buildings.workerbuildings.plantation.modules.generic.DownwardsGrowingPlantModule; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.GrowingPlantHeadBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import static com.minecolonies.api.research.util.ResearchConstants.PLANTATION_NETHER; + +/** + * Planter module for growing {@link Items#WEEPING_VINES}. + *
+ * Requirements: + *
    + *
  1. All requirements from {@link DownwardsGrowingPlantModule}
  2. + *
+ */ +public class WeepingVinesPlantModule extends DownwardsGrowingPlantModule +{ + /** + * The minimum height twisting vines can grow to. + */ + private static final int MIN_HEIGHT = 2; + + /** + * The maximum height twisting vines can grow to. + */ + private static final int MAX_HEIGHT = GrowingPlantHeadBlock.MAX_AGE; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + * @param fieldTag the tag of the field anchor block. + * @param workTag the tag of the working positions. + * @param item the item which is harvested. + */ + public WeepingVinesPlantModule(final IField field, final String fieldTag, final String workTag, final Item item) + { + super(field, fieldTag, workTag, item); + } + + @Override + protected boolean isValidHarvestBlock(final BlockState blockState) + { + return blockState.getBlock() == Blocks.WEEPING_VINES || blockState.getBlock() == Blocks.WEEPING_VINES_PLANT; + } + + @Override + protected int getMinimumPlantLength() + { + return MIN_HEIGHT; + } + + @Override + protected @Nullable Integer getMaximumPlantLength() + { + return MAX_HEIGHT; + } + + @Override + public ResourceLocation getRequiredResearchEffect() + { + return PLANTATION_NETHER; + } + + @Override + public ToolType getRequiredTool() + { + return ToolType.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/AbstractShipRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/AbstractShipRaidEvent.java index 3da6a6e4592..9606ea133e5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/AbstractShipRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/AbstractShipRaidEvent.java @@ -2,13 +2,12 @@ import com.ldtteam.structurize.storage.ServerFutureProcessor; import com.ldtteam.structurize.storage.StructurePacks; -import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.colony.ColonyState; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; import com.minecolonies.api.colony.colonyEvents.IColonyRaidEvent; import com.minecolonies.api.colony.colonyEvents.IColonyStructureSpawnEvent; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderMobUtils; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.BlockPosUtil; @@ -18,7 +17,6 @@ import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipBasedRaiderUtils; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipSize; -import com.minecolonies.coremod.util.CreativeRaiderStructureHandler; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -45,7 +43,7 @@ import java.util.*; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; +import static com.minecolonies.api.util.constant.Constants.STORAGE_STYLE; import static com.minecolonies.api.util.constant.NbtTagConstants.*; import static com.minecolonies.api.util.constant.TranslationConstants.*; @@ -172,15 +170,9 @@ public void onStart() status = EventStatus.PREPARING; daysToGo = MineColonies.getConfig().getServer().daysUntilPirateshipsDespawn.get(); - ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(DEFAULT_STYLE, "decorations" + ShipBasedRaiderUtils.SHIP_FOLDER + shipSize.schematicPrefix + this.getShipDesc() + ".blueprint"), colony.getWorld(), (blueprint -> { - CreativeRaiderStructureHandler structure = - new CreativeRaiderStructureHandler(colony.getWorld(), - spawnPoint, - blueprint, - new PlacementSettings(), - true, - this, colony.getID()); - structure.getBluePrint().rotateWithMirror(BlockPosUtil.getRotationFromRotations(shipRotation), Mirror.NONE, colony.getWorld()); + ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(STORAGE_STYLE, + "decorations" + ShipBasedRaiderUtils.SHIP_FOLDER + shipSize.schematicPrefix + this.getShipDesc() + ".blueprint"), colony.getWorld(), (blueprint -> { + blueprint.rotateWithMirror(BlockPosUtil.getRotationFromRotations(shipRotation), Mirror.NONE, colony.getWorld()); if (spawnPathResult != null && spawnPathResult.isDone()) { @@ -188,27 +180,20 @@ public void onStart() if (path != null && path.canReach()) { final BlockPos endpoint = path.getEndNode().asBlockPos().below(); - if (ShipBasedRaiderUtils.canPlaceShipAt(endpoint, structure.getBluePrint(), colony.getWorld())) + if (ShipBasedRaiderUtils.canPlaceShipAt(endpoint, blueprint, colony.getWorld())) { spawnPoint = endpoint; - structure = - new CreativeRaiderStructureHandler(colony.getWorld(), - spawnPoint, - blueprint, - new PlacementSettings(), - true, this, colony.getID()); - structure.getBluePrint().rotateWithMirror(BlockPosUtil.getRotationFromRotations(shipRotation), Mirror.NONE, colony.getWorld()); } } this.wayPoints = ShipBasedRaiderUtils.createWaypoints(colony.getWorld(), path, WAYPOINT_SPACING); } - if (!ShipBasedRaiderUtils.canPlaceShipAt(spawnPoint, structure.getBluePrint(), colony.getWorld())) + if (!ShipBasedRaiderUtils.canPlaceShipAt(spawnPoint, blueprint, colony.getWorld())) { spawnPoint = spawnPoint.below(); } - if (!ShipBasedRaiderUtils.spawnPirateShip(spawnPoint, colony, structure.getBluePrint(), this)) + if (!ShipBasedRaiderUtils.spawnPirateShip(spawnPoint, colony, blueprint, this)) { // Ship event not successfully started. status = EventStatus.CANCELED; @@ -218,9 +203,9 @@ public void onStart() updateRaidBar(); MessageUtils.format(RAID_EVENT_MESSAGE_PIRATE + shipSize.messageID, - BlockPosUtil.calcDirection(colony.getCenter(), spawnPoint), colony.getName()) - .with(ChatFormatting.DARK_RED) - .sendTo(colony).forManagers(); + BlockPosUtil.calcDirection(colony.getCenter(), spawnPoint), colony.getName()) + .with(ChatFormatting.DARK_RED) + .sendTo(colony).forManagers(); colony.markDirty(); }))); } @@ -309,6 +294,12 @@ public void onUpdate() } } + @Override + public void setMercyEnd() + { + // Noop, the sailing away message is fine. + } + @Override public void onFinish() { @@ -364,7 +355,7 @@ public void onEntityDeath(final LivingEntity entity) @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive() || status != EventStatus.PROGRESSING) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive() || status != EventStatus.PROGRESSING) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -474,7 +465,7 @@ public int getID() public List> getSchematicSpawns() { final List> paths = new ArrayList<>(); - paths.add(new Tuple<>("decorations" + ShipBasedRaiderUtils.SHIP_FOLDER + shipSize.schematicPrefix + this.getShipDesc() + ".blueprint", spawnPoint)); + paths.add(new Tuple<>("decorations" + ShipBasedRaiderUtils.SHIP_FOLDER + shipSize.schematicPrefix + this.getShipDesc() + ".blueprint", spawnPoint)); return paths; } @@ -545,4 +536,14 @@ public void setSpawnPath(final PathResult result) { this.spawnPathResult = result; } + + @Override + public boolean isRaidActive() + { + if (getStatus() == EventStatus.PROGRESSING) + { + return !spawners.isEmpty() || !raiders.isEmpty() || !respawns.isEmpty(); + } + return getStatus() == EventStatus.PROGRESSING ||getStatus() == EventStatus.PREPARING; + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/HordeRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/HordeRaidEvent.java index 8ce1e741cf6..67dfaecca5d 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/HordeRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/HordeRaidEvent.java @@ -6,13 +6,13 @@ import com.minecolonies.api.colony.colonyEvents.IColonyCampFireRaidEvent; import com.minecolonies.api.colony.colonyEvents.IColonyEvent; import com.minecolonies.api.colony.colonyEvents.IColonyRaidEvent; +import com.minecolonies.api.entity.citizen.happiness.ExpirationBasedHappinessModifier; +import com.minecolonies.api.entity.citizen.happiness.StaticHappinessSupplier; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.RaiderMobUtils; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.sounds.RaidSounds; -import com.minecolonies.api.util.BlockPosUtil; -import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.api.util.Tuple; -import com.minecolonies.api.util.WorldUtil; +import com.minecolonies.api.util.*; import com.minecolonies.api.util.constant.NbtTagConstants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.barbarianEvent.Horde; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipBasedRaiderUtils; @@ -24,7 +24,6 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; - import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; @@ -43,6 +42,7 @@ import static com.minecolonies.api.util.constant.ColonyConstants.SMALL_HORDE_SIZE; import static com.minecolonies.api.util.constant.Constants.TAG_COMPOUND; +import static com.minecolonies.api.util.constant.HappinessConstants.RAIDWITHOUTDEATH; import static com.minecolonies.api.util.constant.NbtTagConstants.*; import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.PirateRaidEvent.TAG_DAYS_LEFT; @@ -134,6 +134,11 @@ public abstract class HordeRaidEvent implements IColonyRaidEvent, IColonyCampFir */ private PathResult spawnPathResult; + /** + * If this was a mercy end. + */ + private boolean mercyEnd = false; + /** * Waypoints helping raiders travel */ @@ -213,6 +218,15 @@ public void unregisterEntity(final Entity entity) respawns.add(new Tuple<>(entity.getType(), new BlockPos(entity.position()))); } + @Override + public void onEntityDeath(final LivingEntity entity) + { + if (entity instanceof AbstractEntityRaiderMob) + { + colony.getRaiderManager().onRaiderDeath((AbstractEntityRaiderMob) entity); + } + } + /** * Spawn a specific horde. * @@ -230,6 +244,12 @@ protected void spawnHorde(final BlockPos spawnPos, final IColony colony, final i RaiderMobUtils.spawn(getArcherRaiderType(), numberOfArchers, spawnPos, colony.getWorld(), colony, id); } + @Override + public void setMercyEnd() + { + this.mercyEnd = true; + } + /** * Prepares the horde event, makes them wait at campfires for a while,deciding on their plans. */ @@ -283,7 +303,14 @@ public void onFinish() if (horde.hordeSize > 0) { - MessageUtils.format(ALL_BARBARIANS_KILLED_MESSAGE, colony.getName()).sendTo(colony).forManagers(); + if (mercyEnd) + { + MessageUtils.format(ALL_BARBARIANS_MERCY_MESSAGE, colony.getName()).sendTo(colony).forManagers(); + } + else + { + MessageUtils.format(ALL_BARBARIANS_KILLED_MESSAGE, colony.getName()).sendTo(colony).forManagers(); + } } } @@ -355,6 +382,7 @@ public void onStart() MessageUtils.format(RAID_EVENT_MESSAGE + horde.getMessageID(), BlockPosUtil.calcDirection(colony.getCenter(), spawnPoint), colony.getName()) .with(ChatFormatting.DARK_RED).sendTo(colony).forManagers(); + Log.getLogger().debug("Raiders coming from: " + spawnPoint.toShortString() + " towards colony: " + colony.getName()); PlayAudioMessage audio = new PlayAudioMessage(horde.initialSize <= SMALL_HORDE_SIZE ? RaidSounds.WARNING_EARLY : RaidSounds.WARNING, SoundSource.RECORDS); PlayAudioMessage.sendToAll(getColony(), false, false, audio); @@ -477,7 +505,7 @@ protected void sendHordeMessage() if (colony.getRaiderManager().getLostCitizen() == 0) { - colony.getCitizenManager().updateModifier("raidwithoutdeath"); + colony.getCitizenManager().injectModifier(new ExpirationBasedHappinessModifier(RAIDWITHOUTDEATH, 1.0, new StaticHappinessSupplier(2.0), 3)); } } else if (total > 0 && total <= SMALL_HORDE_SIZE) diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/amazonevent/AmazonRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/amazonevent/AmazonRaidEvent.java index 293ce089cb1..3480667a422 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/amazonevent/AmazonRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/amazonevent/AmazonRaidEvent.java @@ -2,7 +2,7 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.sounds.RaidSounds; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; @@ -10,13 +10,13 @@ import com.minecolonies.coremod.entity.mobs.amazons.EntityAmazonSpearman; import com.minecolonies.coremod.entity.mobs.amazons.EntityArcherAmazon; import com.minecolonies.coremod.network.messages.client.PlayAudioMessage; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.MutableComponent; import static com.minecolonies.api.entity.ModEntities.*; import static com.minecolonies.api.util.constant.TranslationConstants.RAID_AMAZON; @@ -50,7 +50,7 @@ public ResourceLocation getEventTypeID() @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive()) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive()) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -104,7 +104,8 @@ public void onUpdate() @Override public void onEntityDeath(final LivingEntity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob)) + super.onEntityDeath(entity); + if (!(entity instanceof AbstractEntityRaiderMob)) { return; } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/barbarianEvent/BarbarianRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/barbarianEvent/BarbarianRaidEvent.java index 06be033fe87..d976a2d2599 100644 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/barbarianEvent/BarbarianRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/barbarianEvent/BarbarianRaidEvent.java @@ -2,19 +2,19 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; import com.minecolonies.coremod.entity.mobs.barbarians.EntityArcherBarbarian; import com.minecolonies.coremod.entity.mobs.barbarians.EntityBarbarian; import com.minecolonies.coremod.entity.mobs.barbarians.EntityChiefBarbarian; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.MutableComponent; import static com.minecolonies.api.entity.ModEntities.*; import static com.minecolonies.api.util.constant.TranslationConstants.RAID_BARBARIAN; @@ -43,7 +43,7 @@ public ResourceLocation getEventTypeID() @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive()) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive()) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -73,7 +73,8 @@ public void registerEntity(final Entity entity) @Override public void onEntityDeath(final LivingEntity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob)) + super.onEntityDeath(entity); + if (!(entity instanceof AbstractEntityRaiderMob)) { return; } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/egyptianevent/EgyptianRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/egyptianevent/EgyptianRaidEvent.java index be54973fe3b..e0acba2431f 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/egyptianevent/EgyptianRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/egyptianevent/EgyptianRaidEvent.java @@ -2,7 +2,7 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.sounds.RaidSounds; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; @@ -10,14 +10,13 @@ import com.minecolonies.coremod.entity.mobs.egyptians.EntityMummy; import com.minecolonies.coremod.entity.mobs.egyptians.EntityPharao; import com.minecolonies.coremod.network.messages.client.PlayAudioMessage; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.MutableComponent; - import static com.minecolonies.api.entity.ModEntities.*; import static com.minecolonies.api.util.constant.TranslationConstants.RAID_EGYPTIAN; @@ -77,7 +76,7 @@ public void onUpdate() @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive()) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive()) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -107,7 +106,8 @@ public void registerEntity(final Entity entity) @Override public void onEntityDeath(final LivingEntity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob)) + super.onEntityDeath(entity); + if (!(entity instanceof AbstractEntityRaiderMob)) { return; } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/norsemenevent/NorsemenRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/norsemenevent/NorsemenRaidEvent.java index e217c798880..4efde973dc0 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/norsemenevent/NorsemenRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/norsemenevent/NorsemenRaidEvent.java @@ -2,20 +2,19 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; import com.minecolonies.coremod.entity.mobs.norsemen.EntityNorsemenArcher; import com.minecolonies.coremod.entity.mobs.norsemen.EntityNorsemenChief; import com.minecolonies.coremod.entity.mobs.norsemen.EntityShieldmaiden; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.MutableComponent; - import static com.minecolonies.api.entity.ModEntities.*; import static com.minecolonies.api.util.constant.TranslationConstants.RAID_NORSEMEN; @@ -51,7 +50,7 @@ protected void updateRaidBar() @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive()) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive()) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -81,7 +80,8 @@ public void registerEntity(final Entity entity) @Override public void onEntityDeath(final LivingEntity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob)) + super.onEntityDeath(entity); + if (!(entity instanceof AbstractEntityRaiderMob)) { return; } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/PirateGroundRaidEvent.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/PirateGroundRaidEvent.java index d7e2db76447..9cd43a21178 100644 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/PirateGroundRaidEvent.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/PirateGroundRaidEvent.java @@ -2,20 +2,19 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.colonyEvents.EventStatus; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; import com.minecolonies.coremod.entity.mobs.pirates.EntityArcherPirate; import com.minecolonies.coremod.entity.mobs.pirates.EntityCaptainPirate; import com.minecolonies.coremod.entity.mobs.pirates.EntityPirate; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.MutableComponent; - import static com.minecolonies.api.entity.ModEntities.*; import static com.minecolonies.api.util.constant.TranslationConstants.RAID_PIRATE; @@ -69,7 +68,7 @@ public void onFinish() @Override public void registerEntity(final Entity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob) || !entity.isAlive()) + if (!(entity instanceof AbstractEntityRaiderMob) || !entity.isAlive()) { entity.remove(Entity.RemovalReason.DISCARDED); return; @@ -99,7 +98,8 @@ public void registerEntity(final Entity entity) @Override public void onEntityDeath(final LivingEntity entity) { - if (!(entity instanceof AbstractEntityMinecoloniesMob)) + super.onEntityDeath(entity); + if (!(entity instanceof AbstractEntityRaiderMob)) { return; } diff --git a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/ShipBasedRaiderUtils.java b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/ShipBasedRaiderUtils.java index 15a152326a0..e9ab8ab1d6e 100755 --- a/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/ShipBasedRaiderUtils.java +++ b/src/main/java/com/minecolonies/coremod/colony/colonyEvents/raidEvents/pirateEvent/ShipBasedRaiderUtils.java @@ -9,20 +9,25 @@ import com.minecolonies.api.util.WorldUtil; import com.minecolonies.coremod.MineColonies; import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.AirBlock; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.entity.SpawnerBlockEntity; -import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.Path; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; +import static com.minecolonies.api.util.constant.Constants.STORAGE_STYLE; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_COLONY_ID; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_EVENT_ID; @@ -67,8 +72,8 @@ public static boolean spawnPirateShip( final IColonyRaidEvent event) { return colony.getEventManager() - .getStructureManager() - .spawnTemporaryStructure(blueprint, targetSpawnPoint, event.getID()); + .getStructureManager() + .spawnTemporaryStructure(blueprint, targetSpawnPoint, event.getID()); } /** @@ -115,7 +120,7 @@ public static boolean canSpawnShipAt(final IColony colony, final BlockPos spawnP final Level world = colony.getWorld(); final String shipSize = ShipSize.getShipForRaiderAmount(raidLevel).schematicPrefix + shipName; - final Blueprint blueprint = StructurePacks.getBlueprint(DEFAULT_STYLE, "decorations" + SHIP_FOLDER + shipSize + ".blueprint"); + final Blueprint blueprint = StructurePacks.getBlueprint(STORAGE_STYLE, "decorations" + SHIP_FOLDER + shipSize + ".blueprint"); blueprint.rotateWithMirror(BlockPosUtil.getRotationFromRotations(rotation), Mirror.NONE, colony.getWorld()); return canPlaceShipAt(spawnPoint, blueprint, world) || canPlaceShipAt(spawnPoint.below(), blueprint, world); @@ -132,17 +137,21 @@ public static boolean canSpawnShipAt(final IColony colony, final BlockPos spawnP public static boolean canPlaceShipAt(final BlockPos pos, final Blueprint ship, final Level world) { final BlockPos zeroPos = pos.subtract(ship.getPrimaryBlockOffset()); - final List allowedShipMaterials = Lists.newArrayList(Material.WATER, Material.ICE, Material.WATER_PLANT); + final List> allowedShipMaterials = Lists.newArrayList(); + + allowedShipMaterials.add(state -> state.getMaterial().isLiquid()); + allowedShipMaterials.add(state -> state.is(BlockTags.ICE)); + allowedShipMaterials.add(state -> !state.getMaterial().isSolid() && state.getFluidState().is(FluidTags.WATER)); if (MineColonies.getConfig().getServer().skyRaiders.get()) { - allowedShipMaterials.add(Material.AIR); + allowedShipMaterials.add(BlockBehaviour.BlockStateBase::isAir); } return isSurfaceAreaMostlyMaterial(allowedShipMaterials, world, pos.getY(), zeroPos, new BlockPos(zeroPos.getX() + ship.getSizeX() - 1, zeroPos.getY(), zeroPos.getZ() + ship.getSizeZ() - 1), - 0.99); + 0.85); } /** @@ -157,7 +166,7 @@ public static boolean canPlaceShipAt(final BlockPos pos, final Blueprint ship, f * @return true if enough water surface blocks are found */ public static boolean isSurfaceAreaMostlyMaterial( - @NotNull final List materials, + @NotNull final List> materials, @NotNull final Level world, final int baseY, @NotNull final BlockPos from, @NotNull final BlockPos to, @@ -187,9 +196,32 @@ public static boolean isSurfaceAreaMostlyMaterial( { for (int z = 0; z < zDist; z++) { + final BlockState state = world.getBlockState(new BlockPos(from.getX() + (x * xDir), baseY, from.getZ() + (z * zDir))); + boolean suitableBlock = false; + for (final Predicate pred : materials) + { + if (pred.test(state)) + { + suitableBlock = true; + break; + } + } + + // Checks up to 5 blocks above for air/nonblocking + if (suitableBlock) + { + for (int i = 1; i <= 5; i++) + { + if (world.getBlockState(new BlockPos(from.getX() + (x * xDir), baseY + i, from.getZ() + (z * zDir))).getMaterial().isSolid()) + { + suitableBlock = false; + break; + } + } + } + // Count surface waterblocks - if (!materials.contains(world.getBlockState(new BlockPos(from.getX() + (x * xDir), baseY, from.getZ() + (z * zDir))).getMaterial()) - || !world.isEmptyBlock(new BlockPos(from.getX() + (x * xDir), baseY + 1, from.getZ() + (z * zDir)))) + if (!suitableBlock) { wrongMaterialBlocks++; // Skip when we already found too many non water blocks @@ -231,10 +263,10 @@ public static BlockPos getLoadedPositionTowardsCenter( { return BlockPosUtil.findAround(colony.getWorld(), startPos, - 3, 30, + 3, (world, pos) -> (world.getBlockState(pos).canOcclude() || world.getBlockState(pos).getMaterial().isLiquid()) && world.getBlockState( - pos.above()).getMaterial() == Material.AIR && world.getBlockState(pos.above(2)).getMaterial() == Material.AIR); + pos.above()).isAir() && world.getBlockState(pos.above(2)).isAir()); } BlockPos diff = colony.getCenter().subtract(startPos); @@ -279,7 +311,7 @@ public static BlockPos findSpawnPosOnShip(final BlockPos spawnPos, final Level w for (int z = -radius; z <= radius; z++) { if (world.getBlockState(spawnPos.offset(x, y, z)).getBlock() instanceof AirBlock && world.getBlockState(spawnPos.offset(x, y + 1, z)) - .getBlock() instanceof AirBlock) + .getBlock() instanceof AirBlock) { return spawnPos.offset(x, y, z); } @@ -310,7 +342,7 @@ public static List createWaypoints(final Level world, final Path path, { final BlockPos point = path.getNode(i).asBlockPos(); if (lastPoint.distManhattan(point) > spacing - && world.getBlockState(point).getMaterial() == Material.AIR) + && world.getBlockState(point).isAir()) { wayPoints.add(point); lastPoint = point; @@ -344,7 +376,12 @@ public static BlockPos chooseWaypointFor(final List wayPoints, final B if (secondClosest.distManhattan(target) < closest.distManhattan(target)) { - return secondClosest; + closest = secondClosest; + } + + if (closest.distManhattan(target) >= startPos.distManhattan(target)) + { + return target; } return closest; diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipe.java b/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipe.java index 2c0637ba827..bcc8db29dce 100644 --- a/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipe.java +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipe.java @@ -2,6 +2,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; @@ -11,10 +12,16 @@ import com.minecolonies.api.crafting.*; import com.minecolonies.api.research.IGlobalResearchTree; import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.Tuple; import com.minecolonies.api.util.constant.IToolType; import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.api.util.constant.TypeConstants; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -23,8 +30,11 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.StreamSupport; import static com.minecolonies.api.util.constant.NbtTagConstants.COUNT_PROP; import static com.minecolonies.api.util.constant.NbtTagConstants.ITEM_PROP; @@ -55,6 +65,10 @@ public class CustomRecipe */ public static final String RECIPE_TYPE_RECIPE_MULT_IN = "recipe-multi-in"; + /** + * The recipe template type + */ + public static final String RECIPE_TYPE_TEMPLATE = "recipe-template"; /** * The remove type @@ -136,6 +150,16 @@ public class CustomRecipe */ public static final String RECIPE_SHOW_TOOLTIP = "show-tooltip"; + /** + * The property name for a recipe template tag. + */ + public static final String RECIPE_TAG = "tag"; + + /** + * The property name for a recipe template filter. + */ + public static final String RECIPE_FILTER = "filter"; + /** * The crafter name for this instance, defaults to 'unknown' */ @@ -356,6 +380,187 @@ public static CustomRecipe parse(@NotNull final ResourceLocation recipeId, @NotN return recipe; } + /** + * Parse a recipe template into a list of recipes. See {@link ItemStackUtils#parseIdTemplate} + * for details on the template replacement format. + * + * @param baseId the base recipe path + * @param templateJson the recipe template + * @return a list of recipes for items discovered from the template + */ + @NotNull + public static List parseTemplate(@NotNull final ResourceLocation baseId, + @NotNull final JsonObject templateJson) + { + final List recipes = new ArrayList<>(); + + final ResourceLocation tagId = new ResourceLocation(GsonHelper.getAsString(templateJson, RECIPE_TAG)); + final JsonObject baseRecipeJson = GsonHelper.getAsJsonObject(templateJson, RECIPE_TYPE_RECIPE); + + final Predicate filter; + final JsonElement filterJson = templateJson.get(RECIPE_FILTER); + if (filterJson != null && filterJson.isJsonObject()) + { + final Predicate include = parseArrayOrStringFilter(filterJson.getAsJsonObject().get("include"), true); + final Predicate exclude = parseArrayOrStringFilter(filterJson.getAsJsonObject().get("exclude"), false); + filter = id -> include.test(id) && !exclude.test(id); + } + else + { + filter = parseArrayOrStringFilter(filterJson, true); + } + + final boolean logStatus = IMinecoloniesAPI.getInstance().getConfig().getServer().auditCraftingTags.get(); + + for (final Item item : ForgeRegistries.ITEMS.tags().getTag(TagKey.create(Registry.ITEM_REGISTRY, tagId))) + { + final ResourceLocation itemId = ForgeRegistries.ITEMS.getKey(item); + if (!filter.test(itemId)) { continue; } + + final ResourceLocation recipeId = new ResourceLocation(baseId.getNamespace(), baseId.getPath() + '/' + itemId.getNamespace() + '/' + itemId.getPath()); + final JsonObject recipeJson = populateTemplate(baseId, baseRecipeJson, itemId, logStatus); + if (recipeJson != null) + { + recipes.add(parse(recipeId, recipeJson)); + } + } + + return recipes; + } + + @NotNull + private static Predicate parseArrayOrStringFilter(@Nullable final JsonElement filterJson, + final boolean defaultResult) + { + if (filterJson == null) + { + return id -> defaultResult; + } + else if (filterJson.isJsonArray()) + { + final List strings = StreamSupport.stream(filterJson.getAsJsonArray().spliterator(), false) + .map(JsonElement::getAsString).toList(); + return id -> strings.stream().anyMatch(f -> id.toString().contains(f)); + } + else + { + final String filterString = filterJson.getAsString(); + return id -> id.toString().contains(filterString); + } + } + + @Nullable + private static JsonObject populateTemplate(@NotNull final ResourceLocation templateId, + @NotNull final JsonObject baseRecipeJson, + @NotNull final ResourceLocation itemId, + final boolean logStatus) + { + final JsonObject recipeJson = baseRecipeJson.deepCopy(); + + if (recipeJson.has(RECIPE_INPUTS_PROP)) + { + for (final JsonElement e : recipeJson.get(RECIPE_INPUTS_PROP).getAsJsonArray()) + { + if (e.isJsonObject()) + { + final Tuple result = populateTemplateItem(e.getAsJsonObject(), ITEM_PROP, itemId); + if (Boolean.FALSE.equals(result.getA())) + { + if (logStatus) + { + Log.getLogger().error("Template {} with {}: rejecting {} {}", + templateId, itemId, RECIPE_INPUTS_PROP, result.getB()); + } + return null; + } + } + } + } + + final Tuple output = populateTemplateItem(recipeJson, RECIPE_RESULT_PROP, itemId); + if (Boolean.FALSE.equals(output.getA())) + { + if (logStatus) + { + Log.getLogger().error("Template {} with {}: rejecting {} {}", + templateId, itemId, RECIPE_RESULT_PROP, output.getB()); + } + return null; + } + + if (recipeJson.has(RECIPE_SECONDARY_PROP)) + { + for (final JsonElement e : recipeJson.get(RECIPE_SECONDARY_PROP).getAsJsonArray()) + { + if (e.isJsonObject()) + { + final Tuple result = populateTemplateItem(e.getAsJsonObject(), ITEM_PROP, itemId); + if (Boolean.FALSE.equals(result.getA())) + { + if (logStatus) + { + Log.getLogger().error("Template {} with {}: rejecting {} {}", + templateId, itemId, RECIPE_SECONDARY_PROP, result.getB()); + } + return null; + } + } + } + } + + if (recipeJson.has(RECIPE_ALTERNATE_PROP)) + { + for (final Iterator iterator = recipeJson.get(RECIPE_ALTERNATE_PROP).getAsJsonArray().iterator(); iterator.hasNext(); ) + { + final JsonElement e = iterator.next(); + if (e.isJsonObject()) + { + final Tuple result = populateTemplateItem(e.getAsJsonObject(), ITEM_PROP, itemId); + if (Boolean.FALSE.equals(result.getA())) + { + if (logStatus) + { + Log.getLogger().warn("Template {} with {}: ignoring {} {}", + templateId, itemId, RECIPE_ALTERNATE_PROP, result.getB()); + } + + iterator.remove(); + } + } + } + } + + if (!recipeJson.has(RECIPE_RESULT_PROP) && !recipeJson.has(RECIPE_LOOTTABLE_PROP) && + (!recipeJson.has(RECIPE_ALTERNATE_PROP) || recipeJson.getAsJsonArray(RECIPE_ALTERNATE_PROP).isEmpty())) + { + if (logStatus) + { + Log.getLogger().warn("Template {} with {}: rejecting, no outputs", templateId, itemId); + } + return null; + } + + if (logStatus) + { + Log.getLogger().info("Template {} with {}: success", templateId, itemId); + } + return recipeJson; + } + + private static Tuple populateTemplateItem(@NotNull final JsonObject obj, + @NotNull final String prop, + @NotNull final ResourceLocation itemId) + { + if (obj.has(prop)) + { + final Tuple result = ItemStackUtils.parseIdTemplate(GsonHelper.getAsString(obj, prop), itemId); + obj.addProperty(prop, result.getB()); + return result; + } + + return new Tuple<>(true, null); + } + /** * Creates a custom recipe from its components. * @param crafter The crafter for the recipe. diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipeManager.java b/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipeManager.java index 28426bac57b..90feb735029 100644 --- a/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipeManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/CustomRecipeManager.java @@ -1,19 +1,23 @@ package com.minecolonies.coremod.colony.crafting; +import com.google.gson.JsonObject; import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule; import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.loot.ModLootTables; +import com.minecolonies.api.util.Log; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.LootTables; import net.minecraftforge.common.MinecraftForge; import org.jetbrains.annotations.NotNull; @@ -38,12 +42,12 @@ public class CustomRecipeManager /** * The map of loaded recipes by crafter. */ - private final HashMap> recipeMap = new HashMap<>(); + private final Map> recipeMap = new HashMap<>(); /** * The map of all loaded recipes by output. */ - private final HashMap> recipeOutputMap = new HashMap<>(); + private final Map> recipeOutputMap = new HashMap<>(); /** * The recipes that are marked for removal after loading all resource packs @@ -56,6 +60,11 @@ public class CustomRecipeManager */ private final Map> lootTables = new HashMap<>(); + /** + * The collection of recipe templates, pending tag loading. + */ + private final Map recipeTemplates = new HashMap<>(); + private CustomRecipeManager() { } @@ -110,6 +119,17 @@ public void removeRecipe(@NotNull final ResourceLocation toRemove) } } + /** + * Temporarily stores a recipe template while waiting for the tags to finish loading. + * @param id the resource id of the template. + * @param templateJson the template content. + */ + public void addRecipeTemplate(@NotNull final ResourceLocation id, + @NotNull final JsonObject templateJson) + { + recipeTemplates.put(id, templateJson); + } + /** * Reset the entire recipe map. * Should be run on Data Pack Reloads, to avoid transferring settings from another world. @@ -120,6 +140,7 @@ public void reset() recipeMap.clear(); lootTables.clear(); removedRecipes.clear(); + recipeTemplates.clear(); } /** @@ -243,12 +264,40 @@ private void removeRecipes() } } + /** + * Resolve the {@link #recipeTemplates} into actual recipes. + * + * Must be called server-side-only after tags have been loaded and before we sync to client. + */ + public void resolveTemplates() + { + for (final Map.Entry templateEntry : recipeTemplates.entrySet()) + { + try + { + for (final CustomRecipe recipe : CustomRecipe.parseTemplate(templateEntry.getKey(), templateEntry.getValue())) + { + addRecipe(recipe); + } + } + catch (final Exception e) + { + Log.getLogger().error("Error parsing crafterrecipe template " + templateEntry.getKey().toString(), e); + } + } + + recipeTemplates.clear(); + } + /** * Analyses and builds an approximate list of possible loot drops from registered recipes. * @param lootTableManager the loot table manager */ - public void buildLootData(@NotNull final LootTables lootTableManager) + public void buildLootData(@NotNull final LootTables lootTableManager, + @NotNull final Level level) { + final List animals = RecipeAnalyzer.createAnimals(level); + final List lootIds = new ArrayList<>(); for (final Map recipes : recipeMap.values()) { @@ -268,9 +317,15 @@ public void buildLootData(@NotNull final LootTables lootTableManager) { if (module instanceof AnimalHerdingModule herding) { - lootIds.add(herding.getDefaultLootTable()); + for (final Animal animal : animals) + { + if (herding.isCompatible(animal)) + { + lootIds.addAll(herding.getLootTables(animal)); + } + } } - if (module instanceof ICraftingBuildingModule crafting) + else if (module instanceof ICraftingBuildingModule crafting) { lootIds.addAll(crafting.getAdditionalLootTables()); } diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/LootTableAnalyzer.java b/src/main/java/com/minecolonies/coremod/colony/crafting/LootTableAnalyzer.java index 0fb243cd9b4..1cf68acc4a6 100644 --- a/src/main/java/com/minecolonies/coremod/colony/crafting/LootTableAnalyzer.java +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/LootTableAnalyzer.java @@ -27,7 +27,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -47,12 +46,26 @@ public final class LootTableAnalyzer { private LootTableAnalyzer() { } + /** + * Evaluate a loot table and report possible drops. + * + * @param lootTableManager the {@link LootTables} + * @param lootTableId the loot table id + * @return the list of possible drops + */ public static List toDrops(@NotNull final LootTables lootTableManager, @NotNull final ResourceLocation lootTableId) { return toDrops(lootTableManager, lootTableManager.get(lootTableId)); } + /** + * Evaluate a loot table and report possible drops. + * + * @param lootTableManager the {@link LootTables} + * @param lootTable the loot table + * @return the list of possible drops + */ public static List toDrops(@Nullable final LootTables lootTableManager, @NotNull final LootTable lootTable) { @@ -69,6 +82,14 @@ public static List toDrops(@Nullable final LootTables lootTableManager } } + + /** + * Evaluate a loot table and report possible drops. + * + * @param lootTableManager the {@link LootTables} + * @param lootTableJson the loot table json + * @return the list of possible drops + */ public static List toDrops(@Nullable final LootTables lootTableManager, @NotNull final JsonObject lootTableJson) { @@ -82,6 +103,7 @@ public static List toDrops(@Nullable final LootTables lootTableManager final JsonArray pools = GsonHelper.getAsJsonArray(lootTableJson, "pools"); for (final JsonElement pool : pools) { + final float rolls = processNumber(pool.getAsJsonObject().get("rolls"), 1.0f); final JsonArray entries = GsonHelper.getAsJsonArray(pool.getAsJsonObject(), "entries", new JsonArray()); final float totalWeight = StreamSupport.stream(entries.spliterator(), false) .filter(entry -> @@ -99,7 +121,7 @@ public static List toDrops(@Nullable final LootTables lootTableManager final List entryDrops = entryToDrops(lootTableManager, entryJson); for (final LootDrop drop : entryDrops) { - drops.add(new LootDrop(drop.getItemStacks(), drop.getProbability() * (weight / totalWeight), drop.getQuality(), drop.getConditional())); + drops.add(new LootDrop(drop.getItemStacks(), drop.getProbability() * (weight / totalWeight) * rolls, drop.getQuality() * rolls, drop.getConditional())); } } } @@ -108,6 +130,13 @@ public static List toDrops(@Nullable final LootTables lootTableManager return drops; } + /** + * Parse a specific entry and try to determine the possible drops. + * + * @param lootTableManager the {@link LootTables} + * @param entryJson the entry json + * @return the list of possible drops + */ @NotNull private static List entryToDrops(@Nullable final LootTables lootTableManager, @NotNull final JsonObject entryJson) @@ -120,7 +149,9 @@ private static List entryToDrops(@Nullable final LootTables lootTableM final Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(GsonHelper.getAsString(entryJson, "name"))); final float quality = GsonHelper.getAsFloat(entryJson, "quality", 0); float modifier = 1.0F; - final boolean conditional = GsonHelper.getAsJsonArray(entryJson, "conditions", new JsonArray()).size() > 0; + final JsonArray conditions = GsonHelper.getAsJsonArray(entryJson, "conditions", new JsonArray()); + final boolean conditional = conditions.size() > 0; + if (conditionsSeemImpossible(conditions)) { break; } ItemStack stack = new ItemStack(item); if (entryJson.has("functions")) { @@ -145,7 +176,9 @@ private static List entryToDrops(@Nullable final LootTables lootTableM final ResourceLocation table = new ResourceLocation(GsonHelper.getAsString(entryJson, "name")); final List tableDrops = toDrops(lootTableManager, table); final float quality = GsonHelper.getAsFloat(entryJson, "quality", 0); - final boolean conditional = GsonHelper.getAsJsonArray(entryJson, "conditions", new JsonArray()).size() > 0; + final JsonArray conditions = GsonHelper.getAsJsonArray(entryJson, "conditions", new JsonArray()); + final boolean conditional = conditions.size() > 0; + if (conditionsSeemImpossible(conditions)) { break; } for (final LootDrop drop : tableDrops) { drops.add(new LootDrop(drop.getItemStacks(), drop.getProbability(), drop.getQuality() + quality, drop.getConditional() || conditional)); @@ -166,6 +199,35 @@ private static List entryToDrops(@Nullable final LootTables lootTableM return drops; } + /** + * Quick plausibility check to see if conditions on a loot table entry are impossible to ever be met by a colonist, + * and thus should not be listed as a possible drop. This does not actually evaluate the conditions; just checks + * what type of conditions have been specified. + * + * @param conditions The conditions JSON array + * @return true if some condition seems impossible to fulfil for any colonist + */ + private static boolean conditionsSeemImpossible(@NotNull final JsonArray conditions) + { + for (final JsonElement condition : conditions) + { + final String json = condition.toString(); + if (json.contains("damage_source_properties") && !json.contains("minecraft:inverted")) + { + // very unlikely that colonists would match any specific damage sources (disables froglights) + return true; + } + } + return false; + } + + /** + * Replaces an {@link ModItems#adventureToken} with the drops from defeating the corresponding monster. + * + * @param lootTableManager the {@link LootTables} + * @param token the adventure token + * @return the list of possible drops + */ @NotNull private static List expandAdventureToken(@NotNull final LootTables lootTableManager, @NotNull final ItemStack token) @@ -186,6 +248,13 @@ private static List expandAdventureToken(@NotNull final LootTables loo return Collections.emptyList(); } + /** + * Groups and sorts drops by probability (most likely first, with similar-probability items in the + * same "slot" as alternatives). + * + * @param input the unsorted list of drops + * @return the sorted list of drops + */ @NotNull public static List consolidate(@NotNull final List input) { @@ -197,6 +266,14 @@ public static List consolidate(@NotNull final List input) .collect(Collectors.toList()); } + /** + * Rudimentary parsing of loot table functions, primarily focusing on just the ones that are most commonly present + * in the loot tables that we care about and have a visible effect in the JEI display. + * + * @param stack the original {@link ItemStack} to operate on + * @param functions the functions array json + * @return the modified stack and 'quality' modifier + */ private static Tuple processFunctions(@NotNull ItemStack stack, @NotNull final JsonArray functions) { float modifier = 1.0F; @@ -272,6 +349,14 @@ private static Tuple processFunctions(@NotNull ItemStack stack return new Tuple<>(stack, modifier); } + /** + * Evaluates an integer-like loot quantity used as an item count (which may be a fixed value or one of + * several random number types). If zero is a possible return, also reports a probability modifier + * (chance to be non-zero). + * + * @param json the count json + * @return the expected upper bound on possible random values, plus a probability modifier + */ private static Tuple processCount(@Nullable final JsonElement json) { if (json == null) return new Tuple<>(1, 1.0F); @@ -288,6 +373,12 @@ private static Tuple processCount(@Nullable final JsonElement js return new Tuple<>(processNumber(json, 1), 1.0F); } + /** + * Evaluates an int-like loot quantity (which may be a fixed value or one of several random number types). + * + * @param json the quantity json + * @return the expected upper bound on possible random values + */ private static int processNumber(@Nullable final JsonElement json, final int defaultValue) { if (json == null) return defaultValue; @@ -312,6 +403,12 @@ else if (json.isJsonPrimitive()) return defaultValue; } + /** + * Evaluates a float-like loot quantity (which may be a fixed value or one of several random number types). + * + * @param json the quantity json + * @return the expected upper bound on possible random values + */ private static float processNumber(@Nullable final JsonElement json, final float defaultValue) { if (json == null) return defaultValue; diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeAnalyzer.java b/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeAnalyzer.java index e94ec4c6a18..8088a31b541 100644 --- a/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeAnalyzer.java +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeAnalyzer.java @@ -2,24 +2,26 @@ import com.google.common.collect.ImmutableMap; import com.minecolonies.api.MinecoloniesAPIProxy; -import com.ldtteam.domumornamentum.recipe.ModRecipeTypes; import com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule; import com.minecolonies.api.crafting.IGenericRecipe; import com.minecolonies.api.crafting.IRecipeStorage; import com.minecolonies.api.crafting.registry.CraftingType; import com.minecolonies.api.util.ItemStackUtils; -import net.minecraft.world.Container; -import net.minecraft.world.item.crafting.Recipe; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.Predicate; /** * Utility helpers for analyzing the available recipes and determining which crafters are able to use them. @@ -84,7 +86,8 @@ public static List findRecipes(@NotNull final Map ItemStackUtils.compareItemStacksIgnoreStackSize(recipeStorage.getPrimaryOutput(), r.getPrimaryOutput())); + recipes.removeIf(r -> ItemStackUtils.isNotEmpty(r.getPrimaryOutput()) && + ItemStackUtils.compareItemStacksIgnoreStackSize(recipeStorage.getPrimaryOutput(), r.getPrimaryOutput())); recipes.removeIf(r -> recipeStorage.getAlternateOutputs().stream() .anyMatch(s -> ItemStackUtils.compareItemStacksIgnoreStackSize(s, r.getPrimaryOutput()))); } @@ -97,6 +100,61 @@ public static List findRecipes(@NotNull final Map createAnimals(@NotNull final Level level) + { + final List animals = new ArrayList<>(); + + for (final EntityType entityType : ForgeRegistries.ENTITY_TYPES.getValues()) + { + if (entityType.getCategory() != MobCategory.CREATURE) { continue; } + + try + { + // sadly there doesn't seem to be a better way to discover the actual classes for each type, because Java + final Entity entity = entityType.create(level); + if (entity instanceof Animal animal) + { + animals.add(animal); + } + } + catch (final Exception ex) + { + Log.getLogger().error("Couldnt analyze animal", ex); + } + } + + return animals; + } + + /** + * Find "recipes" from a particular animal herding module. + * + * @param animals all possible animals (from {@link #createAnimals}) + * @param module the herding module + * @return recipes for that module + */ + public static List findRecipes(@NotNull final List animals, + @NotNull final AnimalHerdingModule module) + { + final List recipes = new ArrayList<>(); + + for (final Animal animal : animals) + { + if (module.isCompatible(animal)) + { + recipes.addAll(module.getRecipesForDisplayPurposesOnly(animal)); + } + } + + return recipes; + } + private RecipeAnalyzer() { /* diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeStorageFactory.java b/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeStorageFactory.java index 45bc656fac4..692536e7d24 100755 --- a/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeStorageFactory.java +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/RecipeStorageFactory.java @@ -26,6 +26,8 @@ import java.util.ArrayList; import java.util.List; +import static com.minecolonies.api.colony.requestsystem.StandardFactoryController.NBT_TYPE; +import static com.minecolonies.api.colony.requestsystem.StandardFactoryController.NEW_NBT_TYPE; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_TOKEN; /** @@ -173,7 +175,7 @@ public RecipeStorage deserialize(@NotNull final IFactoryController controller, @ for (int i = 0; i < inputTagList.size(); ++i) { final CompoundTag inputTag = inputTagList.getCompound(i); - if(inputTag.contains("Type")) //Check to see if it's something the factorycontroller can handle + if(inputTag.contains(NEW_NBT_TYPE) || inputTag.contains(NBT_TYPE)) //Check to see if it's something the factorycontroller can handle { input.add(StandardFactoryController.getInstance().deserialize(inputTag)); } diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/ToolUsage.java b/src/main/java/com/minecolonies/coremod/colony/crafting/ToolUsage.java new file mode 100644 index 00000000000..1f575c7e0ce --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/ToolUsage.java @@ -0,0 +1,36 @@ +package com.minecolonies.coremod.colony.crafting; + +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.compatibility.jei.ToolRecipeCategory; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import static com.minecolonies.api.util.constant.Constants.MAX_BUILDING_LEVEL; + +/** + * Describes a tool and its level compatibility. + * + * @param tool the tool type + * @param toolLevels basic items accepted at each building level. + * @param enchantedToolLevels (some) enchanted items accepted at each building level. + */ +public record ToolUsage(@NotNull ToolType tool, + @NotNull List> toolLevels, + @NotNull List> enchantedToolLevels) +{ + @NotNull + public static ToolUsage create(@NotNull final ToolType tool) + { + final List> basicLevels = new ArrayList<>(); + final List> enchantedLevels = new ArrayList<>(); + for (int i = 0; i <= MAX_BUILDING_LEVEL; ++i) + { + basicLevels.add(new ArrayList<>()); + enchantedLevels.add(new ArrayList<>()); + } + return new ToolUsage(tool, basicLevels, enchantedLevels); + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/crafting/ToolsAnalyzer.java b/src/main/java/com/minecolonies/coremod/colony/crafting/ToolsAnalyzer.java new file mode 100644 index 00000000000..5b77503dc0c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/crafting/ToolsAnalyzer.java @@ -0,0 +1,101 @@ +package com.minecolonies.coremod.colony.crafting; + +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.constant.ToolType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.minecolonies.api.util.constant.Constants.MAX_BUILDING_LEVEL; + +/** + * Utility helpers for analyzing the available tools and determining which levels are able to use them. + */ +public final class ToolsAnalyzer +{ + /** + * Generate the list of {@link ToolUsage}. + */ + @NotNull + public static List findTools() + { + final Map toolItems = new HashMap<>(); + + for (final ItemStack stack : IColonyManager.getInstance().getCompatibilityManager().getListOfAllItems()) + { + for (final ToolType tool : ToolType.values()) + { + if (tool == ToolType.NONE || !ItemStackUtils.isTool(stack, tool)) { continue; } + + tryAddingToolWithLevel(toolItems, tool, stack); + + if (stack.isEnchantable()) + { + for (int enchantLevel = 1; enchantLevel < 4; ++enchantLevel) + { + tryAddingEnchantedTool(toolItems, tool, stack, enchantLevel); + } + } + } + } + + return toolItems.values().stream().sorted(Comparator.comparing(ToolUsage::tool)).toList(); + } + + private static void tryAddingEnchantedTool(@NotNull final Map toolItems, + @NotNull final ToolType tool, + @NotNull final ItemStack stack, + final int enchantLevel) + { + final ItemStack enchantedStack = stack.copy(); + + // this list should theoretically end up applying a total of two enchants to each tool type + tryEnchantStack(enchantedStack, Enchantments.UNBREAKING, enchantLevel); + tryEnchantStack(enchantedStack, Enchantments.MOB_LOOTING, enchantLevel); + tryEnchantStack(enchantedStack, Enchantments.FLAMING_ARROWS, enchantLevel); + tryEnchantStack(enchantedStack, Enchantments.BLOCK_FORTUNE, enchantLevel); + tryEnchantStack(enchantedStack, Enchantments.ALL_DAMAGE_PROTECTION, enchantLevel); + tryEnchantStack(enchantedStack, Enchantments.FISHING_SPEED, enchantLevel); + + tryAddingToolWithLevel(toolItems, tool, enchantedStack); + } + + private static void tryEnchantStack(@NotNull final ItemStack stack, + @NotNull final Enchantment enchantment, + final int enchantLevel) + { + if (enchantment.canEnchant(stack) && enchantLevel >= enchantment.getMinLevel() && enchantLevel <= enchantment.getMaxLevel()) + { + stack.enchant(enchantment, enchantLevel); + } + } + + private static void tryAddingToolWithLevel(@NotNull final Map toolItems, + @NotNull final ToolType tool, + @NotNull final ItemStack stack) + { + int level = ItemStackUtils.getMiningLevel(stack, tool); + if (level < 0) { + return; + } + level = Math.min(MAX_BUILDING_LEVEL, level + ItemStackUtils.getMaxEnchantmentLevel(stack)); + + final ToolUsage usage = toolItems.computeIfAbsent(tool, ToolUsage::create); + + if (stack.isEnchanted()) + { + usage.enchantedToolLevels().get(level).add(stack); + } + else + { + usage.toolLevels().get(level).add(stack); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/fields/AbstractField.java b/src/main/java/com/minecolonies/coremod/colony/fields/AbstractField.java new file mode 100644 index 00000000000..989f47915d6 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/fields/AbstractField.java @@ -0,0 +1,217 @@ +package com.minecolonies.coremod.colony.fields; + +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.modules.IFieldModule; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.colony.modules.ModuleContainerUtils; +import com.minecolonies.api.util.BlockPosUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_OWNER; + +/** + * Abstract implementation for field instances. + * Contains some basic mandatory logic for fields. + */ +public abstract class AbstractField implements IField +{ + /** + * Set of field modules this field has. + */ + private final List modules = new ArrayList<>(); + + /** + * The type of the field. + */ + private final FieldRegistries.FieldEntry fieldType; + + /** + * The position of the field. + */ + private final BlockPos position; + + /** + * Building id of the building owning the field. + */ + @Nullable + private BlockPos buildingId = null; + + /** + * Constructor used in NBT deserialization. + * + * @param fieldType the type of field. + * @param position the position of the field. + */ + protected AbstractField(final @NotNull FieldRegistries.FieldEntry fieldType, final @NotNull BlockPos position) + { + this.fieldType = fieldType; + this.position = position; + } + + @Override + public boolean hasModule(final Class clazz) + { + return ModuleContainerUtils.hasModule(modules, clazz); + } + + @NotNull + @Override + public T getFirstModuleOccurance(final Class clazz) + { + return ModuleContainerUtils.getFirstModuleOccurance(modules, + clazz, + "The module of class: " + clazz.toString() + "should never be null! Field:" + getFieldType().getRegistryName() + " pos:" + getPosition()); + } + + @NotNull + @Override + public Optional getFirstOptionalModuleOccurance(final Class clazz) + { + return ModuleContainerUtils.getFirstOptionalModuleOccurance(modules, clazz); + } + + @NotNull + @Override + public List getModules(final Class clazz) + { + return ModuleContainerUtils.getModules(modules, clazz); + } + + @NotNull + @Override + public T getModuleMatching(final Class clazz, final Predicate modulePredicate) + { + return ModuleContainerUtils.getModuleMatching(modules, + clazz, + modulePredicate, + "no matching module for Field:" + getFieldType().getRegistryName() + " pos:" + getPosition().toShortString()); + } + + @Override + public void registerModule(@NotNull final IFieldModule module) + { + this.modules.add(module); + } + + @Override + public final @NotNull FieldRegistries.FieldEntry getFieldType() + { + return fieldType; + } + + @Override + @NotNull + public final BlockPos getPosition() + { + return position; + } + + @Override + @Nullable + public final BlockPos getBuildingId() + { + return buildingId; + } + + @Override + public final void setBuilding(final BlockPos buildingId) + { + this.buildingId = buildingId; + } + + @Override + public final void resetOwningBuilding() + { + buildingId = null; + } + + @Override + public final boolean isTaken() + { + return buildingId != null; + } + + @Override + public final int getSqDistance(final IBuildingView building) + { + return (int) Math.sqrt(BlockPosUtil.getDistanceSquared(position, building.getPosition())); + } + + @Override + public @NotNull CompoundTag serializeNBT() + { + CompoundTag compound = new CompoundTag(); + if (buildingId != null) + { + BlockPosUtil.write(compound, TAG_OWNER, buildingId); + } + return compound; + } + + @Override + public void deserializeNBT(final @NotNull CompoundTag compound) + { + if (compound.contains(TAG_OWNER)) + { + buildingId = BlockPosUtil.read(compound, TAG_OWNER); + } + } + + @Override + public void serialize(final @NotNull FriendlyByteBuf buf) + { + buf.writeBoolean(buildingId != null); + if (buildingId != null) + { + buf.writeBlockPos(buildingId); + } + } + + @Override + public void deserialize(final @NotNull FriendlyByteBuf buf) + { + if (buf.readBoolean()) + { + buildingId = buf.readBlockPos(); + } + } + + @Override + public int hashCode() + { + int result = position.hashCode(); + result = 31 * result + fieldType.hashCode(); + return result; + } + + @Override + public boolean equals(final Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final AbstractField that = (AbstractField) o; + + if (!position.equals(that.position)) + { + return false; + } + return fieldType.equals(that.fieldType); + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/fields/FarmField.java b/src/main/java/com/minecolonies/coremod/colony/fields/FarmField.java new file mode 100644 index 00000000000..b345c3df345 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/fields/FarmField.java @@ -0,0 +1,242 @@ +package com.minecolonies.coremod.colony.fields; + +import com.minecolonies.api.blocks.ModBlocks; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +/** + * Field class implementation for the plantation + */ +public class FarmField extends AbstractField +{ + /** + * The max width/length of a field. + */ + private static final int MAX_RANGE = 5; + + private static final String TAG_SEED = "seed"; + private static final String TAG_RADIUS = "radius"; + private static final String TAG_MAX_RANGE = "maxRange"; + private static final String TAG_STAGE = "stage"; + + /** + * The currently selected seed on the field, if any. + */ + private ItemStack seed = ItemStack.EMPTY; + + /** + * The size of the field in all four directions + * in the same order as {@link Direction}: + * S, W, N, E + */ + private int[] radii = {MAX_RANGE, MAX_RANGE, MAX_RANGE, MAX_RANGE}; + + /** + * The maximum radius for this field. + */ + private int maxRadius; + + /** + * Has the field been planted + */ + private Stage fieldStage = Stage.EMPTY; + + /** + * Constructor used in NBT deserialization. + * + * @param fieldType the type of field. + * @param position the position of the field. + */ + public FarmField(final FieldRegistries.FieldEntry fieldType, final BlockPos position) + { + super(fieldType, position); + this.maxRadius = MAX_RANGE; + } + + /** + * Constructor to create new instances + * + * @param position the position it is placed in. + */ + public static FarmField create(final BlockPos position) + { + return (FarmField) FieldRegistries.farmField.get().produceField(position); + } + + @Override + public boolean isValidPlacement(final IColony colony) + { + BlockState blockState = colony.getWorld().getBlockState(getPosition()); + return blockState.is(ModBlocks.blockScarecrow); + } + + @Override + public @NotNull CompoundTag serializeNBT() + { + CompoundTag compound = super.serializeNBT(); + compound.put(TAG_SEED, seed.serializeNBT()); + compound.putIntArray(TAG_RADIUS, radii); + compound.putInt(TAG_MAX_RANGE, maxRadius); + compound.putString(TAG_STAGE, fieldStage.name()); + return compound; + } + + @Override + public void deserializeNBT(final @NotNull CompoundTag compound) + { + super.deserializeNBT(compound); + setSeed(ItemStack.of(compound.getCompound(TAG_SEED))); + radii = compound.getIntArray(TAG_RADIUS); + maxRadius = compound.getInt(TAG_MAX_RANGE); + fieldStage = Stage.valueOf(compound.getString(TAG_STAGE)); + } + + @Override + public void serialize(final @NotNull FriendlyByteBuf buf) + { + super.serialize(buf); + buf.writeItem(getSeed()); + buf.writeVarIntArray(radii); + buf.writeInt(maxRadius); + buf.writeEnum(fieldStage); + } + + @Override + public void deserialize(@NotNull final FriendlyByteBuf buf) + { + super.deserialize(buf); + setSeed(buf.readItem()); + radii = buf.readVarIntArray(); + maxRadius = buf.readInt(); + fieldStage = buf.readEnum(Stage.class); + } + + /** + * Get the current seed on the field. + * + * @return the current seed. + */ + @NotNull + public ItemStack getSeed() + { + seed.setCount(1); + return seed; + } + + /** + * Updates the seed in the field. + * + * @param seed the new seed + */ + public void setSeed(final ItemStack seed) + { + this.seed = seed.copy(); + this.seed.setCount(1); + } + + /** + * Move the field into the new state. + */ + public void nextState() + { + if (getFieldStage().ordinal() + 1 >= Stage.values().length) + { + setFieldStage(Stage.values()[0]); + return; + } + setFieldStage(Stage.values()[getFieldStage().ordinal() + 1]); + } + + /** + * Get the current stage the field is in. + * + * @return the stage of the field. + */ + public Stage getFieldStage() + { + return this.fieldStage; + } + + /** + * Sets the current stage of the field. + * + * @param fieldStage the stage of the field. + */ + public void setFieldStage(final Stage fieldStage) + { + this.fieldStage = fieldStage; + } + + /** + * Get the max range for this field. + * + * @return the maximum range. + */ + public int getMaxRadius() + { + return maxRadius; + } + + /** + * @param direction the direction to get the range for + * @return the radius + */ + public int getRadius(Direction direction) + { + return radii[direction.get2DDataValue()]; + } + + /** + * @param direction the direction for the radius + * @param radius the number of blocks from the scarecrow that the farmer will work with + */ + public void setRadius(Direction direction, int radius) + { + this.radii[direction.get2DDataValue()] = Math.min(radius, maxRadius); + } + + /** + * Checks if a certain position is part of the field. Complies with the definition of field block. + * + * @param world the world object. + * @param position the position. + * @return true if it is. + */ + public boolean isNoPartOfField(@NotNull final Level world, @NotNull final BlockPos position) + { + return world.isEmptyBlock(position) || isValidDelimiter(world.getBlockState(position.above()).getBlock()); + } + + /** + * Check if a block is a valid delimiter of the field. + * + * @param block the block to analyze. + * @return true if so. + */ + private static boolean isValidDelimiter(final Block block) + { + return block instanceof FenceBlock || block instanceof FenceGateBlock || block instanceof WallBlock; + } + + /** + * Describes the stage the field is in. Like if it has been hoed, planted or is empty. + */ + public enum Stage + { + EMPTY, + HOED, + PLANTED + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/fields/PlantationField.java b/src/main/java/com/minecolonies/coremod/colony/fields/PlantationField.java new file mode 100644 index 00000000000..68101d89d15 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/fields/PlantationField.java @@ -0,0 +1,126 @@ +package com.minecolonies.coremod.colony.fields; + +import com.minecolonies.api.blocks.ModBlocks; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.util.BlockPosUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Field class implementation for the plantation + */ +public class PlantationField extends AbstractField +{ + private static final String TAG_WORKING_POS = "workingPositions"; + + /** + * A list of all found tagged working positions. + */ + private List workingPositions = new ArrayList<>(); + + /** + * Constructor used in NBT deserialization. + * + * @param fieldType the type of field. + * @param position the position of the field. + */ + public PlantationField(final @NotNull FieldRegistries.FieldEntry fieldType, final @NotNull BlockPos position) + { + super(fieldType, position); + } + + /** + * Constructor to create new instances + * + * @param fieldEntry the type of field we want to produce. + * @param position the position it is placed in. + */ + public static PlantationField create(final FieldRegistries.FieldEntry fieldEntry, final BlockPos position) + { + return (PlantationField) fieldEntry.produceField(position); + } + + @Override + public boolean isValidPlacement(final IColony colony) + { + BlockState blockState = colony.getWorld().getBlockState(getPosition()); + // TODO: future, remove `blockHutPlantation` from valid blocks + return blockState.is(ModBlocks.blockHutPlantation) || blockState.is(ModBlocks.blockPlantationField); + } + + /** + * Get the list of working positions of this field. + * + * @return an unmodifiable collection of working positions. + */ + public List getWorkingPositions() + { + return workingPositions.stream().toList(); + } + + /** + * Overwrite the working positions on the field instance. + * + * @param workingPositions the new list of working positions. + */ + public void setWorkingPositions(final List workingPositions) + { + this.workingPositions = workingPositions; + } + + /** + * Get the plantation module on this field. + * + * @return the plantation module instance. + */ + public IPlantationModule getModule() + { + return getFirstModuleOccurance(IPlantationModule.class); + } + + @Override + public @NotNull CompoundTag serializeNBT() + { + CompoundTag compound = super.serializeNBT(); + BlockPosUtil.writePosListToNBT(compound, TAG_WORKING_POS, workingPositions); + return compound; + } + + @Override + public void deserializeNBT(@NotNull CompoundTag compound) + { + super.deserializeNBT(compound); + workingPositions = BlockPosUtil.readPosListFromNBT(compound, TAG_WORKING_POS); + } + + @Override + public void serialize(final @NotNull FriendlyByteBuf buf) + { + super.serialize(buf); + buf.writeInt(workingPositions.size()); + for (BlockPos workingPosition : workingPositions) + { + buf.writeBlockPos(workingPosition); + } + } + + @Override + public void deserialize(final @NotNull FriendlyByteBuf buf) + { + super.deserialize(buf); + workingPositions = new ArrayList<>(); + final int workingPositionCount = buf.readInt(); + for (int index = 0; index < workingPositionCount; index++) + { + workingPositions.add(buf.readBlockPos()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/fields/modules/AbstractFieldModule.java b/src/main/java/com/minecolonies/coremod/colony/fields/modules/AbstractFieldModule.java new file mode 100644 index 00000000000..729d288cfb2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/fields/modules/AbstractFieldModule.java @@ -0,0 +1,31 @@ +package com.minecolonies.coremod.colony.fields.modules; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.modules.IFieldModule; + +/** + * Abstract class for all field modules. + */ +public abstract class AbstractFieldModule implements IFieldModule +{ + /** + * The field this module belongs to. + */ + protected IField field; + + /** + * Default constructor. + * + * @param field the field instance this module is working on. + */ + protected AbstractFieldModule(final IField field) + { + this.field = field; + } + + @Override + public IField getField() + { + return field; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/fields/registry/FieldDataManager.java b/src/main/java/com/minecolonies/coremod/colony/fields/registry/FieldDataManager.java new file mode 100644 index 00000000000..4ed552faa1d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/fields/registry/FieldDataManager.java @@ -0,0 +1,110 @@ +package com.minecolonies.coremod.colony.fields.registry; + +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.Log; +import io.netty.buffer.Unpooled; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +/** + * The field manager class responsible for creating field instances from NBT data, etc. + */ +public final class FieldDataManager +{ + private static final String TAG_FIELD_NAME = "name"; + private static final String TAG_FIELD_POSITION = "position"; + private static final String TAG_FIELD_DATA = "data"; + + private FieldDataManager() + { + } + + /** + * Creates a field instance from NBT compound data. + * + * @param compound the input compound data. + * @return the created field instance. + */ + public static IField compoundToField(final @NotNull CompoundTag compound) + { + ResourceLocation fieldName = new ResourceLocation(compound.getString(TAG_FIELD_NAME)); + BlockPos position = BlockPosUtil.read(compound, TAG_FIELD_POSITION); + + IField field = resourceLocationToField(fieldName, position); + if (field != null) + { + field.deserializeNBT(compound.getCompound(TAG_FIELD_DATA)); + } + return field; + } + + /** + * Creates a field instance from a field type and position. + * + * @param fieldName the field registry entry name. + * @param position the position of the field. + * @return the field instance. + */ + public static IField resourceLocationToField(final @NotNull ResourceLocation fieldName, final @NotNull BlockPos position) + { + final FieldRegistries.FieldEntry fieldEntry = FieldRegistries.getFieldRegistry().getValue(fieldName); + + if (fieldEntry == null) + { + Log.getLogger().error("Unknown field type '{}'.", fieldName); + return null; + } + + return fieldEntry.produceField(position); + } + + /** + * Creates a field instance from a complete network buffer. + * + * @param buf the buffer, still containing the field registry type and position. + * @return the field instance. + */ + public static IField bufferToField(final @NotNull FriendlyByteBuf buf) + { + final FieldRegistries.FieldEntry fieldType = buf.readRegistryIdSafe(FieldRegistries.FieldEntry.class); + final BlockPos position = buf.readBlockPos(); + final IField field = fieldType.produceField(position); + field.deserialize(buf); + return field; + } + + /** + * Creates a network buffer from a field instance. + * + * @param field the field instance. + * @return the network buffer. + */ + public static FriendlyByteBuf fieldToBuffer(final @NotNull IField field) + { + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeRegistryId(FieldRegistries.getFieldRegistry(), field.getFieldType()); + buf.writeBlockPos(field.getPosition()); + field.serialize(buf); + return buf; + } + + /** + * Creates NBT compound data from a field instance. + * + * @param field the field instance. + * @return the NBT compound. + */ + public static CompoundTag fieldToCompound(final @NotNull IField field) + { + final CompoundTag compound = new CompoundTag(); + compound.putString(TAG_FIELD_NAME, field.getFieldType().getRegistryName().toString()); + BlockPosUtil.write(compound, TAG_FIELD_POSITION, field.getPosition()); + compound.put(TAG_FIELD_DATA, field.serializeNBT()); + return compound; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDeliveryInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDeliveryInteraction.java new file mode 100644 index 00000000000..003685440c0 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDeliveryInteraction.java @@ -0,0 +1,156 @@ +package com.minecolonies.coremod.colony.interactionhandling; + +import com.ldtteam.blockui.views.BOWindow; +import com.minecolonies.api.colony.ICitizen; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.interactionhandling.IChatPriority; +import com.minecolonies.api.quests.*; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIBasic; +import com.minecolonies.coremod.network.messages.server.colony.InteractionResponse; +import com.minecolonies.coremod.quests.objectives.DialogueObjectiveTemplateTemplate; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import static com.minecolonies.api.colony.interactionhandling.ModInteractionResponseHandlers.QUEST_ACTION; +import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; + +/** + * More specific quest dialogue interaction that also tries to fulfill a deliver request. + */ +public class QuestDeliveryInteraction extends QuestDialogueInteraction +{ + /** + * Two icon options. + */ + private static final ResourceLocation QUEST_START_ICON = new ResourceLocation(Constants.MOD_ID, "textures/icons/queststart.png"); + private static final ResourceLocation QUEST_NEXT_TASK_ICON = new ResourceLocation(Constants.MOD_ID, "textures/icons/nexttask.png"); + + public QuestDeliveryInteraction(final Component inquiry, final IChatPriority priority, final ResourceLocation location, final int index, final ICitizenData citizenData) + { + super(inquiry, priority, location, index, citizenData); + } + + public QuestDeliveryInteraction(final ICitizen data) + { + super(data); + } + + @Override + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) + { + if (colonyQuest == null) + { + colonyQuest = data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(questId).getObjective(index); + triggerResponseState(player, objective); + if (currentElement != null && colonyQuest != null) + { + final IQuestDialogueAnswer result = this.currentElement.getOptionResult(responseId); + if (result instanceof IFinalQuestDialogueAnswer) + { + if (result instanceof IQuestPositiveDialogueAnswer) + { + if (((IQuestDeliveryObjective) objective).hasItem(player, colonyQuest) && ((IQuestDeliveryObjective) objective).tryDiscountItem(player, colonyQuest)) + { + ((IFinalQuestDialogueAnswer) result).applyToQuest(player, colonyQuest); + finished = true; + } + } + else + { + if (!(result instanceof IQuestDialogueAnswer.CloseUIDialogueAnswer)) + { + currentElement = null; + data.getColony().markDirty(); + return; + } + } + currentElement = startElement; + } + else if (result instanceof DialogueObjectiveTemplateTemplate.DialogueElement) + { + this.currentElement = (DialogueObjectiveTemplateTemplate.DialogueElement) result; + if (data != null && data.getJob() != null) + { + ((AbstractEntityAIBasic) data.getJob().getWorkerAI()).setDelay(TICKS_SECOND * 3); + } + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) + { + if (colonyQuest == null) + { + colonyQuest = data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + if (currentElement != null && colonyQuest != null) + { + final IQuestDialogueAnswer result = this.currentElement.getOptionResult(responseId); + if (result instanceof IFinalQuestDialogueAnswer) + { + Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), Component.literal(colonyQuest.getId().toString()), responseId)); + this.currentElement = this.startElement; + return true; + } + else if (result instanceof DialogueObjectiveTemplateTemplate.DialogueElement) + { + Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), Component.literal(colonyQuest.getId().toString()), responseId)); + this.currentElement = (DialogueObjectiveTemplateTemplate.DialogueElement) result; + return false; + } + } + + return true; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void onOpened(final Player player) + { + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(questId).getObjective(index); + triggerResponseState(player, objective); + } + + /** + * Trigger response state. + * + * @param player the player for. + * @param objective the objective to check. + */ + private void triggerResponseState(final Player player, final IQuestObjectiveTemplate objective) + { + if (objective instanceof final IQuestDeliveryObjective delivery) + { + if (delivery.hasItem(player, colonyQuest)) + { + currentElement = delivery.getReadyDialogueTree(); + } + else + { + currentElement = delivery.getDialogueTree(); + } + } + } + + @Override + public String getType() + { + return QUEST_ACTION.getPath(); + } + + @Override + public ResourceLocation getInteractionIcon() + { + return index == 0 ? QUEST_START_ICON : QUEST_NEXT_TASK_ICON; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDialogueInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDialogueInteraction.java new file mode 100644 index 00000000000..cab600cd0ed --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/QuestDialogueInteraction.java @@ -0,0 +1,272 @@ +package com.minecolonies.coremod.colony.interactionhandling; + +import com.ldtteam.blockui.views.BOWindow; +import com.minecolonies.api.colony.ICitizen; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.ICitizenDataView; +import com.minecolonies.api.colony.interactionhandling.IChatPriority; +import com.minecolonies.api.quests.IFinalQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestManager; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIBasic; +import com.minecolonies.coremod.network.messages.server.colony.InteractionResponse; +import com.minecolonies.coremod.quests.objectives.DialogueObjectiveTemplateTemplate; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static com.minecolonies.api.colony.interactionhandling.ModInteractionResponseHandlers.QUEST; +import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; + +/** + * A simple quest dialogue interaction that deals with different dialogue trees. + */ +public class QuestDialogueInteraction extends StandardInteraction +{ + /** + * Three icon options. + */ + private static final ResourceLocation QUEST_START_ICON = new ResourceLocation(Constants.MOD_ID, "textures/icons/queststart.png"); + private static final ResourceLocation QUEST_NEXT_TASK_ICON = new ResourceLocation(Constants.MOD_ID, "textures/icons/nexttask.png"); + private static final ResourceLocation QUEST_WAITING_TASK_ICON = new ResourceLocation(Constants.MOD_ID, "textures/icons/opentask.png"); + + /** + * Currently open colony quest. + */ + protected IQuestInstance colonyQuest; + + /** + * The respective citizen. + */ + protected final ICitizen citizen; + + /** + * The quest resource location. + */ + protected ResourceLocation questId; + + /** + * Index in the quest. + */ + protected int index; + + /** + * The current dialogue element. + */ + protected DialogueObjectiveTemplateTemplate.DialogueElement startElement = null; + + /** + * The current dialogue element. + */ + protected DialogueObjectiveTemplateTemplate.DialogueElement currentElement = null; + + /** + * Some finished flag to make it disappear more quickly on the client side. + */ + protected boolean finished = false; + + public QuestDialogueInteraction(final Component inquiry, final IChatPriority priority, final ResourceLocation location, final int index, final ICitizenData citizenData) + { + super(inquiry, null, priority); + this.questId = location; + this.index = index; + this.currentElement = ((DialogueObjectiveTemplateTemplate) IQuestManager.GLOBAL_SERVER_QUESTS.get(questId).getObjective(index)).getDialogueTree(); + this.startElement = currentElement; + this.colonyQuest = citizenData.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + this.citizen = citizenData; + } + + public QuestDialogueInteraction(final ICitizen data) + { + super(data); + this.colonyQuest = data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + this.citizen = data; + } + + @Override + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) + { + if (colonyQuest == null) + { + colonyQuest = data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + if (currentElement != null && colonyQuest != null) + { + final IQuestDialogueAnswer result = this.currentElement.getOptionResult(responseId); + if (result instanceof IFinalQuestDialogueAnswer) + { + ((IFinalQuestDialogueAnswer) result).applyToQuest(player, data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId)); + if (!(result instanceof IQuestDialogueAnswer.CloseUIDialogueAnswer)) + { + finished = true; + currentElement = null; + data.getColony().markDirty(); + return; + } + currentElement = startElement; + } + else if (result instanceof DialogueObjectiveTemplateTemplate.DialogueElement) + { + this.currentElement = (DialogueObjectiveTemplateTemplate.DialogueElement) result; + if (data != null && data.getJob() != null) + { + ((AbstractEntityAIBasic) data.getJob().getWorkerAI()).setDelay(TICKS_SECOND * 3); + } + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) + { + if (colonyQuest == null) + { + colonyQuest = data.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + if (currentElement != null && colonyQuest != null) + { + final IQuestDialogueAnswer result = this.currentElement.getOptionResult(responseId); + if (result instanceof IFinalQuestDialogueAnswer) + { + Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), Component.literal(questId.toString()), responseId)); + this.currentElement = this.startElement; + finished = true; + return true; + } + else if (result instanceof DialogueObjectiveTemplateTemplate.DialogueElement) + { + Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), Component.literal(questId.toString()), responseId)); + this.currentElement = (DialogueObjectiveTemplateTemplate.DialogueElement) result; + return false; + } + } + + return true; + } + + @Override + public void onOpened(final Player player) + { + super.onOpened(player); + if (colonyQuest == null && citizen != null) + { + colonyQuest = citizen.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + } + + @Override + public Component getId() + { + return Component.literal(this.questId.toString()); + } + + @Override + public void onClosed() + { + this.currentElement = this.startElement; + } + + @Override + public Component getInquiry() + { + return processText(currentElement.getText()); + } + + /** + * Process the text to include the participant names. + * @return the processed text. + */ + private Component processText(final Component text) + { + // TODO: this is not ideal, we should do something more clever and preserve the item subcomponents for tooltips etc + String localText = text.getString(); + if (localText.contains("$") && colonyQuest != null) + { + localText = localText.replace("$0", citizen.getColony().getCitizen(this.colonyQuest.getQuestGiverId()).getName()); + int index = 1; + for (final int participant : this.colonyQuest.getParticipants()) + { + localText = localText.replace("$" + index, citizen.getColony().getCitizen(participant).getName()); + } + } + if (localText.contains("$d") && colonyQuest != null && colonyQuest.getCurrentObjectiveInstance() != null) + { + localText = localText.replace("$d", String.valueOf(colonyQuest.getCurrentObjectiveInstance().getMissingQuantity())); + } + return Component.literal(localText); + } + + @Override + public boolean isVisible(final Level world) + { + return !finished; + } + + @Override + public List getPossibleResponses() + { + return currentElement == null ? Collections.emptyList() : currentElement.getOptions().stream().map(this::processText).collect(Collectors.toList()); + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag tag = super.serializeNBT(); + tag.putString(TAG_QUEST_ID, questId.toString()); + tag.putInt(TAG_QUEST_INDEX, index); + tag.putBoolean(TAG_FINISHED, finished); + return tag; + } + + @Override + public void deserializeNBT(final @NotNull CompoundTag compoundNBT) + { + super.deserializeNBT(compoundNBT); + this.questId = new ResourceLocation(compoundNBT.getString(TAG_QUEST_ID)); + this.index = compoundNBT.getInt(TAG_QUEST_INDEX); + this.currentElement = ((DialogueObjectiveTemplateTemplate) IQuestManager.GLOBAL_SERVER_QUESTS.get(questId).getObjective(index)).getDialogueTree(); + this.startElement = currentElement; + this.finished = compoundNBT.getBoolean(TAG_FINISHED); + } + + @Override + public String getType() + { + return QUEST.getPath(); + } + + @Override + public ResourceLocation getInteractionIcon() + { + if (colonyQuest == null) + { + colonyQuest = citizen.getColony().getQuestManager().getAvailableOrInProgressQuest(questId); + } + + if (colonyQuest != null && colonyQuest.getCurrentObjectiveInstance() != null && !colonyQuest.getCurrentObjectiveInstance().isFulfilled()) + { + return QUEST_WAITING_TASK_ICON; + } + return index == 0 ? QUEST_START_ICON : QUEST_NEXT_TASK_ICON; + } + + @Override + public boolean isValid(final ICitizenData citizen) + { + return currentElement != null && citizen.isParticipantOfQuest(questId) && citizen.getColony().getQuestManager().getAvailableOrInProgressQuest(questId) != null && citizen.getColony().getQuestManager().getAvailableOrInProgressQuest(questId).getObjectiveIndex() == index; + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RecruitmentInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RecruitmentInteraction.java index fd73a37206b..a147dd048a6 100644 --- a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RecruitmentInteraction.java +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RecruitmentInteraction.java @@ -7,6 +7,7 @@ import com.ldtteam.blockui.views.Box; import com.ldtteam.blockui.views.BOWindow; import com.minecolonies.api.colony.*; +import com.minecolonies.api.colony.citizens.event.CitizenAddedEvent; import com.minecolonies.api.colony.interactionhandling.IChatPriority; import com.minecolonies.api.colony.interactionhandling.IInteractionResponseHandler; import com.minecolonies.api.colony.interactionhandling.ModInteractionResponseHandlers; @@ -21,9 +22,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.items.wrapper.InvWrapper; import java.util.Collections; @@ -95,7 +96,7 @@ public void onWindowOpened(final BOWindow window, final ICitizenDataView dataVie if (recruitButton != null && dataView instanceof IVisitorViewData) { final ItemStack recruitCost = ((IVisitorViewData) dataView).getRecruitCost(); - final IColonyView colony = ((IVisitorViewData) dataView).getColonyView(); + final IColonyView colony = (IColonyView) dataView.getColony(); window.findPaneOfTypeByID(CHAT_LABEL_ID, Text.class).setText(PaneBuilders.textBuilder() .append(Component.literal(dataView.getName() + ": ")) @@ -122,15 +123,16 @@ public void onWindowOpened(final BOWindow window, final ICitizenDataView dataVie @Override @OnlyIn(Dist.CLIENT) - public boolean onClientResponseTriggered(final Component response, final Player player, final ICitizenDataView data, final BOWindow window) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) { + final Component response = getPossibleResponses().get(responseId); // Validate recruitment before returning true if (response.equals(recruitAnswer.getA()) && data instanceof IVisitorViewData) { if (player.isCreative() || InventoryUtils.getItemCountInItemHandler(new InvWrapper(player.getInventory()), ((IVisitorViewData) data).getRecruitCost().getItem()) >= ((IVisitorViewData) data).getRecruitCost().getCount()) { - return super.onClientResponseTriggered(response, player, data, window); + return super.onClientResponseTriggered(responseId, player, data, window); } else { @@ -141,8 +143,9 @@ public boolean onClientResponseTriggered(final Component response, final Player } @Override - public void onServerResponseTriggered(final Component response, final Player player, final ICitizenData data) + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) { + final Component response = getPossibleResponses().get(responseId); if (response.equals(recruitAnswer.getA()) && data instanceof IVisitorData) { IColony colony = data.getColony(); @@ -154,7 +157,6 @@ public void onServerResponseTriggered(final Component response, final Player pla { // Recruits visitor as new citizen and respawns entity colony.getVisitorManager().removeCivilian(data); - data.setWorkBuilding(null); data.setHomeBuilding(null); data.setJob(null); @@ -181,6 +183,8 @@ public void onServerResponseTriggered(final Component response, final Player pla { MessageUtils.format(MESSAGE_RECRUITMENT_SUCCESS, data.getName()).sendTo(colony).forAllPlayers(); } + + MinecraftForge.EVENT_BUS.post(new CitizenAddedEvent(newCitizen, CitizenAddedEvent.Source.HIRED)); } } else diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RequestBasedInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RequestBasedInteraction.java index d5d8df906ab..4d132d6066d 100644 --- a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RequestBasedInteraction.java +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/RequestBasedInteraction.java @@ -13,10 +13,10 @@ import com.minecolonies.coremod.client.gui.WindowRequestDetail; import com.minecolonies.coremod.client.gui.citizen.RequestWindowCitizen; import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.entity.player.Player; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; @@ -164,9 +164,9 @@ public void onWindowOpened(final BOWindow window, final ICitizenDataView dataVie @Override @OnlyIn(Dist.CLIENT) - public boolean onClientResponseTriggered(final Component response, final Player player, final ICitizenDataView data, final BOWindow window) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) { - if (response.equals(Component.translatable("com.minecolonies.coremod.gui.chat.fulfill"))) + if (((TranslatableContents) getPossibleResponses().get(responseId).getContents()).getKey().equals("com.minecolonies.coremod.gui.chat.fulfill")) { final IColony colony = IColonyManager.getInstance().getColonyView(data.getColonyId(), player.level.dimension()); @@ -188,15 +188,16 @@ public boolean onClientResponseTriggered(final Component response, final Player } else { - return super.onClientResponseTriggered(response, player, data, window); + return super.onClientResponseTriggered(responseId, player, data, window); } return true; } @Override - public void onServerResponseTriggered(final Component response, final Player player, final ICitizenData data) + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) { - super.onServerResponseTriggered(response, player, data); + super.onServerResponseTriggered(responseId, player, data); + final Component response = getPossibleResponses().get(responseId); if (response.equals(Component.translatable("com.minecolonies.coremod.gui.chat.cancel")) && data.getColony() != null) { data.getColony().getRequestManager().updateRequestState(token, RequestState.CANCELLED); diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/ServerCitizenInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/ServerCitizenInteraction.java index eaa72dbb425..9fc976a87a7 100644 --- a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/ServerCitizenInteraction.java +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/ServerCitizenInteraction.java @@ -17,7 +17,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -29,6 +28,8 @@ import java.util.function.Predicate; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; +import static com.minecolonies.coremod.colony.interactionhandling.StandardInteraction.INTERACTION_R_IGNORE; +import static com.minecolonies.coremod.colony.interactionhandling.StandardInteraction.INTERACTION_R_REMIND; /** * The server side interaction response handler. @@ -127,15 +128,26 @@ public void removeParent(final Component oldParent) } @Override - public void onServerResponseTriggered(final Component response, final Player player, final ICitizenData data) + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) + { + final Component response = getPossibleResponses().get(responseId); + tryHandleIgnoreResponse(response, player); + } + + /** + * Check if the response was an ignore response. + * @param response the response to compare. + * @param player the player that triggered it. + */ + private void tryHandleIgnoreResponse(final Component response, final Player player) { if (response.getContents() instanceof TranslatableContents) { - if (((TranslatableContents) response.getContents()).getKey().equals("com.minecolonies.coremod.gui.chat.remindmelater")) + if (((TranslatableContents) response.getContents()).getKey().equals(INTERACTION_R_REMIND)) { displayAtWorldTick = (int) (player.level.getGameTime() + (TICKS_SECOND * 60 * 10)); } - else if (((TranslatableContents) response.getContents()).getKey().equals("com.minecolonies.coremod.gui.chat.ignore")) + else if (((TranslatableContents) response.getContents()).getKey().equals(INTERACTION_R_IGNORE)) { displayAtWorldTick = (int) (player.level.getGameTime() + (TICKS_SECOND * 60 * 20)); } @@ -144,15 +156,17 @@ else if (((TranslatableContents) response.getContents()).getKey().equals("com.mi @Override @OnlyIn(Dist.CLIENT) - public boolean onClientResponseTriggered(final Component response, final Player player, final ICitizenDataView data, final BOWindow window) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) { - if (((TranslatableContents) response.getContents()).getKey().equals("com.minecolonies.coremod.gui.chat.skipchitchat")) + final Component response = getPossibleResponses().get(responseId); + tryHandleIgnoreResponse(response, player); + if (((TranslatableContents) getPossibleResponses().get(responseId).getContents()).getKey().equals("com.minecolonies.coremod.gui.chat.skipchitchat")) { final MainWindowCitizen windowCitizen = new MainWindowCitizen(data); windowCitizen.open(); } - Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), this.getInquiry(), response)); + Network.getNetwork().sendToServer(new InteractionResponse(data.getColonyId(), data.getId(), player.level.dimension(), this.getInquiry(), responseId)); return true; } @@ -195,4 +209,10 @@ protected void loadValidator() { this.validator = InteractionValidatorRegistry.getStandardInteractionValidatorPredicate(validatorId); } + + @Override + public Component getId() + { + return getInquiry(); + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/SimpleNotificationInteraction.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/SimpleNotificationInteraction.java index f42e0fdb324..5f7776316bf 100644 --- a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/SimpleNotificationInteraction.java +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/SimpleNotificationInteraction.java @@ -7,7 +7,6 @@ import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.entity.player.Player; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -31,27 +30,28 @@ public SimpleNotificationInteraction( } @Override - public void onServerResponseTriggered(final Component response, final Player player, final ICitizenData data) + public void onServerResponseTriggered(final int responseId, final Player player, final ICitizenData data) { - super.onServerResponseTriggered(response, player, data); - onResponse(response); + super.onServerResponseTriggered(responseId, player, data); + onResponse(responseId); } @Override @OnlyIn(Dist.CLIENT) - public boolean onClientResponseTriggered(final Component response, final Player player, final ICitizenDataView data, final BOWindow window) + public boolean onClientResponseTriggered(final int responseId, final Player player, final ICitizenDataView data, final BOWindow window) { - onResponse(response); - return super.onClientResponseTriggered(response, player, data, window); + onResponse(responseId); + return super.onClientResponseTriggered(responseId, player, data, window); } /** * Removes the interaction after a response * - * @param response response + * @param responseId response */ - private void onResponse(final Component response) + private void onResponse(final int responseId) { + final Component response = getPossibleResponses().get(responseId); if (response.getContents() instanceof TranslatableContents) { if (((TranslatableContents) response.getContents()).getKey().equals(INTERACTION_R_OKAY) diff --git a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/registry/InteractionResponseHandlerManager.java b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/registry/InteractionResponseHandlerManager.java index 3e7f76fceb1..3bf95fcf0a4 100755 --- a/src/main/java/com/minecolonies/coremod/colony/interactionhandling/registry/InteractionResponseHandlerManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/interactionhandling/registry/InteractionResponseHandlerManager.java @@ -22,7 +22,7 @@ public final class InteractionResponseHandlerManager implements IInteractionResp public IInteractionResponseHandler createFrom(@NotNull final ICitizen citizen, @NotNull final CompoundTag compound) { final ResourceLocation handlerType = - compound.getAllKeys().contains(NbtTagConstants.TAG_HANDLER_TYPE) + compound.contains(NbtTagConstants.TAG_HANDLER_TYPE) ? new ResourceLocation(Constants.MOD_ID, compound.getString(NbtTagConstants.TAG_HANDLER_TYPE)) : ModInteractionResponseHandlers.STANDARD; final IInteractionResponseHandler handler = IInteractionResponseHandlerRegistry.getInstance().getValue(handlerType).getProducer().apply(citizen); diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJob.java b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJob.java index 8bc2d471dee..9db7644ef45 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJob.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJob.java @@ -3,29 +3,29 @@ import com.minecolonies.api.client.render.modeltype.ModModelTypes; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.modules.IAssignsJob; import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.colony.jobs.registry.IJobRegistry; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.colony.requestsystem.token.IToken; +import com.minecolonies.api.entity.ai.ITickingStateAI; import com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.Log; import com.minecolonies.api.util.NBTUtils; import com.minecolonies.coremod.entity.ai.basic.AbstractAISkeleton; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.goal.GoalSelector; -import net.minecraft.world.item.ItemStack; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageSource; - -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.lang.ref.WeakReference; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -40,10 +40,11 @@ * apply because We are only mapping classes and that is reasonable */ @SuppressWarnings(CLASSES_SHOULD_NOT_ACCESS_STATIC_MEMBERS_OF_THEIR_OWN_SUBCLASSES_DURING_INITIALIZATION) -public abstract class AbstractJob, J extends AbstractJob> implements IJob +public abstract class AbstractJob & ITickingStateAI, J extends AbstractJob> implements IJob { private static final String TAG_ASYNC_REQUESTS = "asyncRequests"; private static final String TAG_ACTIONS_DONE = "actionsDone"; + private static final String TAG_WORK_POS = "workPos"; /** * Job associated to the abstract job. @@ -55,11 +56,6 @@ public abstract class AbstractJob, J extends Ab */ private int actionsDone = 0; - /** - * The priority assigned with every main AI job. - */ - private static final int TASK_PRIORITY = 4; - /** * Citizen connected with the job. */ @@ -81,9 +77,19 @@ public abstract class AbstractJob, J extends Ab private boolean searchedForFoodToday; /** - * The workerAI for this Job + * Position of the work building + */ + protected BlockPos workBuildingPos = null; + + /** + * The work building + */ + protected IBuilding workBuilding = null; + + /** + * The work module we're assigned to */ - private WeakReference workerAI = new WeakReference<>(null); + protected IAssignsJob workModule = null; /** * Initialize citizen data. @@ -119,6 +125,51 @@ public void setRegistryEntry(final JobEntry jobEntry) this.entry = jobEntry; } + @Override + public BlockPos getBuildingPos() + { + return workBuildingPos; + } + + @Override + public IBuilding getWorkBuilding() + { + return workBuilding; + } + + @Override + public IAssignsJob getWorkModule() + { + return workModule; + } + + @Override + public boolean assignTo(final IAssignsJob module) + { + if (module == null || !module.getJobEntry().equals(getJobRegistryEntry())) + { + return false; + } + + if (workBuilding != null && workBuilding != module.getBuilding()) + { + for(final IAssignsJob oldJobModule : workBuilding.getModules(IAssignsJob.class)) + { + if (oldJobModule.hasAssignedCitizen(citizen)) + { + oldJobModule.removeCitizen(citizen); + } + } + } + + workBuilding = module.getBuilding(); + workBuildingPos = workBuilding.getID(); + workModule = module; + + citizen.setJob(this); + return true; + } + @Override final public JobEntry getJobRegistryEntry() { @@ -138,6 +189,11 @@ public CompoundTag serializeNBT() .collect(NBTUtils.toListNBT())); compound.putInt(TAG_ACTIONS_DONE, actionsDone); + if (workBuildingPos != null) + { + BlockPosUtil.write(compound, TAG_WORK_POS, workBuildingPos); + } + return compound; } @@ -145,17 +201,22 @@ public CompoundTag serializeNBT() public void deserializeNBT(final CompoundTag compound) { this.asyncRequests.clear(); - if (compound.getAllKeys().contains(TAG_ASYNC_REQUESTS)) + if (compound.contains(TAG_ASYNC_REQUESTS)) { this.asyncRequests.addAll(NBTUtils.streamCompound(compound.getList(TAG_ASYNC_REQUESTS, Tag.TAG_COMPOUND)) - .map(StandardFactoryController.getInstance()::deserialize) - .map(o -> (IToken) o) - .collect(Collectors.toSet())); + .map(StandardFactoryController.getInstance()::deserialize) + .map(o -> (IToken) o) + .collect(Collectors.toSet())); } - if (compound.getAllKeys().contains(TAG_ACTIONS_DONE)) + if (compound.contains(TAG_ACTIONS_DONE)) { actionsDone = compound.getInt(TAG_ACTIONS_DONE); } + + if (compound.contains(TAG_WORK_POS)) + { + workBuildingPos = BlockPosUtil.read(compound,TAG_WORK_POS); + } } @Override @@ -188,7 +249,7 @@ public void markRequestSync(final IToken id) } @Override - public void addWorkerAIToTaskList(@NotNull final GoalSelector tasks) + public void createAI() { final AI tempAI = generateAI(); @@ -208,9 +269,7 @@ public void addWorkerAIToTaskList(@NotNull final GoalSelector tasks) return; } - tasks.availableGoals.stream().filter(goal -> goal.getGoal() instanceof AbstractAISkeleton).forEach(goal -> tasks.removeGoal(goal.getGoal())); - workerAI = new WeakReference<>(tempAI); - tasks.addGoal(TASK_PRIORITY, tempAI); + citizen.getEntity().get().getCitizenJobHandler().setWorkAI(tempAI); } @Override @@ -277,7 +336,12 @@ public void onWakeUp() @Override public boolean canAIBeInterrupted() { - return (workerAI.get() != null && workerAI.get().canBeInterrupted()); + if (getWorkerAI() != null) + { + return getWorkerAI().canBeInterrupted(); + } + + return true; } @Override @@ -305,24 +369,28 @@ public void clearActionsDone() } @Override - @Nullable public AI getWorkerAI() { - return workerAI.get(); + if (citizen.getEntity().isPresent()) + { + return (AI) citizen.getEntity().get().getCitizenJobHandler().getWorkAI(); + } + + return null; } @Override public boolean isIdling() { - return (workerAI.get() != null && workerAI.get().getState() == AIWorkerState.IDLE); + return (getWorkerAI() != null && getWorkerAI().getState() == AIWorkerState.IDLE); } @Override public void resetAI() { - if (workerAI.get() != null) + if (getWorkerAI() != null) { - workerAI.get().resetAI(); + getWorkerAI().resetAI(); } } @@ -341,10 +409,26 @@ public int getDiseaseModifier() @Override public void onRemoval() { - if (workerAI.get() != null) + citizen.setJob(null); + + if (getWorkerAI() != null) { - workerAI.get().onRemoval(); + getWorkerAI().onRemoval(); } + + if (workBuilding != null) + { + for(final IAssignsJob oldJobModule : workBuilding.getModules(IAssignsJob.class)) + { + if (oldJobModule.hasAssignedCitizen(citizen)) + { + oldJobModule.removeCitizen(citizen); + } + } + } + + workBuilding = null; + workModule = null; } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobCrafter.java b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobCrafter.java index 8b9aa475960..52f42616660 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobCrafter.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobCrafter.java @@ -116,7 +116,7 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)) + if (compound.contains(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)) { rsDataStoreToken = StandardFactoryController.getInstance() .deserialize(compound.getCompound(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)); @@ -126,17 +126,17 @@ public void deserializeNBT(final CompoundTag compound) setupRsDataStore(); } - if (compound.getAllKeys().contains(NbtTagConstants.TAG_PROGRESS)) + if (compound.contains(NbtTagConstants.TAG_PROGRESS)) { this.progress = compound.getInt(NbtTagConstants.TAG_PROGRESS); } - if (compound.getAllKeys().contains(NbtTagConstants.TAG_MAX_COUNTER)) + if (compound.contains(NbtTagConstants.TAG_MAX_COUNTER)) { this.progress = compound.getInt(NbtTagConstants.TAG_MAX_COUNTER); } - if (compound.getAllKeys().contains(NbtTagConstants.TAG_CRAFT_COUNTER)) + if (compound.contains(NbtTagConstants.TAG_CRAFT_COUNTER)) { this.progress = compound.getInt(NbtTagConstants.TAG_CRAFT_COUNTER); } @@ -338,6 +338,7 @@ public void setProgress(final int progress) @Override public void onRemoval() { + super.onRemoval(); cancelAssignedRequests(); getColony().getRequestManager().getDataStoreManager().remove(this.rsDataStoreToken); } diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobStructure.java b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobStructure.java index 8aeb4de2cfe..9f85878e7c4 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobStructure.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/AbstractJobStructure.java @@ -6,6 +6,7 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.workorders.IWorkOrder; +import com.minecolonies.api.util.Log; import com.minecolonies.api.util.Utils; import com.minecolonies.api.util.constant.NbtTagConstants; import com.minecolonies.coremod.colony.buildings.AbstractBuildingStructureBuilder; @@ -119,7 +120,7 @@ public CompoundTag serializeNBT() public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_WORK_ORDER)) + if (compound.contains(TAG_WORK_ORDER)) { workOrderId = compound.getInt(TAG_WORK_ORDER); } @@ -155,7 +156,14 @@ public void complete() tagData.putString(TAG_NAME, location); tagData.putString(NbtTagConstants.TAG_PACK, blueprint.getPackName()); - ((IBlueprintDataProviderBE) te).readSchematicDataFromNBT(compoundNBT); + try + { + ((IBlueprintDataProviderBE) te).readSchematicDataFromNBT(compoundNBT); + } + catch (final Exception e) + { + Log.getLogger().warn("Broken deco-controller at: " + x + " " + y + " " + z); + } ((ServerLevel) getColony().getWorld()).getChunkSource().blockChanged(tePos); te.setChanged(); } diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/JobDeliveryman.java b/src/main/java/com/minecolonies/coremod/colony/jobs/JobDeliveryman.java index 6082d600e1f..42f84f8c5ee 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/JobDeliveryman.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/JobDeliveryman.java @@ -119,7 +119,7 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)) + if (compound.contains(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)) { rsDataStoreToken = StandardFactoryController.getInstance().deserialize(compound.getCompound(NbtTagConstants.TAG_RS_DMANJOB_DATASTORE)); } @@ -359,6 +359,7 @@ private void cancelAssignedRequests() @Override public void onRemoval() { + super.onRemoval(); getCitizen().setWorking(false); try { diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/JobEnchanter.java b/src/main/java/com/minecolonies/coremod/colony/jobs/JobEnchanter.java index fd96e2d8d73..fb7a38eaea3 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/JobEnchanter.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/JobEnchanter.java @@ -65,7 +65,7 @@ public EntityAIWorkEnchanter generateAI() public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_BUILDING_TO_DRAIN)) + if (compound.contains(TAG_BUILDING_TO_DRAIN)) { this.posToDrainFrom = BlockPosUtil.read(compound, TAG_BUILDING_TO_DRAIN); } diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/JobFisherman.java b/src/main/java/com/minecolonies/coremod/colony/jobs/JobFisherman.java index bd57a3513d0..c9f8592cd8e 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/JobFisherman.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/JobFisherman.java @@ -92,14 +92,14 @@ public void deserializeNBT(final CompoundTag compound) { super.deserializeNBT(compound); - if (compound.getAllKeys().contains(TAG_WATER_POND)) + if (compound.contains(TAG_WATER_POND)) { water = new Tuple<>(BlockPosUtil.read(compound, TAG_WATER_POND), BlockPosUtil.read(compound, TAG_PARENT_POND)); } ponds = new ArrayList<>(); - if (compound.getAllKeys().contains(TAG_PONDS)) + if (compound.contains(TAG_PONDS)) { final ListTag listOfPonds = compound.getList(TAG_PONDS, Tag.TAG_COMPOUND); for (int i = 0; i < listOfPonds.size(); i++) diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/JobNetherWorker.java b/src/main/java/com/minecolonies/coremod/colony/jobs/JobNetherWorker.java index c60ad80fd2c..7ad17efd134 100644 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/JobNetherWorker.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/JobNetherWorker.java @@ -11,9 +11,12 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; +import static com.minecolonies.api.research.util.ResearchConstants.FIRE_RES; + public class JobNetherWorker extends AbstractJobCrafter { /** @@ -191,4 +194,15 @@ public boolean addProcessedResultsList(Collection newResults) { return processedResults.addAll(newResults); } + + @Override + public boolean ignoresDamage(@NotNull final DamageSource damageSource) + { + if (damageSource == DamageSource.LAVA || damageSource == DamageSource.IN_FIRE || damageSource == DamageSource.ON_FIRE) + { + return getColony().getResearchManager().getResearchEffects().getEffectStrength(FIRE_RES) > 0; + } + + return super.ignoresDamage(damageSource); + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/JobQuarrier.java b/src/main/java/com/minecolonies/coremod/colony/jobs/JobQuarrier.java index 6ded90eff98..cbb8d3721f0 100644 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/JobQuarrier.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/JobQuarrier.java @@ -4,6 +4,7 @@ import com.minecolonies.api.client.render.modeltype.ModModelTypes; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.modules.IAssignsJob; import com.minecolonies.api.colony.jobs.IJobWithExternalWorkStations; import com.minecolonies.coremod.colony.buildings.modules.QuarryModule; import com.minecolonies.coremod.entity.ai.citizen.miner.EntityAIQuarrier; @@ -75,6 +76,22 @@ public IBuilding findQuarry() return null; } + @Override + public boolean assignTo(final IAssignsJob module) + { + if (module == null || !module.getJobEntry().equals(getJobRegistryEntry())) + { + return false; + } + + if (module instanceof QuarryModule) + { + return true; + } + + return super.assignTo(module); + } + @Override public List getWorkStations() { diff --git a/src/main/java/com/minecolonies/coremod/colony/jobs/registry/JobDataManager.java b/src/main/java/com/minecolonies/coremod/colony/jobs/registry/JobDataManager.java index 42e318dbaae..f9ec618cb70 100755 --- a/src/main/java/com/minecolonies/coremod/colony/jobs/registry/JobDataManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/jobs/registry/JobDataManager.java @@ -25,7 +25,7 @@ public IJob createFrom( final ICitizenData citizen, @NotNull final CompoundTag compound) { final ResourceLocation jobType = - compound.getAllKeys().contains(NbtTagConstants.TAG_JOB_TYPE) ? new ResourceLocation(compound.getString(NbtTagConstants.TAG_JOB_TYPE)) : ModJobs.PLACEHOLDER_ID; + compound.contains(NbtTagConstants.TAG_JOB_TYPE) ? new ResourceLocation(compound.getString(NbtTagConstants.TAG_JOB_TYPE)) : ModJobs.PLACEHOLDER_ID; final IJob job = IJobRegistry.getInstance().getValue(jobType).produceJob(citizen); if (job != null) diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/CitizenManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/CitizenManager.java index 46bca646f3e..5a86df52bee 100755 --- a/src/main/java/com/minecolonies/coremod/colony/managers/CitizenManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/CitizenManager.java @@ -5,12 +5,19 @@ import com.minecolonies.api.colony.ICitizenDataManager; import com.minecolonies.api.colony.ICivilianData; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.HiringMode; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.citizens.event.CitizenAddedEvent; import com.minecolonies.api.colony.managers.interfaces.ICitizenManager; import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.entity.citizen.AbstractCivilianEntity; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.util.*; +import com.minecolonies.api.entity.citizen.happiness.IHappinessModifier; +import com.minecolonies.api.util.EntityUtils; +import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.api.util.NBTUtils; +import com.minecolonies.api.util.WorldUtil; +import com.minecolonies.api.util.constant.CitizenConstants; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.CitizenData; @@ -25,14 +32,14 @@ import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewCitizenViewMessage; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewRemoveCitizenMessage; -import net.minecraft.nbt.Tag; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.core.BlockPos; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; - +import net.minecraftforge.common.MinecraftForge; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -214,7 +221,8 @@ public void sendPackets( { if (citizen.isDirty() || !newSubscribers.isEmpty()) { - players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewCitizenViewMessage(colony, citizen), player)); + final ColonyViewCitizenViewMessage message = new ColonyViewCitizenViewMessage(colony, citizen); + players.forEach(player -> Network.getNetwork().sendToPlayer(message, player)); } } } @@ -315,7 +323,6 @@ public ICitizenData createAndRegisterCivilianData() final CitizenData citizenData = new CitizenData(topCitizenId, colony); citizenData.initForNewCivilian(); citizens.put(citizenData.getId(), citizenData); - return citizenData; } @@ -342,6 +349,9 @@ public ICitizenData resurrectCivilianData(@NotNull final CompoundTag compoundNBT citizenData.onResurrect(); citizens.put(citizenData.getId(), citizenData); spawnOrCreateCitizen(citizenData, world, spawnPos); + + MinecraftForge.EVENT_BUS.post(new CitizenAddedEvent(citizenData, CitizenAddedEvent.Source.RESURRECTED)); + return citizenData; } @@ -409,11 +419,19 @@ public void calculateMaxCitizens() } else if (b.hasModule(LivingBuildingModule.class)) { - newMaxCitizens += b.getFirstModuleOccurance(LivingBuildingModule.class).getModuleMax(); + final LivingBuildingModule module = b.getFirstModuleOccurance(LivingBuildingModule.class); + if (HiringMode.LOCKED.equals(module.getHiringMode())) + { + newMaxCitizens += module.getAssignedCitizen().size(); + } + else + { + newMaxCitizens += module.getModuleMax(); + } } } } - if (getMaxCitizens() != newMaxCitizens) + if (getMaxCitizens() != newMaxCitizens || getPotentialMaxCitizens() != potentialMax + newMaxCitizens) { setMaxCitizens(newMaxCitizens); setPotentialMaxCitizens(potentialMax + newMaxCitizens); @@ -477,9 +495,9 @@ public int getPotentialMaxCitizens() @Override public double maxCitizensFromResearch() { - if(MinecoloniesAPIProxy.getInstance().getGlobalResearchTree().hasResearchEffect(CITIZEN_CAP)) + if (MinecoloniesAPIProxy.getInstance().getGlobalResearchTree().hasResearchEffect(CITIZEN_CAP)) { - final double max = 25 + colony.getResearchManager().getResearchEffects().getEffectStrength(CITIZEN_CAP); + final int max = Math.max(CitizenConstants.CITIZEN_LIMIT_DEFAULT, (int) colony.getResearchManager().getResearchEffects().getEffectStrength(CITIZEN_CAP)); return Math.min(max, MineColonies.getConfig().getServer().maxCitizenPerColony.get()); } else @@ -512,11 +530,11 @@ public void setPotentialMaxCitizens(final int newPotentialMax) } @Override - public void updateModifier(final String id) + public void injectModifier(final IHappinessModifier modifier) { for (final ICitizenData citizenData : citizens.values()) { - citizenData.getCitizenHappinessHandler().getModifier(id).reset(); + citizenData.getCitizenHappinessHandler().addModifier(modifier); } } @@ -532,7 +550,10 @@ public void checkCitizensForHappiness() @Override public boolean tickCitizenData() { - this.getCitizens().forEach(ICitizenData::tick); + for (ICitizenData iCitizenData : this.getCitizens()) + { + iCitizenData.update(); + } return false; } @@ -582,6 +603,8 @@ else if (femaleCount < (getCitizens().size() - 1) / 2.0) spawnOrCreateCivilian(newCitizen, colony.getWorld(), null, true); + MinecraftForge.EVENT_BUS.post(new CitizenAddedEvent(newCitizen, CitizenAddedEvent.Source.INITIAL)); + colony.getEventDescriptionManager().addEventDescription(new CitizenSpawnedEvent(colony.getBuildingManager().getTownHall().getPosition(), newCitizen.getName())); } @@ -663,4 +686,15 @@ public void onWakeUp() } } } + + @Override + public void afterBuildingLoad() + { + calculateMaxCitizens(); + + for(final ICitizenData data: citizens.values()) + { + data.onBuildingLoad(); + } + } } diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/ColonyPackageManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/ColonyPackageManager.java index b044eb89932..bd686b1a32f 100755 --- a/src/main/java/com/minecolonies/coremod/colony/managers/ColonyPackageManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/ColonyPackageManager.java @@ -4,6 +4,7 @@ import com.minecolonies.api.colony.managers.interfaces.IColonyPackageManager; import com.minecolonies.api.colony.workorders.IWorkManager; import com.minecolonies.api.colony.workorders.IWorkOrder; +import com.minecolonies.api.util.WorldUtil; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.Colony; import com.minecolonies.coremod.colony.ColonyView; @@ -12,17 +13,17 @@ import com.minecolonies.coremod.network.messages.client.colony.ColonyViewMessage; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewWorkOrderMessage; import io.netty.buffer.Unpooled; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; import org.jetbrains.annotations.NotNull; import java.util.*; +import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; import static com.minecolonies.api.util.constant.ColonyConstants.UPDATE_STATE_INTERVAL; import static com.minecolonies.api.util.constant.Constants.TICKS_HOUR; -import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; public class ColonyPackageManager implements IColonyPackageManager { @@ -113,7 +114,7 @@ private void updateClosePlayers() { final ServerPlayer player = iterator.next(); - if (colony.getWorld() != player.level) + if (!player.isAlive() || colony.getWorld() != player.level || !WorldUtil.isChunkLoaded(player.level, player.chunkPosition().x, player.chunkPosition().z)) { iterator.remove(); continue; @@ -187,6 +188,7 @@ public void updateColonyViews() colony.getCitizenManager().sendPackets(closeSubscribers, newSubscribers); colony.getVisitorManager().sendPackets(closeSubscribers, newSubscribers); colony.getBuildingManager().sendPackets(closeSubscribers, newSubscribers); + colony.getResearchManager().sendPackets(closeSubscribers, newSubscribers); } if (newSubscribers.isEmpty()) @@ -196,6 +198,8 @@ public void updateColonyViews() colony.getPermissions().clearDirty(); colony.getBuildingManager().clearDirty(); colony.getCitizenManager().clearDirty(); + colony.getVisitorManager().clearDirty(); + colony.getResearchManager().clearDirty(); newSubscribers = new HashSet<>(); } @@ -213,7 +217,12 @@ public void sendColonyViewPackets() } players.addAll(newSubscribers); - players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewMessage(colony, colonyFriendlyByteBuf, newSubscribers.contains(player)), player)); + final ColonyViewMessage message = new ColonyViewMessage(colony, colonyFriendlyByteBuf); + for (ServerPlayer player : players) + { + message.setIsNewSubscription(newSubscribers.contains(player)); + Network.getNetwork().sendToPlayer(message, player); + } } colony.getRequestManager().setDirty(false); } @@ -246,7 +255,8 @@ public void sendWorkOrderPackets() players.addAll(newSubscribers); List workOrders = new ArrayList<>(workManager.getWorkOrders().values()); - players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewWorkOrderMessage(colony, workOrders), player)); + final ColonyViewWorkOrderMessage message = new ColonyViewWorkOrderMessage(colony, workOrders); + players.forEach(player -> Network.getNetwork().sendToPlayer(message, player)); workManager.setDirty(false); } @@ -265,6 +275,7 @@ public void addCloseSubscriber(@NotNull final ServerPlayer subscriber) { closeSubscribers.add(subscriber); newSubscribers.add(subscriber); + updateColonyViews(); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/EventStructureManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/EventStructureManager.java index 308b6c5ccce..b5ac43e539d 100755 --- a/src/main/java/com/minecolonies/coremod/colony/managers/EventStructureManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/EventStructureManager.java @@ -139,6 +139,13 @@ public void loadBackupForEvent(final int eventID) ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(STRUCTURE_BACKUP_FOLDER, backupPath), colony.getWorld(), (blueprint -> { + + if (blueprint == null) + { + Log.getLogger().info("Minor issue: Failed to restore backup" + backupPath.toString()); + return; + } + final IStructureHandler structure = new CreativeStructureHandler(colony.getWorld(), entry.getKey(), blueprint, new PlacementSettings(Mirror.NONE, Rotation.NONE), true); Manager.addToQueue(new TickedWorldOperation(new StructurePlacer(structure), null)); diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/GraveManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/GraveManager.java index 7d7907f22b8..6572831393c 100644 --- a/src/main/java/com/minecolonies/coremod/colony/managers/GraveManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/GraveManager.java @@ -18,6 +18,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.AirBlock; import net.minecraft.world.level.block.Blocks; @@ -266,7 +268,7 @@ public void createCitizenGrave(final Level world, final BlockPos pos, final ICit { if (world.getBlockState(pos.above(i)).getBlock() instanceof AirBlock) { - firstValidPosition = BlockPosUtil.findAround(world, pos, 16, 1, + firstValidPosition = BlockPosUtil.findAround(world, pos, 1, 16, (blockAccess, current) -> blockAccess.getBlockState(current).getMaterial() == Material.AIR && blockAccess.getBlockState(current.below()).getMaterial().isSolid()); @@ -297,6 +299,15 @@ public void createCitizenGrave(final Level world, final BlockPos pos, final ICit { InventoryUtils.dropItemHandler(citizenData.getInventory(), world, pos.getX(), pos.getY(), pos.getZ()); } + for (final EquipmentSlot equipmentSlot : EquipmentSlot.values()) + { + final ItemStack stack = citizenData.getInventory().getArmorInSlot(equipmentSlot); + if (!InventoryUtils.addItemStackToItemHandler(graveEntity.getInventory(), stack)) + { + InventoryUtils.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), stack); + } + } + graveEntity.delayDecayTimer(colony.getResearchManager().getResearchEffects().getEffectStrength(GRAVE_DECAY_BONUS)); diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/RaidManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/RaidManager.java index 249515cdcfd..79a92f696a5 100755 --- a/src/main/java/com/minecolonies/coremod/colony/managers/RaidManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/RaidManager.java @@ -3,11 +3,14 @@ import com.minecolonies.api.MinecoloniesAPIProxy; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyTagCapability; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.colonyEvents.EventStatus; import com.minecolonies.api.colony.colonyEvents.IColonyEvent; import com.minecolonies.api.colony.colonyEvents.IColonyRaidEvent; import com.minecolonies.api.colony.managers.interfaces.IRaiderManager; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.Log; @@ -30,29 +33,33 @@ import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipBasedRaiderUtils; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipSize; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; +import com.minecolonies.coremod.entity.ai.citizen.guard.AbstractEntityAIGuard; import com.minecolonies.coremod.entity.pathfinding.Pathfinding; import com.minecolonies.coremod.entity.pathfinding.pathjobs.PathJobRaiderPathing; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; - +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BiomeTags; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import java.util.*; +import java.util.stream.Collectors; +import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; import static com.minecolonies.api.util.BlockPosUtil.DOUBLE_AIR_POS_SELECTOR; import static com.minecolonies.api.util.BlockPosUtil.SOLID_AIR_POS_SELECTOR; import static com.minecolonies.api.util.constant.ColonyConstants.BIG_HORDE_SIZE; import static com.minecolonies.api.util.constant.Constants.DEFAULT_BARBARIAN_DIFFICULTY; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_NIGHTS_SINCE_LAST_RAID; -import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_RAIDABLE; +import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; /** * Handles spawning hostile raid events. @@ -69,13 +76,6 @@ public class RaidManager implements IRaiderManager */ private static final int MIN_BUILDING_SPAWN_DIST = 35; - /** - * Different biome ids. - */ - private static final String DESERT_BIOME_ID = "desert"; - private static final String JUNGLE_BIOME_ID = "jungle"; - private static final String TAIGA_BIOME_ID = "taiga"; - /** * Thresholds for reducing or increasing raid difficulty */ @@ -104,16 +104,6 @@ public class RaidManager implements IRaiderManager */ private static final int MIN_REQUIRED_RAIDLEVEL = 75; - /** - * Minimum block sqdistance to colony center allowed to spawn - */ - private static final int MIN_RAID_BLOCK_DIST_CENTER_SQ = 5 * 5 * 16 * 16; - - /** - * How many chunks distance a raid span searches additionally - */ - private final static int RAID_SPAWN_SEARCH_CHUNKS = 10; - /** * Percentage increased amount of spawns per player */ @@ -159,11 +149,6 @@ public class RaidManager implements IRaiderManager */ private int nightsSinceLastRaid = INITIAL_NIGHTS_SINCE_LAST_RAID; - /** - * Last raider spawnpoints. - */ - private final List lastSpawnPoints = new ArrayList<>(); - /** * The colony of the manager. */ @@ -189,11 +174,6 @@ public class RaidManager implements IRaiderManager */ private static final int INITIAL_LOST_CITIZENS = 0; - /** - * The amount of citizens lost in a raid, two for normal citizens one for guards - */ - private int lostCitizens = INITIAL_LOST_CITIZENS; - /** * The initial next raid type */ @@ -204,6 +184,21 @@ public class RaidManager implements IRaiderManager */ private String nextForcedType = INITIAL_NEXT_RAID_TYPE; + /** + * List which keeps track of raid historical data + */ + private List raidHistories = new ArrayList<>(); + + /** + * If ships will be allowed or not. + */ + private boolean allowShips = true; + + /** + * Passing through raid timer. + */ + private long passingThroughRaidTime = 0; + /** * Creates the RaidManager for a colony. * @@ -233,22 +228,11 @@ public void setCanHaveRaiderEvents(final boolean canHave) } @Override - public void addRaiderSpawnPoint(final BlockPos pos) - { - lastSpawnPoints.add(pos); - } - - @Override - public void setRaidNextNight(final boolean willRaid) + public void setRaidNextNight(final boolean willRaid, final String raidType, final boolean allowShips) { this.raidTonight = willRaid; - } - - @Override - public void setRaidNextNight(final boolean willRaid, final String raidType) - { - this.raidTonight = true; this.nextForcedType = raidType; + this.allowShips = allowShips; } @Override @@ -270,22 +254,26 @@ public void setSpiesEnabled(final boolean enabled) @Override public void raiderEvent() { - raiderEvent(""); + raiderEvent("", false); } @Override - public void raiderEvent(String raidType) + public RaidSpawnResult raiderEvent(String raidType, final boolean overrideConfig, final boolean allowShips) { - if (colony.getWorld() == null || !canRaid() || raidType == null) + if (colony.getWorld() == null || raidType == null) { - return; + return RaidSpawnResult.ERROR; + } + else if (!canRaid(overrideConfig)) + { + return RaidSpawnResult.CANNOT_RAID; } final int raidLevel = getColonyRaidLevel(); int amount = calculateRaiderAmount(raidLevel); if (amount <= 0 || raidLevel < MIN_REQUIRED_RAIDLEVEL) { - return; + return RaidSpawnResult.TOO_SMALL; } // Splits into multiple raids if too large @@ -307,22 +295,26 @@ public void raiderEvent(String raidType) if (spawnPoints.isEmpty()) { - return; + return RaidSpawnResult.NO_SPAWN_POINT; } + raidHistories.add(new RaidHistory(amount, colony.getWorld().getGameTime())); nightsSinceLastRaid = 0; raidTonight = false; amount = (int) Math.ceil((float) amount / spawnPoints.size()); for (final BlockPos targetSpawnPoint : spawnPoints) { + IColonyRaidEvent raidEvent = null; + if (MineColonies.getConfig().getServer().enableInDevelopmentFeatures.get()) { MessageUtils.format(Component.literal("Horde Spawn Point: " + targetSpawnPoint)).sendTo(colony).forAllPlayers(); } - if (colony.getWorld().getBlockState(targetSpawnPoint).getMaterial() == Material.AIR - && colony.getWorld().getBlockState(targetSpawnPoint.below()).getMaterial() == Material.AIR) + if (MineColonies.getConfig().getServer().skyRaiders.get() && + colony.getWorld().getBlockState(targetSpawnPoint).isAir() + && colony.getWorld().getBlockState(targetSpawnPoint.below()).isAir()) { raidType = PirateRaidEvent.PIRATE_RAID_EVENT_TYPE_ID.getPath(); } @@ -331,22 +323,19 @@ public void raiderEvent(String raidType) final int shipRotation = colony.getWorld().random.nextInt(4); final Holder biome = colony.getWorld().getBiome(colony.getCenter()); final int rand = colony.getWorld().random.nextInt(100); - if ((raidType.isEmpty() && (biome.is(BiomeTags.IS_TAIGA) || rand < IGNORE_BIOME_CHANCE) + if (allowShips && (raidType.isEmpty() && (biome.is(BiomeTags.IS_TAIGA) || rand < IGNORE_BIOME_CHANCE) || raidType.equals(NorsemenRaidEvent.NORSEMEN_RAID_EVENT_TYPE_ID.getPath())) - && ShipBasedRaiderUtils.canSpawnShipAt(colony, - targetSpawnPoint, - amount, - shipRotation, - NorsemenShipRaidEvent.SHIP_NAME)) + && ShipBasedRaiderUtils.canSpawnShipAt(colony, targetSpawnPoint, amount, shipRotation, NorsemenShipRaidEvent.SHIP_NAME)) { final NorsemenShipRaidEvent event = new NorsemenShipRaidEvent(colony); event.setSpawnPoint(targetSpawnPoint); event.setShipSize(ShipSize.getShipForRaiderAmount(amount)); event.setShipRotation(shipRotation); event.setSpawnPath(createSpawnPath(targetSpawnPoint)); + raidEvent = event; colony.getEventManager().addEvent(event); } - else if (ShipBasedRaiderUtils.canSpawnShipAt(colony, targetSpawnPoint, amount, shipRotation, PirateRaidEvent.SHIP_NAME) + else if (allowShips && ShipBasedRaiderUtils.canSpawnShipAt(colony, targetSpawnPoint, amount, shipRotation, PirateRaidEvent.SHIP_NAME) && (raidType.isEmpty() || raidType.equals(PirateRaidEvent.PIRATE_RAID_EVENT_TYPE_ID.getPath()))) { final PirateRaidEvent event = new PirateRaidEvent(colony); @@ -354,6 +343,7 @@ else if (ShipBasedRaiderUtils.canSpawnShipAt(colony, targetSpawnPoint, amount, s event.setShipSize(ShipSize.getShipForRaiderAmount(amount)); event.setShipRotation(shipRotation); event.setSpawnPath(createSpawnPath(targetSpawnPoint)); + raidEvent = event; colony.getEventManager().addEvent(event); } else @@ -364,8 +354,8 @@ else if (ShipBasedRaiderUtils.canSpawnShipAt(colony, targetSpawnPoint, amount, s { event = new EgyptianRaidEvent(colony); } - else if (((biome.is(BiomeTags.IS_JUNGLE) || (rand > IGNORE_BIOME_CHANCE * 2 && rand < IGNORE_BIOME_CHANCE * 3) - && raidType.isEmpty())) || (raidType.equals(AmazonRaidEvent.AMAZON_RAID_EVENT_TYPE_ID.getPath()))) + else if (((biome.is(BiomeTags.IS_JUNGLE) || (rand > IGNORE_BIOME_CHANCE * 2 && rand < IGNORE_BIOME_CHANCE * 3)) + && raidType.isEmpty()) || (raidType.equals(AmazonRaidEvent.AMAZON_RAID_EVENT_TYPE_ID.getPath()))) { event = new AmazonRaidEvent(colony); } @@ -387,12 +377,14 @@ else if (raidType.equals(PirateRaidEvent.PIRATE_RAID_EVENT_TYPE_ID.getPath())) event.setHorde(new Horde(amount)); event.setSpawnPath(createSpawnPath(targetSpawnPoint)); + raidEvent = event; colony.getEventManager().addEvent(event); } - addRaiderSpawnPoint(targetSpawnPoint); + raidHistories.get(raidHistories.size() - 1).spawnData.add(new RaidSpawnInfo(raidEvent.getEventTypeID(), targetSpawnPoint)); } colony.markDirty(); + return RaidSpawnResult.SUCCESS; } /** @@ -453,13 +445,22 @@ public BlockPos calculateSpawnLocation() return null; } + BlockPos worldSpawnPos = null; // 8 Tries for (int i = 0; i < 8; i++) { spawnPos = findSpawnPointInDirections(new BlockPos(closestBuilding.getX(), calcCenter.getY(), closestBuilding.getZ()), advanceTowards); if (spawnPos != null) { - break; + worldSpawnPos = BlockPosUtil.findAround(colony.getWorld(), + BlockPosUtil.getFloor(spawnPos, colony.getWorld()), + 30, + 3, + SOLID_AIR_POS_SELECTOR); + if (worldSpawnPos != null || MineColonies.getConfig().getServer().skyRaiders.get()) + { + break; + } } } @@ -468,18 +469,12 @@ public BlockPos calculateSpawnLocation() return null; } - BlockPos worldSpawnPos = BlockPosUtil.findAround(colony.getWorld(), - BlockPosUtil.getFloor(spawnPos, colony.getWorld()), - 3, - 30, - SOLID_AIR_POS_SELECTOR); - if (worldSpawnPos == null && MineColonies.getConfig().getServer().skyRaiders.get()) { worldSpawnPos = BlockPosUtil.findAround(colony.getWorld(), BlockPosUtil.getFloor(spawnPos, colony.getWorld()), - 10, 15, + 10, DOUBLE_AIR_POS_SELECTOR); } @@ -498,7 +493,7 @@ private BlockPos findSpawnPointInDirections( final BlockPos advancePos) { BlockPos spawnPos = new BlockPos(start); - Vec3 tempPos = new Vec3(spawnPos.getX(), spawnPos.getY(), spawnPos.getZ()); + BlockPos tempPos = new BlockPos(spawnPos.getX(), spawnPos.getY(), spawnPos.getZ()); final Collection buildings = colony.getBuildingManager().getBuildings().values(); final int xDiff = Math.abs(start.getX() - advancePos.getX()); @@ -511,17 +506,17 @@ private BlockPos findSpawnPointInDirections( int validChunkCount = 0; for (int i = 0; i < 10; i++) { - if (WorldUtil.isEntityBlockLoaded(colony.getWorld(), new BlockPos(tempPos))) + if (WorldUtil.isEntityBlockLoaded(colony.getWorld(), tempPos)) { - tempPos = tempPos.add(16 * xzRatio.x, 0, 16 * xzRatio.z); + tempPos = tempPos.offset((int) (16 * xzRatio.x), 0, (int) (16 * xzRatio.z)); - if (WorldUtil.isEntityBlockLoaded(colony.getWorld(), new BlockPos(tempPos))) + if (WorldUtil.isEntityBlockLoaded(colony.getWorld(), tempPos)) { - if (isValidSpawnPoint(buildings, new BlockPos(tempPos))) + if (isValidSpawnPoint(buildings, tempPos) && !isOtherColony(tempPos.getX(), tempPos.getZ())) { - spawnPos = new BlockPos(tempPos); + spawnPos = tempPos; validChunkCount++; - if (validChunkCount > 5) + if (validChunkCount > 2 || i > 2) { return spawnPos; } @@ -546,6 +541,18 @@ private BlockPos findSpawnPointInDirections( return null; } + /** + * Check if the spawn position is within another colony + * + * @param pos + * @return + */ + private boolean isOtherColony(final int x, final int z) + { + final IColonyTagCapability cap = colony.getWorld().getChunk(x >> 4, z >> 4).getCapability(CLOSE_COLONY_CAP, null).orElseGet(null); + return cap != null && cap.getOwningColony() != 0 && cap.getOwningColony() != colony.getID(); + } + /** * Determines whether the given spawn point is allowed. * @@ -593,7 +600,13 @@ else if (building instanceof BuildingTownHall) @Override public List getLastSpawnPoints() { - return new ArrayList<>(lastSpawnPoints); + if (raidHistories.isEmpty()) + { + return List.of(); + } + + final RaidHistory last = raidHistories.get(raidHistories.size() - 1); + return last.spawnData.stream().map(raidSpawnInfo -> raidSpawnInfo.spawnpos).collect(Collectors.toList()); } /** @@ -612,9 +625,13 @@ public int calculateRaiderAmount(final int raidLevel) @Override public boolean isRaided() { + if (colony.getWorld().getGameTime() <= passingThroughRaidTime) + { + return true; + } for (final IColonyEvent event : colony.getEventManager().getEvents().values()) { - if (event instanceof IColonyRaidEvent && (event.getStatus() == EventStatus.PROGRESSING || event.getStatus() == EventStatus.PREPARING)) + if (event instanceof IColonyRaidEvent raidEvent && raidEvent.isRaidActive()) { return true; } @@ -629,19 +646,22 @@ public void onNightFall() { if (nightsSinceLastRaid == 0) { - final double lostPct = (double) lostCitizens / colony.getCitizenManager().getMaxCitizens(); - if (lostPct > LOST_CITIZEN_DIFF_REDUCE_PCT) - { - raidDifficulty = Math.max(MIN_RAID_DIFFICULTY, raidDifficulty - (int) (lostPct / LOST_CITIZEN_DIFF_REDUCE_PCT)); - } - else if (lostPct < LOST_CITIZEN_DIFF_INCREASE_PCT) + if (!raidHistories.isEmpty()) { - raidDifficulty = Math.min(MAX_RAID_DIFFICULTY, raidDifficulty + 1); + RaidHistory history = raidHistories.get(raidHistories.size() - 1); + final double lostPct = (double) history.lostCitizens / colony.getCitizenManager().getMaxCitizens(); + if (lostPct > LOST_CITIZEN_DIFF_REDUCE_PCT) + { + raidDifficulty = Math.max(MIN_RAID_DIFFICULTY, raidDifficulty - (int) (lostPct / LOST_CITIZEN_DIFF_REDUCE_PCT)); + } + else if (lostPct < LOST_CITIZEN_DIFF_INCREASE_PCT) + { + raidDifficulty = Math.min(MAX_RAID_DIFFICULTY, raidDifficulty + 1); + } } } nightsSinceLastRaid++; - lostCitizens = 0; } else { @@ -651,8 +671,9 @@ else if (lostPct < LOST_CITIZEN_DIFF_INCREASE_PCT) if (raidTonight) { raidTonight = false; - raiderEvent(nextForcedType); - nextForcedType = ""; + final boolean overrideConfig = !nextForcedType.isEmpty(); + raiderEvent(nextForcedType, overrideConfig, allowShips); + nextForcedType = INITIAL_NEXT_RAID_TYPE; } else { @@ -672,16 +693,17 @@ public void setNightsSinceLastRaid(final int nightsSinceLastRaid) this.nightsSinceLastRaid = nightsSinceLastRaid; } - /** - * Checks if a raid is possible - * - * @return whether a raid is possible - */ @Override public boolean canRaid() + { + return canRaid(false); + } + + @Override + public boolean canRaid(final boolean override) { return !WorldUtil.isPeaceful(colony.getWorld()) - && MineColonies.getConfig().getServer().doBarbariansSpawn.get() + && (MineColonies.getConfig().getServer().doBarbariansSpawn.get() || override) && colony.getRaiderManager().canHaveRaiderEvents() && !colony.getPackageManager().getImportantColonyPlayers().isEmpty(); } @@ -746,7 +768,7 @@ private boolean raidThisNight(final Level world, final IColony colony) public BlockPos getRandomBuilding() { buildingPosUsage++; - if (buildingPosUsage > 3 || lastBuilding == null) + if (buildingPosUsage > 6 || lastBuilding == null) { buildingPosUsage = 0; final Collection buildingList = colony.getBuildingManager().getBuildings().values(); @@ -755,6 +777,33 @@ public BlockPos getRandomBuilding() { final int rand = colony.getWorld().random.nextInt(buildingArray.length); final IBuilding building = (IBuilding) buildingArray[rand]; + + if (lastBuilding != null) + { + // Alerts guards of raiders reaching a building + final List possibleGuards = new ArrayList<>(); + + for (final ICitizenData entry : colony.getCitizenManager().getCitizens()) + { + if (entry.getEntity().isPresent() + && entry.getJob() instanceof AbstractJobGuard + && BlockPosUtil.getDistanceSquared(entry.getEntity().get().blockPosition(), lastBuilding) < 75 * 75 && entry.getJob().getWorkerAI() != null) + { + if (((AbstractEntityAIGuard) entry.getJob().getWorkerAI()).canHelp(building.getPosition())) + { + possibleGuards.add(entry.getEntity().get()); + } + } + } + + possibleGuards.sort(Comparator.comparingInt(guard -> (int) lastBuilding.distSqr(guard.blockPosition()))); + + for (int i = 0; i < possibleGuards.size() && i <= 3; i++) + { + ((AbstractEntityAIGuard) possibleGuards.get(i).getCitizenData().getJob().getWorkerAI()).setNextPatrolTarget(lastBuilding); + } + } + lastBuilding = building.getPosition(); } else @@ -781,20 +830,30 @@ public void onLostCitizen(final ICitizenData citizen) return; } + if (raidHistories.isEmpty()) + { + return; + } + + final RaidHistory history = raidHistories.get(raidHistories.size() - 1); if (citizen.getJob() instanceof AbstractJobGuard) { - lostCitizens++; + history.lostCitizens++; } else { - lostCitizens += 2; + history.lostCitizens += 2; } - if (((double) lostCitizens / colony.getCitizenManager().getMaxCitizens()) > 0.5) + if (((double) history.lostCitizens / colony.getCitizenManager().getMaxCitizens()) > 0.5) { for (final IColonyEvent event : colony.getEventManager().getEvents().values()) { - event.setStatus(EventStatus.DONE); + if (event instanceof IColonyRaidEvent raidEvent) + { + raidEvent.setStatus(EventStatus.DONE); + raidEvent.setMercyEnd(); + } } } } @@ -805,13 +864,19 @@ public void write(final CompoundTag compound) compound.putBoolean(TAG_RAIDABLE, canHaveRaiderEvents()); compound.putInt(TAG_NIGHTS_SINCE_LAST_RAID, getNightsSinceLastRaid()); compound.putInt(TAG_RAID_DIFFICULTY, raidDifficulty); - compound.putInt(TAG_LOST_CITIZENS, lostCitizens); + + ListTag nbtList = new ListTag(); + for (final RaidHistory history : raidHistories) + { + nbtList.add(history.write()); + } + compound.put(TAG_RAID_HISTORY, nbtList); } @Override public void read(final CompoundTag compound) { - if (compound.getAllKeys().contains(TAG_RAIDABLE)) + if (compound.contains(TAG_RAIDABLE)) { setCanHaveRaiderEvents(compound.getBoolean(TAG_RAIDABLE)); } @@ -826,12 +891,196 @@ public void read(final CompoundTag compound) } raidDifficulty = Mth.clamp(compound.getInt(TAG_RAID_DIFFICULTY), MIN_RAID_DIFFICULTY, MAX_RAID_DIFFICULTY); - lostCitizens = compound.getInt(TAG_LOST_CITIZENS); + + if (compound.contains(TAG_RAID_HISTORY)) + { + raidHistories.clear(); + ListTag nbtList = compound.getList(TAG_RAID_HISTORY, Tag.TAG_COMPOUND); + for (final Tag tag : nbtList) + { + raidHistories.add(RaidHistory.fromNBT((CompoundTag) tag)); + } + } } @Override public int getLostCitizen() { - return lostCitizens; + if (raidHistories.isEmpty()) + { + return 0; + } + + return raidHistories.get(raidHistories.size() - 1).lostCitizens; + } + + @Override + public void onRaiderDeath(final AbstractEntityRaiderMob entity) + { + final RaidHistory last = getLastRaid(); + if (last != null) + { + last.deadRaiders++; + } + } + + /** + * List of raid histories + * + * @return + */ + public RaidHistory getLastRaid() + { + if (raidHistories.isEmpty()) + { + return null; + } + + return raidHistories.get(raidHistories.size() - 1); + } + + @Override + public void setPassThroughRaid() + { + passingThroughRaidTime = colony.getWorld().getGameTime() + TICKS_SECOND * 20; + } + + /** + * Gets all raid histories + * @return + */ + public List getAllRaids() + { + return new ArrayList<>(raidHistories); + } + + /** + * Data holder for raid history + */ + public static class RaidHistory + { + /** + * Serialization constants + */ + static final String TAG_LOSTCITIZENS = "lostCitizens"; + static final String TAG_RAIDERAMOUNT = "raiderAmount"; + static final String TAG_RAIDTIME = "raidTime"; + static final String TAG_SPAWNINFO = "spawnInfo"; + + /** + * Lost citizens during the raid + */ + public int lostCitizens = 0; + + /** + * Total amount of raiders spawned for all raids + */ + public final int raiderAmount; + + /** + * Total amount of raiders killed all raids + */ + public int deadRaiders = 0; + + /** + * World time at which the raid occured + */ + public final long raidTime; + + /** + * List of raid types and their spawnpoints + */ + public final List spawnData = new ArrayList<>(); + + public RaidHistory(final int raiderAmount, final long raidTime) + { + this.raidTime = raidTime; + this.raiderAmount = raiderAmount; + } + + private CompoundTag write() + { + CompoundTag tag = new CompoundTag(); + tag.putInt(TAG_LOSTCITIZENS, lostCitizens); + tag.putInt(TAG_RAIDERAMOUNT, raiderAmount); + tag.putLong(TAG_RAIDTIME, raidTime); + ListTag nbtList = new ListTag(); + for (final RaidSpawnInfo raidSpawnInfo : spawnData) + { + nbtList.add(raidSpawnInfo.write()); + } + tag.put(TAG_SPAWNINFO, nbtList); + return tag; + } + + private static RaidHistory fromNBT(final CompoundTag tag) + { + RaidHistory history = new RaidHistory(tag.getInt(TAG_RAIDERAMOUNT), tag.getLong(TAG_RAIDTIME)); + history.lostCitizens = tag.getInt(TAG_LOST_CITIZENS); + ListTag nbtList = tag.getList(TAG_SPAWNINFO, Tag.TAG_COMPOUND); + for (final Tag entry : nbtList) + { + history.spawnData.add(RaidSpawnInfo.fromNBT((CompoundTag) entry)); + } + + return history; + } + + @Override + public String toString() + { + return "Raid on: " + raidTime / 24000L + + "\nRaiders spawned: " + raiderAmount + + "\nRaiders killed: " + deadRaiders + + "\nCitizens lost: " + lostCitizens + + "\nSpawns:" + spawnData.stream().map(Object::toString).collect(Collectors.joining("\n")); + } + } + + /** + * Data holder for raid spawns + */ + public static class RaidSpawnInfo + { + /** + * Serialization constants + */ + static final String TAG_RAIDTYPE = "raidtype"; + + /** + * Id of the raid type + */ + public final ResourceLocation raidType; + + /** + * Position of the raid spawn + */ + public final BlockPos spawnpos; + + public RaidSpawnInfo(final ResourceLocation raidType, final BlockPos spawnpos) + { + this.raidType = raidType; + this.spawnpos = spawnpos; + } + + private CompoundTag write() + { + CompoundTag tag = new CompoundTag(); + tag.putString(TAG_RAIDTYPE, raidType.toString()); + tag.putInt("x", spawnpos.getX()); + tag.putInt("y", spawnpos.getY()); + tag.putInt("z", spawnpos.getZ()); + return tag; + } + + public static RaidSpawnInfo fromNBT(final CompoundTag tag) + { + return new RaidSpawnInfo(new ResourceLocation(tag.getString(TAG_RAIDTYPE)), new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"))); + } + + public String toString() + { + return "Type: " + raidType.toString() + " pos: " + spawnpos.toShortString(); + } } } diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/RegisteredStructureManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/RegisteredStructureManager.java index b8bae84ed73..216c5b01f3e 100644 --- a/src/main/java/com/minecolonies/coremod/colony/managers/RegisteredStructureManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/RegisteredStructureManager.java @@ -5,34 +5,38 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyTagCapability; -import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.buildings.IGuardBuilding; -import com.minecolonies.api.colony.buildings.IMysticalSite; -import com.minecolonies.api.colony.buildings.IRSComponent; +import com.minecolonies.api.colony.buildings.*; +import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager; import com.minecolonies.api.colony.buildings.workerbuildings.ITownHall; import com.minecolonies.api.colony.buildings.workerbuildings.IWareHouse; +import com.minecolonies.api.colony.fields.IField; import com.minecolonies.api.colony.managers.interfaces.IRegisteredStructureManager; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestManager; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; -import com.minecolonies.api.util.BlockPosUtil; -import com.minecolonies.api.util.Log; -import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.api.util.WorldUtil; +import com.minecolonies.api.util.*; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.blocks.huts.BlockHutTavern; import com.minecolonies.coremod.blocks.huts.BlockHutTownHall; import com.minecolonies.coremod.colony.Colony; import com.minecolonies.coremod.colony.buildings.BuildingMysticalSite; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; import com.minecolonies.coremod.colony.buildings.modules.LivingBuildingModule; import com.minecolonies.coremod.colony.buildings.modules.TavernBuildingModule; -import com.minecolonies.coremod.colony.buildings.workerbuildings.*; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBarracks; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingLibrary; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingWareHouse; +import com.minecolonies.coremod.colony.fields.registry.FieldDataManager; import com.minecolonies.coremod.entity.ai.citizen.builder.ConstructionTapeHelper; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewBuildingViewMessage; +import com.minecolonies.coremod.network.messages.client.colony.ColonyViewFieldsUpdateMessage; import com.minecolonies.coremod.network.messages.client.colony.ColonyViewRemoveBuildingMessage; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; +import com.minecolonies.coremod.quests.objectives.IBuildingUpgradeObjectiveTemplate; import com.minecolonies.coremod.tileentities.TileEntityDecorationController; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -42,13 +46,13 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.levelgen.structure.BoundingBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; @@ -59,6 +63,11 @@ public class RegisteredStructureManager implements IRegisteredStructureManager { + /** + * Mine block objective tracker. + */ + private static final Map> buildBuildingObjectives = new HashMap<>(); + /** * List of building in the colony. */ @@ -68,7 +77,7 @@ public class RegisteredStructureManager implements IRegisteredStructureManager /** * List of fields of the colony. */ - private final List fields = new ArrayList<>(); + private final Set fields = ConcurrentHashMap.newKeySet(); /** * The warehouse building position. Initially null. @@ -92,12 +101,12 @@ public class RegisteredStructureManager implements IRegisteredStructureManager private ITownHall townHall; /** - * Variable to check if the buildings needs to be synched. + * Variable to check if the buildings needs to be synced. */ private boolean isBuildingsDirty = false; /** - * Variable to check if the fields needs to be synched. + * Variable to check if the fields needs to be synced. */ private boolean isFieldsDirty = false; @@ -133,6 +142,21 @@ public void read(@NotNull final CompoundTag compound) maxChunkZ = colony.getCenter().getZ() >> 4; minChunkZ = colony.getCenter().getZ() >> 4; + // Fields + if (compound.contains(TAG_FIELDS)) + { + final ListTag fieldsTagList = compound.getList(TAG_FIELDS, Tag.TAG_COMPOUND); + for (int i = 0; i < fieldsTagList.size(); ++i) + { + final CompoundTag fieldCompound = fieldsTagList.getCompound(i); + final IField field = FieldDataManager.compoundToField(fieldCompound); + if (field != null) + { + addField(field); + } + } + } + // Buildings final ListTag buildingTagList = compound.getList(TAG_BUILDINGS, Tag.TAG_COMPOUND); for (int i = 0; i < buildingTagList.size(); ++i) @@ -146,16 +170,6 @@ public void read(@NotNull final CompoundTag compound) } } - if (compound.contains(TAG_NEW_FIELDS)) - { - // Fields before Buildings, because the Farmer needs them. - final ListTag fieldTagList = compound.getList(TAG_NEW_FIELDS, Tag.TAG_COMPOUND); - for (int i = 0; i < fieldTagList.size(); ++i) - { - addField(BlockPosUtil.read(fieldTagList.getCompound(i), TAG_POS)); - } - } - if (compound.contains(TAG_LEISURE)) { final ListTag leisureTagList = compound.getList(TAG_LEISURE, Tag.TAG_COMPOUND); @@ -170,6 +184,27 @@ public void read(@NotNull final CompoundTag compound) } leisureSites = ImmutableList.copyOf(leisureSitesList); } + + // Ensure fields are still tied to an appropriate building + for (IField field : fields.stream().filter(IField::isTaken).toList()) + { + final IBuilding building = buildings.get(field.getBuildingId()); + if (building == null) + { + field.resetOwningBuilding(); + continue; + } + + final FieldsModule fieldsModule = building.getFirstOptionalModuleOccurance(FieldsModule.class).orElse(null); + if (fieldsModule == null || !field.getClass().equals(fieldsModule.getExpectedFieldType())) + { + field.resetOwningBuilding(); + if (fieldsModule != null) + { + fieldsModule.freeField(field); + } + } + } } /** @@ -215,14 +250,9 @@ public void write(@NotNull final CompoundTag compound) compound.put(TAG_BUILDINGS, buildingTagList); // Fields - @NotNull final ListTag fieldTagList = new ListTag(); - for (@NotNull final BlockPos pos : fields) - { - @NotNull final CompoundTag fieldCompound = new CompoundTag(); - BlockPosUtil.write(fieldCompound, TAG_POS, pos); - fieldTagList.add(fieldCompound); - } - compound.put(TAG_NEW_FIELDS, fieldTagList); + compound.put(TAG_FIELDS, fields.stream() + .map(FieldDataManager::fieldToCompound) + .collect(NBTUtils.toListNBT())); // Leisure sites @NotNull final ListTag leisureTagList = new ListTag(); @@ -239,6 +269,7 @@ public void write(@NotNull final CompoundTag compound) public void clearDirty() { isBuildingsDirty = false; + isFieldsDirty = false; buildings.values().forEach(IBuilding::clearDirty); } @@ -288,27 +319,19 @@ public void cleanUpBuildings(@NotNull final IColony colony) } } - @NotNull final ArrayList tempFields = new ArrayList<>(fields); - - for (@NotNull final BlockPos pos : tempFields) + for (final IField field : fields) { - if (WorldUtil.isBlockLoaded(colony.getWorld(), pos)) + if (WorldUtil.isBlockLoaded(colony.getWorld(), field.getPosition()) && (!colony.isCoordInColony(colony.getWorld(), field.getPosition()) || !field.isValidPlacement(colony))) { - if (!(colony.getWorld().getBlockEntity(pos) instanceof ScarecrowTileEntity)) - { - removeField(pos); - } + removeField(f -> f.equals(field)); } } for (@NotNull final BlockPos pos : leisureSites) { - if (WorldUtil.isBlockLoaded(colony.getWorld(), pos)) + if (WorldUtil.isBlockLoaded(colony.getWorld(), pos) && (!(colony.getWorld().getBlockEntity(pos) instanceof TileEntityDecorationController))) { - if (!(colony.getWorld().getBlockEntity(pos) instanceof TileEntityDecorationController)) - { - removeLeisureSite(pos); - } + removeLeisureSite(pos); } } @@ -337,10 +360,12 @@ public List getLeisureSites() { return leisureSites; } - + @Override public BlockPos getRandomLeisureSite() { + final boolean isRaining = colony.getWorld().isRaining(); + BlockPos pos = null; final int randomDist = RANDOM.nextInt(4); if (randomDist < 1) @@ -354,7 +379,7 @@ public BlockPos getRandomLeisureSite() if (randomDist < 2) { - if (RANDOM.nextBoolean()) + if (!isRaining && RANDOM.nextBoolean()) { pos = getFirstBuildingMatching(b -> b instanceof BuildingMysticalSite && b.getBuildingLevel() >= 1); if (pos != null) @@ -381,6 +406,11 @@ public BlockPos getRandomLeisureSite() } } + if (isRaining) + { + return null; + } + return leisureSites.isEmpty() ? null : leisureSites.get(RANDOM.nextInt(leisureSites.size())); } @@ -465,6 +495,10 @@ public IBuilding getHouseWithSpareBed() if (building.hasModule(LivingBuildingModule.class)) { final LivingBuildingModule module = building.getFirstModuleOccurance(LivingBuildingModule.class); + if (HiringMode.LOCKED.equals(module.getHiringMode())) + { + continue; + } if (module.getAssignedCitizen().size() < module.getModuleMax()) { return building; @@ -523,20 +557,6 @@ public boolean hasTownHall() return townHall != null; } - @NotNull - @Override - public List getFields() - { - return Collections.unmodifiableList(fields); - } - - @Override - public void addNewField(final AbstractScarecrowTileEntity tileEntity, final BlockPos pos, final Level world) - { - addField(pos); - markFieldsDirty(); - } - @Override public B getBuilding(final BlockPos buildingId, @NotNull final Class type) { @@ -551,20 +571,6 @@ public B getBuilding(final BlockPos buildingId, @NotNull f } } - @Override - public ScarecrowTileEntity getFreeField(final int owner, final Level world) - { - for (@NotNull final BlockPos pos : fields) - { - final BlockEntity field = world.getBlockEntity(pos); - if (field instanceof ScarecrowTileEntity && !((ScarecrowTileEntity) field).isTaken()) - { - return (ScarecrowTileEntity) field; - } - } - return null; - } - @Override public IBuilding addNewBuilding(@NotNull final AbstractTileEntityColonyBuilding tileEntity, final Level world) { @@ -578,9 +584,10 @@ public IBuilding addNewBuilding(@NotNull final AbstractTileEntityColonyBuilding tileEntity.setBuilding(building); building.upgradeBuildingLevelToSchematicData(); - Log.getLogger().info(String.format("Colony %d - new AbstractBuilding for %s at %s", + Log.getLogger().debug(String.format("Colony %d - new Building %s for %s at %s", colony.getID(), - tileEntity.getBlockState().getClass(), + building.getBuildingDisplayName(), + tileEntity.getBlockState().getBlock(), tileEntity.getPosition())); building.setIsMirrored(tileEntity.isMirrored()); @@ -672,14 +679,6 @@ else if (building instanceof BuildingMysticalSite) colony.getCitizenManager().calculateMaxCitizens(); } - @Override - public void removeField(final BlockPos pos) - { - this.markFieldsDirty(); - fields.remove(pos); - colony.markDirty(); - } - @Override public BlockPos getBestBuilding(final AbstractEntityCitizen citizen, final Class clazz) { @@ -802,7 +801,8 @@ public void removeMysticalSite(final IMysticalSite mysticalSite) /** * Updates all subscribers of fields etc. */ - private void markFieldsDirty() + @Override + public void markFieldsDirty() { isFieldsDirty = true; } @@ -854,7 +854,8 @@ private void sendBuildingPackets(final Set closeSubscribers, final { if (building.isDirty() || !newSubscribers.isEmpty()) { - players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewBuildingViewMessage(building), player)); + final ColonyViewBuildingViewMessage message = new ColonyViewBuildingViewMessage(building); + players.forEach(player -> Network.getNetwork().sendToPlayer(message, player)); } } } @@ -876,30 +877,10 @@ private void sendFieldPackets(final Set closeSubscribers, final Se players.addAll(closeSubscribers); } players.addAll(newSubscribers); - for (final IBuilding building : buildings.values()) - { - if (building instanceof BuildingFarmer) - { - players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewBuildingViewMessage(building), player)); - } - } + players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewFieldsUpdateMessage(colony, fields), player)); } } - /** - * Add a Field to the Colony. - * - * @param pos Field position to add to the colony. - */ - private void addField(@NotNull final BlockPos pos) - { - if (!fields.contains(pos)) - { - fields.add(pos); - } - colony.markDirty(); - } - @Override public boolean canPlaceAt(final Block block, final BlockPos pos, final Player player) { @@ -937,6 +918,75 @@ public void onBuildingUpgradeComplete(@Nullable final IBuilding building, final { colony.getCitizenManager().calculateMaxCitizens(); markBuildingsDirty(); + if (buildBuildingObjectives.containsKey(building.getBuildingType())) + { + for (final IQuestInstance instance : new ArrayList<>(buildBuildingObjectives.get(building.getBuildingType()))) + { + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(instance.getId()).getObjective(instance.getObjectiveIndex()); + if (objective instanceof IBuildingUpgradeObjectiveTemplate buildingTemplate) + { + buildingTemplate.onBuildingUpgrade(instance.getCurrentObjectiveInstance(), instance, level); + } + } + } + } + } + + @Override + public void trackBuildingLevelUp(final @NotNull BuildingEntry buildingEntry, final @NotNull IQuestInstance colonyQuest) + { + final List currentMap = buildBuildingObjectives.getOrDefault(buildingEntry, new ArrayList<>()); + currentMap.add(colonyQuest); + buildBuildingObjectives.put(buildingEntry, currentMap); + } + + @Override + public void stopTrackingBuildingLevelUp(final @NotNull BuildingEntry buildingEntry, final @NotNull IQuestInstance colonyQuest) + { + buildBuildingObjectives.getOrDefault(buildingEntry, new ArrayList<>()).remove(colonyQuest); + } + + @Override + public @NotNull List getFields(Predicate matcher) + { + return fields.stream() + .filter(matcher) + .toList(); + } + + @Override + public Optional getField(Predicate matcher) + { + return getFields(matcher) + .stream() + .findFirst(); + } + + @Override + public boolean addField(IField field) + { + if (fields.add(field)) + { + markFieldsDirty(); + return true; + } + return false; + } + + @Override + public void removeField(Predicate matcher) + { + final List fieldsToRemove = fields.stream() + .filter(matcher) + .toList(); + + // We must send the message to everyone since fields here will be permanently removed from the list. + // And the clients have no way to later on also get their fields removed, thus every client has to be told + // immediately that the field is gone. + for (IField field : fieldsToRemove) + { + fields.remove(field); + markFieldsDirty(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/ResearchManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/ResearchManager.java index 085a86cd816..82a9bd076d1 100644 --- a/src/main/java/com/minecolonies/coremod/colony/managers/ResearchManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/ResearchManager.java @@ -11,7 +11,9 @@ import com.minecolonies.api.research.util.ResearchState; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.SoundUtils; +import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.Colony; +import com.minecolonies.coremod.network.messages.client.colony.ColonyViewResearchManagerViewMessage; import com.minecolonies.coremod.research.LocalResearch; import com.minecolonies.coremod.research.LocalResearchTree; import com.minecolonies.coremod.research.ResearchEffectManager; @@ -19,14 +21,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; import static com.minecolonies.api.util.constant.TranslationConstants.*; @@ -57,6 +58,11 @@ public class ResearchManager implements IResearchManager */ private final IColony colony; + /** + * Whether synch to client is necessary. + */ + private boolean dirty; + @Override public void readFromNBT(@NotNull final CompoundTag compound) { @@ -69,6 +75,43 @@ public void writeToNBT(@NotNull final CompoundTag compound) tree.writeToNBT(compound); } + @Override + public void sendPackets(final Set closeSubscribers, final Set newSubscribers) + { + if (dirty || !newSubscribers.isEmpty()) + { + final Set players = new HashSet<>(); + if (dirty) + { + players.addAll(closeSubscribers); + } + players.addAll(newSubscribers); + + final ColonyViewResearchManagerViewMessage message = new ColonyViewResearchManagerViewMessage(colony, this); + players.forEach(player -> Network.getNetwork().sendToPlayer(message, player)); + + } + clearDirty(); + } + + @Override + public final void markDirty() + { + dirty = true; + } + + @Override + public final boolean isDirty() + { + return dirty; + } + + @Override + public void clearDirty() + { + dirty = false; + } + public ResearchManager(IColony colony) { this.colony = colony; @@ -164,6 +207,7 @@ public void checkAutoStartResearch() removes.add(research); } autoStartResearch.removeAll(removes); + markDirty(); } /** @@ -172,6 +216,7 @@ public void checkAutoStartResearch() */ private void startCostlessResearch(IGlobalResearch research) { + markDirty(); boolean creativePlayer = false; for (Player player : colony.getMessagePlayerEntities()) { diff --git a/src/main/java/com/minecolonies/coremod/colony/managers/StatisticsManager.java b/src/main/java/com/minecolonies/coremod/colony/managers/StatisticsManager.java index f97193da6ff..4ac6acc10de 100644 --- a/src/main/java/com/minecolonies/coremod/colony/managers/StatisticsManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/managers/StatisticsManager.java @@ -3,13 +3,16 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.managers.interfaces.IStatisticsManager; import it.unimi.dsi.fastutil.ints.Int2IntLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2IntMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; import static com.minecolonies.api.util.constant.NbtTagConstants.*; @@ -89,15 +92,38 @@ public int getStatsInPeriod(final @NotNull String id, final int startDay, final @Override public void serialize(@NotNull final FriendlyByteBuf buf) { - final CompoundTag statsCompound = new CompoundTag(); - writeToNBT(statsCompound); - buf.writeNbt(statsCompound); + buf.writeVarInt(stats.size()); + for (final Map.Entry dataEntry : stats.entrySet()) + { + buf.writeUtf(dataEntry.getKey()); + buf.writeVarInt(dataEntry.getValue().size()); + + for (final Int2IntMap.Entry valueEntry : dataEntry.getValue().int2IntEntrySet()) + { + buf.writeVarInt(valueEntry.getIntKey()); + buf.writeVarInt(valueEntry.getIntValue()); + } + } } @Override public void deserialize(@NotNull final FriendlyByteBuf buf) { - readFromNBT(buf.readNbt()); + stats.clear(); + final int statSize = buf.readVarInt(); + for (int i = 0; i < statSize; i++) + { + final String id = buf.readUtf(); + final int statEntrySize = buf.readVarInt(); + + final Int2IntLinkedOpenHashMap statValues = new Int2IntLinkedOpenHashMap(statEntrySize); + for (int j = 0; j < statEntrySize; j++) + { + statValues.put(buf.readVarInt(), buf.readVarInt()); + } + + stats.put(id, statValues); + } } @Override @@ -130,6 +156,7 @@ public void writeToNBT(@NotNull final CompoundTag compound) @Override public void readFromNBT(@NotNull final CompoundTag compound) { + stats.clear(); if (compound.contains(TAG_STAT_MANAGER)) { final ListTag statsNbts = compound.getList(TAG_STAT_MANAGER, Tag.TAG_COMPOUND); diff --git a/src/main/java/com/minecolonies/coremod/permissions/ColonyPermissionEventHandler.java b/src/main/java/com/minecolonies/coremod/colony/permissions/ColonyPermissionEventHandler.java similarity index 98% rename from src/main/java/com/minecolonies/coremod/permissions/ColonyPermissionEventHandler.java rename to src/main/java/com/minecolonies/coremod/colony/permissions/ColonyPermissionEventHandler.java index 2babb89352f..4d6df05a549 100755 --- a/src/main/java/com/minecolonies/coremod/permissions/ColonyPermissionEventHandler.java +++ b/src/main/java/com/minecolonies/coremod/colony/permissions/ColonyPermissionEventHandler.java @@ -1,4 +1,4 @@ -package com.minecolonies.coremod.permissions; +package com.minecolonies.coremod.colony.permissions; import com.ldtteam.structurize.items.ItemScanTool; import com.minecolonies.api.blocks.AbstractBlockHut; @@ -9,6 +9,7 @@ import com.minecolonies.api.colony.permissions.Explosions; import com.minecolonies.api.colony.permissions.PermissionEvent; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.EntityUtils; import com.minecolonies.api.util.ItemStackUtils; @@ -19,7 +20,6 @@ import com.minecolonies.coremod.blocks.huts.BlockHutTownHall; import com.minecolonies.coremod.colony.Colony; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; -import com.minecolonies.coremod.colony.permissions.Permissions; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import net.minecraft.world.level.block.AirBlock; import net.minecraft.world.level.block.Block; @@ -242,10 +242,6 @@ else if (event.getState().getBlock() instanceof BlockDecorationController) } colony.getBuildingManager().removeLeisureSite(event.getPos()); } - else - { - checkEventCancelation(Action.BREAK_BLOCKS, event.getPlayer(), event.getPlayer().getCommandSenderWorld(), event, event.getPos()); - } } /** @@ -593,7 +589,7 @@ public void on(final AttackEntityEvent event) return; } - if (!(event.getTarget() instanceof Mob) && !perms.hasPermission(event.getEntity(), Action.ATTACK_ENTITY)) + if (!(event.getTarget() instanceof Enemy) && !perms.hasPermission(event.getEntity(), Action.ATTACK_ENTITY)) { cancelEvent(event, event.getEntity(), colony, Action.ATTACK_ENTITY, new BlockPos(event.getTarget().position())); } diff --git a/src/main/java/com/minecolonies/coremod/colony/permissions/Permissions.java b/src/main/java/com/minecolonies/coremod/colony/permissions/Permissions.java index acffaddfacb..d96de1aa83b 100755 --- a/src/main/java/com/minecolonies/coremod/colony/permissions/Permissions.java +++ b/src/main/java/com/minecolonies/coremod/colony/permissions/Permissions.java @@ -357,7 +357,7 @@ public void loadPermissions(@NotNull final CompoundTag compound) final CompoundTag ownerCompound = ownerTagList.getCompound(i); @NotNull final UUID id = UUID.fromString(ownerCompound.getString(TAG_ID)); String name = ""; - if (ownerCompound.getAllKeys().contains(TAG_NAME)) + if (ownerCompound.contains(TAG_NAME)) { name = ownerCompound.getString(TAG_NAME); } @@ -429,6 +429,10 @@ public void restoreOwnerIfNull() players.put(ownerUUID, new ColonyPlayer(ownerUUID, player.getName(), ranks.get(OWNER_RANK_ID))); } } + else if (owner == null) + { + setOwnerAbandoned(); + } } /** @@ -480,7 +484,7 @@ public boolean setOwner(final Player player) @Override public void setOwnerAbandoned() { - players.remove(getOwner()); + players.remove(ownerUUID); ownerName = "[abandoned]"; ownerUUID = UUID.randomUUID(); diff --git a/src/main/java/com/minecolonies/coremod/colony/requestable/SmeltableOre.java b/src/main/java/com/minecolonies/coremod/colony/requestable/SmeltableOre.java index 42dad218478..acf82e4d0e4 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestable/SmeltableOre.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestable/SmeltableOre.java @@ -62,7 +62,7 @@ public static CompoundTag serialize(final IFactoryController controller, final S public static SmeltableOre deserialize(final IFactoryController controller, final CompoundTag compound) { final int count = compound.getInt(NBT_COUNT); - final ItemStack result = compound.getAllKeys().contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; + final ItemStack result = compound.contains(NBT_RESULT) ? ItemStackUtils.deserializeFromNBT(compound.getCompound(NBT_RESULT)) : ItemStackUtils.EMPTY; return new SmeltableOre(count, result); } diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/data/StandardRequestIdentitiesDataStore.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/data/StandardRequestIdentitiesDataStore.java index 2f3516fac42..8d98c4b396f 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/data/StandardRequestIdentitiesDataStore.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/data/StandardRequestIdentitiesDataStore.java @@ -117,9 +117,9 @@ public StandardRequestIdentitiesDataStore deserialize(@NotNull final IFactoryCon final IToken token = controller.deserialize(nbt.getCompound(TAG_TOKEN)); final ListTag list = nbt.getList(TAG_LIST, Tag.TAG_COMPOUND); - final Map, IRequest> map = NBTUtils.streamCompound(list).map(CompoundTag -> { - final IToken id = controller.deserialize(CompoundTag.getCompound(TAG_TOKEN)); - final IRequest request = controller.deserialize(CompoundTag.getCompound(TAG_REQUEST)); + final Map, IRequest> map = NBTUtils.streamCompound(list).map(tag -> { + final IToken id = controller.deserialize(tag.getCompound(TAG_TOKEN)); + final IRequest request = controller.deserialize(tag.getCompound(TAG_REQUEST)); return new Tuple, IRequest>(id, request); }).collect(Collectors.toMap((Tuple, IRequest> t) -> t.getA(), (Tuple, IRequest> t) -> t.getB())); diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/RequestSystemInitializer.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/RequestSystemInitializer.java index a6453787ff6..bdd3b939788 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/RequestSystemInitializer.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/RequestSystemInitializer.java @@ -41,18 +41,22 @@ public static void onPostInit() public static void reconfigureLogging() { + LogManager.getLogger(MineColonies.class.getName()).warn("Reconfiguring logging for RS."); + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); final Configuration config = ctx.getConfiguration(); final LoggerConfig loggerConfig = getLoggerConfiguration(config, String.format("%s.requestsystem", Constants.MOD_ID)); loggerConfig.addFilter(LevelRangeFilter.createFilter(Level.FATAL, - MineColonies.getConfig().getServer().enableDebugLogging.get() ? Level.DEBUG : Level.INFO, + MineColonies.getConfig().getCommon().rsEnableDebugLogging.get() ? Level.DEBUG : Level.INFO, Filter.Result.NEUTRAL, Filter.Result.DENY)); ctx.updateLoggers(); LogManager.getLogger(String.format("%s.requestsystem", Constants.MOD_ID)).warn(String.format("Updated logging config. RS Debug logging enabled: %s", - MineColonies.getConfig().getServer().enableDebugLogging.get())); + MineColonies.getConfig().getCommon().rsEnableDebugLogging.get())); + + LogManager.getLogger(MineColonies.class.getName()).warn("Reconfigured logging for RS."); } private static LoggerConfig getLoggerConfiguration(@NotNull final Configuration configuration, @NotNull final String loggerName) diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/StandardFactoryControllerInitializer.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/StandardFactoryControllerInitializer.java index d5fa3380d8e..0f2bcafb702 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/StandardFactoryControllerInitializer.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/init/StandardFactoryControllerInitializer.java @@ -84,13 +84,12 @@ public static void onPreInit() StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.BoolSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.StringSettingsFactory()); - StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.PlantationSettingsFactory()); + StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.StringWithDescSettingsFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.BlockSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.IntSettingFactory()); - StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.StringWithDescSettingsFactory()); - StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.PatrolModeSettingFactory()); + StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.GuardPatrolModeSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.GuardTaskSettingFactory()); - StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.FollowModeSettingFactory()); + StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.GuardFollowModeSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.CrafterRecipeSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.BuilderModeSettingFactory()); StandardFactoryController.getInstance().registerNewFactory(new SettingsFactories.DynamicTreesSettingFactory()); diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ProviderHandler.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ProviderHandler.java index 7c83127db46..a55df72e944 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ProviderHandler.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ProviderHandler.java @@ -77,7 +77,7 @@ public void removeProvider(final IToken token) @VisibleForTesting void removeProviderInternal(final IToken token) { - manager.getLogger().info(String.format("Removing provider: %s", token)); + manager.log(String.format("Removing provider: %s", token)); //Get the resolvers that are being removed. final Collection> assignedResolvers = getRegisteredResolvers(token); @@ -87,7 +87,7 @@ void removeProviderInternal(final IToken token) //Removing the data from the maps. manager.getProviderResolverAssignmentDataStore().getAssignments().remove(token); manager.getColony().markDirty(); - manager.getLogger().debug(String.format("Removed provider: %s", token)); + manager.log(String.format("Removed provider: %s", token)); } /** diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/RequestHandler.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/RequestHandler.java index c2a45b75c55..f085413eaa0 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/RequestHandler.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/RequestHandler.java @@ -48,10 +48,10 @@ public IRequest createRequest(final IReq final IToken token = manager.getTokenHandler().generateNewToken(); final IRequest constructedRequest = manager.getFactoryController() - .getNewInstance(TypeToken.of((Class>) RequestMappingHandler.getRequestableMappings() - .get(request.getClass())), request, token, requester); + .getNewInstance(TypeToken.of((Class>) RequestMappingHandler.getRequestableMappings() + .get(request.getClass())), request, token, requester); - manager.getLogger().debug("Creating request for: " + request + ", token: " + token + " and output: " + constructedRequest); + manager.log("Creating request for: " + request + ", token: " + token + " and output: " + constructedRequest); registerRequest(constructedRequest); @@ -67,7 +67,7 @@ public void registerRequest(final IRequest request) throw new IllegalArgumentException("The given request is already known to this manager"); } - manager.getLogger().debug("Registering request: " + request); + manager.log("Registering request: " + request); manager.getRequestIdentitiesDataStore().getIdentities().put(request.getId(), request); } @@ -125,7 +125,7 @@ public IToken assignRequestDefault(final IRequest request, final Collectio //Check if the request is registered getRequest(request.getId()); - manager.getLogger().debug("Starting resolver assignment search for request: " + request); + manager.log("Starting resolver assignment search for request: " + request); request.setState(new WrappedStaticStateRequestManager(manager), RequestState.ASSIGNING); @@ -133,17 +133,32 @@ public IToken assignRequestDefault(final IRequest request, final Collectio final List> typeIndexList = new LinkedList<>(requestTypes); - final Set> resolvers = requestTypes.stream() - .filter(typeToken -> manager.getRequestableTypeRequestResolverAssignmentDataStore().getAssignments().containsKey(typeToken)) - .flatMap(type -> manager.getRequestableTypeRequestResolverAssignmentDataStore() - .getAssignments() - .get(type) - .stream() - .map(iToken -> manager.getResolverHandler().getResolver(iToken))) - .filter(iRequestResolver -> typeIndexList.contains(iRequestResolver.getRequestType())) - .sorted(Comparator.comparingInt((IRequestResolver r) -> -1 * r.getPriority()) - .thenComparingInt((IRequestResolver r) -> typeIndexList.indexOf(r.getRequestType()))) - .collect(Collectors.toCollection(LinkedHashSet::new)); + List> resolverList = new ArrayList<>(); + for (final TypeToken requestTypeToken : requestTypes) + { + final Collection> resolverTokens = manager.getRequestableTypeRequestResolverAssignmentDataStore() + .getAssignments() + .get(requestTypeToken); + + if (resolverTokens == null) + { + continue; + } + + for (IToken iToken : resolverTokens) + { + final IRequestResolver iRequestResolver = manager.getResolverHandler().getResolver(iToken); + if (requestTypes.contains(iRequestResolver.getRequestType())) + { + resolverList.add(iRequestResolver); + } + } + } + + resolverList.sort(Comparator.comparingInt((IRequestResolver r) -> -1 * r.getPriority()) + .thenComparingInt((IRequestResolver r) -> typeIndexList.indexOf(r.getRequestType()))); + + final Set> resolvers = new LinkedHashSet<>(resolverList); IRequestResolver previousResolver = null; int previousMetric = Integer.MAX_VALUE; @@ -156,6 +171,11 @@ public IToken assignRequestDefault(final IRequest request, final Collectio continue; } + if (previousResolver != null && !previousResolver.getClass().equals(resolver.getClass())) + { + break; + } + //Skip if preliminary check fails if (!resolver.canResolveRequest(manager, request)) { @@ -171,15 +191,14 @@ public IToken assignRequestDefault(final IRequest request, final Collectio previousResolver = resolver; previousMetric = resolver.getSuitabilityMetric(request); } - continue; } - - if (previousResolver.getClass().equals(resolver.getClass())) + else { final int currentResolverMetric = resolver.getSuitabilityMetric(request); if (currentResolverMetric < previousMetric) { - @Nullable List> tempAttemptResolveRequest = resolver.attemptResolveRequest(new WrappedBlacklistAssignmentRequestManager(manager, resolverTokenBlackList), request); + @Nullable List> tempAttemptResolveRequest = + resolver.attemptResolveRequest(new WrappedBlacklistAssignmentRequestManager(manager, resolverTokenBlackList), request); if (tempAttemptResolveRequest != null) { previousResolver = resolver; @@ -188,10 +207,6 @@ public IToken assignRequestDefault(final IRequest request, final Collectio } } } - else - { - break; - } } if (previousResolver != null) @@ -204,15 +219,20 @@ public IToken assignRequestDefault(final IRequest request, final Collectio /** * Attempt to resolve a given request with a set resolver. - * @param request the request to fulfill. - * @param resolver the resolver to use. + * + * @param request the request to fulfill. + * @param resolver the resolver to use. * @param resolverTokenBlackList the black list. * @return the resolver token. */ - private IToken resolve(final IRequest request, final IRequestResolver resolver, final Collection> resolverTokenBlackList, @Nullable final List> attemptResult) + private IToken resolve( + final IRequest request, + final IRequestResolver resolver, + final Collection> resolverTokenBlackList, + @Nullable final List> attemptResult) { //Successfully found a resolver. Registering - manager.getLogger().debug("Finished resolver assignment search for request: " + request + " successfully"); + manager.log("Finished resolver assignment search for request: " + request + " successfully"); manager.getResolverHandler().addRequestToResolver(resolver, request); //TODO: Change this false to simulation. @@ -485,7 +505,7 @@ public void processDirectCancellationOf(final IRequest request) } } - if (request.hasParent()) + if (request.hasParent()) { getRequest(request.getParent()).removeChild(request.getId()); } @@ -540,7 +560,7 @@ public void resolveRequest(final IRequest request) @Override public void cleanRequestData(final IToken token) { - manager.getLogger().debug("Removing " + token + " from the Manager as it has been completed and its package has been received by the requester."); + manager.log("Removing " + token + " from the Manager as it has been completed and its package has been received by the requester."); getRequest(token); if (isAssigned(token)) @@ -594,7 +614,7 @@ public IRequest getRequest(final IToken token) @Override public IRequest getRequestOrNull(final IToken token) { - manager.getLogger().debug("Retrieving the request for: " + token); + manager.log("Retrieving the request for: " + token); return manager.getRequestIdentitiesDataStore().getIdentities().get(token); } @@ -609,10 +629,10 @@ public IRequest getRequestOrNull(final IToken token) public Collection> getRequestsMadeByRequester(final IRequester requester) { return manager.getRequestIdentitiesDataStore() - .getIdentities() - .values() - .stream() - .filter(iRequest -> iRequest.getRequester().getId().equals(requester.getId())) - .collect(Collectors.toList()); + .getIdentities() + .values() + .stream() + .filter(iRequest -> iRequest.getRequester().getId().equals(requester.getId())) + .collect(Collectors.toList()); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ResolverHandler.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ResolverHandler.java index ae84aba372e..1b727a506b6 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ResolverHandler.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/handlers/ResolverHandler.java @@ -95,7 +95,7 @@ public IToken registerResolver(final IRequestResolver manager.getRequestableTypeRequestResolverAssignmentDataStore().getAssignments().put(c, new ArrayList<>()); } - manager.getLogger().debug("Registering resolver: " + resolver + " with request type: " + c); + manager.log("Registering resolver: " + resolver + " with request type: " + c); manager.getRequestableTypeRequestResolverAssignmentDataStore().getAssignments().get(c).add(resolver.getId()); }); @@ -201,7 +201,7 @@ public void processResolverForRemoval(final Collection> assignedResolv @VisibleForTesting void removeResolverWithoutAssignedRequests(@NotNull final IToken resolverToken) { - manager.getLogger().debug("Removing resolver without assigned requests: " + resolverToken); + manager.log("Removing resolver without assigned requests: " + resolverToken); manager.getRequestResolverRequestAssignmentDataStore().getAssignments().remove(resolverToken); manager.getResolverHandler().removeResolver(resolverToken); @@ -222,7 +222,7 @@ void removeResolverWithAssignedRequests(@NotNull final Collection> ass //Clone the original list to modify it during iteration, if need be. Collection> assignedRequests = new ArrayList<>(manager.getRequestResolverRequestAssignmentDataStore().getAssignments().get(resolverToken)); - manager.getLogger().debug("Starting reassignment of already registered requests registered to resolver with token: " + resolverToken); + manager.log("Starting reassignment of already registered requests registered to resolver with token: " + resolverToken); tempBlackList.addAll(assignedResolvers); for (final IToken requestToken : assignedRequests) @@ -245,7 +245,7 @@ void removeResolverWithAssignedRequests(@NotNull final Collection> ass removeResolverWithoutAssignedRequests(resolverToken); - manager.getLogger().debug("Finished reassignment of already registered requests registered to resolver with token: " + resolverToken); + manager.log("Finished reassignment of already registered requests registered to resolver with token: " + resolverToken); } /** @@ -284,7 +284,7 @@ public IRequestResolver getResolver(final IToken toke throw new IllegalArgumentException("The given token for a resolver is not known to this manager!"); } - manager.getLogger().debug("Retrieving resolver for: " + token); + manager.log("Retrieving resolver for: " + token); return manager.getRequestResolverIdentitiesDataStore().getIdentities().get(token); } @@ -296,7 +296,7 @@ public void removeResolverInternal(final IRequestResolver resolver) final Set> requestTypes = ReflectionUtils.getSuperClasses(resolver.getRequestType()); requestTypes.remove(TypeConstants.OBJECT); requestTypes.forEach(c -> { - manager.getLogger().debug("Removing resolver: " + resolver + " with request type: " + c); + manager.log("Removing resolver: " + resolver + " with request type: " + c); manager.getRequestableTypeRequestResolverAssignmentDataStore().getAssignments().get(c).remove(resolver.getId()); }); } @@ -348,7 +348,7 @@ public void addRequestToResolver(final IRequestResolver resolver, final IRequ manager.getRequestResolverRequestAssignmentDataStore().getAssignments().put(resolver.getId(), new HashSet<>()); } - manager.getLogger().debug("Adding request: " + request + " to resolver: " + resolver); + manager.log("Adding request: " + request + " to resolver: " + resolver); manager.getRequestResolverRequestAssignmentDataStore().getAssignments().get(resolver.getId()).add(request.getId()); @@ -378,7 +378,7 @@ public void removeRequestFromResolver(final IRequestResolver resolver, final throw new IllegalArgumentException("The given request is not registered to the given resolver."); } - manager.getLogger().debug("Removing request: " + request + " from resolver: " + resolver); + manager.log("Removing request: " + request + " from resolver: " + resolver); manager.getRequestResolverRequestAssignmentDataStore().getAssignments().get(resolver.getId()).remove(request.getId()); if (manager.getRequestResolverRequestAssignmentDataStore().getAssignments().get(resolver.getId()).isEmpty()) diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRecipeManager.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRecipeManager.java index 78fa9cab4f8..063dafe1d1e 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRecipeManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRecipeManager.java @@ -7,6 +7,7 @@ import com.minecolonies.api.colony.requestsystem.token.IToken; import com.minecolonies.api.crafting.IRecipeManager; import com.minecolonies.api.crafting.IRecipeStorage; +import com.minecolonies.api.util.Log; import com.minecolonies.api.util.NBTUtils; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -35,12 +36,21 @@ public class StandardRecipeManager implements IRecipeManager */ private ImmutableMap, IRecipeStorage> cache = null; - /** * The list of recipes marked as used this session */ private final Set> usedRecipes = new HashSet<>(); + /** + * If was written to since the last save. + */ + private boolean dirty = false; + + /** + * Nbt cache. + */ + private ListTag nbtCache = null; + @Override public ImmutableMap, IRecipeStorage> getRecipes() { @@ -63,6 +73,7 @@ public IToken addRecipe(final IRecipeStorage storage) recipes.put(storage.getToken(), storage); registerUse(storage.getToken()); cache = null; + dirty = true; return storage.getToken(); } @@ -87,9 +98,14 @@ public IToken getRecipeId(final IRecipeStorage storage) @Override public void write(@NotNull final CompoundTag compound) { - @NotNull final ListTag recipesTagList = - recipes.entrySet().stream().filter(recipeEntry -> usedRecipes.contains(recipeEntry.getKey())).map(entry -> StandardFactoryController.getInstance().serialize(entry.getValue())).collect(NBTUtils.toListNBT()); - compound.put(TAG_RECIPES, recipesTagList); + if (dirty || nbtCache == null) + { + nbtCache = recipes.entrySet().stream().filter(recipeEntry -> usedRecipes.contains(recipeEntry.getKey())).map(entry -> StandardFactoryController.getInstance().serialize(entry.getValue())).collect(NBTUtils.toListNBT()); + Log.getLogger().warn("Writing Recipe Manager: " + recipes.size() + " recipes!"); + } + + compound.put(TAG_RECIPES, nbtCache); + dirty = false; } @Override @@ -112,6 +128,7 @@ public void read(@NotNull final CompoundTag compound) } } cache = null; + nbtCache = list; } @Override @@ -124,6 +141,11 @@ public void reset() @Override public void registerUse(final IToken token) { + if (usedRecipes.contains(token)) + { + return; + } usedRecipes.add(token); + dirty = true; } } diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRequestManager.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRequestManager.java index dbb4928effe..7ae57ef5526 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRequestManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/StandardRequestManager.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.reflect.TypeToken; +import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.colony.requestsystem.data.*; @@ -106,6 +107,11 @@ public class StandardRequestManager implements IStandardRequestManager private int version = -1; + /** + * if debug logging should actually reach the logger. + */ + private boolean enableLogging; + public StandardRequestManager(@NotNull final IColony colony) { this.colony = colony; @@ -116,6 +122,7 @@ public StandardRequestManager(@NotNull final IColony colony) private void setup() { dataStoreManager = StandardFactoryController.getInstance().getNewInstance(TypeConstants.DATA_STORE_MANAGER); + enableLogging = IMinecoloniesAPI.getInstance().getConfig().getCommon().rsEnableDebugLogging.get(); requestIdentitiesDataStoreId = registerDataStore(TypeConstants.REQUEST_IDENTITIES_DATA_STORE); requestResolverIdentitiesDataStoreId = registerDataStore(TypeConstants.REQUEST_RESOLVER_IDENTITIES_DATA_STORE); @@ -287,7 +294,7 @@ public void updateRequestState(@NotNull final IToken token, @NotNull final Re { final IRequest request = getRequestHandler().getRequest(token); - getLogger().debug("Updating request state from:" + token + ". With original state: " + request.getState() + " to : " + state); + log("Updating request state from:" + token + ". With original state: " + request.getState() + " to : " + state); request.setState(new WrappedStaticStateRequestManager(this), state); markDirty(); @@ -295,27 +302,27 @@ public void updateRequestState(@NotNull final IToken token, @NotNull final Re switch (request.getState()) { case RESOLVED: - getLogger().debug("Request resolved: " + token + ". Determining followup requests..."); + log("Request resolved: " + token + ". Determining followup requests..."); getRequestHandler().onRequestResolved(token); return; case COMPLETED: - getLogger().debug("Request completed: " + token + ". Notifying parent and requester..."); + log("Request completed: " + token + ". Notifying parent and requester..."); getRequestHandler().onRequestCompleted(token); return; case OVERRULED: - getLogger().debug("Request overruled: " + token + ". Notifying parent, children and requester..."); + log("Request overruled: " + token + ". Notifying parent, children and requester..."); getRequestHandler().onRequestOverruled(token); return; case FAILED: - getLogger().debug("Request failed: " + token + ". Notifying parent, children and requester..."); + log("Request failed: " + token + ". Notifying parent, children and requester..."); getRequestHandler().onRequestCancelled(token); return; case CANCELLED: - getLogger().debug("Request cancelled: " + token + ". Notifying parent, children and requester..."); + log("Request cancelled: " + token + ". Notifying parent, children and requester..."); getRequestHandler().onRequestCancelled(token); return; case RECEIVED: - getLogger().debug("Request received: " + token + ". Removing from system..."); + log("Request received: " + token + ". Removing from system..."); getRequestHandler().cleanRequestData(token); return; default: @@ -529,7 +536,7 @@ private void executeDeserializationStepOrMarkForUpdate( @NotNull final BiFunction extractor, @NotNull final Consumer valueConsumer) { - if (!nbt.getAllKeys().contains(key)) + if (!nbt.contains(key)) { markForUpdate(); return; @@ -553,11 +560,14 @@ private void markForUpdate() { version = -1; } - + @Override - public Logger getLogger() + public void log(final String message) { - return logger; + if (enableLogging) + { + logger.debug(message); + } } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/wrapped/AbstractWrappedRequestManager.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/wrapped/AbstractWrappedRequestManager.java index d2e9070c579..d815380a680 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/wrapped/AbstractWrappedRequestManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/management/manager/wrapped/AbstractWrappedRequestManager.java @@ -284,8 +284,8 @@ public void onColonyUpdate(@NotNull final Predicate> shouldTriggerRe } @Override - public Logger getLogger() + public void log(final String message) { - return wrappedManager.getLogger(); + wrappedManager.log(message); } } diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/AbstractRequest.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/AbstractRequest.java index 165065cd3ea..2c3686f5939 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/AbstractRequest.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/AbstractRequest.java @@ -137,7 +137,7 @@ public RequestState getState() public void setState(@NotNull final IRequestManager manager, @NotNull final RequestState state) { this.state = state; - manager.getLogger().debug("Updated state from: " + getId() + " to: " + state); + manager.log("Updated state from: " + getId() + " to: " + state); if (this.hasParent() && this.getParent() != null) { @@ -366,7 +366,7 @@ public void childStateUpdated(@NotNull final IRequestManager manager, @NotNull f if (childRequest.getState() == RequestState.IN_PROGRESS && getState().ordinal() < RequestState.IN_PROGRESS.ordinal()) { setState(manager, RequestState.IN_PROGRESS); - manager.getLogger().debug("First child entering progression: " + child + " setting progression state for: " + getId()); + manager.log("First child entering progression: " + child + " setting progression state for: " + getId()); } } catch (final IllegalArgumentException ex) diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequestFactories.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequestFactories.java index 743a241a6f6..e83712db5b6 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequestFactories.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequestFactories.java @@ -1077,17 +1077,17 @@ public static > R deserializeFromN request.addChildren(childTokens); - if (compound.getAllKeys().contains(NBT_PARENT)) + if (compound.contains(NBT_PARENT)) { request.setParent(controller.deserialize(compound.getCompound(NBT_PARENT))); } - if (compound.getAllKeys().contains(NBT_RESULT)) + if (compound.contains(NBT_RESULT)) { request.setResult(typeDeserialization.apply(controller, compound.getCompound(NBT_RESULT))); } - if (compound.getAllKeys().contains(NBT_DELIVERIES)) + if (compound.contains(NBT_DELIVERIES)) { final ImmutableList.Builder stackBuilder = ImmutableList.builder(); final ListTag deliveriesList = compound.getList(NBT_DELIVERIES, Tag.TAG_COMPOUND); diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequests.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequests.java index 19b67d507ba..3a6df551931 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequests.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/requests/StandardRequests.java @@ -227,7 +227,7 @@ public List getDisplayStacks() /** * Generic delivery request. */ - public static class DeliveryRequest extends AbstractRequest + public static class DeliveryRequest extends AbstractRequest implements IStackBasedTask { public DeliveryRequest(@NotNull final IRequester requester, @NotNull final IToken token, @NotNull final RequestState state, @NotNull final Delivery requested) { @@ -247,10 +247,10 @@ public ImmutableList getDeliveries() @Override public Component getShortDisplayString() { - final MutableComponent result = Component.literal(""); - result.append(Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_DELIVERY).append(Component.literal( - getRequest().getStack().getCount() + " ")).append(getRequest().getStack().getDisplayName())); - return result; + return Component.literal("") + .append(Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_DELIVERY) + .append(Component.literal(getRequest().getStack().getCount() + " ")) + .append(getRequest().getStack().getDisplayName())); } @NotNull @@ -260,6 +260,24 @@ public List getDisplayStacks() return ImmutableList.of(); } + @Override + public MutableComponent getDisplayPrefix() + { + return Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_DELIVERY); + } + + @Override + public int getDisplayCount() + { + return getRequest().getStack().getCount(); + } + + @Override + public ItemStack getTaskStack() + { + return getRequest().getStack(); + } + @Override public List getResolverToolTip(final IColonyView colony) { @@ -338,12 +356,41 @@ public ResourceLocation getDisplayIcon() // This can be just the delivery icon. For the user, it's no big deal. return new ResourceLocation("minecolonies:textures/gui/citizen/delivery.png"); } + + @Override + public List getResolverToolTip(final IColonyView colony) + { + final String requester = getRequester().getRequesterDisplayName(colony.getRequestManager(), this).getString(); + + int posInList = -1; + for (IBuildingView view : colony.getBuildings()) + { + if (view.getBuildingType() == ModBuildings.deliveryman.get()) + { + posInList = getPosInList(colony, view, getId()); + if (posInList >= 0) + { + break; + } + } + } + + if (posInList >= 0) + { + return posInList == 0 ? ImmutableList.of(Component.translatable(FROM, requester), Component.translatable(IN_PROGRESS)) : ImmutableList.of(Component.translatable(FROM, requester), Component.translatable(IN_QUEUE, posInList)); + } + else + { + return ImmutableList.of(Component.translatable(FROM, requester)); + } + } + } /** * An abstract implementation for crafting requests */ - public abstract static class AbstractCraftingRequest extends AbstractRequest + public abstract static class AbstractCraftingRequest extends AbstractRequest implements IStackBasedTask { protected AbstractCraftingRequest(@NotNull final IRequester requester, @NotNull final IToken token, @NotNull final C requested) @@ -367,6 +414,24 @@ public final Component getShortDisplayString() return Component.translatable(RequestSystemTranslationConstants.REQUEST_SYSTEM_CRAFTING_DISPLAY, Component.literal(String.valueOf(getRequest().getMinCount())), getRequest().getStack().getDisplayName()); } + @Override + public MutableComponent getDisplayPrefix() + { + return Component.translatable(RequestSystemTranslationConstants.REQUEST_SYSTEM_CRAFTING_DISPLAY_SHORT, Component.literal(String.valueOf(getRequest().getMinCount()))); + } + + @Override + public int getDisplayCount() + { + return getRequest().getCount(); + } + + @Override + public ItemStack getTaskStack() + { + return getRequest().getStack(); + } + protected abstract String getTranslationKey(); @NotNull @@ -506,16 +571,13 @@ public ToolRequest(@NotNull final IRequester requester, @NotNull final IToken public Component getLongDisplayString() { final MutableComponent result = Component.literal(""); - final MutableComponent preType = Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_TOOL_TYPE_PREFIX); - - result.append(preType); - result.append(getRequest().getToolClass().getDisplayName()); if (getRequest().getMinLevel() > ToolLevelConstants.TOOL_LEVEL_HAND) { result.append(Component.literal(" ")); result.append(Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_TOOL_MINIMUM_LEVEL_PREFIX)); + result.append(Component.literal(" ")); result.append(Component.literal(getRequest().isArmor() ? ItemStackUtils.swapArmorGrade(getRequest().getMinLevel()) : ItemStackUtils.swapToolGrade(getRequest().getMinLevel()))); } @@ -529,6 +591,7 @@ public Component getLongDisplayString() result.append(Component.literal(" ")); result.append(Component.translatable(RequestSystemTranslationConstants.REQUESTS_TYPE_TOOL_MAXIMUM_LEVEL_PREFIX)); + result.append(Component.literal(" ")); result.append(Component.literal(getRequest().isArmor() ? ItemStackUtils.swapArmorGrade(getRequest().getMaxLevel()) : ItemStackUtils.swapToolGrade(getRequest().getMaxLevel()))); } diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/BuildingRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/BuildingRequestResolver.java index dc72acd6a2c..f87d7f1f439 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/BuildingRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/BuildingRequestResolver.java @@ -64,7 +64,12 @@ public void onAssignedRequestCancelled(@NotNull final IRequestManager manager, @ @Override public boolean canResolveForBuilding(@NotNull final IRequestManager manager, @NotNull final IRequest request, @NotNull final AbstractBuilding building) { - if (building instanceof BuildingWareHouse || !building.getCitizenForRequest(request.getId()).isPresent()) + if (building instanceof BuildingWareHouse) + { + return false; + } + + if (!request.getRequest().canBeResolvedByBuilding()) { return false; } @@ -85,7 +90,7 @@ public boolean canResolveForBuilding(@NotNull final IRequestManager manager, @No return !requestParent.getRequestOfType(IDeliverable.class).map(d -> d.matches(itemStack)).orElse(false); }; - return InventoryUtils.hasBuildingEnoughElseCount(building, pred, 1) > 0; + return InventoryUtils.hasBuildingEnoughElseCount(building, pred, request.getRequest().getMinimumCount()) >= request.getRequest().getMinimumCount(); } @Nullable @@ -95,23 +100,9 @@ public List> attemptResolveForBuilding( @NotNull final IRequest request, @NotNull final AbstractBuilding building) { - final Set tileEntities = getCapabilityProviders(manager, building); - final int totalRequested = request.getRequest().getCount(); - int totalAvailable = 0; - for (final ICapabilityProvider tile : tileEntities) - { - final List inv = InventoryUtils.filterProvider(tile, itemStack -> request.getRequest().matches(itemStack)); - for (final ItemStack stack : inv) - { - if (!stack.isEmpty()) - { - totalAvailable += stack.getCount(); - } - } - } - - for (final Map.Entry reserved : building.reservedStacks().entrySet()) + int totalAvailable = InventoryUtils.getCountFromBuilding(building, itemStack -> request.getRequest().matches(itemStack)); + for (final Map.Entry reserved : building.reservedStacksExcluding(request).entrySet()) { if (request.getRequest().matches(reserved.getKey().getItemStack())) { @@ -120,6 +111,12 @@ public List> attemptResolveForBuilding( } } + if (totalAvailable <= 0) + { + //Most likely the reserved amount consumed everything. Backtrack. + return null; + } + if (totalAvailable >= totalRequested) { return Lists.newArrayList(); diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PrivateWorkerCraftingRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PrivateWorkerCraftingRequestResolver.java index 0a16e7fbfa1..fddd4ca4664 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PrivateWorkerCraftingRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PrivateWorkerCraftingRequestResolver.java @@ -92,18 +92,9 @@ public int getPriority() } @Override - public boolean canBuildingCraftStack(@NotNull final AbstractBuilding building, final Predicate stackPredicate) + public boolean canBuildingCraftRecipe(@NotNull final AbstractBuilding building, final IRecipeStorage recipe) { - for (final ICraftingBuildingModule module : building.getModules(ICraftingBuildingModule.class)) - { - final IRecipeStorage recipe = module.getFirstRecipe(stackPredicate); - if (recipe != null && (recipe.getIntermediate() == null || recipe.getIntermediate() == Blocks.AIR)) - { - return true; - } - } - - return false; + return recipe != null && (recipe.getIntermediate() == null || recipe.getIntermediate() == Blocks.AIR); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PublicWorkerCraftingRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PublicWorkerCraftingRequestResolver.java index bca709cfb46..5eb8646cef7 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PublicWorkerCraftingRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/PublicWorkerCraftingRequestResolver.java @@ -12,6 +12,7 @@ import com.minecolonies.api.colony.requestsystem.requestable.crafting.PublicCrafting; import com.minecolonies.api.colony.requestsystem.requester.IRequester; import com.minecolonies.api.colony.requestsystem.token.IToken; +import com.minecolonies.api.crafting.IRecipeStorage; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; import com.minecolonies.coremod.colony.buildings.moduleviews.WorkerBuildingModuleView; @@ -104,16 +105,9 @@ public int getPriority() } @Override - public boolean canBuildingCraftStack(@NotNull final AbstractBuilding building, final Predicate stackPredicate) + public boolean canBuildingCraftRecipe(@NotNull final AbstractBuilding building, final IRecipeStorage recipeStorage) { - for (final ICraftingBuildingModule module : building.getModules(ICraftingBuildingModule.class)) - { - if (module.getFirstRecipe(stackPredicate) != null) - { - return true; - } - } - return false; + return recipeStorage != null; } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/StandardRetryingRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/StandardRetryingRequestResolver.java index 350b90a6290..a034cdbf8f3 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/StandardRetryingRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/StandardRetryingRequestResolver.java @@ -144,7 +144,7 @@ public int getPriority() @Override public void tick() { - manager.getLogger().debug("Starting reassignment."); + manager.log("Starting reassignment."); //Lets decrement all delays getAllAssignedRequests().forEach(t -> { @@ -187,10 +187,10 @@ public void tick() }).collect(Collectors.toSet()); successfully.forEach(t -> { - manager.getLogger().debug("Failed to reassign a retryable request: " + id); + manager.log("Failed to reassign a retryable request: " + id); }); - manager.getLogger().debug("Finished reassignment."); + manager.log("Finished reassignment."); } @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingProductionResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingProductionResolver.java index 5192ce85255..1ec02435413 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingProductionResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingProductionResolver.java @@ -166,7 +166,7 @@ protected List> createRequestsForRecipe( if (!ItemStackUtils.isEmpty(ingredient.getItemStack())) { final ItemStack craftingHelperStack = ingredient.getItemStack().copy(); - final ItemStack container = ingredient.getItem().getCraftingRemainingItem(ingredient.getItemStack()); + final ItemStack container = ingredient.getItemStack().getCraftingRemainingItem(); //if recipe secondary produces craftinghelperstack, don't add it by count, add it once. If it's in the tools list, check to see if we need it first. if(!storage.getSecondaryOutputs().isEmpty() && ItemStackUtils.compareItemStackListIgnoreStackSize(storage.getSecondaryOutputs(), craftingHelperStack, false, true)) { diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingRequestResolver.java index 27983c7b0c5..5213c73878a 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractCraftingRequestResolver.java @@ -11,6 +11,7 @@ import com.minecolonies.api.colony.requestsystem.requestable.Food; import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.colony.requestsystem.requestable.IRequestable; +import com.minecolonies.api.colony.requestsystem.requestable.Stack; import com.minecolonies.api.colony.requestsystem.requester.IRequester; import com.minecolonies.api.colony.requestsystem.token.IToken; import com.minecolonies.api.crafting.IRecipeStorage; @@ -19,7 +20,6 @@ import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; -import com.minecolonies.coremod.colony.buildings.modules.CraftingWorkerBuildingModule; import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; import com.minecolonies.coremod.colony.requestsystem.requesters.IBuildingBasedRequester; import net.minecraft.world.level.block.Blocks; @@ -132,36 +132,43 @@ public boolean canResolveRequest(@NotNull final IRequestManager manager, final I */ public boolean canResolveForBuilding(@NotNull final IRequestManager manager, @NotNull final IRequest request, @NotNull final AbstractBuilding building) { - if (building.getBuildingLevel() <= 0 || building.getModuleMatching(WorkerBuildingModule.class, m -> m.getJobEntry() == jobEntry).getAssignedCitizen().isEmpty()) + if (building.getBuildingLevel() <= 0 + || !building.hasModule(WorkerBuildingModule.class) + || building.getModuleMatching(WorkerBuildingModule.class, m -> m.getJobEntry() == jobEntry).getAssignedCitizen().isEmpty()) { return false; } - if (createsCraftingCycle(manager, request, request)) + if (createsCraftingCycle(manager, request, request.getRequest(), request)) { return false; } - // As long as we're not resolving food, fast resolve - if(!(request.getRequest() instanceof Food)) + final boolean isFood = request.getRequest() instanceof Food; + for (final ICraftingBuildingModule module : building.getModules(ICraftingBuildingModule.class)) { - return building.hasModule(WorkerBuildingModule.class) && canBuildingCraftStack(building, itemStack -> request.getRequest().matches(itemStack)); - } + final IRecipeStorage recipe = module.getFirstRecipe(itemStack -> request.getRequest().matches(itemStack)); - // If this building is resolving a generic food request, then only allow it to resolve non-smeltables. - if(building.hasModule(WorkerBuildingModule.class)) - { - for (final ICraftingBuildingModule module : building.getModules(ICraftingBuildingModule.class)) + // If this building is resolving a generic food request, then only allow it to resolve non-smeltables. + if (recipe != null && (!isFood || recipe.getIntermediate() != Blocks.FURNACE) && canBuildingCraftRecipe(building, recipe)) { - final IRecipeStorage recipe = module.getFirstRecipe(itemStack -> request.getRequest().matches(itemStack)); - if (recipe != null && recipe.getIntermediate() != Blocks.FURNACE) + final int recipeCount = request.getRequest().getCount() / recipe.getPrimaryOutput().getCount(); + boolean success = true; + for (final ItemStorage ingredient : recipe.getCleanedInput()) + { + if (createsCraftingCycle(manager, request, new Stack(ingredient.getItemStack(), ingredient.getAmount() * recipeCount, ingredient.getAmount() * recipeCount), null)) + { + success = false; + break; + } + } + if (success) { - return canBuildingCraftStack(building, itemStack -> request.getRequest().matches(itemStack)); + return true; } } } - // It's both a Food request and smeltable return false; } @@ -176,9 +183,10 @@ public boolean canResolveForBuilding(@NotNull final IRequestManager manager, @No protected boolean createsCraftingCycle( @NotNull final IRequestManager manager, @NotNull final IRequest request, - @NotNull final IRequest target) + @NotNull final IDeliverable target, + @Nullable final IRequest targetRequest) { - return createsCraftingCycle(manager, request, target, 0, new ArrayList<>()); + return createsCraftingCycle(manager, request, target, targetRequest, 0); } /** @@ -188,39 +196,23 @@ protected boolean createsCraftingCycle( * @param request the request. * @param target the target to create. * @param count the itemCount. - * @param reqs the list of reqs. * @return true if a loop is detected to abort. */ protected boolean createsCraftingCycle( @NotNull final IRequestManager manager, @NotNull final IRequest request, - @NotNull final IRequest target, - final int count, - final List reqs) + @NotNull final IDeliverable target, + @Nullable final IRequest targetRequest, + final int count) { - if (reqs.contains(request.getRequest())) - { - for (final IRequestable requestable : reqs) - { - if (requestable.equals(request.getRequest()) - && request.getRequest() instanceof IDeliverable - && requestable instanceof IDeliverable - && ((IDeliverable) request.getRequest()).getCount() <= ((IDeliverable) requestable).getCount()) - { - return true; - } - } - } - reqs.add(request.getRequest()); - if (count > MAX_CRAFTING_CYCLE_DEPTH) { return true; } - if (!request.equals(target) && request.getRequest().equals(target.getRequest())) + if ((targetRequest == null || !targetRequest.equals(request)) && request.getRequest().equals(target)) { - if (request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).getCount() <= target.getRequest().getCount() && !request.hasChildren()) + if (request.getRequest() instanceof IDeliverable && ((IDeliverable) request.getRequest()).getCount() <= target.getCount()) { return true; } @@ -231,17 +223,17 @@ protected boolean createsCraftingCycle( return false; } - return createsCraftingCycle(manager, manager.getRequestForToken(request.getParent()), target, count + 1, reqs); + return createsCraftingCycle(manager, manager.getRequestForToken(request.getParent()), target, targetRequest, count + 1); } /** - * Check if a building can craft a certain stack. + * Check if a building can craft a certain recipe. * * @param building the building to check in. - * @param stackPredicate predicate used to check if a building knows the recipe. + * @param recipe the recipe to check. * @return true if so. */ - public abstract boolean canBuildingCraftStack(@NotNull final AbstractBuilding building, Predicate stackPredicate); + public abstract boolean canBuildingCraftRecipe(@NotNull final AbstractBuilding building, IRecipeStorage recipe); @Nullable @Override diff --git a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractWarehouseRequestResolver.java b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractWarehouseRequestResolver.java index cb2f7759afe..53bb04bb608 100755 --- a/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractWarehouseRequestResolver.java +++ b/src/main/java/com/minecolonies/coremod/colony/requestsystem/resolvers/core/AbstractWarehouseRequestResolver.java @@ -250,9 +250,8 @@ public List> getFollowupRequestForCompletion(@NotNull final IRequest final Delivery delivery = new Delivery(itemStackLocation, completedRequest.getRequester().getLocation(), matchingStack, getDefaultDeliveryPriority(true)); - final IToken requestToken = - manager.createRequest(manager.getFactoryController() - .getNewInstance(TypeToken.of(this.getClass()), completedRequest.getRequester().getLocation(), completedRequest.getId()), delivery); + + final IToken requestToken = manager.createRequest(this, delivery); deliveries.add(manager.getRequestForToken(requestToken)); remainingCount -= count; diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/AbstractWorkOrder.java b/src/main/java/com/minecolonies/coremod/colony/workorders/AbstractWorkOrder.java index ab0d15e9c01..2bc8f4d7deb 100755 --- a/src/main/java/com/minecolonies/coremod/colony/workorders/AbstractWorkOrder.java +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/AbstractWorkOrder.java @@ -2,6 +2,8 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.storage.StructurePacks; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.IJob; @@ -13,16 +15,11 @@ import com.minecolonies.api.util.Log; import com.minecolonies.api.util.Tuple; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBuilder; -import com.minecolonies.coremod.colony.workorders.view.AbstractWorkOrderView; -import com.minecolonies.coremod.colony.workorders.view.WorkOrderBuildingView; -import com.minecolonies.coremod.colony.workorders.view.WorkOrderDecorationView; -import com.minecolonies.coremod.colony.workorders.view.WorkOrderMinerView; +import com.minecolonies.coremod.colony.workorders.view.*; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; -import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,6 +27,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.Optional; +import java.util.concurrent.Future; import static com.minecolonies.api.util.constant.Suppression.UNUSED_METHOD_PARAMETERS_SHOULD_BE_REMOVED; @@ -72,6 +70,7 @@ public abstract class AbstractWorkOrder implements IWorkOrder { addMapping("building", WorkOrderBuilding.class, WorkOrderBuildingView.class); addMapping("decoration", WorkOrderDecoration.class, WorkOrderDecorationView.class); + addMapping("plantation_field", WorkOrderPlantationField.class, WorkOrderPlantationFieldView.class); addMapping("miner", WorkOrderMiner.class, WorkOrderMinerView.class); } @@ -98,7 +97,7 @@ public abstract class AbstractWorkOrder implements IWorkOrder /** * The structurize schematic name. */ - private String packName; + protected String packName; /** * The work order name. @@ -158,7 +157,7 @@ public abstract class AbstractWorkOrder implements IWorkOrder /** * Internal flag to see if anything has been changed. */ - private boolean changed; + protected boolean changed; /** * Add a given Work Order mapping. @@ -402,6 +401,12 @@ public String getStructurePack() return packName; } + @Override + public Future getBlueprintFuture() + { + return StructurePacks.getBlueprintFuture(getStructurePack(), getStructurePath()); + } + @Override public final String getTranslationKey() { diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkManager.java b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkManager.java index 3398145e06e..58798faa666 100755 --- a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkManager.java +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkManager.java @@ -88,6 +88,7 @@ public void removeWorkOrder(final int orderId) final IWorkOrder workOrder = workOrders.get(orderId); if (workOrder != null) { + dirty = true; workOrders.remove(orderId); colony.removeWorkOrderInView(orderId); workOrder.onRemoved(colony); diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderDecoration.java b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderDecoration.java index 00dcd752c1c..2404c6859f6 100644 --- a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderDecoration.java +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderDecoration.java @@ -3,13 +3,11 @@ import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.colony.workorders.IWorkManager; import com.minecolonies.api.colony.workorders.WorkOrderType; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.coremod.colony.jobs.JobBuilder; import com.minecolonies.coremod.entity.ai.citizen.builder.ConstructionTapeHelper; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import static com.minecolonies.api.util.constant.Suppression.UNUSED_METHOD_PARAMETERS_SHOULD_BE_REMOVED; @@ -97,28 +95,6 @@ public boolean isValid(final IColony colony) return super.isValid(colony) && this.getStructurePath() != null && !this.getStructurePath().isEmpty(); } - /** - * Read the WorkOrder data from the CompoundTag. - * - * @param compound NBT Tag compound. - */ - @Override - public void read(@NotNull final CompoundTag compound, final IWorkManager manager) - { - super.read(compound, manager); - } - - /** - * Save the Work Order to an CompoundTag. - * - * @param compound NBT tag compound. - */ - @Override - public void write(@NotNull final CompoundTag compound) - { - super.write(compound); - } - @Override public void onAdded(final IColony colony, final boolean readingFromNbt) { diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderMiner.java b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderMiner.java index 995e1387772..4dae8891c6c 100644 --- a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderMiner.java +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderMiner.java @@ -1,5 +1,8 @@ package com.minecolonies.coremod.colony.workorders; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.storage.StructurePacks; +import com.ldtteam.structurize.util.IOPool; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.IJob; @@ -11,6 +14,9 @@ import net.minecraft.core.BlockPos; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.Future; + +import static com.minecolonies.api.util.constant.Constants.STORAGE_STYLE; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS; /** @@ -55,6 +61,26 @@ public WorkOrderMiner( this.minerBuilding = minerBuilding; } + @Override + public Future getBlueprintFuture() + { + return IOPool.submit(() -> + { + Blueprint blueprint = StructurePacks.getBlueprint(getStructurePack(), getStructurePath(), true); + if (blueprint == null) + { + // automatic fallback to default style + blueprint = StructurePacks.getBlueprint(STORAGE_STYLE, getStructurePath()); + if (blueprint != null) + { + packName = STORAGE_STYLE; + changed = true; + } + } + return blueprint; + }); + } + @Override public boolean canBuild(@NotNull ICitizenData citizen) { diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderPlantationField.java b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderPlantationField.java new file mode 100644 index 00000000000..1f54a5f210c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/WorkOrderPlantationField.java @@ -0,0 +1,98 @@ +package com.minecolonies.coremod.colony.workorders; + +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.jobs.IJob; +import com.minecolonies.api.colony.workorders.WorkOrderType; +import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.coremod.colony.jobs.JobBuilder; +import com.minecolonies.coremod.entity.ai.citizen.builder.ConstructionTapeHelper; +import net.minecraft.core.BlockPos; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_NEW_DECORATION_REQUEST; + +/** + * A work order that the build can take to build plantation fields. + */ +public class WorkOrderPlantationField extends AbstractWorkOrder +{ + /** + * Unused constructor for reflection. + */ + public WorkOrderPlantationField() + { + super(); + } + + private WorkOrderPlantationField( + String packName, String path, final String translationKey, WorkOrderType workOrderType, BlockPos location, int rotation, boolean isMirrored, int currentLevel, + int targetLevel) + { + super(packName, path, translationKey, workOrderType, location, rotation, isMirrored, currentLevel, targetLevel); + } + + public static WorkOrderPlantationField create( + @NotNull final WorkOrderType type, + final String packName, + final String path, + final String translationKey, + final BlockPos location, + final int rotation, + final boolean mirror, + final int currentLevel) + { + int targetLevel = 1; + if (type == WorkOrderType.REMOVE) + { + targetLevel = 0; + } + + return new WorkOrderPlantationField( + packName, + path, + translationKey, + type, + location, + rotation, + mirror, + currentLevel, + targetLevel); + } + + @Override + public boolean canBeMadeBy(final IJob job) + { + return job instanceof JobBuilder; + } + + @Override + public boolean canBuild(final @NotNull ICitizenData citizen) + { + return true; + } + + @Override + public boolean isValid(final IColony colony) + { + return super.isValid(colony) && this.getStructurePath() != null && !this.getStructurePath().isEmpty(); + } + + @Override + public void onAdded(final IColony colony, final boolean readingFromNbt) + { + super.onAdded(colony, readingFromNbt); + if (!readingFromNbt && colony != null && colony.getWorld() != null) + { + ConstructionTapeHelper.placeConstructionTape(this, colony.getWorld()); + MessageUtils.format(MESSAGE_NEW_DECORATION_REQUEST, colony.getName()).sendTo(colony).forManagers(); + } + } + + @Override + public void onRemoved(final IColony colony) + { + super.onRemoved(colony); + ConstructionTapeHelper.removeConstructionTape(this, colony.getWorld()); + } +} diff --git a/src/main/java/com/minecolonies/coremod/colony/workorders/view/WorkOrderPlantationFieldView.java b/src/main/java/com/minecolonies/coremod/colony/workorders/view/WorkOrderPlantationFieldView.java new file mode 100644 index 00000000000..6865e3cc00e --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/colony/workorders/view/WorkOrderPlantationFieldView.java @@ -0,0 +1,36 @@ +package com.minecolonies.coremod.colony.workorders.view; + +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.buildings.workerbuildings.ITownHallView; +import com.minecolonies.api.util.constant.TranslationConstants; +import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBuilder; +import net.minecraft.network.chat.Component; + +/** + * The client side representation for a work order that the builder can take to build plantation fields. + */ +public class WorkOrderPlantationFieldView extends AbstractWorkOrderView +{ + @Override + public Component getDisplayName() + { + return getOrderTypePrefix(Component.translatable(getTranslationKey())); + } + + private Component getOrderTypePrefix(Component nameComponent) + { + return switch (this.getWorkOrderType()) + { + case BUILD -> Component.translatable(TranslationConstants.BUILDER_ACTION_BUILDING, nameComponent); + case REPAIR -> Component.translatable(TranslationConstants.BUILDER_ACTION_REPAIRING, nameComponent); + case REMOVE -> Component.translatable(TranslationConstants.BUILDER_ACTION_REMOVING, nameComponent); + default -> nameComponent; + }; + } + + @Override + public boolean shouldShowIn(IBuildingView view) + { + return view instanceof ITownHallView || view instanceof BuildingBuilder.View; + } +} diff --git a/src/main/java/com/minecolonies/coremod/commands/CommandArgumentNames.java b/src/main/java/com/minecolonies/coremod/commands/CommandArgumentNames.java index 04443d6a8a7..06b017ddb5f 100755 --- a/src/main/java/com/minecolonies/coremod/commands/CommandArgumentNames.java +++ b/src/main/java/com/minecolonies/coremod/commands/CommandArgumentNames.java @@ -7,9 +7,9 @@ public abstract class CommandArgumentNames public static final String CITIZENID_ARG = "citizenID"; public static final String RAID_TYPE_ARG = "raidtype"; public static final String RAID_TIME_ARG = "raidtime"; + public static final String SHIP_ARG = "allowships"; public static final String RAID_NOW = "now"; public static final String RAID_TONIGHT = "tonight"; - public static final String POS_ARG = "location"; public static final String RANGE_ARG = "range"; diff --git a/src/main/java/com/minecolonies/coremod/commands/EntryPoint.java b/src/main/java/com/minecolonies/coremod/commands/EntryPoint.java index d4cf1c0e587..71ab1de2d01 100755 --- a/src/main/java/com/minecolonies/coremod/commands/EntryPoint.java +++ b/src/main/java/com/minecolonies/coremod/commands/EntryPoint.java @@ -54,6 +54,9 @@ public static void register(final CommandDispatcher dispatch .addNode(new CommandLoadBackup().build()) .addNode(new CommandLoadAllBackups().build()) .addNode(new CommandColonyInfo().build()) + .addNode(new CommandColonyPrintStats().build()) + .addNode(new CommandColonyRaidsInfo().build()) + .addNode(new CommandColonyChunks().build()) .addNode(new CommandRSReset().build()) .addNode(new CommandRSResetAll().build()) .addNode(new CommandSetAbandoned().build()) @@ -88,6 +91,7 @@ public static void register(final CommandDispatcher dispatch .addNode(new CommandBackup().build()) .addNode(new CommandResetPlayerSupplies().build()) .addNode(new CommandHelp().build()) + .addNode(new ScanCommand().build()) .addNode(new CommandPruneWorld().build()); /* diff --git a/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenInfo.java b/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenInfo.java index 45818c95fda..df3bc0d56b9 100755 --- a/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenInfo.java +++ b/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenInfo.java @@ -9,13 +9,14 @@ import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; import com.minecolonies.coremod.commands.commandTypes.IMCColonyOfficerCommand; import com.minecolonies.coremod.commands.commandTypes.IMCCommand; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import java.util.Optional; @@ -110,9 +111,9 @@ else if (entityCitizen.getCitizenColonyHandler().getWorkBuilding() != null && en entityCitizen.getCitizenColonyHandler().getWorkBuilding().getFirstModuleOccurance(WorkerBuildingModule.class).getJobEntry().getTranslationKey()), true); context.getSource() .sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_CITIZEN_INFO_ACTIVITY, - entityCitizen.getDesiredActivity(), + ((EntityCitizen) entityCitizen).getCitizenAI().getState(), entityCitizen.getCitizenJobHandler().getColonyJob().getNameTagDescription(), - entityCitizen.goalSelector.getRunningGoals().findFirst().get().getGoal().toString()), true); + entityCitizen.getCitizenJobHandler().getWorkAI().getState()), true); } return 1; diff --git a/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenSpawnNew.java b/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenSpawnNew.java index 889722ad534..6818e585a70 100755 --- a/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenSpawnNew.java +++ b/src/main/java/com/minecolonies/coremod/commands/citizencommands/CommandCitizenSpawnNew.java @@ -1,7 +1,9 @@ package com.minecolonies.coremod.commands.citizencommands; +import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.citizens.event.CitizenAddedEvent; import com.minecolonies.coremod.commands.commandTypes.IMCCommand; import com.minecolonies.coremod.commands.commandTypes.IMCOPCommand; import com.mojang.brigadier.arguments.IntegerArgumentType; @@ -9,6 +11,7 @@ import com.mojang.brigadier.context.CommandContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; +import net.minecraftforge.common.MinecraftForge; import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_CITIZEN_SPAWN_SUCCESS; import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_COLONY_ID_NOT_FOUND; @@ -36,9 +39,11 @@ public int onExecute(final CommandContext context) return 0; } - context.getSource() - .sendSuccess(Component.translatable(COMMAND_CITIZEN_SPAWN_SUCCESS, - colony.getCitizenManager().spawnOrCreateCivilian(null, colony.getWorld(), null, true).getName()), true); + final ICitizenData newCitizen = colony.getCitizenManager().spawnOrCreateCivilian(null, colony.getWorld(), null, true); + context.getSource().sendSuccess(Component.translatable(COMMAND_CITIZEN_SPAWN_SUCCESS, newCitizen.getName()), true); + + MinecraftForge.EVENT_BUS.post(new CitizenAddedEvent(newCitizen, CitizenAddedEvent.Source.COMMANDS)); + return 1; } diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandAddOfficer.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandAddOfficer.java index d0a5c7e0bd4..f48a42a1ced 100755 --- a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandAddOfficer.java +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandAddOfficer.java @@ -60,6 +60,7 @@ public int onExecute(final CommandContext context) return 0; } colony.getPermissions().addPlayer(profile, colony.getPermissions().getRank(colony.getPermissions().OFFICER_RANK_ID)); + colony.getPackageManager().addImportantColonyPlayer(context.getSource().getServer().getPlayerList().getPlayer(profile.getId())); context.getSource().sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_OFFICER_ADD_SUCCESS, profile.getName(), colony.getName()), true); return 1; diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyChunks.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyChunks.java new file mode 100644 index 00000000000..f6cff57a4db --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyChunks.java @@ -0,0 +1,91 @@ +package com.minecolonies.coremod.commands.colonycommands; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.coremod.commands.commandTypes.IMCColonyOfficerCommand; +import com.minecolonies.coremod.commands.commandTypes.IMCCommand; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.Ticket; +import net.minecraft.server.level.TicketType; +import net.minecraft.util.SortedArraySet; + +import java.util.HashSet; +import java.util.Set; + +import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_COLONY_ID_NOT_FOUND; +import static com.minecolonies.coremod.commands.CommandArgumentNames.COLONYID_ARG; +import static com.minecolonies.coremod.commands.colonycommands.CommandColonyInfo.ID_TEXT; +import static com.minecolonies.coremod.commands.colonycommands.CommandColonyInfo.NAME_TEXT; + +public class CommandColonyChunks implements IMCColonyOfficerCommand +{ + /** + * What happens when the command is executed after preConditions are successful. + * + * @param context the context of the command execution + */ + @Override + public int onExecute(final CommandContext context) + { + // Colony + final int colonyID = IntegerArgumentType.getInteger(context, COLONYID_ARG); + final IColony colony = IColonyManager.getInstance().getColonyByDimension(colonyID, context.getSource().getLevel().dimension()); + if (colony == null) + { + context.getSource().sendSuccess(Component.translatable(COMMAND_COLONY_ID_NOT_FOUND, colonyID), true); + return 0; + } + + + Set types = new HashSet<>(); + + for (final Long chunkLong : colony.getLoadedChunks()) + { + final SortedArraySet> tickets = context.getSource().getLevel().getChunkSource().chunkMap.getDistanceManager().tickets.get((long) chunkLong); + if (tickets != null) + { + for (final Ticket ticket : tickets) + { + types.add(ticket.getType()); + } + } + } + + StringBuilder ticketString = new StringBuilder(); + for (final TicketType type : types) + { + ticketString.append("[").append(type).append("]"); + } + + context.getSource() + .sendSuccess(Component.literal(ID_TEXT) + .append(Component.literal("" + colony.getID()).withStyle(ChatFormatting.YELLOW)) + .append(Component.literal(" " + NAME_TEXT)) + .append(Component.literal("" + colony.getName()).withStyle(ChatFormatting.YELLOW)), true); + context.getSource().sendSuccess(Component.literal("Loaded chunks:").append(Component.literal(" " + colony.getLoadedChunkCount()).withStyle(ChatFormatting.YELLOW)), true); + context.getSource().sendSuccess(Component.translatable("Ticket types: ").append(Component.literal(ticketString.toString()).withStyle(ChatFormatting.YELLOW)), true); + + return 1; + } + + /** + * Name string of the command. + */ + @Override + public String getName() + { + return "chunkstatus"; + } + + @Override + public LiteralArgumentBuilder build() + { + return IMCCommand.newLiteral(getName()) + .then(IMCCommand.newArgument(COLONYID_ARG, IntegerArgumentType.integer(1)).executes(this::checkPreConditionAndExecute)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyInfo.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyInfo.java index 57b3d6c7c66..bfbff834e25 100755 --- a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyInfo.java +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyInfo.java @@ -7,11 +7,11 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; +import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Style; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_COLONY_ID_NOT_FOUND; import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_DISABLED_IN_CONFIG; @@ -19,8 +19,8 @@ public class CommandColonyInfo implements IMCCommand { - private static final String ID_TEXT = "ID: "; - private static final String NAME_TEXT = "Name: "; + public static final String ID_TEXT = "ID: "; + public static final String NAME_TEXT = "Name: "; private static final String MAYOR_TEXT = "Mayor: "; private static final String COORDINATES_TEXT = "Coordinates: "; private static final String COORDINATES_XYZ = "x=%s y=%s z=%s"; diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyPrintStats.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyPrintStats.java new file mode 100644 index 00000000000..4af2a92dbad --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyPrintStats.java @@ -0,0 +1,142 @@ +package com.minecolonies.coremod.commands.colonycommands; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.managers.RaidManager; +import com.minecolonies.coremod.commands.commandTypes.IMCCommand; +import com.minecolonies.coremod.commands.commandTypes.IMCOPCommand; +import com.minecolonies.coremod.research.LocalResearchTree; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.contents.LiteralContents; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; +import java.util.stream.Collectors; + +import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_COLONY_ID_NOT_FOUND; +import static com.minecolonies.coremod.commands.CommandArgumentNames.COLONYID_ARG; + +/** + * Command to print statistics on a colony + */ +public class CommandColonyPrintStats implements IMCOPCommand +{ + public static final String ID_TEXT = "ID: "; + public static final String NAME_TEXT = "Name: "; + private static final String MAYOR_TEXT = "Mayor: "; + private static final String COORDINATES_TEXT = "Coordinates: "; + private static final String COORDINATES_XYZ = "x=%s y=%s z=%s"; + private static final String CITIZENS = "Citizens: "; + private static final String LAST_CONTACT_TEXT = "Last contact with Owner or Officer: %d hours ago!"; + private static final String IS_DELETABLE = "If true this colony cannot be deleted: "; + private static final String CANNOT_BE_RAIDED = "This colony is unable to be raided"; + private String fullLog = ""; + + /** + * What happens when the command is executed after preConditions are successful. + * + * @param context the context of the command execution + */ + @Override + public int onExecute(final CommandContext context) + { + fullLog = "\n"; + // Colony + final int colonyID = IntegerArgumentType.getInteger(context, COLONYID_ARG); + final IColony colony = IColonyManager.getInstance().getColonyByDimension(colonyID, context.getSource().getLevel().dimension()); + if (colony == null) + { + context.getSource().sendSuccess(Component.translatable(COMMAND_COLONY_ID_NOT_FOUND, colonyID), false); + return 0; + } + + final BlockPos position = colony.getCenter(); + context.getSource().sendSuccess(literalAndRemember(ID_TEXT + colony.getID() + NAME_TEXT + colony.getName()), false); + final String mayor = colony.getPermissions().getOwnerName(); + context.getSource().sendSuccess(literalAndRemember(MAYOR_TEXT + mayor), false); + context.getSource() + .sendSuccess(literalAndRemember(CITIZENS + colony.getCitizenManager().getCurrentCitizenCount() + "/" + colony.getCitizenManager().getMaxCitizens()), false); + context.getSource() + .sendSuccess(literalAndRemember( + COORDINATES_TEXT + String.format(COORDINATES_XYZ, position.getX(), position.getY(), position.getZ())).setStyle(Style.EMPTY.withColor( + ChatFormatting.GREEN)), false); + context.getSource().sendSuccess(literalAndRemember(String.format(LAST_CONTACT_TEXT, colony.getLastContactInHours())), false); + context.getSource().sendSuccess(literalAndRemember(IS_DELETABLE + !colony.canBeAutoDeleted()), false); + + if (!colony.getRaiderManager().canHaveRaiderEvents()) + { + context.getSource().sendSuccess(literalAndRemember(CANNOT_BE_RAIDED), false); + } + + final RaidManager.RaidHistory last = ((RaidManager) colony.getRaiderManager()).getLastRaid(); + if (last != null) + { + context.getSource().sendSuccess(literalAndRemember(last.toString()), false); + } + + if (colony.getBuildingManager().getBuildings().size() > 0) + { + context.getSource() + .sendSuccess(literalAndRemember("Buildings:" + colony.getBuildingManager().getBuildings().size() + " average level:" + colony.getBuildingManager() + .getBuildings() + .values() + .stream() + .filter(iBuilding -> iBuilding.getBuildingLevel() != 0) + .collect( + Collectors.summingInt(ibuilding -> ibuilding.getBuildingLevel())) / colony.getBuildingManager().getBuildings().size()), false); + context.getSource() + .sendSuccess(literalAndRemember(colony.getBuildingManager() + .getBuildings() + .values() + .stream() + .filter(iBuilding -> iBuilding.getBuildingLevel() != 0) + .map(building -> building.getSchematicName() + building.getBuildingLevel() + " pos:" + building.getPosition().toShortString()) + .collect( + Collectors.joining("\n"))), false); + } + + List completed = ((LocalResearchTree) colony.getResearchManager().getResearchTree()).getCompletedList(); + context.getSource().sendSuccess(literalAndRemember("Reasearches completed count:" + completed.size()), false); + context.getSource().sendSuccess(literalAndRemember(completed.stream().map(r -> r.toString()).collect(Collectors.joining("\n"))), false); + + Log.getLogger().info(fullLog); + return 1; + } + + /** + * Creates a literal component and remembers the string for logging + * + * @param message + * @return + */ + MutableComponent literalAndRemember(String message) + { + fullLog += message + "\n"; + return MutableComponent.create(new LiteralContents(message)); + } + + /** + * Name string of the command. + */ + @Override + public String getName() + { + return "printStats"; + } + + @Override + public LiteralArgumentBuilder build() + { + return IMCCommand.newLiteral(getName()) + .then(IMCCommand.newArgument(COLONYID_ARG, IntegerArgumentType.integer(1)).executes(this::checkPreConditionAndExecute)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyRaidsInfo.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyRaidsInfo.java new file mode 100644 index 00000000000..ac0e6eb3e8c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandColonyRaidsInfo.java @@ -0,0 +1,72 @@ +package com.minecolonies.coremod.commands.colonycommands; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.coremod.MineColonies; +import com.minecolonies.coremod.colony.managers.RaidManager; +import com.minecolonies.coremod.commands.commandTypes.IMCCommand; +import com.minecolonies.coremod.commands.commandTypes.IMCOPCommand; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; + +import java.util.List; + +import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_COLONY_ID_NOT_FOUND; +import static com.minecolonies.api.util.constant.translation.CommandTranslationConstants.COMMAND_DISABLED_IN_CONFIG; +import static com.minecolonies.coremod.commands.CommandArgumentNames.COLONYID_ARG; + +public class CommandColonyRaidsInfo implements IMCOPCommand +{ + /** + * What happens when the command is executed after preConditions are successful. + * + * @param context the context of the command execution + */ + @Override + public int onExecute(final CommandContext context) + { + // Colony + final int colonyID = IntegerArgumentType.getInteger(context, COLONYID_ARG); + final IColony colony = IColonyManager.getInstance().getColonyByDimension(colonyID, context.getSource().getLevel().dimension()); + if (colony == null) + { + context.getSource().sendSuccess(Component.translatable(COMMAND_COLONY_ID_NOT_FOUND, colonyID), true); + return 0; + } + + if (!context.getSource().hasPermission(OP_PERM_LEVEL) && !MineColonies.getConfig().getServer().canPlayerUseShowColonyInfoCommand.get()) + { + context.getSource().sendSuccess(Component.translatable(COMMAND_DISABLED_IN_CONFIG), true); + return 0; + } + + List allRaids = ((RaidManager) colony.getRaiderManager()).getAllRaids(); + for (int i = 0; i < allRaids.size(); i++) + { + final RaidManager.RaidHistory history = allRaids.get(i); + final double hoursSince = Math.round(100 * (colony.getWorld().getGameTime() - history.raidTime) / (20.0 * 60 * 60)) / 100.0; + context.getSource().sendSuccess(Component.literal(hoursSince + " hours ago:" + history), true); + } + + return 1; + } + + /** + * Name string of the command. + */ + @Override + public String getName() + { + return "raidhistory"; + } + + @Override + public LiteralArgumentBuilder build() + { + return IMCCommand.newLiteral(getName()) + .then(IMCCommand.newArgument(COLONYID_ARG, IntegerArgumentType.integer(1)).executes(this::checkPreConditionAndExecute)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandRaid.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandRaid.java index 297fd55b255..6685357a013 100644 --- a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandRaid.java +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandRaid.java @@ -4,11 +4,13 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.colonyEvents.registry.ColonyEventTypeRegistryEntry; +import com.minecolonies.api.colony.managers.interfaces.IRaiderManager; import com.minecolonies.api.util.constant.translation.CommandTranslationConstants; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.norsemenevent.NorsemenShipRaidEvent; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.PirateGroundRaidEvent; import com.minecolonies.coremod.commands.commandTypes.IMCCommand; import com.minecolonies.coremod.commands.commandTypes.IMCOPCommand; +import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -61,14 +63,25 @@ public int raidExecute(final CommandContext context, final S return 0; } + final boolean allowShips = BoolArgumentType.getBool(context, SHIP_ARG); if(StringArgumentType.getString(context, RAID_TIME_ARG).equals(RAID_NOW)) { - colony.getRaiderManager().raiderEvent(raidType); - context.getSource().sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_RAID_NOW_SUCCESS, colony.getName()), true); + final IRaiderManager.RaidSpawnResult result = colony.getRaiderManager().raiderEvent(raidType, true, allowShips); + if (result == IRaiderManager.RaidSpawnResult.SUCCESS) + { + context.getSource().sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_RAID_NOW_SUCCESS, colony.getName()), true); + return 1; + } + context.getSource().sendFailure(Component.translatable(CommandTranslationConstants.COMMAND_RAID_NOW_FAILURE, colony.getName(), result)); } else if(StringArgumentType.getString(context, RAID_TIME_ARG).equals(RAID_TONIGHT)) { - colony.getRaiderManager().setRaidNextNight(true, raidType); + if (!colony.getRaiderManager().canRaid(true)) + { + context.getSource().sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_RAID_NOW_FAILURE, colony.getName(), IRaiderManager.RaidSpawnResult.CANNOT_RAID), true); + return 1; + } + colony.getRaiderManager().setRaidNextNight(true, raidType, allowShips); context.getSource().sendSuccess(Component.translatable(CommandTranslationConstants.COMMAND_RAID_TONIGHT_SUCCESS, colony.getName()), true); } return 1; @@ -106,7 +119,8 @@ public LiteralArgumentBuilder build() .then(IMCCommand.newArgument(COLONYID_ARG, IntegerArgumentType.integer(1)) .then(IMCCommand.newArgument(RAID_TYPE_ARG, StringArgumentType.string()) .suggests((ctx, builder) -> SharedSuggestionProvider.suggest(raidTypes, builder)) - .executes(this::onSpecificExecute)) + .then(IMCCommand.newArgument(SHIP_ARG, BoolArgumentType.bool()) + .executes(this::onSpecificExecute))) .executes(this::checkPreConditionAndExecute))); } } diff --git a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandShowClaim.java b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandShowClaim.java index 48cfda4ac02..43ad4efd7cc 100644 --- a/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandShowClaim.java +++ b/src/main/java/com/minecolonies/coremod/commands/colonycommands/CommandShowClaim.java @@ -11,9 +11,10 @@ import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.LevelChunk; @@ -39,7 +40,7 @@ public int onExecute(final CommandContext context) BlockPos pos = new BlockPos(context.getSource().getPosition()); try { - pos = BlockPosArgument.getLoadedBlockPos(context, POS_ARG); + pos = context.getArgument(POS_ARG, Coordinates.class).getBlockPos(context.getSource()); } catch (Exception e) { diff --git a/src/main/java/com/minecolonies/coremod/commands/generalcommands/CommandRaidAll.java b/src/main/java/com/minecolonies/coremod/commands/generalcommands/CommandRaidAll.java index bbfbcade71b..25764f00db0 100644 --- a/src/main/java/com/minecolonies/coremod/commands/generalcommands/CommandRaidAll.java +++ b/src/main/java/com/minecolonies/coremod/commands/generalcommands/CommandRaidAll.java @@ -54,7 +54,7 @@ public int raidsExecute(final CommandContext context, final { for (final IColony colony : IColonyManager.getInstance().getAllColonies()) { - colony.getRaiderManager().raiderEvent(raidType); + colony.getRaiderManager().raiderEvent(raidType, true); } context.getSource().sendSuccess(Component.translatable(COMMAND_RAID_TONIGHT_WARNING), true); return 1; diff --git a/src/main/java/com/minecolonies/coremod/commands/generalcommands/ScanCommand.java b/src/main/java/com/minecolonies/coremod/commands/generalcommands/ScanCommand.java new file mode 100644 index 00000000000..87f485e7e06 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/commands/generalcommands/ScanCommand.java @@ -0,0 +1,395 @@ +package com.minecolonies.coremod.commands.generalcommands; + +import com.ldtteam.structurize.Network; +import com.ldtteam.structurize.Structurize; +import com.ldtteam.structurize.api.util.BlockPosUtil; +import com.ldtteam.structurize.api.util.Log; +import com.ldtteam.structurize.api.util.constant.Constants; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.blueprints.v1.BlueprintUtil; +import com.ldtteam.structurize.commands.AbstractCommand; +import com.ldtteam.structurize.network.messages.SaveScanMessage; +import com.ldtteam.structurize.storage.rendering.types.BoxPreviewData; +import com.ldtteam.structurize.util.BlockInfo; +import com.ldtteam.structurize.util.ScanToolData; +import com.minecolonies.api.blocks.AbstractBlockHut; +import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; +import com.minecolonies.coremod.network.messages.client.SaveStructureNBTMessage; +import com.mojang.authlib.GameProfile; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.ResourceLocationException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.GameProfileArgument; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.JigsawBlock; +import net.minecraft.world.level.block.entity.JigsawBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.stream.Collectors; + +import static com.ldtteam.structurize.api.util.constant.Constants.MOD_ID; +import static com.ldtteam.structurize.api.util.constant.TranslationConstants.ANCHOR_POS_OUTSIDE_SCHEMATIC; +import static com.ldtteam.structurize.api.util.constant.TranslationConstants.MAX_SCHEMATIC_SIZE_REACHED; +import static com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE.TAG_BLUEPRINTDATA; + +/** + * Command for opening WindowScanTool or scanning a structure into a file + */ +public class ScanCommand extends AbstractCommand +{ + /** + * Descriptive string. + */ + public static final String NAME = "scan"; + + /** + * The player not found for a scan message. + */ + private static final String PLAYER_NOT_FOUND = "com.structurize.command.playernotfound"; + + /** + * The scan success message. + */ + private static final String SCAN_SUCCESS_MESSAGE = "com.structurize.command.scan.success"; + + /** + * The no permission message reply. + */ + private static final String NO_PERMISSION_MESSAGE = "com.structurize.command.scan.no.perm"; + + /** + * The filename command argument. + */ + public static final String FILE_NAME = "filename"; + + /** + * The player name command argument. + */ + public static final String PLAYER_NAME = "player"; + + /** + * Position 1 command argument. + */ + public static final String POS1 = "pos1"; + + /** + * Position 2 command argument. + */ + public static final String POS2 = "pos2"; + + /** + * Anchor position command argument. + */ + public static final String ANCHOR_POS = "anchor_pos"; + + /** + * Scan the structure and save it to the disk. + * + * @param world Current world. + * @param player causing this action. + * @param slot the scan data. + * @param saveEntities whether to scan in entities + */ + public static void saveStructure( + final Level world, + final Player player, + final ScanToolData.Slot slot, + final boolean saveEntities) + { + if (slot.getBox().getAnchor().isPresent()) + { + if (!BlockPosUtil.isInbetween(slot.getBox().getAnchor().get(), slot.getBox().getPos1(), slot.getBox().getPos2())) + { + player.displayClientMessage(Component.translatable(ANCHOR_POS_OUTSIDE_SCHEMATIC), false); + return; + } + } + + final BoundingBox box = BoundingBox.fromCorners(slot.getBox().getPos1(), slot.getBox().getPos2()); + if (box.getXSpan() * box.getYSpan() * box.getZSpan() > Structurize.getConfig().getServer().schematicBlockLimit.get()) + { + player.displayClientMessage(Component.translatable(MAX_SCHEMATIC_SIZE_REACHED, Structurize.getConfig().getServer().schematicBlockLimit.get()), false); + return; + } + + final long currentMillis = System.currentTimeMillis(); + final String currentMillisString = Long.toString(currentMillis); + String fileName; + if (slot.getName().isEmpty()) + { + fileName = Component.translatable("item.sceptersteel.scanformat", "", currentMillisString).getString(); + } + else + { + fileName = slot.getName(); + } + + if (!fileName.contains(".blueprint")) + { + fileName+= ".blueprint"; + } + + final String[] split = fileName.split("/"); + final String style = split.length <= 1 ? "" : split[0]; + + final BlockPos zero = new BlockPos(box.minX(), box.minY(), box.minZ()); + final Blueprint + bp = BlueprintUtil.createBlueprint(world, zero, saveEntities, (short) box.getXSpan(), (short) box.getYSpan(), (short) box.getZSpan(), fileName, slot.getBox().getAnchor()); + + if (slot.getBox().getAnchor().isEmpty() && bp.getPrimaryBlockOffset().equals(new BlockPos(bp.getSizeX() / 2, 0, bp.getSizeZ() / 2))) + { + final List list = bp.getBlockInfoAsList().stream() + .filter(blockInfo -> blockInfo.hasTileEntityData() && blockInfo.getTileEntityData().contains(TAG_BLUEPRINTDATA)) + .collect(Collectors.toList()); + + if (list.size() > 1) + { + player.displayClientMessage(Component.translatable("com.ldtteam.structurize.gui.scantool.scanbadanchor", fileName), false); + } + } + + Network.getNetwork().sendToPlayer(new SaveScanMessage(BlueprintUtil.writeBlueprintToNBT(bp), fileName.toLowerCase(Locale.US)), (ServerPlayer) player); + if (style.isEmpty()) + { + return; + } + + boolean hasJigsaw = false; + for (BlockState state : bp.getPalette()) + { + if (state.getBlock() == Blocks.JIGSAW) + { + hasJigsaw = true; + break; + } + } + + if (!hasJigsaw) + { + return; + } + + final BlockState primary = world.getBlockState(zero.offset(bp.getPrimaryBlockOffset())); + final boolean isHut; + if (primary.getBlock() instanceof AbstractBlockHut) + { + isHut = true; + final AbstractTileEntityColonyBuilding building = (AbstractTileEntityColonyBuilding) world.getBlockEntity(zero.offset(bp.getPrimaryBlockOffset())); + building.addTag(new BlockPos(0, 0, 0), "deactivated"); + building.setPackName(style); + building.setBlueprintPath(fileName.replace( style + "/", "")); + } + else + { + isHut = false; + } + + int lowestY = box.maxY(); + final String piecesName = style.replace(" ", "").toLowerCase(Locale.US); + for (final BlockPos mutablePos : BlockPos.betweenClosed(zero, zero.offset(box.getXSpan() - 1, box.getYSpan() - 1, box.getZSpan() - 1))) + { + BlockState state = world.getBlockState(mutablePos); + if (state.getBlock() == Blocks.JIGSAW) + { + if (mutablePos.getY() < lowestY) + { + lowestY = mutablePos.getY(); + } + JigsawBlockEntity jigsawBlockEntity = (JigsawBlockEntity) world.getBlockEntity(mutablePos); + if (jigsawBlockEntity.getName().getPath().isEmpty() || jigsawBlockEntity.getName().getPath().equals("empty")) + { + if (jigsawBlockEntity.getFinalState().equals("minecraft:air")) + { + jigsawBlockEntity.setFinalState("minecraft:structure_void"); + } + if (isHut) + { + jigsawBlockEntity.setPool(ResourceKey.create(Registry.TEMPLATE_POOL_REGISTRY, new ResourceLocation("minecolonies:" + piecesName+ "/roads"))); + jigsawBlockEntity.setName(new ResourceLocation("minecolonies:building_entrance")); + jigsawBlockEntity.setTarget(new ResourceLocation("minecolonies:building_entrance")); + } + else if (jigsawBlockEntity.getPool().location().getPath().contains("building")) + { + jigsawBlockEntity.setPool(ResourceKey.create(Registry.TEMPLATE_POOL_REGISTRY, new ResourceLocation("minecolonies:" + piecesName+ "/buildings"))); + jigsawBlockEntity.setName(new ResourceLocation("minecolonies:building_entrance")); + jigsawBlockEntity.setTarget(new ResourceLocation("minecolonies:building_entrance")); + } + else + { + jigsawBlockEntity.setPool(ResourceKey.create(Registry.TEMPLATE_POOL_REGISTRY, new ResourceLocation("minecolonies:" + piecesName+ "/roads"))); + jigsawBlockEntity.setName(new ResourceLocation("minecolonies:street")); + jigsawBlockEntity.setTarget(new ResourceLocation("minecolonies:street")); + } + } + jigsawBlockEntity.setChanged(); + world.sendBlockUpdated(mutablePos, state, state, 3); + } + } + + final StructureTemplateManager structuretemplatemanager = ((ServerLevel) world).getStructureManager(); + final BlockPos newZero = new BlockPos(zero.getX(), Math.max(zero.getY(), lowestY - 1), zero.getZ()); + final int yDif = newZero.getY() - zero.getY(); + StructureTemplate structuretemplate; + try + { + final ResourceLocation location = new ResourceLocation(Constants.MOD_ID, fileName.replace(".blueprint", "").replace(" ", "").toLowerCase(Locale.US)); + structuretemplate = structuretemplatemanager.getOrCreate(location); + structuretemplate.fillFromWorld(world, newZero, new BlockPos(box.getXSpan(), box.getYSpan() - yDif, box.getZSpan()), false, Blocks.STRUCTURE_VOID); + com.minecolonies.coremod.Network.getNetwork().sendToPlayer(new SaveStructureNBTMessage(structuretemplate.save(new CompoundTag()), fileName.replace(".blueprint", ".nbt").toLowerCase(Locale.US)), (ServerPlayer) player); + } + catch (final ResourceLocationException resLocEx) + { + Log.getLogger().warn("Couldnt save nbt."); + } + + if (isHut) + { + final AbstractTileEntityColonyBuilding building = (AbstractTileEntityColonyBuilding) world.getBlockEntity(zero.offset(bp.getPrimaryBlockOffset())); + building.removeTag(new BlockPos(0, 0, 0), "deactivated"); + } + } + + private static int execute(final CommandSourceStack source, final BlockPos from, final BlockPos to, final Optional anchorPos, final GameProfile profile, final String name) throws CommandSyntaxException + { + @Nullable final Level world = source.getLevel(); + if (source.getEntity() instanceof Player && !source.getPlayerOrException().isCreative()) + { + source.sendFailure(Component.literal(NO_PERMISSION_MESSAGE)); + } + + final Player player; + if (profile != null && world.getServer() != null) + { + player = world.getServer().getPlayerList().getPlayer(profile.getId()); + if (player == null) + { + source.sendFailure(Component.translatable(PLAYER_NOT_FOUND, profile.getName())); + return 0; + } + } + else if (source.getEntity() instanceof Player) + { + player = source.getPlayerOrException(); + } + else + { + source.sendFailure(Component.translatable(PLAYER_NOT_FOUND)); + return 0; + } + + + saveStructure(world, player, new ScanToolData.Slot(name, new BoxPreviewData(from, to, anchorPos)), true); + source.sendFailure(Component.translatable(SCAN_SUCCESS_MESSAGE)); + return 1; + } + + private static int onExecute(final CommandContext context) throws CommandSyntaxException + { + final BlockPos from = BlockPosArgument.getSpawnablePos(context, POS1); + final BlockPos to = BlockPosArgument.getSpawnablePos(context, POS2); + return execute(context.getSource(), from, to, Optional.empty(), null, null); + } + + private static int onExecuteWithAnchor(final CommandContext context) throws CommandSyntaxException + { + final BlockPos from = BlockPosArgument.getSpawnablePos(context, POS1); + final BlockPos to = BlockPosArgument.getSpawnablePos(context, POS2); + final BlockPos anchorPos = BlockPosArgument.getSpawnablePos(context, ANCHOR_POS); + return execute(context.getSource(), from, to, Optional.of(anchorPos), null, null); + } + + private static int onExecuteWithPlayerName(final CommandContext context) throws CommandSyntaxException + { + final BlockPos from = BlockPosArgument.getSpawnablePos(context, POS1); + final BlockPos to = BlockPosArgument.getSpawnablePos(context, POS2); + GameProfile profile = GameProfileArgument.getGameProfiles(context, PLAYER_NAME).stream().findFirst().orElse(null); + return execute(context.getSource(), from, to, Optional.empty(), profile, null); + } + + private static int onExecuteWithPlayerNameAndFileName(final CommandContext context) throws CommandSyntaxException + { + final BlockPos from = BlockPosArgument.getSpawnablePos(context, POS1); + final BlockPos to = BlockPosArgument.getSpawnablePos(context, POS2); + GameProfile profile = GameProfileArgument.getGameProfiles(context, PLAYER_NAME).stream().findFirst().orElse(null); + String name = StringArgumentType.getString(context, FILE_NAME); + return execute(context.getSource(), from, to, Optional.empty(), profile, name); + } + + private static int onExecuteWithPlayerNameAndFileNameAndAnchorPos(final CommandContext context) throws CommandSyntaxException + { + final BlockPos from = BlockPosArgument.getSpawnablePos(context, POS1); + final BlockPos to = BlockPosArgument.getSpawnablePos(context, POS2); + final BlockPos anchorPos = BlockPosArgument.getSpawnablePos(context, ANCHOR_POS); + GameProfile profile = GameProfileArgument.getGameProfiles(context, PLAYER_NAME).stream().findFirst().orElse(null); + String name = StringArgumentType.getString(context, FILE_NAME); + return execute(context.getSource(), from, to, Optional.of(anchorPos), profile, name); + } + + public static LiteralArgumentBuilder build() + { + return newLiteral(NAME) + .then(newArgument(POS1, BlockPosArgument.blockPos()) + .then(newArgument(POS2, BlockPosArgument.blockPos()) + .executes(ScanCommand::onExecute) + .then(newArgument(ANCHOR_POS, BlockPosArgument.blockPos()) + .executes(ScanCommand::onExecuteWithAnchor)) + .then(newArgument(PLAYER_NAME, GameProfileArgument.gameProfile()) + .executes(ScanCommand::onExecuteWithPlayerName) + .then(newArgument(FILE_NAME, StringArgumentType.string()) + .executes(ScanCommand::onExecuteWithPlayerNameAndFileName) + .then(newArgument(ANCHOR_POS, BlockPosArgument.blockPos()) + .executes(ScanCommand::onExecuteWithPlayerNameAndFileNameAndAnchorPos)))))); + } + + /** + * Generates a command string for the given parameters. + * + * @param slot The scan slot data. + * @return The command string. + */ + @NotNull + public static String format(@NotNull final ScanToolData.Slot slot) + { + final String name = slot.getName().chars().anyMatch(c -> !StringReader.isAllowedInUnquotedString((char)c)) + ? StringTag.quoteAndEscape(slot.getName()) : slot.getName(); + + final StringBuilder builder = new StringBuilder(); + builder.append(String.format("/%s %s %s %s @p %s", MOD_ID, NAME, + BlockPosUtil.format(slot.getBox().getPos1()), + BlockPosUtil.format(slot.getBox().getPos2()), + name)); + if (slot.getBox().getAnchor().isPresent() && BlockPosUtil.isInbetween(slot.getBox().getAnchor().get(), slot.getBox().getPos1(), slot.getBox().getPos2())) + { + builder.append(' '); + builder.append(BlockPosUtil.format(slot.getBox().getAnchor().get())); + } + return builder.toString(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillAnimal.java b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillAnimal.java index 3230fc6c432..54e4cf69f4b 100755 --- a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillAnimal.java +++ b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillAnimal.java @@ -6,6 +6,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.entity.EntityTypeTest; public class CommandKillAnimal implements IMCOPCommand { @@ -21,9 +23,9 @@ public final int onExecute(final CommandContext context) { entitiesKilled = 0; - context.getSource().getLevel().getEntities().getAll().forEach(entity -> + context.getSource().getLevel().getEntities(EntityTypeTest.forClass(Animal.class), (e) -> true).forEach(entity -> { - if (entity instanceof Animal) + if (entity != null) { entity.remove(Entity.RemovalReason.DISCARDED); entitiesKilled++; diff --git a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillMonster.java b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillMonster.java index 2d59ea3d0c9..faaa65a2729 100755 --- a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillMonster.java +++ b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillMonster.java @@ -6,6 +6,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.entity.EntityTypeTest; public class CommandKillMonster implements IMCOPCommand { @@ -21,9 +22,9 @@ public int onExecute(final CommandContext context) { entitiesKilled = 0; - context.getSource().getLevel().getEntities().getAll().forEach(entity -> + context.getSource().getLevel().getEntities(EntityTypeTest.forClass(Monster.class), (e) -> true).forEach(entity -> { - if (entity instanceof Monster) + if (entity != null) { entity.remove(Entity.RemovalReason.DISCARDED); entitiesKilled++; diff --git a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillRaider.java b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillRaider.java index c6d244d0c1b..f9133d555dd 100755 --- a/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillRaider.java +++ b/src/main/java/com/minecolonies/coremod/commands/killcommands/CommandKillRaider.java @@ -2,13 +2,14 @@ import com.minecolonies.api.colony.colonyEvents.EventStatus; import com.minecolonies.api.colony.colonyEvents.IColonyEvent; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.coremod.commands.commandTypes.IMCOPCommand; import com.mojang.brigadier.context.CommandContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.EntityTypeTest; public class CommandKillRaider implements IMCOPCommand { @@ -24,11 +25,11 @@ public int onExecute(final CommandContext context) { entitiesKilled = 0; - context.getSource().getLevel().getEntities().getAll().forEach(entity -> + context.getSource().getLevel().getEntities(EntityTypeTest.forClass(AbstractEntityRaiderMob.class), (e) -> true).forEach(entity -> { - if (entity instanceof AbstractEntityMinecoloniesMob) + if (entity != null) { - final AbstractEntityMinecoloniesMob mob = (AbstractEntityMinecoloniesMob) entity; + final AbstractEntityRaiderMob mob = (AbstractEntityRaiderMob) entity; mob.die(new DamageSource("despawn")); mob.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/com/minecolonies/coremod/compatibility/CraftingTagAuditor.java b/src/main/java/com/minecolonies/coremod/compatibility/CraftingTagAuditor.java index 4472b1c839b..501d9390162 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/CraftingTagAuditor.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/CraftingTagAuditor.java @@ -10,14 +10,15 @@ import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.crafting.ModCraftingTypes; import com.minecolonies.api.crafting.registry.CraftingType; +import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import com.minecolonies.coremod.colony.buildings.modules.SimpleCraftingModule; -import com.minecolonies.coremod.colony.crafting.CustomRecipeManager; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; -import com.minecolonies.coremod.colony.crafting.RecipeAnalyzer; +import com.minecolonies.coremod.colony.crafting.*; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.LevelResource; @@ -31,7 +32,6 @@ import java.nio.file.Path; import java.util.*; import java.util.function.Supplier; -import java.util.stream.Collectors; import static com.minecolonies.api.util.constant.Constants.MOD_ID; @@ -58,6 +58,7 @@ public static void doRecipeAudit(@NotNull final MinecraftServer server, createFile("block tag audit", server, "tag_block_audit.csv", writer -> doBlockTagAudit(writer, server)); createFile("recipe audit", server, "recipe_audit.csv", writer -> doRecipeAudit(writer, server, customRecipeManager)); createFile("domum audit", server, "domum_audit.csv", writer -> doDomumAudit(writer, server)); + createFile("tools audit", server, "tools_audit.csv", writer -> doToolsAudit(writer, server)); } private static boolean createFile(@NotNull final String description, @@ -171,11 +172,13 @@ private static void doRecipeAudit(@NotNull final BufferedWriter writer, { final Map> vanillaRecipesMap = RecipeAnalyzer.buildVanillaRecipesMap(server.getRecipeManager(), server.overworld()); + final List animals = RecipeAnalyzer.createAnimals(server.overworld()); final List crafters = getCraftingModules() .stream() .sorted(Comparator.comparing(m -> m instanceof SimpleCraftingModule).reversed()) - .collect(Collectors.toList()); // sort the simple modules first (2x2 crafting, personal only) - final Map>> craftingMap = new HashMap<>(); + .toList(); // sort the simple modules first (2x2 crafting, personal only) + final List herders = getHerdingModules(); + final Map>> craftingMap = new HashMap<>(); // initially map every vanilla craftable for (final List recipeList : vanillaRecipesMap.values()) @@ -199,13 +202,24 @@ private static void doRecipeAudit(@NotNull final BufferedWriter writer, add(customRecipeManager, craftingMap, crafter, recipe); } } + for (final AnimalHerdingModule herder : herders) + { + writer.write(','); + writer.write(herder.getHerdingJob().getJobRegistryEntry().getKey().getPath()); + + final List recipes = RecipeAnalyzer.findRecipes(animals, herder); + for (final IGenericRecipe recipe : recipes) + { + add(customRecipeManager, craftingMap, herder, recipe); + } + } writer.newLine(); for (final ItemStack item : getAllItems()) { writeItemData(writer, item); - final Map> crafterMap = + final Map> crafterMap = craftingMap.getOrDefault(new ItemStorage(item, true, false), Collections.emptyMap()); writeCrafterValue(writer, crafterMap, null); @@ -213,6 +227,10 @@ private static void doRecipeAudit(@NotNull final BufferedWriter writer, { writeCrafterValue(writer, crafterMap, crafter); } + for (final AnimalHerdingModule herder : herders) + { + writeCrafterValue(writer, crafterMap, herder); + } writer.newLine(); } } @@ -225,7 +243,7 @@ private static void doDomumAudit(@NotNull final BufferedWriter writer, final List crafters = getCraftingModules() .stream() .filter(m -> m.canLearn(ModCraftingTypes.ARCHITECTS_CUTTER.get())) - .collect(Collectors.toList()); + .toList(); writer.write("type,"); writeItemHeaders(writer); @@ -246,7 +264,7 @@ private static void doDomumAudit(@NotNull final BufferedWriter writer, .distinct() .sorted(Comparator.comparing(s -> ForgeRegistries.ITEMS.getKey(s.getItem()).toString())) .map(ItemStorage::getItemStack) - .collect(Collectors.toList()); + .toList(); for (final ItemStack skin : allSkins) { if (first) @@ -268,6 +286,41 @@ private static void doDomumAudit(@NotNull final BufferedWriter writer, } } + private static void doToolsAudit(@NotNull final BufferedWriter writer, + @NotNull final MinecraftServer server) throws IOException + { + final List toolUsages = ToolsAnalyzer.findTools(); + + writeItemHeaders(writer); + for (final ToolUsage tool : toolUsages) + { + writer.write(','); + writer.write(tool.tool().getName()); + } + writer.newLine(); + + for (final ItemStack item : getAllItems()) + { + writeItemData(writer, item); + + for (final ToolUsage tool : toolUsages) + { + writer.write(','); + for (int level = 0; level < tool.toolLevels().size(); ++level) + { + final List stacks = tool.toolLevels().get(level); + if (ItemStackUtils.compareItemStackListIgnoreStackSize(stacks, item, false, true)) + { + writer.write(Integer.toString(level)); + break; + } + } + } + + writer.newLine(); + } + } + private static void writeItemHeaders(@NotNull final BufferedWriter writer) throws IOException { writer.write("item,name"); @@ -295,8 +348,8 @@ private static void writeItemStack(@NotNull final BufferedWriter writer, } private static void writeCrafterValue(@NotNull final BufferedWriter writer, - @NotNull final Map> crafterMap, - @Nullable final ICraftingBuildingModule crafter) throws IOException + @NotNull final Map> crafterMap, + @Nullable final Object crafter) throws IOException { writer.write(','); @@ -308,8 +361,8 @@ private static void writeCrafterValue(@NotNull final BufferedWriter writer, } private static void add(@NotNull final CustomRecipeManager customRecipeManager, - @NotNull final Map>> craftingMap, - @Nullable final ICraftingBuildingModule crafter, + @NotNull final Map>> craftingMap, + @Nullable final Object crafter, @NotNull final IGenericRecipe recipe) { for (final ItemStack stack : recipe.getAllMultiOutputs()) @@ -329,8 +382,8 @@ private static void add(@NotNull final CustomRecipeManager customRecipeManager, } } - private static void add(@NotNull final Map>> craftingMap, - @Nullable final ICraftingBuildingModule crafter, + private static void add(@NotNull final Map>> craftingMap, + @Nullable final Object crafter, @NotNull final IGenericRecipe recipe, @NotNull final ItemStack stack) { @@ -350,9 +403,29 @@ private static List getCraftingModules() { final IBuildingModule module = producer.get(); - if (module instanceof ICraftingBuildingModule) + if (module instanceof ICraftingBuildingModule crafting) + { + modules.add(crafting); + } + } + } + + return modules; + } + + private static List getHerdingModules() + { + final List modules = new ArrayList<>(); + + for (final BuildingEntry building : IMinecoloniesAPI.getInstance().getBuildingRegistry()) + { + for (final Supplier producer : building.getModuleProducers()) + { + final IBuildingModule module = producer.get(); + + if (module instanceof AnimalHerdingModule herding) { - modules.add((ICraftingBuildingModule) module); + modules.add(herding); } } } diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/GenericRecipeCategory.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/GenericRecipeCategory.java index f23ac8b8fd3..18163039399 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/jei/GenericRecipeCategory.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/jei/GenericRecipeCategory.java @@ -6,10 +6,12 @@ import com.minecolonies.api.crafting.IGenericRecipe; import com.minecolonies.api.crafting.registry.CraftingType; import com.minecolonies.api.util.constant.TranslationConstants; +import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import com.minecolonies.coremod.colony.crafting.CustomRecipeManager; import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; import com.minecolonies.coremod.colony.crafting.RecipeAnalyzer; import com.mojang.blaze3d.vertex.PoseStack; +import mezz.jei.api.gui.ITickTimer; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.builder.IRecipeSlotBuilder; import mezz.jei.api.gui.drawable.IDrawableStatic; @@ -22,6 +24,8 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -41,26 +45,29 @@ public class GenericRecipeCategory extends JobBasedRecipeCategory job, - @NotNull final ICraftingBuildingModule crafting, - @NotNull final IGuiHelper guiHelper, + @NotNull final IGuiHelper guiHelper, @NotNull final IModIdHelper modIdHelper) { - super(job, createRecipeType(crafting), getCatalyst(building), guiHelper); + super(job, createRecipeType(job), getCatalyst(building), guiHelper); - this.building = building; - this.crafting.add(crafting); this.arrow = guiHelper.createDrawable(TEXTURE, 20, 121, 24, 18); this.modIdHelper = modIdHelper; + this.animalTimer = guiHelper.createTickTimer(200, 359, false); outputSlotX = CITIZEN_X + CITIZEN_W + 2 + (30 - this.slot.getWidth()) / 2; outputSlotY = CITIZEN_Y + CITIZEN_H + 1 - this.slot.getHeight(); } - @NotNull private final BuildingEntry building; @NotNull private final List crafting = new ArrayList<>(); + @NotNull private final List herding = new ArrayList<>(); @NotNull private final IDrawableStatic arrow; @NotNull private final IModIdHelper modIdHelper; + @NotNull private final ITickTimer animalTimer; + private static final int ANIMAL_W = (WIDTH - CITIZEN_W) / 2; + private static final int ANIMAL_H = CITIZEN_H - 10; + private static final int ANIMAL_X = CITIZEN_X + CITIZEN_W + (WIDTH - CITIZEN_X - CITIZEN_W - ANIMAL_W) / 2; + private static final int ANIMAL_Y = CITIZEN_Y - 20; private static final int LOOT_SLOTS_X = CITIZEN_X + CITIZEN_W + 4; private static final int LOOT_SLOTS_W = WIDTH - LOOT_SLOTS_X; private static final int INPUT_SLOT_X = CITIZEN_X + CITIZEN_W + 32; @@ -72,11 +79,15 @@ public void addModule(@NotNull final ICraftingBuildingModule module) { this.crafting.add(module); } + public void addModule(@NotNull final AnimalHerdingModule module) + { + this.herding.add(module); + } @NotNull - private static RecipeType createRecipeType(@NotNull final ICraftingBuildingModule crafting) + private static RecipeType createRecipeType(@NotNull final IJob job) { - final ResourceLocation uid = Objects.requireNonNull(crafting.getUid()); + final ResourceLocation uid = job.getJobRegistryEntry().getKey(); return RecipeType.create(uid.getNamespace(), uid.getPath(), IGenericRecipe.class); } @@ -108,7 +119,7 @@ private void setNormalRecipe(@NotNull final IRecipeLayoutBuilder builder, { final ResourceLocation id = recipe.getRecipeId(); - addToolSlot(builder, recipe.getRequiredTool(), WIDTH - 18, CITIZEN_Y - 20, false); + addToolSlot(builder, recipe.getRequiredTool(), WIDTH - 18, CITIZEN_Y - 20, true); int x = outputSlotX; int y = outputSlotY; @@ -178,6 +189,8 @@ private void setLootBasedRecipe(@NotNull final IRecipeLayoutBuilder builder, final List drops = getLootDrops(recipe.getLootTable()); final ResourceLocation id = recipe.getRecipeId(); + addToolSlot(builder, recipe.getRequiredTool(), WIDTH - 18, CITIZEN_Y - 20, true); + int x = LOOT_SLOTS_X; int y = CITIZEN_Y; @@ -191,7 +204,6 @@ private void setLootBasedRecipe(@NotNull final IRecipeLayoutBuilder builder, x += this.slot.getWidth() + 2; } } - addToolSlot(builder, recipe.getRequiredTool(), x, y, false); boolean showLootTooltip = true; if (drops.isEmpty()) @@ -259,6 +271,22 @@ public void draw(@NotNull final IGenericRecipe recipe, final BlockState block = recipe.getIntermediate().defaultBlockState(); RenderHelper.renderBlock(stack, block, outputSlotX + 8, CITIZEN_Y + 6, 100, -30F, 30F, 16F); } + + final LivingEntity animal = recipe.getRequiredEntity(); + if (animal != null) + { + final float scale = ANIMAL_H / 2.4f; + final int animal_cx = ANIMAL_X + (ANIMAL_W / 2); + final int animal_cy = ANIMAL_Y + (ANIMAL_H / 2); + final int animal_by = ANIMAL_Y + ANIMAL_H; + final int offsetY = 16; + final float yaw = animalTimer.getValue(); + final float headYaw = (float) Math.atan((animal_cx - mouseX) / 40.0F) * 40.0F + yaw; + final float pitch = (float) Math.atan((animal_cy - offsetY - mouseY) / 40.0F) * 20.0F; + RenderHelper.scissor(stack, ANIMAL_X, ANIMAL_Y, ANIMAL_W, ANIMAL_H); + RenderHelper.renderEntity(stack, animal_cx, animal_by - offsetY, scale, headYaw, yaw, pitch, animal); + RenderHelper.stopScissor(); + } } @Override @@ -291,13 +319,18 @@ private static List getLootDrops(@NotNull final Reso } @NotNull - public List findRecipes(@NotNull final Map> vanilla) + public List findRecipes(@NotNull final Map> vanilla, + @NotNull final List animals) { final List recipes = new ArrayList<>(); for (final ICraftingBuildingModule module : this.crafting) { recipes.addAll(RecipeAnalyzer.findRecipes(vanilla, module)); } + for (final AnimalHerdingModule module : this.herding) + { + recipes.addAll(RecipeAnalyzer.findRecipes(animals, module)); + } return recipes.stream() .sorted(Comparator.comparing(IGenericRecipe::getLevelSort) diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/HerderRecipeCategory.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/HerderRecipeCategory.java deleted file mode 100644 index b3f79d13dab..00000000000 --- a/src/main/java/com/minecolonies/coremod/compatibility/jei/HerderRecipeCategory.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.minecolonies.coremod.compatibility.jei; - -import com.minecolonies.api.colony.buildings.registry.BuildingEntry; -import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.crafting.IGenericRecipe; -import com.minecolonies.api.crafting.registry.CraftingType; -import com.minecolonies.api.util.constant.IToolType; -import com.minecolonies.api.util.constant.ToolType; -import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; -import com.mojang.blaze3d.vertex.PoseStack; -import mezz.jei.api.gui.ITickTimer; -import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; -import mezz.jei.api.gui.ingredient.IRecipeSlotsView; -import mezz.jei.api.helpers.IGuiHelper; -import mezz.jei.api.recipe.IFocusGroup; -import mezz.jei.api.recipe.RecipeIngredientRole; -import mezz.jei.api.recipe.RecipeType; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -/** - * The JEI recipe category for animal herders. - */ -@OnlyIn(Dist.CLIENT) -public class HerderRecipeCategory extends JobBasedRecipeCategory -{ - private final AnimalHerdingModule herding; - private final ITickTimer animalTimer; - - public HerderRecipeCategory(@NotNull final BuildingEntry building, - @NotNull final IJob job, - @NotNull final AnimalHerdingModule herding, - @NotNull final IGuiHelper guiHelper) - { - super(job, createRecipeType(job), getCatalyst(building), guiHelper); - - this.herding = herding; - this.animalTimer = guiHelper.createTickTimer(200, 359, false); - } - - private static final int LOOT_SLOTS_X = CITIZEN_X + CITIZEN_W + 4; - private static final int LOOT_SLOTS_W = WIDTH - LOOT_SLOTS_X; - - private static final int ANIMAL_W = (WIDTH - CITIZEN_W) / 2; - private static final int ANIMAL_H = CITIZEN_H - 10; - private static final int ANIMAL_X = CITIZEN_X + CITIZEN_W + (WIDTH - CITIZEN_X - CITIZEN_W - ANIMAL_W) / 2; - private static final int ANIMAL_Y = CITIZEN_Y - 20; - - @NotNull - private static RecipeType createRecipeType(@NotNull final IJob job) - { - final ResourceLocation uid = job.getJobRegistryEntry().getKey(); - return RecipeType.create(uid.getNamespace(), uid.getPath(), HerdingRecipe.class); - } - - @NotNull - @Override - protected List generateInfoBlocks(@NotNull HerdingRecipe recipe) - { - return Collections.emptyList(); - } - - @Override - public void setRecipe(@NotNull final IRecipeLayoutBuilder builder, - @NotNull final HerdingRecipe recipe, - @NotNull final IFocusGroup focuses) - { - addToolSlot(builder, recipe.getRequiredTool(), WIDTH - 18, CITIZEN_Y, true); - builder.addSlot(RecipeIngredientRole.INPUT, CITIZEN_X + CITIZEN_W + 2, CITIZEN_Y) - .setBackground(this.slot, -1, -1) - .addItemStacks(recipe.getBreedingItems()); - - if (!recipe.getDrops().isEmpty()) - { - final int initialColumns = LOOT_SLOTS_W / this.slot.getWidth(); - final int rows = (recipe.getDrops().size() + initialColumns - 1) / initialColumns; - final int columns = (recipe.getDrops().size() + rows - 1) / rows; - final int startX = LOOT_SLOTS_X + (LOOT_SLOTS_W - (columns * this.slot.getWidth())) / 2; - int x = startX; - int y = CITIZEN_Y + CITIZEN_H - rows * this.slot.getHeight() + 1; - int c = 0; - - for (final LootTableAnalyzer.LootDrop drop : recipe.getDrops()) - { - builder.addSlot(RecipeIngredientRole.OUTPUT, x, y) - .setBackground(this.chanceSlot, -1, -1) - .addItemStacks(drop.getItemStacks()) - .addTooltipCallback(new LootTableTooltipCallback(drop, recipe.getId())); - if (++c >= columns) - { - c = 0; - x = startX; - y += this.slot.getHeight(); - } - else - { - x += this.slot.getWidth(); - } - } - } - } - - @Override - public void draw(@NotNull final HerdingRecipe recipe, - @NotNull final IRecipeSlotsView recipeSlotsView, - @NotNull final PoseStack stack, - final double mouseX, final double mouseY) - { - super.draw(recipe, recipeSlotsView, stack, mouseX, mouseY); - - final LivingEntity animal = recipe.getAnimal(); - if (animal != null) - { - final float scale = ANIMAL_H / 2.4f; - final int animal_cx = ANIMAL_X + (ANIMAL_W / 2); - final int animal_cy = ANIMAL_Y + (ANIMAL_H / 2); - final int animal_by = ANIMAL_Y + ANIMAL_H; - final int offsetY = 16; - final float yaw = animalTimer.getValue(); - final float headYaw = (float) Math.atan((animal_cx - mouseX) / 40.0F) * 40.0F + yaw; - final float pitch = (float) Math.atan((animal_cy - offsetY - mouseY) / 40.0F) * 20.0F; - RenderHelper.scissor(stack, ANIMAL_X, ANIMAL_Y, ANIMAL_W, ANIMAL_H); - RenderHelper.renderEntity(stack, animal_cx, animal_by - offsetY, scale, headYaw, yaw, pitch, animal); - RenderHelper.stopScissor(); - } - } - - @NotNull - @Override - public List findRecipes(@NotNull final Map> vanilla) - { - final List breedingItems = this.herding.getBreedingItems(); - - final List drops = this.herding.getExpectedLoot(); - drops.sort(Comparator.comparing(LootTableAnalyzer.LootDrop::getProbability).reversed()); - - final HerdingRecipe recipe = new HerdingRecipe(this.herding.getDefaultLootTable(), this.herding.getAnimalType(), breedingItems, drops); - return Collections.singletonList(recipe); - } - - public static class HerdingRecipe - { - @NotNull - private final ResourceLocation id; - @Nullable - private final LivingEntity animal; - @NotNull - private final List breedingItems; - @NotNull - private final List drops; - - public HerdingRecipe(@NotNull final ResourceLocation id, - @NotNull final EntityType animalType, - @NotNull final List breedingItems, - @NotNull final List drops) - { - this.id = id; - this.animal = (LivingEntity) animalType.create(Minecraft.getInstance().level); - this.breedingItems = breedingItems; - this.drops = drops.size() > 18 ? LootTableAnalyzer.consolidate(drops) : drops; - } - - @NotNull - public ResourceLocation getId() - { - return this.id; - } - - @Nullable - public LivingEntity getAnimal() - { - return this.animal; - } - - @NotNull - public List getBreedingItems() - { - return this.breedingItems; - } - - @NotNull - public IToolType getRequiredTool() - { - return ToolType.AXE; - } - - @NotNull - public List getDrops() - { - return this.drops; - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/JEIPlugin.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/JEIPlugin.java index 5f32cce64f8..3c4c7bc9558 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/jei/JEIPlugin.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/jei/JEIPlugin.java @@ -28,6 +28,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -57,6 +58,7 @@ public void registerCategories(@NotNull final IRecipeCategoryRegistration regist final IGuiHelper guiHelper = jeiHelpers.getGuiHelper(); final IModIdHelper modIdHelper = jeiHelpers.getModIdHelper(); + registration.addRecipeCategories(new ToolRecipeCategory(guiHelper)); registration.addRecipeCategories(new CompostRecipeCategory(guiHelper)); registration.addRecipeCategories(new FishermanRecipeCategory(guiHelper)); @@ -77,19 +79,22 @@ public void registerCategories(@NotNull final IRecipeCategoryRegistration regist GenericRecipeCategory category = craftingCategories.get(job.getJobRegistryEntry()); if (category == null) { - category = new GenericRecipeCategory(building, job, crafting, guiHelper, modIdHelper); + category = new GenericRecipeCategory(building, job, guiHelper, modIdHelper); craftingCategories.put(job.getJobRegistryEntry(), category); } - else - { - category.addModule(crafting); - } + category.addModule(crafting); } } - - if (module instanceof final AnimalHerdingModule herding) + else if (module instanceof final AnimalHerdingModule herding) { - registerCategory(registration, new HerderRecipeCategory(building, herding.getHerdingJob(), herding, guiHelper)); + final IJob job = herding.getHerdingJob(); + GenericRecipeCategory category = craftingCategories.get(job.getJobRegistryEntry()); + if (category == null) + { + category = new GenericRecipeCategory(building, job, guiHelper, modIdHelper); + craftingCategories.put(job.getJobRegistryEntry(), category); + } + category.addModule(herding); } } @@ -113,25 +118,28 @@ public void registerRecipes(@NotNull final IRecipeRegistration registration) registration.addIngredientInfo(new ItemStack(ModBlocks.blockHutComposter.asItem()), VanillaTypes.ITEM_STACK, Component.translatable(TranslationConstants.PARTIAL_JEI_INFO + ModJobs.COMPOSTER_ID.getPath())); + registration.addRecipes(ModRecipeTypes.TOOLS, ToolRecipeCategory.findRecipes()); registration.addRecipes(ModRecipeTypes.COMPOSTING, CompostRecipeCategory.findRecipes()); registration.addRecipes(ModRecipeTypes.FISHING, FishermanRecipeCategory.findRecipes()); final ClientLevel level = Minecraft.getInstance().level; final Map> vanilla = RecipeAnalyzer.buildVanillaRecipesMap(level.getRecipeManager(), level); + final List animals = RecipeAnalyzer.createAnimals(level); for (final JobBasedRecipeCategory category : this.categories) { - addJobBasedRecipes(vanilla, category, registration::addRecipes); + addJobBasedRecipes(vanilla, animals, category, registration::addRecipes); } } private void addJobBasedRecipes(@NotNull final Map> vanilla, + @NotNull final List animals, @NotNull final JobBasedRecipeCategory category, @NotNull final BiConsumer, List> registrar) { try { - registrar.accept(category.getRecipeType(), category.findRecipes(vanilla)); + registrar.accept(category.getRecipeType(), category.findRecipes(vanilla, animals)); } catch (Exception e) { @@ -167,12 +175,4 @@ public void registerGuiHandlers(@NotNull final IGuiHandlerRegistration registrat new FurnaceCraftingGuiHandler(this.categories).register(registration); new BrewingCraftingGuiHandler(this.categories).register(registration); } - - // while this looks suspiciously similar to BiConsumer, it works around a generic type incompatibility - @FunctionalInterface - private interface Registrar - { - void accept(RecipeType type, List list); - } - } diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/JobBasedRecipeCategory.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/JobBasedRecipeCategory.java index 6b980c2d325..6f9ea29013c 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/jei/JobBasedRecipeCategory.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/jei/JobBasedRecipeCategory.java @@ -43,6 +43,7 @@ import net.minecraft.network.chat.Style; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -159,7 +160,8 @@ public IDrawable getIcon() return this.icon; } - public List findRecipes(@NotNull final Map> vanilla) + public List findRecipes(@NotNull final Map> vanilla, + @NotNull final List animals) { return Collections.emptyList(); } diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/ModRecipeTypes.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/ModRecipeTypes.java index cec8a0276b6..6541dc9ebb3 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/jei/ModRecipeTypes.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/jei/ModRecipeTypes.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.compatibility.jei; import com.minecolonies.api.crafting.CompostRecipe; +import com.minecolonies.coremod.colony.crafting.ToolUsage; import mezz.jei.api.recipe.RecipeType; import static com.minecolonies.api.util.constant.Constants.MOD_ID; @@ -13,6 +14,9 @@ public class ModRecipeTypes public static final RecipeType FISHING = RecipeType.create(MOD_ID, "fishing", FishermanRecipeCategory.FishingRecipe.class); + public static final RecipeType TOOLS = + RecipeType.create(MOD_ID, "tools", ToolUsage.class); + private ModRecipeTypes() { // purely static diff --git a/src/main/java/com/minecolonies/coremod/compatibility/jei/ToolRecipeCategory.java b/src/main/java/com/minecolonies/coremod/compatibility/jei/ToolRecipeCategory.java new file mode 100644 index 00000000000..4e5b6c8ba22 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/compatibility/jei/ToolRecipeCategory.java @@ -0,0 +1,139 @@ +package com.minecolonies.coremod.compatibility.jei; + +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.util.constant.TranslationConstants; +import com.minecolonies.coremod.colony.crafting.ToolUsage; +import com.minecolonies.coremod.colony.crafting.ToolsAnalyzer; +import com.mojang.blaze3d.vertex.PoseStack; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.Style; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static com.minecolonies.api.util.constant.Constants.MAX_BUILDING_LEVEL; + +/** + * JEI recipe category showing supported tool and armor levels. + */ +public class ToolRecipeCategory implements IRecipeCategory +{ + private static final int WIDTH = 180; + private static final int HEIGHT = 44; + private static final int SLOT_X = WIDTH - 2 - ((MAX_BUILDING_LEVEL+1) * 18); + + private final IDrawable background; + private final IDrawable icon; + private final IDrawable slot; + + /** + * Constructor + */ + public ToolRecipeCategory(@NotNull final IGuiHelper guiHelper) + { + this.background = guiHelper.createBlankDrawable(WIDTH, HEIGHT); + this.icon = guiHelper.createDrawableItemStack(new ItemStack(ModItems.plateArmorChest)); + this.slot = guiHelper.getSlotDrawable(); + } + + /** + * Generate the list of {@link ToolUsage}. + */ + @NotNull + public static List findRecipes() + { + return ToolsAnalyzer.findTools(); + } + + @NotNull + @Override + public RecipeType getRecipeType() + { + return ModRecipeTypes.TOOLS; + } + + @NotNull + @Override + public Component getTitle() + { + return Component.translatable(TranslationConstants.PARTIAL_JEI_INFO + "tools"); + } + + @NotNull + @Override + public IDrawable getBackground() + { + return this.background; + } + + @NotNull + @Override + public IDrawable getIcon() + { + return this.icon; + } + + @Override + public void setRecipe(@NotNull final IRecipeLayoutBuilder builder, + @NotNull final ToolUsage recipe, + @NotNull final IFocusGroup focuses) + { + int x = SLOT_X; + int y = HEIGHT - 36; + + for (int i = 0; i <= MAX_BUILDING_LEVEL; ++i) + { + builder.addSlot(RecipeIngredientRole.INPUT, x, y) + .setSlotName("L" + i) + .addItemStacks(recipe.toolLevels().get(i)) + .setBackground(this.slot, -1, -1); + + builder.addSlot(RecipeIngredientRole.INPUT, x, y + 18) + .setSlotName("L" + i + "e") + .addItemStacks(recipe.enchantedToolLevels().get(i)) + .setBackground(this.slot, -1, -1); + + x += 18; + } + } + + @Override + public void draw(@NotNull final ToolUsage recipe, + @NotNull final IRecipeSlotsView recipeSlotsView, + @NotNull final PoseStack stack, + final double mouseX, final double mouseY) + { + final Minecraft mc = Minecraft.getInstance(); + + final List lines = mc.font.getSplitter().splitLines(recipe.tool().getDisplayName(), SLOT_X - 4, Style.EMPTY); + final int y = HEIGHT - (36 + (lines.size() * mc.font.lineHeight)) / 2 - 1; + for (int i = 0; i < lines.size(); ++i) + { + mc.font.draw(stack, Language.getInstance().getVisualOrder(lines.get(i)), 2, y + (i * mc.font.lineHeight), 0); + } + + final float scale = 0.5F; + stack.pushPose(); + stack.scale(scale, scale, 1.0F); + int x = SLOT_X; + for (int i = 0; i <= MAX_BUILDING_LEVEL; ++i) + { + final Component text = Component.translatable(TranslationConstants.PARTIAL_JEI_INFO + "onelevelrestriction", i); + mc.font.draw(stack, text, (x + (18 - mc.font.width(text)*scale) / 2F) / scale, 1 / scale, 0); + x += 18; + } + stack.popPose(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/compatibility/journeymap/EventListener.java b/src/main/java/com/minecolonies/coremod/compatibility/journeymap/EventListener.java index 3d1d4805d6e..e3e7d525168 100644 --- a/src/main/java/com/minecolonies/coremod/compatibility/journeymap/EventListener.java +++ b/src/main/java/com/minecolonies/coremod/compatibility/journeymap/EventListener.java @@ -7,7 +7,7 @@ import com.minecolonies.api.colony.jobs.registry.IJobRegistry; import com.minecolonies.api.colony.jobs.registry.JobEntry; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.entity.citizen.VisitorCitizen; import journeymap.client.api.display.Context; @@ -152,7 +152,7 @@ public void onUpdateEntityRadar(@NotNull final EntityRadarUpdateEvent event) wrapper.setColor(entity.getTeamColor()); } } - else if (entity instanceof AbstractEntityMinecoloniesMob) + else if (entity instanceof AbstractEntityRaiderMob) { final JourneymapOptions.RaiderColor color = JourneymapOptions.getRaiderColor(this.jmap.getOptions()); diff --git a/src/main/java/com/minecolonies/coremod/datalistener/CrafterRecipeListener.java b/src/main/java/com/minecolonies/coremod/datalistener/CrafterRecipeListener.java index 8ca16e08691..6694936a618 100644 --- a/src/main/java/com/minecolonies/coremod/datalistener/CrafterRecipeListener.java +++ b/src/main/java/com/minecolonies/coremod/datalistener/CrafterRecipeListener.java @@ -53,6 +53,9 @@ protected void apply(@NotNull final Map object, case RECIPE_TYPE_RECIPE_MULT_OUT: recipeManager.addRecipe(CustomRecipe.parse(key, recipeJson)); break; + case RECIPE_TYPE_TEMPLATE: + recipeManager.addRecipeTemplate(key, recipeJson); + break; case RECIPE_TYPE_REMOVE: final ResourceLocation toRemove = new ResourceLocation(GsonHelper.getAsString(recipeJson, RECIPE_ID_TO_REMOVE_PROP, "")); recipeManager.removeRecipe(toRemove); diff --git a/src/main/java/com/minecolonies/coremod/datalistener/CustomVisitorListener.java b/src/main/java/com/minecolonies/coremod/datalistener/CustomVisitorListener.java index c2338b58355..98560ea7645 100644 --- a/src/main/java/com/minecolonies/coremod/datalistener/CustomVisitorListener.java +++ b/src/main/java/com/minecolonies/coremod/datalistener/CustomVisitorListener.java @@ -214,7 +214,7 @@ public void applyToVisitor(final IVisitorData visitorData) visitorData.triggerInteraction(new RecruitmentInteraction(Component.translatable(storykey, visitorData.getName().split(" ")[0]), ChatPriority.IMPORTANT)); } - visitorData.markDirty(); + visitorData.markDirty(0); } } diff --git a/src/main/java/com/minecolonies/coremod/datalistener/ItemNbtListener.java b/src/main/java/com/minecolonies/coremod/datalistener/ItemNbtListener.java new file mode 100644 index 00000000000..6976604b3e6 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/datalistener/ItemNbtListener.java @@ -0,0 +1,81 @@ +package com.minecolonies.coremod.datalistener; + +import com.google.gson.*; +import com.minecolonies.api.items.CheckedNbtKey; +import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.generation.ItemNbtCalculator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +/** + * Loads and listens to get custom nbt matching rules. + */ +public class ItemNbtListener extends SimpleJsonResourceReloadListener +{ + /** + * Gson instance + */ + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + + /** + * Create a new listener. + */ + public ItemNbtListener() + { + super(GSON, "compatibility"); + } + + @Override + protected void apply(final Map jsonElementMap, final @NotNull ResourceManager resourceManager, final @NotNull ProfilerFiller profiler) + { + ItemStackUtils.CHECKED_NBT_KEYS.clear(); + for (final Map.Entry entry : jsonElementMap.entrySet()) + { + tryParse(entry); + } + } + + /** + * Tries to parse the entry + * + * @param entry + */ + private void tryParse(final Map.Entry entry) + { + for (final JsonElement element : entry.getValue().getAsJsonArray()) + { + try + { + final JsonObject jsonObj = element.getAsJsonObject(); + final ResourceLocation itemLoc = new ResourceLocation(jsonObj.get("item").getAsString()); + if (jsonObj.has("checkednbtkeys")) + { + final HashSet set = new HashSet<>(); + final JsonArray jsonArray = jsonObj.getAsJsonArray("checkednbtkeys"); + for (final JsonElement subElement : jsonArray) + { + set.add(ItemNbtCalculator.deserializeKeyFromJson(subElement.getAsJsonObject())); + } + + ItemStackUtils.CHECKED_NBT_KEYS.put(ForgeRegistries.ITEMS.getValue(itemLoc), set); + } + else + { + ItemStackUtils.CHECKED_NBT_KEYS.put(ForgeRegistries.ITEMS.getValue(itemLoc), new HashSet<>()); + } + } + catch (Exception e) + { + Log.getLogger().warn("Could not nbt comparator for:" + entry.getKey(), e); + } + } + Log.getLogger().warn("Read " + ItemStackUtils.CHECKED_NBT_KEYS.size() + " items with their nbt keys for compatibility."); + } +} diff --git a/src/main/java/com/minecolonies/coremod/datalistener/QuestJsonListener.java b/src/main/java/com/minecolonies/coremod/datalistener/QuestJsonListener.java new file mode 100644 index 00000000000..3b3edbbd574 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/datalistener/QuestJsonListener.java @@ -0,0 +1,376 @@ +package com.minecolonies.coremod.datalistener; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.*; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.network.messages.client.GlobalQuestSyncMessage; +import com.minecolonies.coremod.quests.*; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; +import io.netty.buffer.Unpooled; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; +import net.minecraft.util.profiling.ProfilerFiller; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.Function; + +import static com.minecolonies.coremod.quests.QuestParsingConstants.*; +import static com.minecolonies.coremod.quests.QuestParsingConstants.BRACE_CLOSE; +import static org.apache.commons.lang3.StringUtils.EMPTY; + +/** + * Loader for Json based quest data. + */ +public class QuestJsonListener extends SimpleJsonResourceReloadListener +{ + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + + /** + * The last json map. + */ + private static Map globalJsonElementMap = new HashMap<>(); + + /** + * Set up the core loading, with the directory in the datapack that contains this data Directory is: /quests/ + */ + public QuestJsonListener() + { + super(GSON, "quests"); + } + + /** + * Sync to client. + * @param player to send it to. + */ + public static void sendGlobalQuestPackets(final ServerPlayer player) + { + final FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeInt(globalJsonElementMap.size()); + for (final Map.Entry entry : globalJsonElementMap.entrySet()) + { + byteBuf.writeResourceLocation(entry.getKey()); + byteBuf.writeByteArray(entry.getValue().toString().getBytes()); + } + Network.getNetwork().sendToPlayer(new GlobalQuestSyncMessage(byteBuf), player); + } + + /** + * Read the data from the packet and parse it. + * @param byteBuf pck. + */ + public static void readGlobalQuestPackets(final FriendlyByteBuf byteBuf) + { + globalJsonElementMap.clear(); + final int size = byteBuf.readInt(); + for (int i = 0; i < size; i++) + { + globalJsonElementMap.put(byteBuf.readResourceLocation(), GSON.fromJson(new String(byteBuf.readByteArray()), JsonObject.class)); + } + apply(globalJsonElementMap); + } + + @Override + protected void apply(final Map jsonElementMap, final @NotNull ResourceManager resourceManager, final @NotNull ProfilerFiller profiler) + { + globalJsonElementMap.clear(); + globalJsonElementMap.putAll(jsonElementMap); + apply(jsonElementMap); + } + + /** + * Our universal apply. + * @param jsonElementMap the map. + */ + private static void apply(final Map jsonElementMap) + { + Log.getLogger().info("Loading quests from data"); + + // We start by clearing all old requests. + IQuestManager.GLOBAL_SERVER_QUESTS.clear(); + + for (final Map.Entry entry : jsonElementMap.entrySet()) + { + final ResourceLocation fileResLoc = entry.getKey(); + final JsonObject questDataJson = entry.getValue().getAsJsonObject(); + + try + { + final IQuestTemplate data = loadDataFromJson(fileResLoc, questDataJson); + IQuestManager.GLOBAL_SERVER_QUESTS.put(fileResLoc, data); + } + catch (Exception e) + { + Log.getLogger().error("Skipping quest: " + fileResLoc + " due to parsing error:", e); + } + } + + Log.getLogger().info("Finished loading quests from data"); + } + + public static IQuestTemplate loadDataFromJson(final ResourceLocation questId, final JsonObject jsonObject) throws Exception + { + final List questTriggers = new ArrayList<>(); + // Read quest triggers + for (final JsonElement triggerJson : jsonObject.get(QUEST_TRIGGERS).getAsJsonArray()) + { + final JsonObject triggerObj = triggerJson.getAsJsonObject(); + final String type = triggerObj.get(TYPE).getAsString(); + + try + { + questTriggers.add(IMinecoloniesAPI.getInstance().getQuestTriggerRegistry().getValue(new ResourceLocation(type)).produce(triggerObj)); + } + catch (final Exception ex) + { + throw new Exception("Failed loading triggers for type: " + type, ex); + } + } + + final List questObjectives = new ArrayList<>(); + for (final JsonElement objectivesJson : jsonObject.get(QUEST_OBJECTIVES).getAsJsonArray()) + { + final JsonObject objectiveObj = objectivesJson.getAsJsonObject(); + final String type = objectiveObj.get(TYPE).getAsString(); + try + { + questObjectives.add(IMinecoloniesAPI.getInstance().getQuestObjectiveRegistry().getValue(new ResourceLocation(type)).produce(objectiveObj)); + } + catch (final Exception ex) + { + throw new Exception("Failed loading objectives for type: " + type, ex); + } + } + + String order = ""; + if (jsonObject.has(TRIGGER_ORDER)) + { + order = jsonObject.get(TRIGGER_ORDER).getAsString(); + } + + final int maxOccurrences; + if (jsonObject.has(MAX_OCC)) + { + maxOccurrences = jsonObject.get(MAX_OCC).getAsInt(); + } + else + { + maxOccurrences = 1; + } + + final int questTimeout; + if (jsonObject.has(TIMEOUT)) + { + questTimeout = jsonObject.get(TIMEOUT).getAsInt(); + } + else + { + questTimeout = 10; + } + + final Component questName = Component.translatable(jsonObject.get(NAME).getAsString()); + + final List questRewards = new ArrayList<>(); + for (final JsonElement objectivesJson : jsonObject.get(QUEST_REWARDS).getAsJsonArray()) + { + final JsonObject objectiveObj = objectivesJson.getAsJsonObject(); + final String type = objectiveObj.get(TYPE).getAsString(); + try + { + questRewards.add(IMinecoloniesAPI.getInstance().getQuestRewardRegistry().getValue(new ResourceLocation(type)).produce(objectiveObj)); + } + catch (final Exception ex) + { + throw new Exception("Failed loading rewards for type: " + type, ex); + } + } + + final List parents = new ArrayList<>(); + for (final JsonElement objectivesJson : jsonObject.get(QUEST_PARENTS).getAsJsonArray()) + { + try + { + parents.add(new ResourceLocation(objectivesJson.getAsString())); + } + catch (final Exception ex) + { + throw new Exception("Failed loading parents: ", ex); + } + } + + return new QuestTemplate(questId, questName, parents, maxOccurrences, parseTriggerOrder(questId, order, questTriggers), questObjectives, questTimeout, questRewards); + + /* + + + // Read effect ID's and save data for creating them + + if (!jsonObject.has(QUEST_EFFECTS)) + { + throw new Exception("Parsing failure: Missing effects for quest"); + } + + effectData = new HashMap<>(); + for (final JsonElement effectJson : jsonObject.get(QUEST_EFFECTS).getAsJsonArray()) + { + // List of complex objects + final JsonObject effectJsonObj = effectJson.getAsJsonObject(); + + if (!effectJsonObj.has(ID)) + { + throw new Exception("Missing ID for " + QUEST_EFFECTS + " in quest type: "); + } + + final ResourceLocation effectID = getResourceLocation(effectJsonObj.get(ID).getAsString()); + if (!effectRegistry.containsKey(effectID)) + { + throw new Exception("Unkown/unregistered quest effect: for " + effectID); + } + + effectData.put(effectID, effectJsonObj); + }*/ + } + + // Unused yet + private static Function>> parseTriggerOrder(final ResourceLocation questId, final String order, final List triggers) + { + // Default and. + if (order.isEmpty()) + { + return colony -> { + final List> returnList = new ArrayList<>(); + + for (final IQuestTriggerTemplate trigger: triggers) + { + ITriggerReturnData returnData = trigger.canTriggerQuest(questId, colony); + if (returnData.isPositive()) + { + returnList.add(returnData); + } + else + { + return null; + } + } + return returnList; + }; + } + + // Test + //order = "(2 && (1 || 3)) && ((1 && 2) || 3)"; + // Replace whitespaces + //order = order.replaceAll("\\s+", ""); + + // Split by words and braces, but keep the chars + final List values = Arrays.asList(order.replaceAll("\\s+","").split("((?<=\\w)|(?=\\w)|(?<=[)(])|(?=[)(]))")); + + final List types = new ArrayList<>(); + for (String value : values) + { + try + { + // Try parsing to number. We only allow numbers. + Integer.parseInt(value); + if (!types.contains(value)) + { + types.add(value); + } + } + catch (final Exception ex) + { + //ignore + } + } + + if (types.size() != triggers.size()) + { + Log.getLogger().error("Failed to Parse Quest Triggers. Mismatch number of triggers in order for quest: " + questId.toString()); + return null; + } + + final Map triggerMap = new HashMap<>(); + for (int i = 0; i < triggers.size(); i++) + { + triggerMap.put(String.valueOf(i+1), triggers.get(i)); + } + + return colony -> evaluate(colony, triggerMap, new ArrayList<>(values), new ArrayList<>(), true); + } + + /** + * Recursively parses a string condition to a predicate + * + * @param colony the colony. + * @param data split string data + * @return predicate from data + */ + private static List> evaluate(final IColony colony, final Map triggerMap, final List data, final List> lastReturnData, final boolean recursive) + { + // first we evaluate all and handle negation + // then find deepest brace open, solve deepest brace open + // then recursive until they are gone + // substitute deepest brace open with its result + if (data.isEmpty()) + { + return lastReturnData; + } + + final String current = data.get(0); + data.remove(0); + switch (current) + { + case OR: + // + return lastReturnData != null ? lastReturnData : evaluate(colony, triggerMap, data, lastReturnData, recursive); + case AND: + return lastReturnData == null ? null : evaluate(colony, triggerMap, data, lastReturnData, recursive); + case NOT: + return evaluate(colony, triggerMap, data, lastReturnData, false) == null ? evaluate(colony, triggerMap, data, lastReturnData, true) : null; + case BRACE_OPEN: + List> currentReturnData = lastReturnData; + List> result = evaluate(colony, triggerMap, data, new ArrayList<>(), recursive); + if (result == null) + { + return evaluate(colony, triggerMap, data, null, recursive); + } + + result.addAll(currentReturnData); + return evaluate(colony, triggerMap, data, result, recursive); + case BRACE_CLOSE: + return lastReturnData; + case EMPTY: + return evaluate(colony, triggerMap, data, lastReturnData, recursive); + default: + { + final IQuestTriggerTemplate trigger = triggerMap.get(current); + final ITriggerReturnData returnData = trigger.canTriggerQuest(colony); + if (returnData.isPositive()) + { + if (lastReturnData == null) + { + final List> newReturnData = new ArrayList<>(); + newReturnData.add(returnData); + return recursive ? evaluate(colony, triggerMap, data, newReturnData, recursive) : newReturnData; + } + else + { + lastReturnData.add(returnData); + return recursive ? evaluate(colony, triggerMap, data, lastReturnData, recursive) : lastReturnData; + } + } + return recursive ? evaluate(colony, triggerMap, data, null, recursive) : null; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/entity/CustomArrowEntity.java b/src/main/java/com/minecolonies/coremod/entity/CustomArrowEntity.java index b0eb60cf0a4..633365b0cd9 100644 --- a/src/main/java/com/minecolonies/coremod/entity/CustomArrowEntity.java +++ b/src/main/java/com/minecolonies/coremod/entity/CustomArrowEntity.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.entity; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -7,15 +8,15 @@ import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.network.protocol.Packet; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import java.util.function.Predicate; -import net.minecraft.world.entity.Entity.RemovalReason; - /** * Custom arrow entity class which remove themselves when on the ground for a bit to not cause lag and they do not scale in damage with their motion. */ @@ -26,6 +27,11 @@ public class CustomArrowEntity extends Arrow */ private static final int MAX_LIVE_TIME = 10 * 20; + /** + * Max time the arrow is stuck in ground before removing it. + */ + private static final int GROUND_LIVE_TIME = 2 * 20; + /** * Whether the arrow entity pierces players */ @@ -82,7 +88,6 @@ protected void onHitEntity(EntityHitResult traceResult) { source = DamageSource.arrow(this, shooter); } - source.bypassArmor(); player.hurt(source, (float) getBaseDamage()); setBaseDamage(0); } @@ -117,13 +122,49 @@ public void setPlayerArmorPierce() } @Override - public void tick() + public boolean shouldFall() { - super.tick(); + if (this.inGround) + { + final AABB aabb = (new AABB(this.position(), this.position())).inflate(0.06D); + for(VoxelShape voxelshape : this.level.getBlockCollisions(null, aabb)) { + if (!voxelshape.isEmpty()) + { + return false; + } + } + return true; + } + return false; + } + @Override + public boolean save(@NotNull CompoundTag nbt) + { + return false; + } + + @Override + public void load(@NotNull CompoundTag nbt) + { + discard(); + } + + @Override + public void tick() + { if (this.tickCount > MAX_LIVE_TIME) { remove(RemovalReason.DISCARDED); + return; } + + if (this.inGroundTime > GROUND_LIVE_TIME) + { + remove(RemovalReason.DISCARDED); + return; + } + + super.tick(); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/NewBobberEntity.java b/src/main/java/com/minecolonies/coremod/entity/NewBobberEntity.java index 8b9070b1be6..071179adb7a 100755 --- a/src/main/java/com/minecolonies/coremod/entity/NewBobberEntity.java +++ b/src/main/java/com/minecolonies/coremod/entity/NewBobberEntity.java @@ -33,6 +33,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ToolActions; import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.PlayMessages; @@ -41,8 +42,6 @@ import javax.annotation.Nullable; import java.util.List; -import net.minecraft.world.entity.Entity.RemovalReason; - public class NewBobberEntity extends Entity implements IEntityAdditionalSpawnData { private static final EntityDataAccessor DATA_HOOKED_ENTITY = SynchedEntityData.defineId(NewBobberEntity.class, EntityDataSerializers.INT); @@ -310,8 +309,8 @@ public boolean shouldStopFishing() { final ItemStack itemstack = this.angler.getMainHandItem(); final ItemStack itemstack1 = this.angler.getOffhandItem(); - final boolean flag = itemstack.getItem() instanceof net.minecraft.world.item.FishingRodItem; - final boolean flag1 = itemstack1.getItem() instanceof net.minecraft.world.item.FishingRodItem; + final boolean flag = itemstack.canPerformAction(ToolActions.FISHING_ROD_CAST); + final boolean flag1 = itemstack1.canPerformAction(ToolActions.FISHING_ROD_CAST); if (!this.angler.isRemoved() && this.angler.isAlive() && (flag || flag1) && !(this.distanceToSqr(this.angler) > 1024.0D)) { return false; diff --git a/src/api/java/com/minecolonies/api/entity/SpearEntity.java b/src/main/java/com/minecolonies/coremod/entity/SpearEntity.java similarity index 87% rename from src/api/java/com/minecolonies/api/entity/SpearEntity.java rename to src/main/java/com/minecolonies/coremod/entity/SpearEntity.java index b73c879bcd3..c12cabba13c 100644 --- a/src/api/java/com/minecolonies/api/entity/SpearEntity.java +++ b/src/main/java/com/minecolonies/coremod/entity/SpearEntity.java @@ -1,5 +1,7 @@ -package com.minecolonies.api.entity; +package com.minecolonies.coremod.entity; +import com.minecolonies.api.entity.ICustomAttackSound; +import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.items.ModItems; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; @@ -11,7 +13,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.entity.projectile.ThrownTrident; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -24,17 +25,20 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import net.minecraft.world.entity.Entity.RemovalReason; - /** * Custom arrow entity used for spear throwing, acts similar to the trident without any of the special effects. */ public class SpearEntity extends ThrownTrident implements ICustomAttackSound { /** - * Max time the arrow is alive before removing it, currently gets removed after 60 seconds. + * Max time the spear is alive before removing it */ - private static final int MAX_TIME_ALIVE = 1200; + private static final int MAX_LIVE_TIME = 10 * 20; + + /** + * Max time the spear is stuck in ground before removing it. + */ + private static final int GROUND_LIVE_TIME = 2 * 20; /** * The spears base damage before any modifications. @@ -106,7 +110,7 @@ protected void onHitEntity(EntityHitResult result) } Entity ownerEntity = this.getOwner(); - DamageSource damageSource = new IndirectEntityDamageSource("spear", this, ownerEntity == null ? this : ownerEntity).setProjectile(); + DamageSource damageSource = new IndirectEntityDamageSource("spear", this, ownerEntity == null ? this : ownerEntity); this.dealtDamage = true; if (targetEntity.hurt(damageSource, damageAmount)) { @@ -165,12 +169,19 @@ public void addAdditionalSaveData(@NotNull CompoundTag nbt) @Override public void tick() { - super.tick(); + if (this.tickCount > MAX_LIVE_TIME) + { + remove(RemovalReason.DISCARDED); + return; + } - if (tickCount > MAX_TIME_ALIVE) + if (this.inGroundTime > GROUND_LIVE_TIME) { remove(RemovalReason.DISCARDED); + return; } + + super.tick(); } @Override @@ -200,4 +211,16 @@ public SoundEvent getAttackSound() { return SoundEvents.TRIDENT_THROW; } -} + + @Override + public boolean save(@NotNull CompoundTag nbt) + { + return false; + } + + @Override + public void load(@NotNull CompoundTag nbt) + { + discard(); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractAISkeleton.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractAISkeleton.java index 70a0ef682e2..e75ed8ffed5 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractAISkeleton.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractAISkeleton.java @@ -1,34 +1,27 @@ package com.minecolonies.coremod.entity.ai.basic; import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.Status; +import com.minecolonies.api.entity.ai.ITickingStateAI; import com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.util.CompatibilityUtils; import com.minecolonies.api.util.ItemStackUtils; -import com.minecolonies.coremod.MineColonies; -import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import java.util.Arrays; -import java.util.EnumSet; - -import net.minecraft.world.entity.ai.goal.Goal.Flag; /** * Skeleton class for worker ai. Here general target execution will be handled. No utility on this level! * * @param the job this ai will have. */ -public abstract class AbstractAISkeleton> extends Goal +public abstract class AbstractAISkeleton> implements ITickingStateAI { @NotNull protected final J job; @@ -56,12 +49,16 @@ protected AbstractAISkeleton(@NotNull final J job) throw new IllegalArgumentException("Cannot instantiate a AI from a Job that is attached to a Citizen without entity."); } - this.setFlags(EnumSet.of(Goal.Flag.MOVE)); this.job = job; this.worker = this.job.getCitizen().getEntity().get(); this.world = CompatibilityUtils.getWorldFromCitizen(this.worker); stateMachine = new TickRateStateMachine<>(AIWorkerState.INIT, this::onException); - stateMachine.setTickRate(MineColonies.getConfig().getServer().updateRate.get()); + } + + @Override + public void tick() + { + stateMachine.tick(); } /** @@ -84,71 +81,10 @@ protected final void registerTargets(final TickingTransition... target Arrays.asList(targets).forEach(this::registerTarget); } - /** - * Returns whether the Goal should begin execution. - * - * @return true if execution is wanted. - */ - @Override - public final boolean canUse() - { - return worker.getDesiredActivity() == DesiredActivity.WORK; - } - - /** - * Returns whether an in-progress Goal should continue executing. - */ - @Override - public final boolean canContinueToUse() - { - return super.canContinueToUse(); - } - - /** - * Execute a one shot task or start executing a continuous task. - */ - @Override - public final void start() - { - worker.getCitizenStatusHandler().setStatus(Status.WORKING); - worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); - } - - /** - * Resets the task. - */ - @Override - public final void stop() - { - resetAI(); - worker.getCitizenData().setVisibleStatus(null); - } - - /** - * Updates the task. - */ - @Override - public final void tick() - { - stateMachine.tick(); - } - protected void onException(final RuntimeException e) { } - /** - * Made final to preserve behaviour: Sets a bitmask telling which other tasks may not run concurrently. The test is a simple bitwise AND - if it yields zero, the two tasks may - * run concurrently, if not - they must run exclusively from each other. - * - * @param mutexBits the bits to flag this with. - */ - @Override - public final void setFlags(final EnumSet mutexBits) - { - super.setFlags(mutexBits); - } - /** * Get the current state the ai is in. * @@ -210,5 +146,20 @@ public void onRemoval() worker.setItemSlot(EquipmentSlot.LEGS, ItemStackUtils.EMPTY); worker.setItemSlot(EquipmentSlot.OFFHAND, ItemStackUtils.EMPTY); worker.setItemSlot(EquipmentSlot.MAINHAND, ItemStackUtils.EMPTY); + + worker.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.CHEST); + worker.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.FEET); + worker.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.HEAD); + worker.getInventoryCitizen().moveArmorToInventory(EquipmentSlot.LEGS); + } + + /** + * Sets the delay to next execution for the currently executed transition + * + * @param ticksToNextUpdate + */ + public void setCurrentDelay(final int ticksToNextUpdate) + { + stateMachine.setCurrentDelay(ticksToNextUpdate); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIBasic.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIBasic.java index c986143fd95..c123eac67e8 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIBasic.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIBasic.java @@ -5,9 +5,9 @@ import com.google.common.reflect.TypeToken; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.jobs.IJob; +import com.minecolonies.api.colony.permissions.IPermissions; import com.minecolonies.api.colony.requestsystem.location.ILocation; import com.minecolonies.api.colony.requestsystem.request.IRequest; import com.minecolonies.api.colony.requestsystem.request.RequestState; @@ -38,18 +38,23 @@ import com.minecolonies.coremod.colony.requestsystem.resolvers.StationRequestResolver; import com.minecolonies.coremod.entity.pathfinding.EntityCitizenWalkToProxy; import com.minecolonies.coremod.util.WorkerUtil; +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -66,9 +71,9 @@ import static com.minecolonies.api.util.constant.CitizenConstants.*; import static com.minecolonies.api.util.constant.Constants.*; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ENTITY_WORKER_INVENTORYFULLCHEST; +import static com.minecolonies.api.util.constant.TranslationConstants.WORKER_AI_EXCEPTION; import static com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract.RENDER_META_WORKING; -import net.minecraftforge.common.capabilities.ForgeCapabilities; /** * This class provides basic ai functionality. @@ -269,7 +274,7 @@ private IAIState walkToState() } /** - * Retrieve a material from the building. For this go to the building if no position has been set. Then check for the chest with the required material and set the position and + * Retrieve a material from the building. For this check for the chest with the required material and set the position and * return. *

* If the position has been set navigate to it. On arrival transfer to inventory and return to StartWorking. @@ -278,13 +283,6 @@ private IAIState walkToState() */ private IAIState getNeededItem() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_GATHERING)); - - if (walkTo == null && walkToBuilding()) - { - return getState(); - } - if (needsCurrently == null) { return getStateAfterPickUp(); @@ -362,6 +360,7 @@ protected void onException(final RuntimeException e) { final int timeout = EXCEPTION_TIMEOUT * exceptionTimer; this.setDelay(FMLEnvironment.production ? timeout : EXCEPTION_TIMEOUT); + setCurrentDelay(FMLEnvironment.production ? timeout : EXCEPTION_TIMEOUT); // wait for longer now exceptionTimer *= 2; if (worker != null) @@ -370,7 +369,7 @@ protected void onException(final RuntimeException e) final BlockPos workerPosition = worker.blockPosition(); final IJob colonyJob = worker.getCitizenJobHandler().getColonyJob(); final String jobName = colonyJob == null ? "null" : colonyJob.getJobRegistryEntry().getTranslationKey(); - Log.getLogger().error("Pausing Entity " + name + " (" + jobName + ") at " + workerPosition + " for " + timeout + " Seconds because of error:"); + Log.getLogger().error("Pausing Citizen " + name + " (" + jobName + ") in colony:"+worker.getCitizenData().getColony().getID() +" at " + workerPosition + " for " + timeout + " Seconds because of error:"); } else { @@ -534,31 +533,9 @@ private void clearWorkTarget() protected IAIState waitForRequests() { delay = DELAY_RECHECK; - updateWorkerStatusFromRequests(); return lookForRequests(); } - private void updateWorkerStatusFromRequests() - { - if (!building.hasWorkerOpenRequests(worker.getCitizenData().getId()) && !building.hasCitizenCompletedRequests(worker.getCitizenData())) - { - worker.getCitizenStatusHandler().setLatestStatus(); - return; - } - - Collection> requests = building.getCompletedRequests(worker.getCitizenData()); - if (requests.isEmpty()) - { - requests = building.getOpenRequests(worker.getCitizenData().getId()); - } - - if (!requests.isEmpty()) - { - worker.getCitizenStatusHandler() - .setLatestStatus(Component.translatable("com.minecolonies.coremod.status.waiting"), requests.iterator().next().getShortDisplayString()); - } - } - /** * Utility method to search for items currently needed. Poll this until all items are there. * @@ -591,7 +568,15 @@ private IAIState lookForRequests() if (!deliverableRequests.isEmpty()) { final IRequest firstDeliverableRequest = deliverableRequests.get(0); - final IRequestResolver resolver = building.getColony().getRequestManager().getResolverForRequest(firstDeliverableRequest.getId()); + IRequestResolver resolver = null; + try + { + resolver = building.getColony().getRequestManager().getResolverForRequest(firstDeliverableRequest.getId()); + } + catch (final Exception ex) + { + Log.getLogger().warn("Resolver died for finished request. Oopsy. " + worker.getCitizenData().getName() + " witnessed it."); + } final ILocation pickupLocation = resolver instanceof StationRequestResolver ? resolver.getLocation() : building.getLocation(); if (walkToBlock(pickupLocation.getInDimensionLocation()) || !WorldUtil.isBlockLoaded(world, pickupLocation.getInDimensionLocation())) @@ -680,7 +665,7 @@ protected int getSecondarySkillLevel() */ protected WorkerBuildingModule getModuleForJob() { - return building.getModuleMatching(WorkerBuildingModule.class, m -> m.getJobEntry() == job.getJobRegistryEntry()); + return (WorkerBuildingModule) job.getWorkModule(); } /** @@ -1160,6 +1145,18 @@ private boolean dumpOneMoreSlot() { final ItemStack activeStack = getInventory().extractItem(slotAt, amount, false); InventoryUtils.transferItemStackIntoNextBestSlotInItemHandler(activeStack, getBuildingToDump().getCapability(ForgeCapabilities.ITEM_HANDLER, null).orElseGet(null)); + + if (getInventory().getHeldItemSlot(InteractionHand.MAIN_HAND) == slotAt) + { + getInventory().setHeldItem(InteractionHand.MAIN_HAND, -1); + worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + if (getInventory().getHeldItemSlot(InteractionHand.OFF_HAND) == slotAt) + { + getInventory().setHeldItem(InteractionHand.OFF_HAND, -1); + worker.setItemInHand(InteractionHand.OFF_HAND, ItemStack.EMPTY); + } + hasDumpedItems = true; } } @@ -1773,4 +1770,15 @@ public int getExceptionTimer() { return exceptionTimer; } + + /** + * Obtains a fake player class which can be used inside the AI logic to utilize in requests that require a player instance when none is available. + * + * @return a fake player. + */ + protected FakePlayer getFakePlayer() + { + IPermissions permissions = building.getColony().getPermissions(); + return FakePlayerFactory.get((ServerLevel) world, new GameProfile(permissions.getOwner(), permissions.getOwnerName())); + } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAICrafting.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAICrafting.java index fae944baee9..13278eafbe4 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAICrafting.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAICrafting.java @@ -11,8 +11,10 @@ import com.minecolonies.api.crafting.RecipeStorage; import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; +import com.minecolonies.api.inventory.InventoryCitizen; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Tuple; @@ -33,8 +35,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,6 +47,7 @@ import static com.minecolonies.api.util.constant.CitizenConstants.FACING_DELTA_YAW; import static com.minecolonies.api.util.constant.Constants.DEFAULT_SPEED; import static com.minecolonies.api.util.constant.StatisticsConstants.ITEMS_CRAFTED; +import static com.minecolonies.coremod.util.WorkerUtil.hasTooManyExternalItemsInInv; /** * Abstract class for the principal crafting AIs. @@ -88,6 +89,11 @@ public abstract class AbstractEntityAICrafting input = currentRecipeStorage.getCleanedInput(); for (final ItemStorage inputStorage : input) { - final ItemStack container = inputStorage.getItem().getCraftingRemainingItem(inputStorage.getItemStack()); + final ItemStack container = inputStorage.getItemStack().getCraftingRemainingItem(); final int remaining; if(!currentRecipeStorage.getCraftingToolsAndSecondaryOutputs().isEmpty() && ItemStackUtils.compareItemStackListIgnoreStackSize(currentRecipeStorage.getCraftingToolsAndSecondaryOutputs(), inputStorage.getItemStack(), false, true)) { @@ -320,7 +340,7 @@ protected IAIState checkForItems(@NotNull final IRecipeStorage storage) { final Predicate predicate = stack -> !ItemStackUtils.isEmpty(stack) && new Stack(stack, false).matches(inputStorage.getItemStack()); final int invCount = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), predicate); - final ItemStack container = inputStorage.getItem().getCraftingRemainingItem(inputStorage.getItemStack()); + final ItemStack container = inputStorage.getItemStack().getCraftingRemainingItem(); final int remaining; if(!currentRecipeStorage.getCraftingToolsAndSecondaryOutputs().isEmpty() && ItemStackUtils.compareItemStackListIgnoreStackSize(currentRecipeStorage.getCraftingToolsAndSecondaryOutputs(), inputStorage.getItemStack(), false, true)) { @@ -499,6 +519,7 @@ public void resetValues() job.setCraftCounter(0); worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStackUtils.EMPTY); worker.setItemInHand(InteractionHand.OFF_HAND, ItemStackUtils.EMPTY); + dumped = false; } @Override @@ -514,9 +535,9 @@ public IAIState afterDump() worker.getCitizenExperienceHandler().addExperience(currentRequest.getRequest().getCount() / 2.0); } currentRequest = null; + resetValues(); } - - resetValues(); + return super.afterDump(); } @@ -559,10 +580,9 @@ protected LootContext getLootContext() */ protected LootContext getLootContext(boolean includeKiller) { - if(playerDamageSource == null) + if (playerDamageSource == null) { - FakePlayer fp = FakePlayerFactory.getMinecraft((ServerLevel) this.world); - playerDamageSource = DamageSource.playerAttack(fp); + playerDamageSource = DamageSource.playerAttack(getFakePlayer()); } LootContext.Builder builder = (new LootContext.Builder((ServerLevel) this.world)) @@ -572,13 +592,13 @@ protected LootContext getLootContext(boolean includeKiller) .withRandom(worker.getRandom()) .withLuck((float) getEffectiveSkillLevel(getPrimarySkillLevel())); - if(includeKiller) + if (includeKiller) { builder = builder - .withParameter(LootContextParams.DAMAGE_SOURCE, playerDamageSource) - .withParameter(LootContextParams.KILLER_ENTITY, playerDamageSource.getEntity()) - .withParameter(LootContextParams.DIRECT_KILLER_ENTITY, playerDamageSource.getDirectEntity()); - } + .withParameter(LootContextParams.DAMAGE_SOURCE, playerDamageSource) + .withParameter(LootContextParams.KILLER_ENTITY, playerDamageSource.getEntity()) + .withParameter(LootContextParams.DIRECT_KILLER_ENTITY, playerDamageSource.getDirectEntity()); + } return builder.create(RecipeStorage.recipeLootParameters); } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIFight.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIFight.java index 2127630d150..27f85c2f1f5 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIFight.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIFight.java @@ -1,6 +1,5 @@ package com.minecolonies.coremod.entity.ai.basic; -import com.minecolonies.api.colony.buildings.IGuardBuilding; import com.minecolonies.api.entity.ai.citizen.guards.GuardGear; import com.minecolonies.api.entity.ai.citizen.guards.GuardGearBuilder; import com.minecolonies.api.entity.ai.statemachine.AITarget; @@ -9,19 +8,16 @@ import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.constant.ToolType; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.research.util.ResearchConstants.SHIELD_USAGE; @@ -91,7 +87,6 @@ public AbstractEntityAIFight(@NotNull final J job) */ protected IAIState startWorkingAtOwnBuilding() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_WORKER_GOINGTOHUT)); if (walkToBuilding()) { return getState(); @@ -99,6 +94,18 @@ protected IAIState startWorkingAtOwnBuilding() return PREPARING; } + @Override + public IAIState afterRequestPickUp() + { + return PREPARING; + } + + @Override + public IAIState getStateAfterPickUp() + { + return PREPARING; + } + /** * Prepares the guard. Fills his required armor and tool lists and transfer from building chest if required. * @@ -153,16 +160,27 @@ protected void atBuildingActions() int bestLevel = -1; IItemHandler bestHandler = null; - if (!ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType()))) + if (item.getType().getType() == EquipmentSlot.Type.ARMOR) + { + if (!ItemStackUtils.isEmpty(worker.getInventoryCitizen().getArmorInSlot(item.getType()))) + { + bestLevel = ItemStackUtils.getMiningLevel(worker.getInventoryCitizen().getArmorInSlot(item.getType()), item.getItemNeeded()); + } + } + else { - bestLevel = ItemStackUtils.getMiningLevel(worker.getItemBySlot(item.getType()), item.getItemNeeded()); + if (!ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType()))) + { + bestLevel = ItemStackUtils.getMiningLevel(worker.getItemBySlot(item.getType()), item.getItemNeeded()); + } } - final Map> items = InventoryUtils.findAllSlotsInProviderWith(building, item::test); + + final Map> items = InventoryUtils.findAllSlotsInProviderWith(building, item); if (items.isEmpty()) { - // None found, check for equipped - if (ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType()))) + // None found, check for equipped + if ((item.getType().getType() == EquipmentSlot.Type.ARMOR && ItemStackUtils.isEmpty(worker.getInventoryCitizen().getArmorInSlot(item.getType()))) || (item.getType().getType() != EquipmentSlot.Type.ARMOR && ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType())))) { // create request checkForToolorWeaponASync(item.getItemNeeded(), item.getMinArmorLevel(), item.getMaxArmorLevel()); @@ -196,19 +214,44 @@ protected void atBuildingActions() // Transfer if needed if (bestHandler != null) { - if (!ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType()))) + if (item.getType().getType() == EquipmentSlot.Type.ARMOR) { - final int slot = - InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), stack -> stack == worker.getItemBySlot(item.getType())); + if (!ItemStackUtils.isEmpty(worker.getInventoryCitizen().getArmorInSlot(item.getType()))) + { + final ItemStack armorStack = worker.getInventoryCitizen().getArmorInSlot(item.getType()); + worker.getInventoryCitizen().moveArmorToInventory(item.getType()); + final int slot = + InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), stack -> stack == armorStack); + if (slot > -1) + { + InventoryUtils.transferItemStackIntoNextFreeSlotInProvider(worker.getInventoryCitizen(), slot, building); + } + } + + final ItemStack newStack = bestHandler.getStackInSlot(bestSlot); + InventoryUtils.transferItemStackIntoNextFreeSlotInItemHandler(bestHandler, bestSlot, worker.getInventoryCitizen()); + final int slot = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), stack -> stack == newStack); if (slot > -1) { - InventoryUtils.transferItemStackIntoNextFreeSlotInProvider(worker.getInventoryCitizen(), slot, building); + worker.getInventoryCitizen().transferArmorToSlot(item.getType(), slot); } } + else + { + if (!ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType()))) + { + final int slot = + InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), stack -> stack == worker.getItemBySlot(item.getType())); + if (slot > -1) + { + InventoryUtils.transferItemStackIntoNextFreeSlotInProvider(worker.getInventoryCitizen(), slot, building); + } + } - // Used for further comparisons, set to the right inventory slot afterwards - worker.setItemSlot(item.getType(), bestHandler.getStackInSlot(bestSlot)); - InventoryUtils.transferItemStackIntoNextFreeSlotInItemHandler(bestHandler, bestSlot, worker.getInventoryCitizen()); + // Used for further comparisons, set to the right inventory slot afterwards + worker.setItemSlot(item.getType(), bestHandler.getStackInSlot(bestSlot)); + InventoryUtils.transferItemStackIntoNextFreeSlotInItemHandler(bestHandler, bestSlot, worker.getInventoryCitizen()); + } } } } @@ -227,18 +270,50 @@ public IAIState afterDump() */ public void equipInventoryArmor() { - cleanArmor(); + cleanVisibleSlots(); + final Set equipment = new HashSet<>(); for (final List itemList : itemsNeeded) { for (final GuardGear item : itemList) { - if (ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType())) && building.getBuildingLevel() >= item.getMinBuildingLevelRequired() && building.getBuildingLevel() <= item.getMaxBuildingLevelRequired()) + if (equipment.contains(item.getType())) + { + continue; + } + if (item.getType().getType() == EquipmentSlot.Type.ARMOR) { - int slot = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), item::test); + if (building.getBuildingLevel() >= item.getMinBuildingLevelRequired() && building.getBuildingLevel() <= item.getMaxBuildingLevelRequired()) + { + int slot = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), item); + if (slot <= -1) + { + continue; + } - if (slot > -1) + equipment.add(item.getType()); + final ItemStack current = worker.getInventoryCitizen().getArmorInSlot(item.getType()); + if (!current.isEmpty() && current.getItem() instanceof ArmorItem) + { + final int currentLevel = ItemStackUtils.getMiningLevel(current, item.getItemNeeded()); + final int newLevel = ItemStackUtils.getMiningLevel(worker.getInventoryCitizen().getStackInSlot(slot), item.getItemNeeded()); + if (currentLevel > newLevel) + { + continue; + } + } + worker.getInventoryCitizen().transferArmorToSlot(item.getType(), slot); + } + } + else + { + if (ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType())) && building.getBuildingLevel() >= item.getMinBuildingLevelRequired() && building.getBuildingLevel() <= item.getMaxBuildingLevelRequired()) { - worker.setItemSlot(item.getType(), worker.getInventoryCitizen().getStackInSlot(slot)); + equipment.add(item.getType()); + int slot = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getInventoryCitizen(), item); + if (slot > -1) + { + worker.setItemSlot(item.getType(), worker.getInventoryCitizen().getStackInSlot(slot)); + } } } } @@ -246,27 +321,18 @@ public void equipInventoryArmor() } /** - * Removes currently equipped armor and shields - */ - public void cleanArmor() - { - updateArmorInSlot(EquipmentSlot.CHEST); - updateArmorInSlot(EquipmentSlot.FEET); - updateArmorInSlot(EquipmentSlot.HEAD); - updateArmorInSlot(EquipmentSlot.LEGS); - updateArmorInSlot(EquipmentSlot.OFFHAND); - } - - /** - * Check if the armor is still in the inventory, if not empty the equipment slot. - * @param type the type of armor. + * Removes currently equipped shield */ - private void updateArmorInSlot(final EquipmentSlot type) + public void cleanVisibleSlots() { - final ItemStack stack = worker.getItemBySlot(type); + final ItemStack stack = worker.getItemBySlot(EquipmentSlot.OFFHAND); if (stack.isEmpty() || InventoryUtils.findFirstSlotInItemHandlerWith(getInventory(), itemStack -> ItemStackUtils.compareItemStacksIgnoreStackSize(stack, itemStack, false, true)) == -1) { - worker.setItemSlot(type, ItemStackUtils.EMPTY); + worker.setItemSlot(EquipmentSlot.OFFHAND, ItemStackUtils.EMPTY); } + worker.setItemSlot(EquipmentSlot.HEAD, ItemStackUtils.EMPTY); + worker.setItemSlot(EquipmentSlot.CHEST, ItemStackUtils.EMPTY); + worker.setItemSlot(EquipmentSlot.LEGS, ItemStackUtils.EMPTY); + worker.setItemSlot(EquipmentSlot.FEET, ItemStackUtils.EMPTY); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIInteract.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIInteract.java index c9956c8fc2f..d11f78982ca 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIInteract.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIInteract.java @@ -16,8 +16,6 @@ import net.minecraft.world.level.block.AirBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; @@ -348,18 +346,30 @@ public void fillItemsList() /** * Search for all items around the worker. and store them in the items list. * - * @param boundingBox the area to search. + * @param boundingBox the area to search. */ public void searchForItems(final AABB boundingBox) { items = world.getEntitiesOfClass(ItemEntity.class, boundingBox) .stream() .filter(item -> item != null && item.isAlive() && - (!item.getPersistentData().getAllKeys().contains("PreventRemoteMovement") || !item.getPersistentData().getBoolean("PreventRemoteMovement"))) + (!item.getPersistentData().contains("PreventRemoteMovement") || !item.getPersistentData().getBoolean("PreventRemoteMovement")) && + isItemWorthPickingUp(item.getItem())) .map(BlockPosUtil::fromEntity) .collect(Collectors.toList()); } + /** + * Check if an item is sufficiently interesting to want to go pick it up. (This won't stop a + * worker picking up something else as they pass by, but it makes them not want to go over to it.) + * @param stack the stack to check. + * @return true if the worker wants to go over to it. + */ + protected boolean isItemWorthPickingUp(final ItemStack stack) + { + return true; + } + /** * Collect one item by walking to it. */ diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIRequestSmelter.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIRequestSmelter.java index 99d859994f8..1b5cc9ce231 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIRequestSmelter.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIRequestSmelter.java @@ -23,15 +23,15 @@ import com.minecolonies.coremod.colony.buildings.modules.ItemListModule; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.AbstractJobCrafter; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FurnaceBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.FurnaceBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.InteractionHand; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.FurnaceBlockEntity; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; @@ -44,7 +44,8 @@ import static com.minecolonies.api.util.constant.BuildingConstants.FUEL_LIST; import static com.minecolonies.api.util.constant.CitizenConstants.TICKS_20; import static com.minecolonies.api.util.constant.Constants.*; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.BAKER_HAS_NO_FURNACES_MESSAGE; +import static com.minecolonies.api.util.constant.TranslationConstants.FURNACE_USER_NO_FUEL; /** * Crafts furnace stone related block when needed. @@ -434,7 +435,6 @@ private BlockPos getPositionOfOvenToRetrieveFrom() if (fullResult || (!furnace.isLit() && countInResultSlot > 0 && isEmpty(furnace.getItem(SMELTABLE_SLOT)))) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); return pos; } } @@ -458,7 +458,6 @@ protected BlockPos getPositionOfOvenToRetrieveFuelFrom() if (!furnace.getItem(FUEL_SLOT).isEmpty() && !compareItemStackListIgnoreStackSize(getAllowedFuel(), furnace.getItem(FUEL_SLOT), false, false)) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); return pos; } } @@ -514,8 +513,6 @@ protected IAIState checkForItems(@NotNull final IRecipeStorage storage) */ private IAIState retrieveSmeltableFromFurnace() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null || currentRequest == null) { return START_WORKING; @@ -573,8 +570,6 @@ private IAIState retrieveSmeltableFromFurnace() */ private IAIState retrieveUsedFuel() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null) { return START_WORKING; @@ -837,7 +832,6 @@ protected IAIState craft() if (furnacePosWithUsedFuel != null) { walkTo = furnacePosWithUsedFuel; - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.retrieving")); return RETRIEVING_USED_FUEL_FROM_FURNACE; } @@ -845,7 +839,6 @@ protected IAIState craft() if (posOfOven != null) { walkTo = posOfOven; - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.retrieving")); return RETRIEVING_END_PRODUCT_FROM_FURNACE; } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructure.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructure.java index 6e04fb77f5a..0e888d905db 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructure.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructure.java @@ -8,7 +8,6 @@ import com.ldtteam.structurize.placement.StructurePlacer; import com.ldtteam.structurize.placement.structure.IStructureHandler; import com.ldtteam.structurize.storage.ServerFutureProcessor; -import com.ldtteam.structurize.storage.StructurePacks; import com.ldtteam.structurize.util.BlockUtils; import com.ldtteam.structurize.util.BlueprintPositionInfo; import com.ldtteam.structurize.util.PlacementSettings; @@ -18,6 +17,7 @@ import com.minecolonies.api.colony.requestsystem.request.IRequest; import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.colony.requestsystem.requestable.Stack; +import com.minecolonies.api.colony.workorders.IWorkOrder; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.entity.ai.citizen.builder.IBuilderUndestroyable; import com.minecolonies.api.entity.ai.statemachine.AIEventTarget; @@ -37,8 +37,6 @@ import com.minecolonies.coremod.entity.ai.util.BuildingStructureHandler; import com.minecolonies.coremod.tileentities.TileEntityDecorationController; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; @@ -55,7 +53,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.Future; import java.util.function.Predicate; @@ -349,8 +350,6 @@ protected IAIState structureStep() return INVENTORY_FULL; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.building")); - checkForExtraBuildingActions(); // some things to do first! then we go to the actual phase! @@ -471,6 +470,7 @@ protected IAIState structureStep() if (!structurePlacer.getB().nextStage()) { building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); return COMPLETE_BUILD; } } @@ -496,6 +496,7 @@ else if (result.getBlockResult().getResult() == BlockPlacementResult.Result.LIMI if (result.getBlockResult().getResult() == BlockPlacementResult.Result.BREAK_BLOCK) { blockToMine = result.getBlockResult().getWorldPos(); + worker.getCitizenData().setStatusPosition(blockToMine); return MINE_BLOCK; } else @@ -561,23 +562,22 @@ public IAIState doMining() /** * Loads the structure given the name, rotation and position. * - * @param packName the pack name. - * @param blueprintPath the path of the blueprint. + * @param workOrder the work order. * @param rotateTimes number of times to rotateWithMirror it. * @param position the position to set it. * @param isMirrored is the structure mirroed? * @param removal if removal step. */ - public void loadStructure(@NotNull final String packName, final String blueprintPath, final int rotateTimes, final BlockPos position, final boolean isMirrored, final boolean removal) + public void loadStructure(@NotNull final IWorkOrder workOrder, final int rotateTimes, final BlockPos position, final boolean isMirrored, final boolean removal) { - final Future blueprintFuture = StructurePacks.getBlueprintFuture(packName, blueprintPath); + final Future blueprintFuture = workOrder.getBlueprintFuture(); this.loadingBlueprint = true; ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(blueprintFuture, world, (blueprint -> { if (blueprint == null) { handleSpecificCancelActions(); - Log.getLogger().warn("Couldn't find structure with name: " + blueprintPath + " in: " + packName + ". Aborting loading procedure"); + Log.getLogger().warn("Couldn't find structure with name: " + workOrder.getStructurePath() + " in: " + workOrder.getStructurePack() + ". Aborting loading procedure"); this.loadingBlueprint = false; return; } @@ -596,7 +596,7 @@ public void loadStructure(@NotNull final String packName, final String blueprint building.setTotalStages(2); } else if ((colonyBuilding != null && (colonyBuilding.getBuildingLevel() > 0 || colonyBuilding.hasParent())) || - (entity instanceof TileEntityDecorationController && Utils.getBlueprintLevel(((TileEntityDecorationController) entity).getSchematicPath()) != -1)) + (entity instanceof TileEntityDecorationController && Utils.getBlueprintLevel(((TileEntityDecorationController) entity).getBlueprintPath()) != -1)) { structure = new BuildingStructureHandler<>(world, position, @@ -815,8 +815,6 @@ public void storeProgressPos(final BlockPos blockPos, final BuildingStructureHan @Override public void fillItemsList() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.gathering")); - if (!structurePlacer.getB().hasBluePrint()) { return; @@ -872,6 +870,28 @@ protected boolean isAlreadyCleared() return false; } + /** + * Get the current block being placed/removed. May be null if nothing is loaded yet. + * + * @return the current building position, or null. + */ + @Nullable + public BlockPos getCurrentBuildingPosition() + { + if (structurePlacer == null || structurePlacer.getA() == null || structurePlacer.getB() == null) + { + return null; + } + + final BlockPos progressPos = structurePlacer.getA().getIterator().getProgressPos(); + if (progressPos == null || progressPos.equals(NULL_POS)) + { + return null; + } + + return structurePlacer.getB().getProgressPosInWorld(progressPos); + } + /** * Get the current working position for the worker. If workFrom is null calculate a new one. * @@ -879,7 +899,7 @@ protected boolean isAlreadyCleared() */ protected BlockPos getCurrentWorkingPosition() { - return workFrom == null ? getWorkingPosition(structurePlacer.getB().getProgressPosInWorld(structurePlacer.getA().getIterator().getProgressPos())) : workFrom; + return workFrom == null ? getWorkingPosition(getCurrentBuildingPosition()) : workFrom; } /** @@ -891,7 +911,6 @@ protected boolean isThereAStructureToBuild() { if (structurePlacer == null || !structurePlacer.getB().hasBluePrint()) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.waitingForBuild")); return false; } return true; @@ -949,6 +968,7 @@ public void resetCurrentStructure() workFrom = null; structurePlacer = null; building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); } /** diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructureWithWorkOrder.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructureWithWorkOrder.java index 6bd53a4a88b..c9552e9bbf1 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructureWithWorkOrder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIStructureWithWorkOrder.java @@ -6,6 +6,7 @@ import com.ldtteam.structurize.placement.StructurePlacer; import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.event.BuildingConstructionEvent; import com.minecolonies.api.colony.workorders.IWorkOrder; import com.minecolonies.api.colony.workorders.WorkOrderType; import com.minecolonies.api.crafting.ItemStorage; @@ -31,12 +32,14 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.MinecraftForge; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static com.ldtteam.structurize.placement.AbstractBlueprintIterator.NULL_POS; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.util.constant.Constants.STACKSIZE; +import static com.minecolonies.api.util.constant.StatisticsConstants.*; import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ENTITY_BUILDER_BUILD_START; /** @@ -86,6 +89,7 @@ public AbstractEntityAIStructureWithWorkOrder(@NotNull final J job) public void storeProgressPos(final BlockPos blockPos, final BuildingStructureHandler.Stage stage) { building.setProgressPos(blockPos, stage); + worker.getCitizenData().setStatusPosition(blockPos.equals(NULL_POS) ? null : structurePlacer.getB().getProgressPosInWorld(blockPos)); } @Override @@ -178,7 +182,7 @@ private void loadStructure() final int tempRotation = workOrder.getRotation(); final boolean removal = workOrder.getWorkOrderType() == WorkOrderType.REMOVE; - loadStructure(workOrder.getStructurePack(), workOrder.getStructurePath(), tempRotation, pos, workOrder.isMirrored(), removal); + loadStructure(workOrder, tempRotation, pos, workOrder.isMirrored(), removal); workOrder.setCleared(false); workOrder.setRequested(removal); } @@ -375,15 +379,19 @@ public void executeSpecificCompleteActions() { case BUILD: job.getColony().getEventDescriptionManager().addEventDescription(new BuildingBuiltEvent(wo.getLocation(), workOrderName)); + worker.getCitizenColonyHandler().getColony().getStatisticsManager().increment(BUILD_BUILT); break; case UPGRADE: job.getColony().getEventDescriptionManager().addEventDescription(new BuildingUpgradedEvent(wo.getLocation(), workOrderName, wo.getTargetLevel())); + worker.getCitizenColonyHandler().getColony().getStatisticsManager().increment(BUILD_UPGRADED); break; case REPAIR: job.getColony().getEventDescriptionManager().addEventDescription(new BuildingRepairedEvent(wo.getLocation(), workOrderName, wo.getCurrentLevel())); + worker.getCitizenColonyHandler().getColony().getStatisticsManager().increment(BUILD_REPAIRED); break; case REMOVE: job.getColony().getEventDescriptionManager().addEventDescription(new BuildingDeconstructedEvent(wo.getLocation(), workOrderName, wo.getCurrentLevel())); + worker.getCitizenColonyHandler().getColony().getStatisticsManager().increment(BUILD_REMOVED); break; } @@ -392,6 +400,7 @@ public void executeSpecificCompleteActions() if (wo instanceof WorkOrderBuilding) { final IBuilding building = job.getColony().getBuildingManager().getBuilding(wo.getLocation()); + MinecraftForge.EVENT_BUS.post(new BuildingConstructionEvent(building, BuildingConstructionEvent.EventType.fromWorkOrderType(wo.getWorkOrderType()))); switch (wo.getWorkOrderType()) { case BUILD: diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIUsesFurnace.java b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIUsesFurnace.java index 6019d675998..e1fb2bc0ae1 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIUsesFurnace.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/basic/AbstractEntityAIUsesFurnace.java @@ -19,14 +19,14 @@ import com.minecolonies.coremod.colony.buildings.modules.ItemListModule; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.AbstractJob; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FurnaceBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.FurnaceBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.FurnaceBlockEntity; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; @@ -37,8 +37,8 @@ import static com.minecolonies.api.util.ItemStackUtils.*; import static com.minecolonies.api.util.constant.BuildingConstants.FUEL_LIST; import static com.minecolonies.api.util.constant.Constants.*; -import static com.minecolonies.api.util.constant.TranslationConstants.*; -import static com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract.RENDER_META_WORKING; +import static com.minecolonies.api.util.constant.TranslationConstants.BAKER_HAS_NO_FURNACES_MESSAGE; +import static com.minecolonies.api.util.constant.TranslationConstants.FURNACE_USER_NO_FUEL; /** * AI class for all workers which use a furnace and require fuel and a block to smelt in it. @@ -139,7 +139,6 @@ protected BlockPos getPositionOfOvenToRetrieveFrom() || countInResultSlot > RETRIEVE_SMELTABLE_IF_MORE_THAN || (countInResultSlot > 0 && countInInputSlot == 0)) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); return pos; } } @@ -164,7 +163,6 @@ protected BlockPos getPositionOfOvenToRetrieveFuelFrom() if (!furnace.getItem(FUEL_SLOT).isEmpty() && !module.isItemInList(new ItemStorage(furnace.getItem(FUEL_SLOT)))) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); return pos; } } @@ -209,8 +207,6 @@ public IAIState startWorking() return getState(); } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_DECIDING)); - final IAIState nextState = checkForImportantJobs(); if (nextState != START_WORKING) { @@ -221,7 +217,6 @@ public IAIState startWorking() if (posOfUsedFuelOven != null) { walkTo = posOfUsedFuelOven; - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.retrieving")); return RETRIEVING_USED_FUEL_FROM_FURNACE; } @@ -229,7 +224,6 @@ public IAIState startWorking() if (posOfOven != null) { walkTo = posOfOven; - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.retrieving")); return RETRIEVING_END_PRODUCT_FROM_FURNACE; } @@ -358,7 +352,6 @@ private IAIState checkIfAbleToSmelt(final int amountOfFuel, final int amountOfSm */ protected IAIState checkForAdditionalJobs() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_IDLING)); return START_WORKING; } @@ -392,8 +385,6 @@ protected int getActionsDoneUntilDumping() */ private IAIState retrieveSmeltableFromFurnace() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null) { return START_WORKING; @@ -427,8 +418,6 @@ private IAIState retrieveSmeltableFromFurnace() */ private IAIState retrieveUsedFuel() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null) { return START_WORKING; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/CitizenAI.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/CitizenAI.java new file mode 100644 index 00000000000..5444ff33454 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/CitizenAI.java @@ -0,0 +1,316 @@ +package com.minecolonies.coremod.entity.ai.citizen; + +import com.minecolonies.api.colony.interactionhandling.ChatPriority; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.ITickingStateAI; +import com.minecolonies.api.entity.ai.statemachine.AIEventTarget; +import com.minecolonies.api.entity.ai.statemachine.AITarget; +import com.minecolonies.api.entity.ai.statemachine.states.AIBlockingEventType; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; +import com.minecolonies.api.entity.ai.statemachine.states.IState; +import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; +import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenColonyHandler; +import com.minecolonies.api.util.CompatibilityUtils; +import com.minecolonies.api.util.WorldUtil; +import com.minecolonies.api.util.constant.CitizenConstants; +import com.minecolonies.coremod.MineColonies; +import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; +import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; +import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; +import com.minecolonies.coremod.colony.jobs.JobPupil; +import com.minecolonies.coremod.entity.ai.minimal.*; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.monster.Monster; + +import java.util.ArrayList; +import java.util.List; + +import static com.minecolonies.api.entity.citizen.VisibleCitizenStatus.*; +import static com.minecolonies.api.research.util.ResearchConstants.WORKING_IN_RAIN; +import static com.minecolonies.api.util.constant.CitizenConstants.*; +import static com.minecolonies.api.util.constant.Constants.DEFAULT_SPEED; +import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.coremod.entity.ai.minimal.EntityAIEatTask.RESTAURANT_LIMIT; +import static com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenDiseaseHandler.SEEK_DOCTOR_HEALTH; + +/** + * High level AI for citizens, which switches between all the different AI states like sleeping,working,fleeing etc + */ +public class CitizenAI implements IStateAI +{ + /** + * Citizen this AI belongs to + */ + private final EntityCitizen citizen; + + /** + * The last citizen AI state + */ + private IState lastState = CitizenAIState.IDLE; + + /** + * List of small AI's added + */ + private List minimalAI = new ArrayList<>(); + + public CitizenAI(final EntityCitizen citizen) + { + this.citizen = citizen; + + citizen.getCitizenAI().addTransition(new AIEventTarget(AIBlockingEventType.EVENT, () -> true, this::decideAiTask, 10)); + registerWorkAI(); + + minimalAI.add(new EntityAICitizenAvoidEntity(citizen, Monster.class, (float) DISTANCE_OF_ENTITY_AVOID, LATER_RUN_SPEED_AVOID, INITIAL_RUN_SPEED_AVOID)); + minimalAI.add(new EntityAIEatTask(citizen)); + minimalAI.add(new EntityAICitizenWander(citizen, DEFAULT_SPEED)); + minimalAI.add(new EntityAISickTask(citizen)); + minimalAI.add(new EntityAISleep(citizen)); + minimalAI.add(new EntityAIMournCitizen(citizen, DEFAULT_SPEED)); + } + + /** + * Registers callbacks for the work/job AI + */ + private void registerWorkAI() + { + citizen.getCitizenAI().addTransition(new AITarget<>(CitizenAIState.WORK, () -> true, () -> + { + final ITickingStateAI ai = citizen.getCitizenJobHandler().getColonyJob().getWorkerAI(); + if (ai != null) + { + ai.resetAI(); + } + citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); + return CitizenAIState.WORKING; + }, 10)); + + citizen.getCitizenAI().addTransition(new AITarget<>(CitizenAIState.WORKING, () -> true, () -> + { + if (citizen.getCitizenJobHandler().getColonyJob() != null) + { + final ITickingStateAI ai = citizen.getCitizenJobHandler().getColonyJob().getWorkerAI(); + if (ai != null) + { + citizen.getCitizenJobHandler().getColonyJob().getWorkerAI().tick(); + } + } + + return CitizenAIState.WORKING; + }, 1)); + } + + /** + * Checks on the AI state the citizen should be in, and transitions as necessary + * + * @return + */ + private IState decideAiTask() + { + IState next = calculateNextState(); + if (next == null || next == lastState && citizen.getCitizenAI().getState() != CitizenAIState.IDLE) + { + return null; + } + + citizen.getCitizenData().setVisibleStatus(null); + lastState = next; + return lastState; + } + + /** + * Determines the AI state the citizen should be doing, sleeping,raiding etc at different priorities + * + * @return + */ + private IState calculateNextState() + { + if (citizen.getCitizenJobHandler().getColonyJob() instanceof AbstractJobGuard guardJob) + { + if (shouldEat()) + { + return CitizenAIState.EATING; + } + + // Sick + if (citizen.getCitizenDiseaseHandler().isSick() && guardJob.canAIBeInterrupted()) + { + citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); + return CitizenAIState.SICK; + } + + return CitizenAIState.WORK; + } + + // Sick at hospital + if (citizen.getCitizenDiseaseHandler().isSick() && citizen.getCitizenDiseaseHandler().sleepsAtHospital()) + { + citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); + return CitizenAIState.SICK; + } + + // Raiding + if (citizen.getCitizenColonyHandler().getColony().getRaiderManager().isRaided()) + { + citizen.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_RAID), ChatPriority.IMPORTANT)); + citizen.setVisibleStatusIfNone(RAIDED); + return CitizenAIState.SLEEP; + } + + // Sleeping + if (!WorldUtil.isPastTime(CompatibilityUtils.getWorldFromCitizen(citizen), NIGHT - 2000)) + { + if (lastState == CitizenAIState.SLEEP) + { + citizen.setVisibleStatusIfNone(SLEEP); + citizen.getCitizenAI().setCurrentDelay(20 * 15); + return CitizenAIState.SLEEP; + } + + if (citizen.getCitizenSleepHandler().shouldGoSleep()) + { + citizen.getCitizenData().onGoSleep(); + return CitizenAIState.SLEEP; + } + } + else + { + if (citizen.getCitizenSleepHandler().isAsleep()) + { + if (citizen.getCitizenDiseaseHandler().isSick()) + { + final BlockPos bedPos = citizen.getCitizenSleepHandler().getBedLocation(); + if (bedPos == null || bedPos.distSqr(citizen.blockPosition()) > 5) + { + citizen.getCitizenSleepHandler().onWakeUp(); + } + } + else + { + citizen.getCitizenSleepHandler().onWakeUp(); + } + } + } + + // Sick + if (citizen.getCitizenDiseaseHandler().isSick() || citizen.getCitizenDiseaseHandler().isHurt()) + { + citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); + return CitizenAIState.SICK; + } + + // Eating + if (shouldEat()) + { + return CitizenAIState.EATING; + } + + // Mourning + if (citizen.getCitizenData().getCitizenMournHandler().isMourning() && citizen.getCitizenData().getCitizenMournHandler().shouldMourn()) + { + if (lastState != CitizenAIState.MOURN) + { + citizen.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_MOURNING, + citizen.getCitizenData().getCitizenMournHandler().getDeceasedCitizens().iterator().next()), + Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_MOURNING), + ChatPriority.IMPORTANT)); + + citizen.setVisibleStatusIfNone(MOURNING); + } + return CitizenAIState.MOURN; + } + else + { + this.citizen.getCitizenData().getCitizenMournHandler().clearDeceasedCitizen(); + this.citizen.getCitizenData().getCitizenMournHandler().setMourning(false); + } + + // Raining + if (CompatibilityUtils.getWorldFromCitizen(citizen).isRaining() && !shouldWorkWhileRaining() && !WorldUtil.isNetherType(citizen.level)) + { + citizen.setVisibleStatusIfNone(BAD_WEATHER); + if (!citizen.getCitizenData().getColony().getRaiderManager().isRaided() + && !citizen.getCitizenData().getCitizenMournHandler().isMourning()) + { + citizen.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_RAINING), ChatPriority.HIDDEN)); + } + return CitizenAIState.IDLE; + } + + // Work + if (citizen.isBaby() && citizen.getCitizenJobHandler().getColonyJob() instanceof JobPupil && citizen.level.getDayTime() % 24000 > NOON) + { + citizen.setVisibleStatusIfNone(HOUSE); + return CitizenAIState.IDLE; + } + + if (citizen.getCitizenJobHandler().getColonyJob() != null) + { + return CitizenAIState.WORK; + } + + citizen.setVisibleStatusIfNone(HOUSE); + return CitizenAIState.IDLE; + } + + /** + * Checks if the citizen should be eating + * + * @return + */ + public boolean shouldEat() + { + if (citizen.getCitizenData().justAte()) + { + return false; + } + + if (citizen.getCitizenJobHandler().getColonyJob() != null && !citizen.getCitizenJobHandler().getColonyJob().canAIBeInterrupted()) + { + return false; + } + + if (lastState == CitizenAIState.EATING) + { + return true; + } + + if (citizen.getCitizenDiseaseHandler().isSick() && citizen.getCitizenSleepHandler().isAsleep()) + { + return false; + } + + return citizen.getCitizenData().getSaturation() <= CitizenConstants.AVERAGE_SATURATION && + (citizen.getCitizenData().getSaturation() <= RESTAURANT_LIMIT || + (citizen.getCitizenData().getSaturation() < LOW_SATURATION && citizen.getHealth() < SEEK_DOCTOR_HEALTH)); + } + + /** + * Checks if the citizen should work even when it rains. + * + * @return true if his building level is bigger than 5. + */ + private boolean shouldWorkWhileRaining() + { + if (MineColonies.getConfig().getServer().workersAlwaysWorkInRain.get()) + { + return true; + } + + final ICitizenColonyHandler colonyHandler = citizen.getCitizenColonyHandler(); + if (colonyHandler.getColony().getResearchManager().getResearchEffects().getEffectStrength(WORKING_IN_RAIN) > 0) + { + return true; + } + + if (colonyHandler.getWorkBuilding() != null) + { + if (colonyHandler.getWorkBuilding().hasModule(WorkerBuildingModule.class)) + { + return colonyHandler.getWorkBuilding().getFirstModuleOccurance(WorkerBuildingModule.class).canWorkDuringTheRain(); + } + } + return false; + } +} diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/alchemist/EntityAIWorkAlchemist.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/alchemist/EntityAIWorkAlchemist.java index 29fe9576d6d..277004b1f1f 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/alchemist/EntityAIWorkAlchemist.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/alchemist/EntityAIWorkAlchemist.java @@ -32,7 +32,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.ShearsItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; @@ -47,8 +46,8 @@ import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.util.ItemStackUtils.*; import static com.minecolonies.api.util.constant.Constants.*; +import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; import static com.minecolonies.api.util.constant.TranslationConstants.BAKER_HAS_NO_FURNACES_MESSAGE; -import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING; /** * Crafts brewing recipes. @@ -249,7 +248,7 @@ private IAIState harvestMistleToe() final BlockState state = world.getBlockState(walkTo); - final int slot = InventoryUtils.findFirstSlotInItemHandlerWith(worker.getInventoryCitizen(), stack -> stack.getItem() instanceof ShearsItem); + final int slot = InventoryUtils.getFirstSlotOfItemHandlerContainingTool(worker.getInventoryCitizen(), ToolType.SHEARS, TOOL_LEVEL_WOOD_OR_GOLD, building.getMaxToolLevel()); worker.getCitizenItemHandler().setHeldItem(InteractionHand.MAIN_HAND, slot); worker.swing(InteractionHand.MAIN_HAND); @@ -299,7 +298,7 @@ protected IAIState decide() if (building.isInBuilding(worker.blockPosition())) { - worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ); + worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, false); } else { @@ -649,7 +648,6 @@ private BlockPos getPositionOfBrewingStandToRetrieveFrom() if (brewingStand.brewTime <= 0 && countInResultSlot > 0 && isEmpty(brewingStand.getItem(INGREDIENT_SLOT))) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); return pos; } } @@ -704,8 +702,6 @@ protected IAIState checkForItems(@NotNull final IRecipeStorage storage) */ private IAIState retrieveBrewableFromBrewingStand() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null || currentRequest == null) { return START_WORKING; @@ -775,8 +771,6 @@ private IAIState retrieveBrewableFromBrewingStand() */ private IAIState retrieveUsedFuel() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_RETRIEVING)); - if (walkTo == null) { return START_WORKING; @@ -1054,7 +1048,6 @@ protected IAIState craft() if (posOfOven != null) { walkTo = posOfOven; - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.retrieving")); return RETRIEVING_END_PRODUCT_FROM_BREWINGSTAMD; } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/beekeeper/EntityAIWorkBeekeeper.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/beekeeper/EntityAIWorkBeekeeper.java index 419bc7f86bb..3f7e13355a9 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/beekeeper/EntityAIWorkBeekeeper.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/beekeeper/EntityAIWorkBeekeeper.java @@ -10,29 +10,28 @@ import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.constant.ToolType; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.api.util.constant.translation.RequestSystemTranslationConstants; import com.minecolonies.coremod.colony.buildings.modules.ItemListModule; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBeekeeper; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.JobBeekeeper; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; -import net.minecraft.world.level.block.BeehiveBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Bee; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BeehiveBlock; import net.minecraft.world.level.block.entity.BeehiveBlockEntity; -import net.minecraft.world.InteractionHand; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -181,7 +180,6 @@ private IAIState prepareForHerding() */ private IAIState startWorkingAtOwnBuilding() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_WORKER_GOINGTOHUT)); if (walkToBuilding()) { setDelay(2); @@ -259,8 +257,6 @@ private IAIState decideWhatToDo() job.resetCounter(); } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_DECIDING)); - if (isReadyForBreeding()) { return HERDER_BREED; @@ -309,8 +305,6 @@ private IAIState breedAnimals() return START_WORKING; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_BREEDING)); - breedTwoAnimals(animalOne, animalTwo); incrementActionsDoneAndDecSaturation(); @@ -324,8 +318,6 @@ private IAIState breedAnimals() */ private IAIState harvestHoney() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_BEEKEEPER_HARVESTING)); - final List hives = building .getHives() .stream() @@ -416,7 +408,6 @@ public boolean walkingToAnimal(final Animal animal) { if (animal != null) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_GOINGTOANIMAL)); return walkToBlock(new BlockPos(animal.position())); } else diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/ConstructionTapeHelper.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/ConstructionTapeHelper.java index 4a5792e0c07..ed6cf0c60b4 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/ConstructionTapeHelper.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/ConstructionTapeHelper.java @@ -41,7 +41,7 @@ private ConstructionTapeHelper() {} */ public static void placeConstructionTape(@NotNull final IWorkOrder workOrder, @NotNull final Level world) { - ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(workOrder.getStructurePack(), workOrder.getStructurePath()), world, (blueprint -> { + ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(workOrder.getBlueprintFuture(), world, (blueprint -> { final Tuple corners = ColonyUtils.calculateCorners(workOrder.getLocation(), world, blueprint, workOrder.getRotation(), workOrder.isMirrored()); placeConstructionTape(corners, world); }))); @@ -163,7 +163,7 @@ public static BlockPos firstValidPosition(@NotNull final BlockPos target, @NotNu */ public static void removeConstructionTape(@NotNull final IWorkOrder workOrder, @NotNull final Level world) { - ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(workOrder.getStructurePack(), workOrder.getStructurePath()), world, (blueprint -> { + ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(workOrder.getBlueprintFuture(), world, (blueprint -> { final Tuple corners = ColonyUtils.calculateCorners(workOrder.getLocation(), world, blueprint, workOrder.getRotation(), workOrder.isMirrored()); removeConstructionTape(corners, world); }))); diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/EntityAIStructureBuilder.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/EntityAIStructureBuilder.java index ec543387dbc..ff36e037e81 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/EntityAIStructureBuilder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/builder/EntityAIStructureBuilder.java @@ -95,6 +95,7 @@ private boolean checkForWorkOrder() { building.searchWorkOrder(); building.setProgressPos(null, BuildingStructureHandler.Stage.CLEAR); + worker.getCitizenData().setStatusPosition(null); return false; } @@ -104,6 +105,7 @@ private boolean checkForWorkOrder() { job.setWorkOrder(null); building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); return false; } @@ -201,6 +203,11 @@ public boolean walkToConstructionSite(final BlockPos currentBlock) return false; } + if (BlockPosUtil.getDistance2D(worker.blockPosition(), currentBlock) <= 5L + (pathBackupFactor * 5L)) + { + return true; + } + if (walkToBlock(workFrom)) { return false; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/composter/EntityAIWorkComposter.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/composter/EntityAIWorkComposter.java index 0b237b4a899..4f0da196e72 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/composter/EntityAIWorkComposter.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/composter/EntityAIWorkComposter.java @@ -19,27 +19,24 @@ import com.minecolonies.coremod.colony.jobs.JobComposter; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; import com.minecolonies.coremod.tileentities.TileEntityBarrel; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.InteractionHand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.Random; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.research.util.ResearchConstants.PODZOL_CHANCE; import static com.minecolonies.api.util.constant.Constants.DOUBLE; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ENTITY_COMPOSTER_EMPTYLIST; public class EntityAIWorkComposter extends AbstractEntityAIInteract { @@ -198,7 +195,6 @@ private IAIState getMaterials() */ private IAIState decideWhatToDo() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_IDLING)); worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); if (walkToBuilding()) @@ -248,7 +244,6 @@ private IAIState decideWhatToDo() */ private IAIState fillBarrels() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_COMPOSTER_FILLING)); if (worker.getItemInHand(InteractionHand.MAIN_HAND) == ItemStack.EMPTY) { @@ -294,7 +289,6 @@ private IAIState fillBarrels() */ private IAIState harvestBarrels() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(COM_MINECOLONIES_COREMOD_STATUS_COMPOSTER_HARVESTING)); if (walkToBlock(currentTarget)) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/cook/EntityAIWorkCook.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/cook/EntityAIWorkCook.java index 290f8532676..3ce821e338c 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/cook/EntityAIWorkCook.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/cook/EntityAIWorkCook.java @@ -15,29 +15,28 @@ import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.util.*; import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.modules.ItemListModule; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingCook; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.JobCook; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIUsesFurnace; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.FurnaceBlockEntity; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.function.Predicate; -import java.util.stream.Collectors; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.util.ItemStackUtils.CAN_EAT; +import static com.minecolonies.api.util.constant.CitizenConstants.AVERAGE_SATURATION; import static com.minecolonies.api.util.constant.Constants.*; import static com.minecolonies.api.util.constant.StatisticsConstants.FOOD_SERVED; import static com.minecolonies.api.util.constant.TranslationConstants.FURNACE_USER_NO_FOOD; @@ -150,7 +149,7 @@ protected boolean reachedMaxToKeep() return true; } final int buildingLimit = Math.max(1, building.getBuildingLevel() * building.getBuildingLevel()) * SLOT_PER_LINE; - return InventoryUtils.getCountFromBuildingWithLimit(building, ItemStackUtils.CAN_EAT.and(stack -> stack.getItem().getFoodProperties().getNutrition() >= building.getBuildingLevel() - 1), stack -> stack.getMaxStackSize() * 6) > buildingLimit; + return InventoryUtils.getCountFromBuildingWithLimit(building, ItemStackUtils.CAN_EAT.and(stack -> stack.getItem().getFoodProperties(stack, worker).getNutrition() >= building.getBuildingLevel() - 1), stack -> stack.getMaxStackSize() * 6) > buildingLimit; } @Override @@ -176,8 +175,6 @@ public void requestSmeltable() */ private IAIState serveFoodToCitizen() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_SERVING)); - if (citizenToServe.isEmpty() && playerToServe.isEmpty()) { return START_WORKING; @@ -194,7 +191,7 @@ private IAIState serveFoodToCitizen() return START_WORKING; } - if (walkToBlock(new BlockPos(living.position()))) + if (walkToBlock(living.blockPosition())) { return getState(); } @@ -211,7 +208,7 @@ private IAIState serveFoodToCitizen() final ItemStack stack = worker.getInventoryCitizen().extractItem(foodSlot, 1, false); if (stack.isEdible()) { - citizenToServe.get(0).getCitizenData().increaseSaturation(stack.getItem().getFoodProperties().getNutrition() / 2.0); + citizenToServe.get(0).getCitizenData().increaseSaturation(stack.getItem().getFoodProperties(stack, worker).getNutrition() / 2.0); } worker.getCitizenColonyHandler().getColony().getStatisticsManager().increment(FOOD_SERVED); } @@ -234,11 +231,6 @@ else if (InventoryUtils.hasItemInItemHandler(handler, stack -> CAN_EAT.test(stac } worker.getCitizenColonyHandler().getColony().getStatisticsManager().incrementBy(FOOD_SERVED, count); - if (!citizenToServe.isEmpty() && citizenToServe.get(0).getCitizenData() != null) - { - citizenToServe.get(0).getCitizenData().setJustAte(true); - } - if (citizenToServe.isEmpty() && living instanceof Player) { MessageUtils.format(MESSAGE_INFO_CITIZEN_COOK_SERVE_PLAYER, worker.getName().getString()).sendTo((Player) living); @@ -302,14 +294,6 @@ protected IAIState checkForImportantJobs() this.reservedItemCache.clear(); //Clear the cache of current pending work citizenToServe.clear(); - final List citizenList = WorldUtil.getEntitiesWithinBuilding(world, AbstractEntityCitizen.class, building, null) - .stream() - .filter(cit -> !(cit.getCitizenJobHandler().getColonyJob() instanceof JobCook) - && cit.shouldBeFed() - && !InventoryUtils.hasItemInItemHandler(cit.getItemHandlerCitizen(), stack -> CAN_EAT.test(stack) && canEat(stack, cit))) - .sorted(Comparator.comparingInt(a -> (a.getCitizenJobHandler().getColonyJob() == null ? 1 : 0))) - .collect(Collectors.toList()); - final List playerList = WorldUtil.getEntitiesWithinBuilding(world, Player.class, building, player -> player != null && player.getFoodData().getFoodLevel() < LEVEL_TO_FEED_PLAYER @@ -319,8 +303,15 @@ protected IAIState checkForImportantJobs() playerToServe.addAll(playerList); boolean hasFoodInBuilding = false; - for (final AbstractEntityCitizen citizen : citizenList) + for (final EntityCitizen citizen : WorldUtil.getEntitiesWithinBuilding(world, EntityCitizen.class, building, null)) { + if (citizen.getCitizenJobHandler().getColonyJob() instanceof JobCook + || !shouldBeFed(citizen) + || InventoryUtils.hasItemInItemHandler(citizen.getItemHandlerCitizen(), stack -> CAN_EAT.test(stack) && canEat(stack, citizen))) + { + continue; + } + final Predicate foodPredicate = stack -> ItemStackUtils.CAN_EAT.test(stack) && !isItemStackForAssistant(stack) && canEat(stack, citizen); if (InventoryUtils.hasItemInItemHandler(worker.getInventoryCitizen(), foodPredicate)) { @@ -362,6 +353,20 @@ protected IAIState checkForImportantJobs() return START_WORKING; } + /** + * Check if the citizen can be fed. + * + * @return true if so. + */ + private boolean shouldBeFed(AbstractEntityCitizen citizen) + { + return citizen.getCitizenData() != null + && !citizen.getCitizenData().isWorking() + && citizen.getCitizenData().getSaturation() <= AVERAGE_SATURATION + && !citizen.getCitizenData().justAte(); + + } + /** * Check if the stack we're using is needed by the assistant * @param stack the stack to check @@ -395,7 +400,7 @@ protected IRequestable getSmeltAbleClass() } } - blockedItems.removeIf(item -> item.getItem().getFoodProperties() == null || item.getItem().getFoodProperties().getNutrition() < building.getBuildingLevel() - 1); + blockedItems.removeIf(item -> item.getItem().getFoodProperties(item.getItemStack(), worker) == null || item.getItem().getFoodProperties(item.getItemStack(), worker).getNutrition() < building.getBuildingLevel() - 1); if (!blockedItems.isEmpty()) { if (IColonyManager.getInstance().getCompatibilityManager().getEdibles(building.getBuildingLevel() - 1).size() <= blockedItems.size()) diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/crusher/EntityAIWorkCrusher.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/crusher/EntityAIWorkCrusher.java index 6de371c54a5..6cbe23323dc 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/crusher/EntityAIWorkCrusher.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/crusher/EntityAIWorkCrusher.java @@ -77,7 +77,7 @@ protected IAIState decide() { if (building.isInBuilding(worker.blockPosition())) { - worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ); + worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, false); } else { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/deliveryman/EntityAIWorkDeliveryman.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/deliveryman/EntityAIWorkDeliveryman.java index 93ead1565bd..e0ef811c290 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/deliveryman/EntityAIWorkDeliveryman.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/deliveryman/EntityAIWorkDeliveryman.java @@ -28,12 +28,12 @@ import com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests.DeliveryRequest; import com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests.PickupRequest; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.InteractionHand; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -158,7 +158,6 @@ private IAIState pickup() } worker.getCitizenData().setVisibleStatus(DELIVERING); - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.gathering")); final BlockPos pickupTarget = currentTask.getRequester().getLocation().getInDimensionLocation(); if (pickupTarget != BlockPos.ZERO && !worker.isWorkerAtSiteWithMove(pickupTarget, MIN_DISTANCE_TO_WAREHOUSE)) @@ -292,15 +291,19 @@ public static int workerRequiresItem(final IBuilding building, final ItemStack s */ private IAIState dump() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.dumping")); + final @Nullable IWareHouse warehouse = getAndCheckWareHouse(); + if (warehouse == null) + { + return START_WORKING; + } - if (!worker.isWorkerAtSiteWithMove(getAndCheckWareHouse().getPosition(), MIN_DISTANCE_TO_WAREHOUSE)) + if (!worker.isWorkerAtSiteWithMove(warehouse.getPosition(), MIN_DISTANCE_TO_WAREHOUSE)) { setDelay(WALK_DELAY); return DUMPING; } - getAndCheckWareHouse().getTileEntity().dumpInventoryIntoWareHouse(worker.getInventoryCitizen()); + warehouse.getTileEntity().dumpInventoryIntoWareHouse(worker.getInventoryCitizen()); worker.getCitizenItemHandler().setHeldItem(InteractionHand.MAIN_HAND, SLOT_HAND); return START_WORKING; @@ -334,7 +337,6 @@ private IAIState deliver() } worker.getCitizenData().setVisibleStatus(DELIVERING); - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.delivering")); final ILocation targetBuildingLocation = ((Delivery) currentTask.getRequest()).getTarget(); if (!targetBuildingLocation.isReachableFromLocation(worker.getLocation())) @@ -351,7 +353,7 @@ private IAIState deliver() final BlockEntity tileEntity = world.getBlockEntity(targetBuildingLocation.getInDimensionLocation()); - if (!(tileEntity instanceof TileEntityColonyBuilding)) + if (!(tileEntity instanceof TileEntityColonyBuilding) || ((AbstractTileEntityColonyBuilding) tileEntity).getBuilding() == null) { // TODO: Non-Colony deliveries are unsupported yet. Fix that at some point in time. job.finishRequest(true); diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/enchanter/EntityAIWorkEnchanter.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/enchanter/EntityAIWorkEnchanter.java index 169bdf89c10..5265a96c0f3 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/enchanter/EntityAIWorkEnchanter.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/enchanter/EntityAIWorkEnchanter.java @@ -1,7 +1,10 @@ package com.minecolonies.coremod.entity.ai.citizen.enchanter; import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.interactionhandling.ChatPriority; +import com.minecolonies.api.colony.requestsystem.token.IToken; +import com.minecolonies.api.crafting.IRecipeStorage; import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; @@ -99,9 +102,6 @@ public EntityAIWorkEnchanter(@NotNull final JobEnchanter job) { super(job); super.registerTargets( - new AITarget(IDLE, START_WORKING, TICKS_SECOND), - new AITarget(START_WORKING, DECIDE, TICKS_SECOND), - new AITarget(DECIDE, this::decide, TICKS_SECOND), new AITarget(ENCHANTER_DRAIN, this::gatherAndDrain, 10), new AITarget(ENCHANT, this::enchant, TICKS_SECOND) ); @@ -113,20 +113,27 @@ public EntityAIWorkEnchanter(@NotNull final JobEnchanter job) * * @return the next state to go to. */ + @Override protected IAIState decide() { worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); if (walkToBuilding()) { - return DECIDE; + return START_WORKING; } final IAIState craftState = getNextCraftingState(); - if (craftState != getState() && !WorldUtil.isPastTime(world, 13000)) + if (craftState != START_WORKING && !WorldUtil.isPastTime(world, 6000)) { return craftState; } + if (wantInventoryDumped()) + { + // Wait to dump before continuing. + return getState(); + } + if (getPrimarySkillLevel() < building.getBuildingLevel() * MANA_REQ_PER_LEVEL) { final BuildingEnchanter enchanterBuilding = building; @@ -163,17 +170,31 @@ protected IAIState decide() return ENCHANTER_DRAIN; } - final int ancientTomesInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), IS_ANCIENT_TOME); - if (ancientTomesInInv <= 0) + final BuildingEnchanter.@NotNull CraftingModule craftingModule = building.getFirstModuleOccurance(BuildingEnchanter.CraftingModule.class); + boolean ancientTomeCraftingDisabled = false; + for (final IToken token : craftingModule.getRecipes()) { - final int amountOfAncientTomes = InventoryUtils.hasBuildingEnoughElseCount(building, IS_ANCIENT_TOME, 1); - if (amountOfAncientTomes > 0) + final IRecipeStorage storage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(token); + if (storage != null && !storage.getInput().isEmpty() && storage.getInput().get(0).getItem() == ModItems.ancientTome && craftingModule.isDisabled(token)) { - needsCurrently = new Tuple<>(IS_ANCIENT_TOME, 1); - return GATHERING_REQUIRED_MATERIALS; + ancientTomeCraftingDisabled = true; + } + } + + if (!ancientTomeCraftingDisabled) + { + final int ancientTomesInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), IS_ANCIENT_TOME); + if (ancientTomesInInv <= 0) + { + final int amountOfAncientTomes = InventoryUtils.hasBuildingEnoughElseCount(building, IS_ANCIENT_TOME, 1); + if (amountOfAncientTomes > 0) + { + needsCurrently = new Tuple<>(IS_ANCIENT_TOME, 1); + return GATHERING_REQUIRED_MATERIALS; + } + checkIfRequestForItemExistOrCreateAsync(new ItemStack(ModItems.ancientTome, 1), 1, 1, false); + return IDLE; } - checkIfRequestForItemExistOrCreateAsync(new ItemStack(ModItems.ancientTome, 1), 1, 1, false); - return IDLE; } return ENCHANT; @@ -197,7 +218,7 @@ private IAIState enchant() if (currentRecipeStorage == null) { progressTicks = 0; - return DECIDE; + return START_WORKING; } if (progressTicks++ < MAX_ENCHANTMENT_TICKS / building.getBuildingLevel()) @@ -309,7 +330,7 @@ private IAIState gatherAndDrain() if (workers.isEmpty()) { resetDraining(); - return DECIDE; + return START_WORKING; } citizen = workers.get(0); } @@ -333,7 +354,7 @@ private IAIState gatherAndDrain() if (!job.incrementWaitingTicks()) { resetDraining(); - return DECIDE; + return START_WORKING; } return getState(); } @@ -393,7 +414,7 @@ private IAIState gatherAndDrain() worker.getInventoryCitizen().extractItem(bookSlot, 1, false); worker.getCitizenData().getCitizenSkillHandler().incrementLevel(Skill.Mana, 1); worker.getCitizenExperienceHandler().addExperience(XP_PER_DRAIN); - worker.getCitizenData().markDirty(); + worker.getCitizenData().markDirty(80); } resetDraining(); return IDLE; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/farmer/EntityAIWorkFarmer.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/farmer/EntityAIWorkFarmer.java index 80b88502273..967f217b39a 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/farmer/EntityAIWorkFarmer.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/farmer/EntityAIWorkFarmer.java @@ -2,7 +2,7 @@ import com.google.common.reflect.TypeToken; import com.minecolonies.api.advancements.AdvancementTriggers; -import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.IField; import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.requestsystem.requestable.StackList; import com.minecolonies.api.compatibility.Compatibility; @@ -12,41 +12,39 @@ import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.items.ModItems; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; -import com.minecolonies.api.tileentities.ScarecrowFieldStage; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Tuple; +import com.minecolonies.api.util.WorldUtil; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.api.util.constant.ToolType; import com.minecolonies.api.util.constant.translation.RequestSystemTranslationConstants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.blocks.BlockScarecrow; -import com.minecolonies.coremod.colony.buildings.modules.FarmerFieldModule; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingFarmer; -import com.minecolonies.coremod.colony.interactionhandling.PosBasedInteraction; +import com.minecolonies.coremod.colony.fields.FarmField; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.JobFarmer; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAICrafting; import com.minecolonies.coremod.network.messages.client.CompostParticleMessage; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; import com.minecolonies.coremod.util.AdvancementUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.NonNullList; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,11 +58,10 @@ import static com.minecolonies.api.util.constant.CitizenConstants.BLOCK_BREAK_SOUND_RANGE; import static com.minecolonies.api.util.constant.Constants.STACKSIZE; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; -import static com.minecolonies.api.util.constant.StatisticsConstants.*; +import static com.minecolonies.api.util.constant.StatisticsConstants.CROPS_HARVESTED; +import static com.minecolonies.api.util.constant.StatisticsConstants.LAND_TILLED; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; -import static com.minecolonies.api.util.constant.TranslationConstants.*; - -import net.minecraft.world.level.block.state.BlockState; +import static com.minecolonies.api.util.constant.TranslationConstants.NO_FREE_FIELDS; /** * Farmer AI class. Created: December 20, 2014 @@ -104,7 +101,7 @@ public class EntityAIWorkFarmer extends AbstractEntityAICrafting START_WORKING, 10), new AITarget(PREPARING, this::prepareForFarming, TICKS_SECOND), new AITarget(FARMER_HOE, this::workAtField, 5), new AITarget(FARMER_PLANT, this::workAtField, 5), @@ -143,61 +144,55 @@ public EntityAIWorkFarmer(@NotNull final JobFarmer job) } @Override - protected void updateRenderMetaData() + public Class getExpectedBuildingClass() { - worker.setRenderMetadata((getState() == FARMER_PLANT || getState() == FARMER_HARVEST) ? RENDER_META_WORKING : ""); + return BuildingFarmer.class; } + /** + * Called to check when the InventoryShouldBeDumped. + * + * @return true if the conditions are met + */ @Override - public Class getExpectedBuildingClass() + protected boolean wantInventoryDumped() { - return BuildingFarmer.class; + if (shouldDumpInventory || job.getActionsDone() >= getActionRewardForCraftingSuccess()) + { + shouldDumpInventory = false; + return true; + } + return super.wantInventoryDumped(); } @Override - protected int getActionsDoneUntilDumping() + protected int getActionRewardForCraftingSuccess() { return MAX_BLOCKS_MINED; } @Override - protected int getActionRewardForCraftingSuccess() + protected void updateRenderMetaData() { - return MAX_BLOCKS_MINED; + worker.setRenderMetadata((getState() == FARMER_PLANT || getState() == FARMER_HARVEST) ? RENDER_META_WORKING : ""); } @Override protected IAIState decide() { - final IAIState nextState = super.decide(); - if (nextState != START_WORKING && nextState != IDLE) - { - return nextState; - } - - if (wantInventoryDumped()) - { - // Wait to dump before continuing. - return getState(); - } - - if (job.getTaskQueue().isEmpty()) - { - return PREPARING; - } + IAIState state = super.decide(); - if (job.getCurrentTask() == null) + if (state == IDLE) { return PREPARING; } + return state; + } - - if (currentRequest != null && currentRecipeStorage != null) - { - return QUERY_ITEMS; - } - - return GET_RECIPE; + @Override + protected int getActionsDoneUntilDumping() + { + return MAX_BLOCKS_MINED; } /** @@ -208,26 +203,17 @@ protected IAIState decide() @NotNull private IAIState prepareForFarming() { + worker.getCitizenData().setIdleAtJob(true); + if (building == null || building.getBuildingLevel() < 1) { return PREPARING; } - if (!job.getTaskQueue().isEmpty() || getActionsDoneUntilDumping() <= job.getActionsDone()) - { - return START_WORKING; - } - worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); - - final FarmerFieldModule module = building.getFirstModuleOccurance(FarmerFieldModule.class); + final FieldsModule module = building.getFirstModuleOccurance(FieldsModule.class); + module.claimFields(); - module.syncWithColony(world); - if (module.getFarmerFields().size() < building.getBuildingLevel() && !module.assignManually()) - { - searchAndAddFields(); - } - - if (module.getFarmerFields().size() == building.getMaxBuildingLevel()) + if (module.getOwnedFields().size() == building.getMaxBuildingLevel()) { AdvancementUtils.TriggerAdvancementPlayersForColony(building.getColony(), AdvancementTriggers.MAX_FIELDS::trigger); } @@ -237,8 +223,7 @@ private IAIState prepareForFarming() if (amountOfCompostInBuilding + amountOfCompostInInv <= 0) { - if (building.requestFertilizer() && !building.hasWorkerOpenRequestsOfType(worker.getCitizenData().getId(), - TypeToken.of(StackList.class))) + if (building.requestFertilizer() && !building.hasWorkerOpenRequestsOfType(worker.getCitizenData().getId(), TypeToken.of(StackList.class))) { final List compostAbleItems = new ArrayList<>(); compostAbleItems.add(new ItemStack(ModItems.compost, 1)); @@ -258,40 +243,29 @@ else if (amountOfCompostInInv <= 0 && amountOfCompostInBuilding > 0) { worker.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(NO_FREE_FIELDS), ChatPriority.BLOCKING)); } - worker.getCitizenData().setIdleAtJob(true); - return PREPARING; - } - worker.getCitizenData().setIdleAtJob(false); - - //If the farmer has no currentField and there is no field which needs work, check fields. - if (module.getCurrentField() == null && module.getFieldToWorkOn(world) == null) - { - module.resetFields(); return IDLE; } - @Nullable final BlockPos currentField = module.getCurrentField(); - final BlockEntity entity = world.getBlockEntity(currentField); - if (entity instanceof ScarecrowTileEntity && ((ScarecrowTileEntity) entity).needsWork()) + module.resetCurrentField(); + final IField fieldToWork = module.getFieldToWorkOn(); + if (fieldToWork instanceof FarmField farmField) { - if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.PLANTED && checkIfShouldExecute((ScarecrowTileEntity) entity, pos -> this.findHarvestableSurface(pos) != null)) + worker.getCitizenData().setIdleAtJob(false); + worker.getCitizenData().setVisibleStatus(FARMING_ICON); + + if (farmField.getFieldStage() == FarmField.Stage.PLANTED && checkIfShouldExecute(farmField, pos -> this.findHarvestableSurface(pos) != null)) { return FARMER_HARVEST; } - else if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.HOED) + else if (farmField.getFieldStage() == FarmField.Stage.HOED) { - return canGoPlanting((ScarecrowTileEntity) entity, building); + return canGoPlanting(farmField); } - else if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.EMPTY && checkIfShouldExecute((ScarecrowTileEntity) entity, - pos -> this.findHoeableSurface(pos, (ScarecrowTileEntity) entity) != null)) + else if (farmField.getFieldStage() == FarmField.Stage.EMPTY && checkIfShouldExecute(farmField, pos -> this.findHoeableSurface(pos, farmField) != null)) { return FARMER_HOE; } - ((ScarecrowTileEntity) entity).nextState(); - } - else - { - module.setCurrentField(null); + farmField.nextState(); } return PREPARING; } @@ -311,46 +285,25 @@ private boolean isCompost(final ItemStack itemStack) return itemStack.getItem() == Items.BONE_MEAL; } - /** - * Searches and adds a field that has not been taken yet for the farmer and then adds it to the list. - */ - private void searchAndAddFields() - { - final IColony colony = worker.getCitizenColonyHandler().getColony(); - if (colony != null) - { - @Nullable final AbstractScarecrowTileEntity newField = colony.getBuildingManager().getFreeField(worker.getCitizenData().getId(), world); - - if (newField != null) - { - newField.setOwner(worker.getCitizenData().getId()); - newField.setTaken(true); - newField.setChanged(); - final FarmerFieldModule module = building.getFirstModuleOccurance(FarmerFieldModule.class); - module.addFarmerFields(newField.getPosition()); - } - } - } - /** * Handles the offset of the field for the farmer. Checks if the field needs a certain operation checked with a given predicate. * - * @param field the field object. + * @param farmField the field object. * @param predicate the predicate to test. * @return true if a harvestable crop was found. */ - private boolean checkIfShouldExecute(@NotNull final ScarecrowTileEntity field, @NotNull final Predicate predicate) + private boolean checkIfShouldExecute(@NotNull final FarmField farmField, @NotNull final Predicate predicate) { BlockPos position; do { - workingOffset = nextValidCell(field); + workingOffset = nextValidCell(farmField); if (workingOffset == null) { return false; } - position = field.getBlockPos().below().south(workingOffset.getZ()).east(workingOffset.getX()); + position = farmField.getPosition().below().south(workingOffset.getZ()).east(workingOffset.getX()); } while (!predicate.test(position)); @@ -360,28 +313,17 @@ private boolean checkIfShouldExecute(@NotNull final ScarecrowTileEntity field, @ /** * Checks if the farmer is ready to plant. * - * @param currentField the field to plant. - * @param buildingFarmer the farmer building. - * @return true if he is ready. + * @param farmField the field to plant. + * @return the next AI state. */ - private IAIState canGoPlanting(@NotNull final ScarecrowTileEntity currentField, @NotNull final BuildingFarmer buildingFarmer) + private IAIState canGoPlanting(@NotNull final FarmField farmField) { - if (currentField.getSeed() == null || currentField.getSeed().isEmpty()) + if (farmField.getSeed() == null) { - worker.getCitizenData() - .triggerInteraction(new PosBasedInteraction(Component.translatable(NO_SEED_SET, currentField.getBlockPos()), - ChatPriority.BLOCKING, - Component.translatable(NO_SEED_SET), - currentField.getBlockPos())); - - final FarmerFieldModule module = buildingFarmer.getFirstModuleOccurance(FarmerFieldModule.class); - module.setCurrentField(null); - worker.getCitizenData().setIdleAtJob(true); return PREPARING; } - worker.getCitizenData().setIdleAtJob(false); - final ItemStack seeds = currentField.getSeed().copy(); + final ItemStack seeds = farmField.getSeed(); final int slot = worker.getCitizenInventoryHandler().findFirstSlotInInventoryWith(seeds.getItem()); if (slot != -1) { @@ -395,25 +337,25 @@ private IAIState canGoPlanting(@NotNull final ScarecrowTileEntity currentField, seeds.setCount(seeds.getMaxStackSize()); checkIfRequestForItemExistOrCreateAsync(seeds, seeds.getMaxStackSize(), 1); - currentField.nextState(); + farmField.nextState(); return PREPARING; } /** * Checks if the ground should be hoed and the block above removed. * - * @param position the position to check. - * @param field the field close to this position. + * @param position the position to check. + * @param farmField the field close to this position. * @return position of hoeable surface or null if there is not one */ - private BlockPos findHoeableSurface(@NotNull BlockPos position, @NotNull final ScarecrowTileEntity field) + private BlockPos findHoeableSurface(@NotNull BlockPos position, @NotNull final FarmField farmField) { position = getSurfacePos(position); if (position == null - || field.isNoPartOfField(world, position) - || (world.getBlockState(position.above()).getBlock() instanceof CropBlock) - || (world.getBlockState(position.above()).getBlock() instanceof BlockScarecrow) - || !world.getBlockState(position).is(BlockTags.DIRT) + || farmField.isNoPartOfField(world, position) + || (world.getBlockState(position.above()).getBlock() instanceof CropBlock) + || (world.getBlockState(position.above()).getBlock() instanceof BlockScarecrow) + || !world.getBlockState(position).is(BlockTags.DIRT) ) { return null; @@ -433,21 +375,22 @@ private BlockPos getSurfacePos(final BlockPos position) } /** - * Finds the position of the surface near the specified position - * - * @param position the location to begin the search - * @param depth the depth of the search for the surface - * @return the position of the surface block or null if it can't be found - */ + * Finds the position of the surface near the specified position + * + * @param position the location to begin the search + * @param depth the depth of the search for the surface + * @return the position of the surface block or null if it can't be found + */ private BlockPos getSurfacePos(final BlockPos position, final Integer depth) { - if (Math.abs(depth) > MAX_DEPTH) + if (Math.abs(depth) > MAX_DEPTH || !WorldUtil.isBlockLoaded(world, position)) { return null; } final BlockState curBlockState = world.getBlockState(position); @Nullable final Block curBlock = curBlockState.getBlock(); - if ((curBlockState.getMaterial().isSolid() && !(curBlock instanceof PumpkinBlock) && !(curBlock instanceof MelonBlock) && !(curBlock instanceof WebBlock)) || curBlockState.getMaterial().isLiquid()) + if ((curBlockState.getMaterial().isSolid() && !(curBlock instanceof PumpkinBlock) && !(curBlock instanceof MelonBlock) && !(curBlock instanceof WebBlock)) + || curBlockState.getMaterial().isLiquid()) { if (depth < 0) { @@ -455,7 +398,7 @@ private BlockPos getSurfacePos(final BlockPos position, final Integer depth) } return getSurfacePos(position.above(), depth + 1); } - else + else { if (depth > 0) { @@ -463,20 +406,14 @@ private BlockPos getSurfacePos(final BlockPos position, final Integer depth) } return getSurfacePos(position.below(), depth - 1); } - } /** - * The current index within the current field - */ - private int cell = -1; - - /** - * Fetch the next available block within the field. Uses mathemajical quadratic equations to determine the coordinates by an index. Considers max radii set in the field gui. + * Fetch the next available block within the field. Uses mathematical quadratic equations to determine the coordinates by an index. Considers max radii set in the field gui. * * @return the new offset position */ - protected BlockPos nextValidCell(AbstractScarecrowTileEntity field) + protected BlockPos nextValidCell(FarmField farmField) { int ring, ringCell, x, z; Direction facing; @@ -488,12 +425,12 @@ protected BlockPos nextValidCell(AbstractScarecrowTileEntity field) do { - if (++cell == getLargestCell()) + if (++cell == getLargestCell(farmField)) { return null; } - ring = (int) Math.floor((Math.sqrt(cell + 1) + 1) / 2.0); - ringCell = cell - (int) (4 * Math.pow(ring - 1, 2) + 4 * (ring - 1)); + ring = (int) Math.floor((Math.sqrt(cell + 1D) + 1) / 2.0); + ringCell = cell - (int) (4 * Math.pow(ring - 1D, 2) + 4 * (ring - 1)); facing = Direction.from2DDataValue(Math.floorDiv(ringCell, 2 * ring)); @@ -509,34 +446,18 @@ protected BlockPos nextValidCell(AbstractScarecrowTileEntity field) } } while ( - -z > field.getRadius(Direction.NORTH) - || x > field.getRadius(Direction.EAST) - || z > field.getRadius(Direction.SOUTH) - || -x > field.getRadius(Direction.WEST) + -z > farmField.getRadius(Direction.NORTH) + || x > farmField.getRadius(Direction.EAST) + || z > farmField.getRadius(Direction.SOUTH) + || -x > farmField.getRadius(Direction.WEST) ); return new BlockPos(x, 0, z); } - protected int getLargestCell() - { - return (int) Math.pow(ScarecrowTileEntity.getMaxRange() * 2 + 1, 2); - } - - /** - * Called to check when the InventoryShouldBeDumped. - * - * @return true if the conditions are met - */ - @Override - protected boolean wantInventoryDumped() + protected int getLargestCell(FarmField farmField) { - if (shouldDumpInventory || (job != null && job.getActionsDone() >= getActionRewardForCraftingSuccess())) - { - shouldDumpInventory = false; - return true; - } - return super.wantInventoryDumped(); + return (int) Math.pow(farmField.getMaxRadius() * 2D + 1D, 2); } /** @@ -546,30 +467,20 @@ protected boolean wantInventoryDumped() */ private IAIState workAtField() { - @Nullable final BuildingFarmer buildingFarmer = building; - - final FarmerFieldModule module = buildingFarmer.getFirstModuleOccurance(FarmerFieldModule.class); + final FieldsModule module = building.getFirstModuleOccurance(FieldsModule.class); if (checkForToolOrWeapon(ToolType.HOE) || module.getCurrentField() == null) { return PREPARING; } worker.getCitizenData().setVisibleStatus(FARMING_ICON); - @Nullable final BlockPos field = module.getCurrentField(); - final BlockEntity entity = world.getBlockEntity(field); - if (entity instanceof ScarecrowTileEntity) + + final IField field = module.getCurrentField(); + if (field instanceof FarmField farmField) { - final ScarecrowTileEntity scarecrow = (ScarecrowTileEntity) entity; if (workingOffset != null) { - if (scarecrow.getOwnerId() != worker.getCivilianID()) - { - module.freeField(module.getCurrentField()); - module.setCurrentField(null); - return getState(); - } - - final BlockPos position = field.below().south(workingOffset.getZ()).east(workingOffset.getX()); + final BlockPos position = farmField.getPosition().below().south(workingOffset.getZ()).east(workingOffset.getX()); // Still moving to the block if (walkToBlock(position.above())) @@ -579,40 +490,41 @@ private IAIState workAtField() switch ((AIWorkerState) getState()) { - case FARMER_HOE: - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.hoeing")); - - if (!hoeIfAble(position, scarecrow)) + case FARMER_HOE -> + { + if (!hoeIfAble(position, farmField)) { return getState(); } - break; - case FARMER_PLANT: - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.planting")); - if (!tryToPlant(scarecrow, position)) + } + case FARMER_PLANT -> + { + if (!tryToPlant(farmField, position)) { return PREPARING; } - break; - case FARMER_HARVEST: - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.harvesting")); + } + case FARMER_HARVEST -> + { if (!harvestIfAble(position)) { return getState(); } - break; - default: + } + default -> + { return PREPARING; + } } prevPos = position; setDelay(getLevelDelay()); } - workingOffset = nextValidCell(scarecrow); + workingOffset = nextValidCell(farmField); if (workingOffset == null) { shouldDumpInventory = true; - scarecrow.nextState(); + farmField.nextState(); prevPos = null; return IDLE; } @@ -627,13 +539,13 @@ private IAIState workAtField() /** * Checks if we can hoe, and does so if we can. * - * @param position the position to check. - * @param field the field close to this position. + * @param position the position to check. + * @param farmField the field close to this position. * @return true if the farmer should move on. */ - private boolean hoeIfAble(BlockPos position, final ScarecrowTileEntity field) + private boolean hoeIfAble(BlockPos position, final FarmField farmField) { - position = findHoeableSurface(position, field); + position = findHoeableSurface(position, farmField); if (position != null && !checkForToolOrWeapon(ToolType.HOE)) { if (mineBlock(position.above())) @@ -652,12 +564,6 @@ private boolean hoeIfAble(BlockPos position, final ScarecrowTileEntity field) return true; } - @Override - public int getBreakSpeedLevel() - { - return getSecondarySkillLevel(); - } - /** * Checks if we can harvest, and does so if we can. * @@ -699,14 +605,14 @@ protected int getLevelDelay() /** * Try to plant the field at a certain position. * - * @param field the field to try to plant. - * @param position the position to try. + * @param farmField the field to try to plant. + * @param position the position to try. * @return the next state to go to. */ - private boolean tryToPlant(final ScarecrowTileEntity field, BlockPos position) + private boolean tryToPlant(final FarmField farmField, BlockPos position) { - position = findPlantableSurface(position, field); - return position == null || plantCrop(field.getSeed(), position); + position = findPlantableSurface(position, farmField); + return position == null || plantCrop(farmField.getSeed(), position); } /** @@ -720,19 +626,19 @@ private void equipHoe() /** * Checks if the ground should be planted. * - * @param position the position to check. - * @param field the field close to this position. + * @param position the position to check. + * @param farmField the field close to this position. * @return position of plantable surface or null */ - private BlockPos findPlantableSurface(@NotNull BlockPos position, @NotNull final ScarecrowTileEntity field) + private BlockPos findPlantableSurface(@NotNull BlockPos position, @NotNull final FarmField farmField) { position = getSurfacePos(position); if (position == null - || field.isNoPartOfField(world, position) - || (world.getBlockState(position.above()).getBlock() instanceof CropBlock) - || (world.getBlockState(position.above()).getBlock() instanceof StemBlock) - || (world.getBlockState(position).getBlock() instanceof BlockScarecrow) - || !(world.getBlockState(position).getBlock() instanceof FarmBlock) + || farmField.isNoPartOfField(world, position) + || (world.getBlockState(position.above()).getBlock() instanceof CropBlock) + || (world.getBlockState(position.above()).getBlock() instanceof StemBlock) + || (world.getBlockState(position).getBlock() instanceof BlockScarecrow) + || !(world.getBlockState(position).getBlock() instanceof FarmBlock) ) { return null; @@ -745,7 +651,7 @@ private BlockPos findPlantableSurface(@NotNull BlockPos position, @NotNull final * * @param item the crop. * @param position the location. - * @return true if succesful. + * @return true if successful. */ private boolean plantCrop(final ItemStack item, @NotNull final BlockPos position) { @@ -759,7 +665,7 @@ private boolean plantCrop(final ItemStack item, @NotNull final BlockPos position return false; } - if (item.getItem() instanceof BlockItem && (((BlockItem) item.getItem()).getBlock() instanceof CropBlock || ((BlockItem) item.getItem()).getBlock() instanceof StemBlock)) + if (item.getItem() instanceof BlockItem blockItem && (blockItem.getBlock() instanceof CropBlock || blockItem.getBlock() instanceof StemBlock)) { @NotNull final Item seed = item.getItem(); if ((seed == Items.MELON_SEEDS || seed == Items.PUMPKIN_SEEDS) && prevPos != null && !world.isEmptyBlock(prevPos.above())) @@ -863,6 +769,12 @@ protected List increaseBlockDrops(final List drops) return newDrops; } + @Override + public int getBreakSpeedLevel() + { + return getSecondarySkillLevel(); + } + /** * Harvest the crop (only if pams is installed). * @@ -893,9 +805,8 @@ private void harvestCrop(@NotNull final BlockPos pos) InventoryUtils.addItemStackToItemHandler(worker.getInventoryCitizen(), drop); } - if (state.getBlock() instanceof CropBlock) + if (state.getBlock() instanceof final CropBlock crops) { - final CropBlock crops = (CropBlock) state.getBlock(); world.setBlockAndUpdate(pos, crops.getStateForAge(0)); } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/fisherman/EntityAIWorkFisherman.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/fisherman/EntityAIWorkFisherman.java index 046a581912d..d8be17bb062 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/fisherman/EntityAIWorkFisherman.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/fisherman/EntityAIWorkFisherman.java @@ -27,7 +27,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ExperienceOrb; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.FishingRodItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.block.Blocks; @@ -252,9 +251,9 @@ private boolean hasFish() */ private boolean hasRodButNotEquipped() { - return InventoryUtils.hasItemInItemHandler(getInventory(), item -> item.getItem() instanceof FishingRodItem) + return InventoryUtils.hasItemHandlerToolWithLevel(getInventory(), ToolType.FISHINGROD, TOOL_LEVEL_WOOD_OR_GOLD, building.getMaxToolLevel()) && worker.getMainHandItem() != null - && !(worker.getMainHandItem().getItem() instanceof FishingRodItem); + && !ItemStackUtils.isTool(worker.getMainHandItem(), ToolType.FISHINGROD); } /** @@ -268,7 +267,6 @@ private IAIState getToWater() { return FISHERMAN_SEARCHING_WATER; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.goingtopond")); if (walkToWater()) { @@ -335,7 +333,6 @@ private IAIState tryDifferentAngles() */ private IAIState findWater() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.searchingwater")); //Reset executedRotations when fisherman searches a new Pond executedRotations = 0; @@ -423,7 +420,6 @@ private IAIState findNewWater() @Nullable private IAIState doFishing() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.fishing")); @Nullable final IAIState notReadyState = isReadyToFish(); if (notReadyState != null) diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/AbstractEntityAIGuard.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/AbstractEntityAIGuard.java index 303f4223821..231d170fa8e 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/AbstractEntityAIGuard.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/AbstractEntityAIGuard.java @@ -6,7 +6,6 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.IGuardBuilding; import com.minecolonies.api.colony.buildings.modules.ISettingsModule; -import com.minecolonies.api.colony.guardtype.registry.ModGuardTypes; import com.minecolonies.api.colony.jobs.ModJobs; import com.minecolonies.api.colony.permissions.Action; import com.minecolonies.api.colony.requestsystem.location.ILocation; @@ -41,6 +40,7 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -174,7 +174,8 @@ public AbstractEntityAIGuard(@NotNull final J job) new AITarget(GUARD_SLEEP, this::sleep, 1), new AITarget(GUARD_SLEEP, this::sleepParticles, PARTICLE_INTERVAL), new AITarget(GUARD_REGEN, this::regen, GUARD_REGEN_INTERVAL), - new AITarget(CombatAIStates.ATTACKING, this::shouldFlee, () -> GUARD_REGEN, GUARD_REGEN_INTERVAL), + new AITarget(GUARD_FLEE, this::flee, 20), + new AITarget(CombatAIStates.ATTACKING, this::shouldFlee, () -> GUARD_FLEE, GUARD_REGEN_INTERVAL), new AITarget(CombatAIStates.NO_TARGET, this::decide, GUARD_TASK_INTERVAL), new AITarget(GUARD_WAKE, this::wakeUpGuard, TICKS_SECOND), @@ -349,7 +350,7 @@ private void stopSleeping() */ private boolean shouldFlee() { - if (buildingGuards.shallRetrieveOnLowHealth() && worker.getHealth() < ((int) worker.getMaxHealth() * 0.2D)) + if (buildingGuards.shallRetrieveOnLowHealth() && worker.getHealth() < ((int) worker.getMaxHealth() * 0.2D) && worker.distanceToSqr(Vec3.atCenterOf(building.getID())) > 20) { return worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(RETREAT) > 0; } @@ -364,18 +365,9 @@ private boolean shouldFlee() */ private IAIState regen() { - if (!worker.hasEffect(MobEffects.MOVEMENT_SPEED)) - { - final double effect = worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(FLEEING_SPEED); - if (effect > 0) - { - worker.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 200, (int) (0 + effect))); - } - } - - if (walkToBuilding()) + if (((EntityCitizen)worker).getThreatTable().getTargetMob() != null && ((EntityCitizen)worker).getThreatTable().getTargetMob().distanceTo(worker) < 10) { - return GUARD_REGEN; + return CombatAIStates.ATTACKING; } if (worker.getHealth() < ((int) worker.getMaxHealth() * 0.75D) && buildingGuards.shallRetrieveOnLowHealth()) @@ -390,6 +382,30 @@ private IAIState regen() return START_WORKING; } + /** + * Flee to the building. + * + * @return next state to go to. + */ + private IAIState flee() + { + if (!worker.hasEffect(MobEffects.MOVEMENT_SPEED)) + { + final double effect = worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(FLEEING_SPEED); + if (effect > 0) + { + worker.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 200, (int) (0 + effect))); + } + } + + if (walkToBuilding()) + { + return GUARD_FLEE; + } + + return GUARD_REGEN; + } + /** * Guard at a specific position. * @@ -472,15 +488,11 @@ private IAIState rally(final ILocation location) @Override protected IAIState startWorkingAtOwnBuilding() { - final ILocation rallyLocation = buildingGuards.getRallyLocation(); - if ((rallyLocation != null && rallyLocation.isReachableFromLocation(worker.getLocation()) || !canBeInterrupted()) || ( - buildingGuards.getTask().equals(GuardTaskSetting.PATROL_MINE) && buildingGuards.getMinePos() != null)) + if (buildingGuards != null) { - return PREPARING; + buildingGuards.setTempNextPatrolPoint(buildingGuards.getPosition()); } - - // Walks to our building, only when not busy with another task - return super.startWorkingAtOwnBuilding(); + return DECIDE; } /** @@ -604,7 +616,7 @@ public boolean hasTool() */ public void startHelpCitizen(final LivingEntity attacker) { - if (canHelp()) + if (canHelp(attacker.blockPosition())) { ((IThreatTableEntity) worker).getThreatTable().addThreat(attacker, 20); registerTarget(new AIOneTimeEventTarget(CombatAIStates.ATTACKING)); @@ -615,11 +627,17 @@ public void startHelpCitizen(final LivingEntity attacker) * Check if we can help a citizen * * @return true if not fighting/helping already + * @param pos */ - public boolean canHelp() + public boolean canHelp(final BlockPos pos) { if ((getState() == CombatAIStates.NO_TARGET || getState() == GUARD_SLEEP) && canBeInterrupted()) { + if (buildingGuards.getTask().equals(GuardTaskSetting.GUARD) && !isWithinPersecutionDistance(pos,getPersecutionDistance())) + { + return false; + } + // Stop sleeping when someone called for help stopSleeping(); return true; @@ -642,6 +660,11 @@ protected IAIState decide() regularActionTimer = 0; } + if (worker.getRandom().nextDouble() < 0.05) + { + equipInventoryArmor(); + } + if (!hasTool()) { return PREPARING; @@ -675,19 +698,14 @@ protected IAIState decide() return rally(rallyLocation); } - switch (buildingGuards.getTask()) - { - case GuardTaskSetting.PATROL: - return patrol(); - case GuardTaskSetting.GUARD: - return guard(); - case GuardTaskSetting.FOLLOW: - return follow(); - case GuardTaskSetting.PATROL_MINE: - return patrolMine(); - default: - return PREPARING; - } + return switch (buildingGuards.getTask()) + { + case GuardTaskSetting.PATROL -> patrol(); + case GuardTaskSetting.GUARD -> guard(); + case GuardTaskSetting.FOLLOW -> follow(); + case GuardTaskSetting.PATROL_MINE -> patrolMine(); + default -> PREPARING; + }; } /** @@ -751,7 +769,7 @@ private int getPersecutionDistance() @Override public boolean canBeInterrupted() { - if (fighttimer > 0 || getState() == CombatAIStates.ATTACKING || buildingGuards.getRallyLocation() != null || buildingGuards.getTask() + if (fighttimer > 0 || getState() == CombatAIStates.ATTACKING || worker.getLastHurtMob() != null || buildingGuards.getRallyLocation() != null || buildingGuards.getTask() .equals(GuardTaskSetting.FOLLOW)) { return false; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/KnightCombatAI.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/KnightCombatAI.java index 1759208374a..de8013ee783 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/KnightCombatAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/KnightCombatAI.java @@ -341,7 +341,7 @@ protected void onTargetChange() @Override protected int getSearchRange() { - return 0; + return 16; } @Override diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/RangerCombatAI.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/RangerCombatAI.java index 9a410aae370..3aa9b9e4c82 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/RangerCombatAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/guard/RangerCombatAI.java @@ -240,16 +240,19 @@ private double calculateDamage(final AbstractArrow arrow) if (!ItemStackUtils.isEmpty(user.getInventoryCitizen().extractItem(slot, 1, true))) { damage += ARROW_EXTRA_DAMAGE; - ((CustomArrowEntity) arrow).setOnHitCallback(entityRayTraceResult -> + if (arrow instanceof CustomArrowEntity customArrowEntity) { - final int arrowSlot = InventoryUtils.findFirstSlotInItemHandlerWith(user.getInventoryCitizen(), item -> item.getItem() instanceof ArrowItem); - if (arrowSlot != -1) + customArrowEntity.setOnHitCallback(entityRayTraceResult -> { - user.getInventoryCitizen().extractItem(arrowSlot, 1, false); - } - - return true; - }); + final int arrowSlot = InventoryUtils.findFirstSlotInItemHandlerWith(user.getInventoryCitizen(), item -> item.getItem() instanceof ArrowItem); + if (arrowSlot != -1) + { + user.getInventoryCitizen().extractItem(arrowSlot, 1, false); + } + + return true; + }); + } } } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/healer/EntityAIWorkHealer.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/healer/EntityAIWorkHealer.java index 7f3ec18e56a..5460d81797f 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/healer/EntityAIWorkHealer.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/healer/EntityAIWorkHealer.java @@ -330,7 +330,6 @@ private IAIState cure() currentPatient = null; citizen.heal(10); worker.getCitizenExperienceHandler().addExperience(BASE_XP_GAIN); - citizen.markDirty(); return DECIDE; } @@ -486,7 +485,7 @@ private IAIState wander() 1), worker); citizen.heal(citizen.getMaxHealth() - citizen.getHealth() - 5 - building.getBuildingLevel()); - citizen.markDirty(); + citizen.markDirty(10); worker.getCitizenExperienceHandler().addExperience(1); remotePatient = null; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/AbstractEntityAIHerder.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/AbstractEntityAIHerder.java index 08cd5a1ed44..b15f66a8424 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/AbstractEntityAIHerder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/AbstractEntityAIHerder.java @@ -7,38 +7,37 @@ import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.WorldUtil; import com.minecolonies.api.util.constant.ToolType; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.AbstractBuilding; +import com.minecolonies.coremod.colony.buildings.modules.AnimalHerdingModule; import com.minecolonies.coremod.colony.jobs.AbstractJob; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; +import java.util.function.Predicate; +import java.util.stream.Stream; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; -import static net.minecraft.world.entity.animal.Sheep.ITEM_BY_DYE; /** * Abstract class for all Citizen Herder AIs */ -public abstract class AbstractEntityAIHerder, B extends AbstractBuilding, T extends Animal> extends AbstractEntityAIInteract +public abstract class AbstractEntityAIHerder, B extends AbstractBuilding> extends AbstractEntityAIInteract { /** * How many animals per hut level the worker should max have. @@ -50,6 +49,11 @@ public abstract class AbstractEntityAIHerder, B exte */ private static final int NUM_OF_ANIMALS_TO_BREED = 2; + /** + * Request this many sets of breeding items at once, to reduce courier workload. + */ + private static final int EXTRA_BREEDING_ITEMS_REQUEST = 8; + /** * Butchering attack damage. */ @@ -80,13 +84,28 @@ public abstract class AbstractEntityAIHerder, B exte /** * New born age. */ - private static final double MAX_ENTITY_AGE = -24000.0; + private static final double MAX_ENTITY_AGE = AgeableMob.BABY_START_AGE; /** * Xp per action, like breed feed butcher */ protected static final double XP_PER_ACTION = 0.5; + /** + * The current herding module we're working on + */ + @Nullable protected AnimalHerdingModule current_module; + + /** + * Selected breeding partners + */ + private final List animalsToBreed = new ArrayList<>(); + + /** + * Prevents retrying breeding too quickly if last attempt failed + */ + private int breedTimeOut = 0; + /** * Creates the abstract part of the AI. Always use this constructor! * @@ -122,7 +141,10 @@ protected List itemsNiceToHave() if (building.getSetting(AbstractBuilding.BREEDING).getValue() || building.getSetting(AbstractBuilding.FEEDING).getValue()) { - list.add(getRequestBreedingItems()); + for (final AnimalHerdingModule module : building.getModules(AnimalHerdingModule.class)) + { + list.addAll(getRequestBreedingItems(module)); + } } return list; } @@ -160,48 +182,55 @@ public IAIState decideWhatToDo() { worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); - final List animals = new ArrayList<>(searchForAnimals()); - - if (animals.isEmpty()) + for (final AnimalHerdingModule module : building.getModules(AnimalHerdingModule.class)) { - return DECIDE; - } + final List animals = searchForAnimals(module::isCompatible); + if (animals.isEmpty()) + { + continue; + } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_DECIDING)); + current_module = module; - int numOfBreedableAnimals = 0; - int numOfFeedableAnimals = 0; - for (final Animal entity : animals) - { - if (isBreedAble(entity)) + int numOfBreedableAnimals = 0; + int numOfFeedableAnimals = 0; + for (final Animal entity : animals) + { + if (isBreedAble(entity)) + { + numOfBreedableAnimals++; + } + else if (isFeedAble(entity)) + { + numOfFeedableAnimals++; + } + } + + final boolean hasBreedingItem = + InventoryUtils.getItemCountInItemHandler((worker.getInventoryCitizen()), + (ItemStack stack) -> ItemStackUtils.compareItemStackListIgnoreStackSize(module.getBreedingItems(), stack)) > 1; + + if (!searchForItemsInArea().isEmpty()) { - numOfBreedableAnimals++; + return HERDER_PICKUP; } - else if (MAX_ENTITY_AGE / entity.getAge() <= 1 + getSecondarySkillLevel()/100.0) + else if (maxAnimals(animals)) { - numOfFeedableAnimals++; + return HERDER_BUTCHER; + } + else if (canBreedChildren() && numOfBreedableAnimals >= NUM_OF_ANIMALS_TO_BREED && hasBreedingItem && breedTimeOut == 0) + { + return HERDER_BREED; + } + else if (canFeedChildren() && numOfFeedableAnimals > 0 && hasBreedingItem) + { + return HERDER_FEED; } } - final boolean hasBreedingItem = - InventoryUtils.getItemCountInItemHandler((worker.getInventoryCitizen()), - (ItemStack stack) -> ItemStackUtils.compareItemStacksIgnoreStackSize(stack, getBreedingItem())) > 1; - - if (!searchForItemsInArea().isEmpty()) + if (breedTimeOut > 0) { - return HERDER_PICKUP; - } - else if (maxAnimals(animals)) - { - return HERDER_BUTCHER; - } - else if (canBreedChildren() && numOfBreedableAnimals >= NUM_OF_ANIMALS_TO_BREED && hasBreedingItem) - { - return HERDER_BREED; - } - else if (canFeedChildren() && numOfFeedableAnimals > 0 && hasBreedingItem) - { - return HERDER_FEED; + --breedTimeOut; } return START_WORKING; } @@ -214,7 +243,18 @@ else if (canFeedChildren() && numOfFeedableAnimals > 0 && hasBreedingItem) */ protected boolean isBreedAble(final Animal entity) { - return entity.getAge() == 0 && entity.canFallInLove(); + return entity.getAge() == 0 && (entity.isInLove() || entity.canFallInLove()); + } + + /** + * Checks if we can feed this entity + * + * @param entity to check + * @return true if feed able + */ + protected boolean isFeedAble(final Animal entity) + { + return entity.isBaby() && MAX_ENTITY_AGE / entity.getAge() <= 1 + getSecondarySkillLevel()/100.0; } /** @@ -243,7 +283,6 @@ protected boolean canFeedChildren() */ private IAIState startWorkingAtOwnBuilding() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_WORKER_GOINGTOHUT)); if (walkToBuilding()) { return getState(); @@ -258,6 +297,11 @@ private IAIState startWorkingAtOwnBuilding() */ private IAIState prepareForHerding() { + if (current_module == null) + { + return DECIDE; + } + for (final ToolType tool : getExtraToolsNeeded()) { if (checkForToolOrWeapon(tool)) @@ -269,8 +313,10 @@ private IAIState prepareForHerding() if (building.getSetting(AbstractBuilding.BREEDING).getValue() || building.getSetting(AbstractBuilding.FEEDING).getValue()) { - final ItemStack breedingItem = getBreedingItem(); - checkIfRequestForItemExistOrCreateAsync(breedingItem, breedingItem.getMaxStackSize(), breedingItem.getCount()); + for (final ItemStack breedingItem : current_module.getBreedingItems()) + { + checkIfRequestForItemExistOrCreateAsync(breedingItem, breedingItem.getCount() * EXTRA_BREEDING_ITEMS_REQUEST, breedingItem.getCount()); + } } for (final ItemStack item : getExtraItemsNeeded()) @@ -288,7 +334,12 @@ private IAIState prepareForHerding() */ protected IAIState butcherAnimals() { - final List animals = new ArrayList<>(searchForAnimals()); + if (current_module == null) + { + return DECIDE; + } + + final List animals = searchForAnimals(current_module::isCompatible); if (!maxAnimals(animals)) { @@ -329,42 +380,74 @@ protected IAIState butcherAnimals() */ protected IAIState breedAnimals() { - final List animals = searchForAnimals(); + if (current_module == null) + { + worker.getCitizenItemHandler().removeHeldItem(); + return DECIDE; + } - final Animal animalOne = animals - .stream() - .filter(this::isBreedAble) - .findAny() - .orElse(null); + if (breedTwoAnimals()) + { + return getState(); + } + + final Predicate predicate = ((Predicate) current_module::isCompatible).and(this::isBreedAble); + final List breedables = new ArrayList<>(searchForAnimals(predicate)); + Collections.shuffle(breedables); + + final Animal animalOne = breedables.stream().findAny().orElse(null); if (animalOne == null) { + worker.getCitizenItemHandler().removeHeldItem(); + breedTimeOut = 15; return DECIDE; } - final Animal animalTwo = animals.stream().filter(animal -> + final int oldAnimalOneLove = animalOne.getInLoveTime(); + animalOne.setInLoveTime(5); + + final Animal animalTwo = breedables.stream().filter(animal -> { - final float range = animal.distanceTo(animalOne); - final boolean isAnimalOne = animalOne.equals(animal); - return isBreedAble(animal) && range <= DISTANCE_TO_BREED && !isAnimalOne; + if (animalOne.equals(animal) || animal.distanceTo(animalOne) > DISTANCE_TO_BREED) + { + return false; + } + + final int oldLove = animal.getInLoveTime(); + animal.setInLoveTime(5); + final boolean canMate = animalOne.canMate(animal); + animal.setInLoveTime(oldLove); + + return canMate; } ).findAny().orElse(null); + animalOne.setInLoveTime(oldAnimalOneLove); + if (animalTwo == null) { + worker.getCitizenItemHandler().removeHeldItem(); + breedTimeOut = 5; return DECIDE; } - if (!equipItem(InteractionHand.MAIN_HAND, getBreedingItem())) + if (!equipItem(InteractionHand.MAIN_HAND, current_module.getBreedingItems())) { + worker.getCitizenItemHandler().removeHeldItem(); return START_WORKING; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_BREEDING)); + animalsToBreed.add(animalOne); + animalsToBreed.add(animalTwo); - breedTwoAnimals(animalOne, animalTwo); - worker.decreaseSaturationForContinuousAction(); - return DECIDE; + if (breedTwoAnimals()) + { + return getState(); + } + + worker.getCitizenItemHandler().removeHeldItem(); + return IDLE; } /** @@ -374,34 +457,33 @@ protected IAIState breedAnimals() */ protected IAIState feedAnimals() { - final List animals = searchForAnimals(); + if (current_module == null) + { + return DECIDE; + } - final Animal animalOne = animals - .stream() - .filter(entity -> entity.isBaby() && MAX_ENTITY_AGE / entity.getAge() <= 1 + getSecondarySkillLevel()/100.0) - .findAny() - .orElse(null); + final Predicate predicate = ((Predicate) current_module::isCompatible).and(this::isFeedAble); + final Animal animalOne = searchForAnimals(predicate).stream().findAny().orElse(null); if (animalOne == null) { return DECIDE; } - if (!equipItem(InteractionHand.MAIN_HAND, getBreedingItem())) + if (!equipItem(InteractionHand.MAIN_HAND, current_module.getBreedingItems())) { return START_WORKING; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_FEEDING)); - if (!walkingToAnimal(animalOne)) { // Values taken from vanilla. animalOne.ageUp((int)((float)(-animalOne.getAge() / 20) * 0.1F), true); worker.swing(InteractionHand.MAIN_HAND); - InventoryUtils.reduceStackInItemHandler(worker.getInventoryCitizen(), getBreedingItem()); + worker.getMainHandItem().shrink(1); worker.getCitizenExperienceHandler().addExperience(XP_PER_ACTION); animalOne.playSound(SoundEvents.GENERIC_EAT, 1.0F, 1.0F); + worker.getCitizenItemHandler().removeHeldItem(); return DECIDE; } @@ -432,11 +514,12 @@ private IAIState pickupItems() /** * Find animals in area. * - * @return the {@link List} of animals in the area. + * @param predicate true if the animal is interesting. + * @return a {@link Stream} of animals in the area. */ - public List searchForAnimals() + public List searchForAnimals(final Predicate predicate) { - return WorldUtil.getEntitiesWithinBuilding(world, getAnimalClass(), building, null); + return WorldUtil.getEntitiesWithinBuilding(world, Animal.class, building, predicate); } public int getMaxAnimalMultiplier() @@ -454,13 +537,6 @@ public List searchForItemsInArea() return WorldUtil.getEntitiesWithinBuilding(world, ItemEntity.class, building, null); } - /** - * Get the Animal's class from the none Abstract. - * - * @return the class of the animal to work with. - */ - public abstract Class getAnimalClass(); - /** * Lets the herder walk to the animal. * @@ -471,7 +547,6 @@ public boolean walkingToAnimal(final Animal animal) { if (animal != null) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_GOINGTOANIMAL)); return walkToBlock(new BlockPos(animal.position())); } else @@ -482,26 +557,32 @@ public boolean walkingToAnimal(final Animal animal) /** * Breed two animals together! - * - * @param animalOne the first {@link Animal} to breed. - * @param animalTwo the second {@link Animal} to breed. + * @return true if still working on it */ - private void breedTwoAnimals(final Animal animalOne, final Animal animalTwo) + private boolean breedTwoAnimals() { - final List animalsToBreed = new ArrayList<>(); - animalsToBreed.add(animalOne); - animalsToBreed.add(animalTwo); - - for (final Animal animal : animalsToBreed) + for (final Iterator it = animalsToBreed.iterator(); it.hasNext(); ) { - if (!animal.isInLove() && !walkingToAnimal(animal)) + final Animal animal = it.next(); + if (animal.isInLove() || animal.isDeadOrDying()) + { + it.remove(); + } + else if (walkingToAnimal(animal)) + { + break; + } + else { animal.setInLove(null); worker.swing(InteractionHand.MAIN_HAND); - InventoryUtils.reduceStackInItemHandler(worker.getInventoryCitizen(), getBreedingItem()); + worker.getMainHandItem().shrink(1); worker.getCitizenExperienceHandler().addExperience(XP_PER_ACTION); + worker.decreaseSaturationForAction(); + it.remove(); } } + return !animalsToBreed.isEmpty(); } /** @@ -510,10 +591,10 @@ private void breedTwoAnimals(final Animal animalOne, final Animal animalTwo) * @param allAnimals the list of animals. * @return if amount of animals is over max. */ - public boolean maxAnimals(final List allAnimals) + public boolean maxAnimals(final List allAnimals) { - final List animals = allAnimals.stream() - .filter(animalToButcher -> !animalToButcher.isBaby()).collect(Collectors.toList()); + final List animals = allAnimals.stream() + .filter(animalToButcher -> !animalToButcher.isBaby()).toList(); if (animals.isEmpty()) { return false; @@ -563,17 +644,21 @@ private int getToolSlot(final ToolType toolType) /** * Sets the {@link ItemStack} as held item or returns false. * - * @param itemStack the {@link ItemStack} to equip. - * @param hand the hand to equip it in. + * @param itemStacks the list of {@link ItemStack}s to equip one of. + * @param hand the hand to equip it in. * @return true if the item was equipped. */ - public boolean equipItem(final InteractionHand hand, final ItemStack itemStack) + public boolean equipItem(final InteractionHand hand, final List itemStacks) { - if (checkIfRequestForItemExistOrCreateAsync(itemStack)) + for (final ItemStack itemStack : itemStacks) { - worker.getCitizenItemHandler().setHeldItem(hand, getItemSlot(itemStack.getItem())); - return true; + if (checkIfRequestForItemExistOrCreateAsync(itemStack)) + { + worker.getCitizenItemHandler().setHeldItem(hand, getItemSlot(itemStack.getItem())); + return true; + } } + return false; } @@ -595,12 +680,10 @@ public int getItemSlot(final Item item) */ protected void butcherAnimal(@Nullable final Animal animal) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_BUTCHERING)); if (animal != null && !walkingToAnimal(animal) && !ItemStackUtils.isEmpty(worker.getMainHandItem())) { worker.swing(InteractionHand.MAIN_HAND); - final FakePlayer fp = FakePlayerFactory.getMinecraft((ServerLevel) worker.getCommandSenderWorld()); - final DamageSource ds = DamageSource.playerAttack(fp); + final DamageSource ds = DamageSource.playerAttack(getFakePlayer()); animal.hurt(ds, (float) getButcheringAttackDamage()); worker.getCitizenItemHandler().damageItemInHand(InteractionHand.MAIN_HAND, 1); } @@ -618,19 +701,22 @@ public double getButcheringAttackDamage() /** * Gets an ItemStack of breedingItem for requesting, requests multiple items to decrease work for delivery man * - * @return the BreedingItem stack. + * @param module the herding module. + * @return the BreedingItem stacks. */ - public ItemStack getRequestBreedingItems() + public List getRequestBreedingItems(final AnimalHerdingModule module) { - final ItemStack breedingItem = getBreedingItem().copy(); - ItemStackUtils.setSize(breedingItem, breedingItem.getCount() * 8); // means that we can breed 8 animals before requesting again. - return breedingItem; - } + final List breedingItems = new ArrayList<>(); - /** - * Get breeding item for animal. - * - * @return the {@link Item} needed for breeding the animal. - */ - public abstract ItemStack getBreedingItem(); + // TODO: currently this will request some of all items, when really we should be happy with enough of *any* of + // these items ... but right now it doesn't matter anyway since these are currently all single item lists. + for (final ItemStack stack : module.getBreedingItems()) + { + final ItemStack requestable = stack.copy(); + ItemStackUtils.setSize(requestable, stack.getCount() * EXTRA_BREEDING_ITEMS_REQUEST); + breedingItems.add(requestable); + } + + return breedingItems; + } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkChickenHerder.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkChickenHerder.java index 4d62acbd6be..fe247743485 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkChickenHerder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkChickenHerder.java @@ -4,17 +4,12 @@ import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingChickenHerder; import com.minecolonies.coremod.colony.jobs.JobChickenHerder; import com.minecolonies.coremod.util.NamedDamageSource; -import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.animal.Chicken; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.InteractionHand; import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.animal.Animal; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,13 +18,8 @@ /** * The AI behind the {@link JobChickenHerder} for Breeding and Killing Chickens. */ -public class EntityAIWorkChickenHerder extends AbstractEntityAIHerder +public class EntityAIWorkChickenHerder extends AbstractEntityAIHerder { - /** - * Max amount of animals per Hut Level. - */ - private static final int MAX_ANIMALS_PER_LEVEL = 2; - /** * Get chicken icon */ @@ -52,26 +42,6 @@ public Class getExpectedBuildingClass() return BuildingChickenHerder.class; } - @Override - public ItemStack getBreedingItem() - { - final ItemStack stack = new ItemStack(Items.WHEAT_SEEDS); - stack.setCount(2); - return stack; - } - - @Override - public int getMaxAnimalMultiplier() - { - return MAX_ANIMALS_PER_LEVEL; - } - - @Override - public Class getAnimalClass() - { - return Chicken.class; - } - @Override protected IAIState breedAnimals() { @@ -89,7 +59,6 @@ protected IAIState butcherAnimals() @Override protected void butcherAnimal(@Nullable final Animal animal) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_BUTCHERING)); if (animal != null && !walkingToAnimal(animal) && !ItemStackUtils.isEmpty(worker.getMainHandItem())) { worker.swing(InteractionHand.MAIN_HAND); diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkCowboy.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkCowboy.java index 5c2e1d87c19..d218e1fd2a3 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkCowboy.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkCowboy.java @@ -6,17 +6,21 @@ import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.constant.Constants; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingCowboy; import com.minecolonies.coremod.colony.jobs.JobCowboy; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.MushroomCow; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.InteractionHand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; @@ -24,17 +28,13 @@ /** * The AI behind the {@link JobCowboy} for Breeding, Killing and Milking Cows. */ -public class EntityAIWorkCowboy extends AbstractEntityAIHerder +public class EntityAIWorkCowboy extends AbstractEntityAIHerder { - /** - * Max amount of animals per Hut Level. - */ - private static final int MAX_ANIMALS_PER_LEVEL = 2; - /** * Bucket metadata. */ public static final String RENDER_META_BUCKET = "bucket"; + public static final String RENDER_META_BOWL = "bowl"; /** * Herd cow icon @@ -42,6 +42,14 @@ public class EntityAIWorkCowboy extends AbstractEntityAIHerder getExpectedBuildingClass() return BuildingCowboy.class; } - @Override - public ItemStack getBreedingItem() - { - final ItemStack stack = new ItemStack(Items.WHEAT); - stack.setCount(2); - return stack; - } - - @Override - public int getMaxAnimalMultiplier() - { - return MAX_ANIMALS_PER_LEVEL; - } - - @Override - public Class getAnimalClass() - { - return Cow.class; - } - @Override public IAIState decideWhatToDo() { final IAIState result = super.decideWhatToDo(); - final boolean hasBucket = InventoryUtils.hasItemInItemHandler(worker.getInventoryCitizen(), Items.BUCKET); - if (building != null && building.getSetting(BuildingCowboy.MILKING).getValue() && result.equals(START_WORKING) && hasBucket) + + if (milkCoolDown > 0) + { + --milkCoolDown; + } + else if (building != null && building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).canTryToMilk() && result.equals(START_WORKING)) { return COWBOY_MILK; } + + if (stewCoolDown > 0) + { + --stewCoolDown; + } + else if (building != null && building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).canTryToStew() && result.equals(START_WORKING)) + { + return COWBOY_STEW; + } + return result; } @@ -109,10 +116,16 @@ public IAIState decideWhatToDo() public List getExtraItemsNeeded() { final List list = super.getExtraItemsNeeded(); - if (building.getSetting(BuildingCowboy.MILKING).getValue()) + if (building != null && building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).canTryToMilk() && + !searchForAnimals(a -> a instanceof Cow && !(a instanceof MushroomCow)).isEmpty()) { list.add(new ItemStack(Items.BUCKET)); } + if (building != null && building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).canTryToStew() && + !searchForAnimals(a -> a instanceof MushroomCow).isEmpty()) + { + list.add(new ItemStack(Items.BOWL)); + } return list; } @@ -123,39 +136,100 @@ public List getExtraItemsNeeded() */ private IAIState milkCows() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_COWBOY_MILKING)); worker.getCitizenData().setVisibleStatus(HERD_COW); - if (!worker.getCitizenInventoryHandler().hasItemInInventory(getBreedingItem().getItem()) && InventoryUtils.hasBuildingEnoughElseCount(building, new ItemStorage(new ItemStack(Items.BUCKET, 1)), 2) > 1) + if (!worker.getCitizenInventoryHandler().hasItemInInventory(Items.BUCKET)) { - if (!walkToBuilding()) + if (InventoryUtils.hasBuildingEnoughElseCount(building, new ItemStorage(new ItemStack(Items.BUCKET, 1)), 1) > 0 + && !walkToBuilding()) { checkAndTransferFromHut(new ItemStack(Items.BUCKET, 1)); } else { + milkCoolDown = MILK_COOL_DOWN; return DECIDE; } } - final Cow cow = searchForAnimals().stream().findFirst().orElse(null); + final Cow cow = searchForAnimals(a -> a instanceof Cow && !(a instanceof MushroomCow) && !a.isBaby()).stream() + .map(a -> (Cow) a).findFirst().orElse(null); if (cow == null) { + milkCoolDown = MILK_COOL_DOWN; return DECIDE; } - if (!walkingToAnimal(cow) && equipItem(InteractionHand.MAIN_HAND, new ItemStack(Items.BUCKET, 1))) + if (equipItem(InteractionHand.MAIN_HAND, Collections.singletonList(new ItemStack(Items.BUCKET))) && !walkingToAnimal(cow)) { if (InventoryUtils.addItemStackToItemHandler(worker.getInventoryCitizen(), new ItemStack(Items.MILK_BUCKET))) { + building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).onMilked(); worker.getCitizenItemHandler().removeHeldItem(); - equipItem(InteractionHand.MAIN_HAND, new ItemStack(Items.MILK_BUCKET)); + equipItem(InteractionHand.MAIN_HAND, Collections.singletonList(new ItemStack(Items.MILK_BUCKET))); InventoryUtils.tryRemoveStackFromItemHandler(worker.getInventoryCitizen(), new ItemStack(Items.BUCKET, 1)); } incrementActionsDoneAndDecSaturation(); worker.getCitizenExperienceHandler().addExperience(1.0); + return INVENTORY_FULL; + } + + return DECIDE; + } + + /** + * Makes the Cowboy "Milk" the mooshrooms + * + * @return The next {@link IAIState} + */ + private IAIState milkMooshrooms() + { + worker.getCitizenData().setVisibleStatus(HERD_COW); + + if (!worker.getCitizenInventoryHandler().hasItemInInventory(Items.BOWL)) + { + if (InventoryUtils.hasBuildingEnoughElseCount(building, new ItemStorage(new ItemStack(Items.BOWL, 1)), 1) > 0 + && !walkToBuilding()) + { + checkAndTransferFromHut(new ItemStack(Items.BOWL, 1)); + } + else + { + stewCoolDown = MILK_COOL_DOWN; + return DECIDE; + } + } + + final MushroomCow mooshroom = searchForAnimals(a -> a instanceof MushroomCow && !a.isBaby()).stream() + .map(a -> (MushroomCow) a).findFirst().orElse(null); + + if (mooshroom == null) + { + stewCoolDown = MILK_COOL_DOWN; + return DECIDE; + } + + if (equipItem(InteractionHand.MAIN_HAND, Collections.singletonList(new ItemStack(Items.BOWL))) && !walkingToAnimal(mooshroom)) + { + final FakePlayer fakePlayer = FakePlayerFactory.getMinecraft((ServerLevel) worker.getLevel()); + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.BOWL)); + if (mooshroom.mobInteract(fakePlayer, InteractionHand.MAIN_HAND).equals(InteractionResult.CONSUME)) + { + if (InventoryUtils.addItemStackToItemHandler(worker.getInventoryCitizen(), fakePlayer.getMainHandItem())) + { + building.getFirstModuleOccurance(BuildingCowboy.HerdingModule.class).onStewed(); + worker.getCitizenItemHandler().removeHeldItem(); + equipItem(InteractionHand.MAIN_HAND, Collections.singletonList(fakePlayer.getMainHandItem())); + InventoryUtils.tryRemoveStackFromItemHandler(worker.getInventoryCitizen(), new ItemStack(Items.BOWL)); + } + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + + incrementActionsDoneAndDecSaturation(); + worker.getCitizenExperienceHandler().addExperience(1.0); + return INVENTORY_FULL; } return DECIDE; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkRabbitHerder.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkRabbitHerder.java index 18ccc4c843c..4c5c65bb3b1 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkRabbitHerder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkRabbitHerder.java @@ -1,19 +1,12 @@ package com.minecolonies.coremod.entity.ai.citizen.herders; import com.minecolonies.api.util.ItemStackUtils; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingRabbitHutch; import com.minecolonies.coremod.colony.jobs.JobRabbitHerder; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.animal.Rabbit; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,18 +16,13 @@ /** * The AI behind the {@link JobRabbitHerder} for Breeding and Killing Rabbits. */ -public class EntityAIWorkRabbitHerder extends AbstractEntityAIHerder +public class EntityAIWorkRabbitHerder extends AbstractEntityAIHerder { /** * Carrot render meta data. */ public static final String RENDER_META_CARROT = "carrot"; - /** - * Max amount of animals per Hut Level. - */ - private static final int MAX_ANIMALS_PER_LEVEL = 2; - /** * Creates the abstract part of the AI. Always use this constructor! * @@ -62,38 +50,16 @@ public Class getExpectedBuildingClass() return BuildingRabbitHutch.class; } - @Override - public ItemStack getBreedingItem() - { - final ItemStack stack = new ItemStack(Items.CARROT); - stack.setCount(2); - return stack; - } - - @Override - public int getMaxAnimalMultiplier() - { - return MAX_ANIMALS_PER_LEVEL; - } - - @Override - public Class getAnimalClass() - { - return Rabbit.class; - } - @Override protected void butcherAnimal(@Nullable final Animal animal) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_HERDER_BUTCHERING)); if (animal != null && !walkingToAnimal(animal) && !ItemStackUtils.isEmpty(worker.getMainHandItem())) { worker.swing(InteractionHand.MAIN_HAND); if (worker.getRandom().nextInt(1 + (ONE_HUNDRED_PERCENT - getPrimarySkillLevel()) / 5) <= 1) { - final FakePlayer fp = FakePlayerFactory.getMinecraft((ServerLevel) worker.getCommandSenderWorld()); - final DamageSource ds = DamageSource.playerAttack(fp); + final DamageSource ds = DamageSource.playerAttack(getFakePlayer()); animal.hurt(ds, (float) getButcheringAttackDamage()); worker.getCitizenItemHandler().damageItemInHand(InteractionHand.MAIN_HAND, 1); } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkShepherd.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkShepherd.java index b83db5e6885..210c7541979 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkShepherd.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkShepherd.java @@ -3,23 +3,19 @@ import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.util.InventoryUtils; -import com.minecolonies.api.util.SoundUtils; import com.minecolonies.api.util.constant.ToolType; -import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingShepherd; import com.minecolonies.coremod.colony.jobs.JobShepherd; import com.minecolonies.coremod.network.messages.client.LocalizedParticleEffectMessage; -import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.animal.Sheep; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -31,13 +27,8 @@ /** * The AI behind the {@link JobShepherd} for Breeding, Killing and Shearing sheep. */ -public class EntityAIWorkShepherd extends AbstractEntityAIHerder +public class EntityAIWorkShepherd extends AbstractEntityAIHerder { - /** - * Max amount of animals per Hut Level. - */ - private static final int MAX_ANIMALS_PER_LEVEL = 2; - /** * Constants used for sheep dying calculations. */ @@ -74,27 +65,12 @@ public Class getExpectedBuildingClass() return BuildingShepherd.class; } - @Override - public ItemStack getBreedingItem() - { - final ItemStack stack = new ItemStack(Items.WHEAT); - stack.setCount(2); - return stack; - } - - @Override - public int getMaxAnimalMultiplier() - { - return MAX_ANIMALS_PER_LEVEL; - } - @Override public IAIState decideWhatToDo() { final IAIState result = super.decideWhatToDo(); - final List animals = new ArrayList<>(searchForAnimals()); - final Sheep shearingSheep = animals.stream().filter(sheepie -> !sheepie.isSheared() && !sheepie.isBaby()).findFirst().orElse(null); + final Sheep shearingSheep = findShearableSheep(); if (building.getSetting(BuildingShepherd.SHEARING).getValue() && result.equals(START_WORKING) && shearingSheep != null) { @@ -112,10 +88,14 @@ public double getButcheringAttackDamage() return Math.max(1.0, getSecondarySkillLevel() / 10.0); } - @Override - public Class getAnimalClass() + /** + * @return a shearable {@link Sheep} or null. + */ + @Nullable + private Sheep findShearableSheep() { - return Sheep.class; + return searchForAnimals(a -> a instanceof Sheep sheepie && !sheepie.isSheared() && !sheepie.isBaby()) + .stream().map(a -> (Sheep) a).findAny().orElse(null); } /** @@ -125,11 +105,10 @@ public Class getAnimalClass() */ private IAIState shearSheep() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(TranslationConstants.COM_MINECOLONIES_COREMOD_STATUS_SHEPHERD_SHEARING)); - final List sheeps = searchForAnimals(); + final Sheep sheep = findShearableSheep(); - if (sheeps.isEmpty()) + if (sheep == null) { return DECIDE; } @@ -139,9 +118,7 @@ private IAIState shearSheep() return PREPARING; } - final Sheep sheep = sheeps.stream().filter(sheepie -> !sheepie.isSheared() && !sheepie.isBaby()).findFirst().orElse(null); - - if (worker.getMainHandItem() != null && sheep != null) + if (worker.getMainHandItem() != null) { if (walkingToAnimal(sheep)) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkSwineHerder.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkSwineHerder.java index 7212617d852..4b10272fcf4 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkSwineHerder.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/herders/EntityAIWorkSwineHerder.java @@ -2,8 +2,6 @@ import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingSwineHerder; import com.minecolonies.coremod.colony.jobs.JobSwineHerder; -import net.minecraft.world.entity.animal.Pig; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; @@ -13,13 +11,8 @@ /** * The AI behind the {@link JobSwineHerder} for Breeding and Killing Pigs. */ -public class EntityAIWorkSwineHerder extends AbstractEntityAIHerder +public class EntityAIWorkSwineHerder extends AbstractEntityAIHerder { - /** - * Max amount of animals per Hut Level. - */ - private static final int MAX_ANIMALS_PER_LEVEL = 2; - /** * Creates the abstract part of the AI. Always use this constructor! * @@ -47,29 +40,9 @@ public Class getExpectedBuildingClass() return BuildingSwineHerder.class; } - @Override - public ItemStack getBreedingItem() - { - final ItemStack stack = new ItemStack(Items.CARROT); - stack.setCount(2); - return stack; - } - - @Override - public int getMaxAnimalMultiplier() - { - return MAX_ANIMALS_PER_LEVEL; - } - @Override public double getButcheringAttackDamage() { return Math.max(1.0, getPrimarySkillLevel() / 10.0); } - - @Override - public Class getAnimalClass() - { - return Pig.class; - } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/EntityAIWorkLumberjack.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/EntityAIWorkLumberjack.java index 14b39839370..095ea54ec8c 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/EntityAIWorkLumberjack.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/EntityAIWorkLumberjack.java @@ -22,10 +22,10 @@ import com.minecolonies.coremod.util.WorkerUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; @@ -190,7 +190,8 @@ public EntityAIWorkLumberjack(@NotNull final JobLumberjack job) new AITarget(LUMBERJACK_SEARCHING_TREE, this::findTrees, TICKS_SECOND), new AITarget(LUMBERJACK_CHOP_TREE, this::chopWood, TICKS_SECOND), new AITarget(LUMBERJACK_GATHERING, this::gathering, TICKS_SECOND), - new AITarget(LUMBERJACK_NO_TREES_FOUND, this::waitBeforeCheckingAgain, TICKS_SECOND) + new AITarget(LUMBERJACK_NO_TREES_FOUND, this::waitBeforeCheckingAgain, TICKS_SECOND), + new AITarget(LUMBERJACK_GATHERING_2, this::gathering2, TICKS_SECOND) ); worker.setCanPickUpLoot(true); } @@ -297,10 +298,50 @@ private IAIState waitBeforeCheckingAgain() return getState(); } + // Check again for saplings + resetGatheringItems(); + return LUMBERJACK_GATHERING_2; + } + + /** + * After we ran out of trees, and waited a bit, double-check if there are any saplings to gather + * anywhere within our restriction zone. + */ + private IAIState gathering2() + { + if (building.shouldRestrict()) + { + if (getItemsForPickUp() == null) + { + // search for interesting items in our restriction zone, if we ran out of trees + searchForItems(new AABB(building.getStartRestriction(), building.getEndRestriction()) + .inflate(RANGE_HORIZONTAL_PICKUP, RANGE_VERTICAL_PICKUP, RANGE_HORIZONTAL_PICKUP)); + } + + if (getItemsForPickUp() != null && !getItemsForPickUp().isEmpty()) + { + gatherItems(); + return getState(); + } + } + // Reset everything, maybe there are new crafting requests + resetGatheringItems(); return START_WORKING; } + @Override + protected boolean isItemWorthPickingUp(final ItemStack stack) + { + if (getState() == LUMBERJACK_GATHERING_2) + { + // we're only interested in saplings at this point + return stack.is(ItemTags.SAPLINGS) || stack.is(fungi); + } + + return super.isItemWorthPickingUp(stack); + } + /** * Checks if lumberjack has already found some trees. If not search trees. * @@ -310,7 +351,6 @@ private IAIState findTrees() { if (job.getTree() == null) { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.searchingtree")); return findTree(); } @@ -427,10 +467,15 @@ private IAIState chopWood() */ private IAIState chopTree() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.chopping")); - final boolean shouldBreakLeaves = building.shouldDefoliate() || job.getTree().isNetherTree(); + if (building.shouldRestrict() && !BlockPosUtil.isInArea(building.getStartRestriction(), building.getEndRestriction(), job.getTree().getLocation())) + { + job.setTree(null); + pathResult = null; + return START_WORKING; + } + if (job.getTree().hasLogs() || (shouldBreakLeaves && job.getTree().hasLeaves()) || checkedInHut) { if (!walkToTree(job.getTree().getStumpLocations().isEmpty() ? job.getTree().getLocation() : job.getTree().getStumpLocations().get(0))) @@ -457,6 +502,7 @@ private IAIState chopTree() else { job.setTree(null); + pathResult = null; checkedInHut = false; } @@ -578,10 +624,10 @@ public boolean walkToTree(final BlockPos workAt) { pathToTree = ((MinecoloniesAdvancedPathNavigate) worker.getNavigation()).setPathJob(new PathJobMoveToWithPassable(world, AbstractPathJob.prepareStart(worker), - workAt, + workFrom, SEARCH_RANGE, worker, - this::isPassable), workAt, 1.0d, true); + this::isPassable), workFrom, 1.0d, true); } return false; @@ -714,6 +760,7 @@ private void plantSapling() if (plantSapling(job.getTree().getLocation())) { job.setTree(null); + pathResult = null; checkedInHut = false; } } @@ -745,8 +792,6 @@ private boolean plantSapling(@NotNull final BlockPos location) return true; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.planting")); - final int saplingSlot = findSaplingSlot(); if (saplingSlot != -1) @@ -909,7 +954,6 @@ private boolean isCorrectSapling(final ItemStack stack) */ private IAIState gathering() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.gathering")); if (getItemsForPickUp() == null) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/Tree.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/Tree.java index 20cf2e12994..e90e1a0c829 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/Tree.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/lumberjack/Tree.java @@ -6,6 +6,7 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.compatibility.Compatibility; import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.BlockStateUtils; import com.minecolonies.api.util.ItemStackUtils; @@ -144,7 +145,7 @@ private Tree() public Tree(@NotNull final Level world, @NotNull final BlockPos log, @Nullable final IColony colony) { final BlockState block = BlockPosUtil.getBlockState(world, log); - if (block.is(BlockTags.LOGS) || Compatibility.isSlimeBlock(block.getBlock()) || Compatibility.isDynamicBlock(block.getBlock())) + if (block.is(ModTags.tree) || Compatibility.isSlimeBlock(block.getBlock()) || Compatibility.isDynamicBlock(block.getBlock())) { isTree = true; woodBlocks = new LinkedList<>(); @@ -297,6 +298,12 @@ public static List getSaplingsForLeaf(ServerLevel world, BlockPos pos NonNullList list = NonNullList.create(); BlockState state = world.getBlockState(position); + if (state.is(Blocks.MANGROVE_LEAVES)) + { + list.add(new ItemStack(Items.MANGROVE_PROPAGULE)); + return list; + } + for (int i = 1; i < 100; i++) { list.addAll(state.getDrops(new LootContext.Builder(world) @@ -351,7 +358,7 @@ public static boolean checkTree(@NotNull final LevelReader world, final BlockPos //Is the first block a log? final BlockState state = world.getBlockState(pos); final Block block = state.getBlock(); - if (!state.is(BlockTags.LOGS) && !Compatibility.isSlimeBlock(block) && !Compatibility.isDynamicBlock(block)) + if (!state.is(ModTags.tree) && !Compatibility.isSlimeBlock(block) && !Compatibility.isDynamicBlock(block)) { return false; } @@ -420,7 +427,7 @@ private static Tuple getBottomAndTopLog( { final BlockPos temp = log.offset(x, y, z); final BlockState block = world.getBlockState(temp); - if ((block.is(BlockTags.LOGS) || Compatibility.isSlimeBlock(block.getBlock()) || Compatibility.isDynamicBlock(block.getBlock())) && !woodenBlocks.contains(temp)) + if ((block.is(ModTags.tree) || Compatibility.isSlimeBlock(block.getBlock()) || Compatibility.isDynamicBlock(block.getBlock())) && !woodenBlocks.contains(temp)) { return getBottomAndTopLog(world, temp, woodenBlocks, bottom, top); } @@ -444,17 +451,18 @@ private static boolean hasEnoughLeavesAndIsSupposedToCut(@NotNull final LevelRea boolean checkedLeaves = false; int leafCount = 0; int dynamicBonusY = 0; + final BlockState blockState = world.getBlockState(pos); // Additional leaf search range for dynamic trees, as we start from the baselog - if (Compatibility.isDynamicBlock(world.getBlockState(pos).getBlock())) + if (blockState.is(ModTags.mangroveTree) || Compatibility.isDynamicBlock(blockState.getBlock())) { - dynamicBonusY = 10; + dynamicBonusY = 8; } for (int dx = -1; dx <= 1; dx++) { for (int dz = -1; dz <= 1; dz++) { - for (int dy = -3; dy <= 1 + dynamicBonusY; dy++) + for (int dy = -3; dy <= 3 + dynamicBonusY; dy++) { final BlockPos leafPos = pos.offset(dx, dy, dz); if (world.getBlockState(leafPos).getMaterial().equals(Material.LEAVES) || world.getBlockState(leafPos).is(BlockTags.WART_BLOCKS)) @@ -640,6 +648,22 @@ public void fillTreeStumps(final int yLevel) stumpLocations.add(pos); } } + + // todo: for the sake of generic-ness this could check for adjacency rather than just special-casing, + // though that's harder if someone decides to make a tree bigger than 2x2. + if (stumpLocations.size() > 1 && sapling.is(Items.MANGROVE_PROPAGULE)) + { + BlockPos.MutableBlockPos acc = BlockPos.ZERO.mutable(); + for (final BlockPos stump : stumpLocations) + { + acc = acc.move(stump); + } + + final BlockPos mean = new BlockPos(acc.getX() / stumpLocations.size(), + acc.getY() / stumpLocations.size(), acc.getZ() / stumpLocations.size()); + stumpLocations.clear(); + stumpLocations.add(mean); + } } /** @@ -662,7 +686,7 @@ private void addAndSearch(@NotNull final Level world, @NotNull final BlockPos lo } // Check if the new log fits the Tree's base log type - if (!world.getBlockState(log).getBlock().equals(world.getBlockState(location).getBlock())) + if (!isBlockPartOfSameTree(world.getBlockState(log), world.getBlockState(location))) { return; } @@ -705,7 +729,7 @@ private void addAndSearch(@NotNull final Level world, @NotNull final BlockPos lo { final BlockPos temp = log.offset(x, y, z); final BlockState block = BlockPosUtil.getBlockState(world, temp); - if ((block.is(BlockTags.LOGS) || Compatibility.isSlimeBlock(block.getBlock()))) + if ((block.is(ModTags.tree) || Compatibility.isSlimeBlock(block.getBlock()))) { addAndSearch(world, temp, colony); } @@ -714,6 +738,23 @@ private void addAndSearch(@NotNull final Level world, @NotNull final BlockPos lo } } + /** + * Check if this is a log in the same tree type. + * @param existingBlock the current block in the tree. + * @param newBlock block to check. + * @return true if this is the same type of tree; false if it's something different. + */ + private boolean isBlockPartOfSameTree(@NotNull final BlockState existingBlock, + @NotNull final BlockState newBlock) + { + if (existingBlock.is(ModTags.mangroveTree)) + { + return newBlock.is(ModTags.mangroveTree); + } + + return existingBlock.getBlock().equals(newBlock.getBlock()); + } + /** * Adds a leaf and searches for further leaves. * diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIQuarrier.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIQuarrier.java index 4bea9fef37a..4d2b36e8a8c 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIQuarrier.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIQuarrier.java @@ -5,16 +5,17 @@ import com.ldtteam.structurize.placement.StructurePhasePlacementResult; import com.ldtteam.structurize.placement.StructurePlacer; import com.ldtteam.structurize.storage.ServerFutureProcessor; -import com.ldtteam.structurize.storage.StructurePacks; import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.interactionhandling.ChatPriority; +import com.minecolonies.api.colony.workorders.IWorkOrder; import com.minecolonies.api.entity.ai.citizen.builder.IBuilderUndestroyable; import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.entity.pathfinding.SurfaceType; +import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; import com.minecolonies.api.util.*; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.colony.buildings.AbstractBuildingStructureBuilder; @@ -42,6 +43,7 @@ import net.minecraftforge.common.ToolActions; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.concurrent.Future; import static com.ldtteam.structurize.placement.AbstractBlueprintIterator.NULL_POS; @@ -51,7 +53,8 @@ import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; import static com.minecolonies.api.util.constant.StatisticsConstants.BLOCKS_MINED; import static com.minecolonies.api.util.constant.StatisticsConstants.ORES_MINED; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.QUARRY_MINER_FINISHED_QUARRY; +import static com.minecolonies.api.util.constant.TranslationConstants.QUARRY_MINER_NO_QUARRY; import static com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingMiner.FILL_BLOCK; import static com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIStructure.ItemCheckResult.RECALC; import static com.minecolonies.coremod.entity.ai.citizen.miner.EntityAIStructureMiner.RENDER_META_PICKAXE; @@ -138,7 +141,9 @@ public IAIState loadRequirements() return IDLE; } - final WorkOrderMiner wo = new WorkOrderMiner(quarry.getStructurePack(), "infrastructure/mineshafts/" + quarry.getSchematicName() + "shaft1.blueprint", quarry.getSchematicName() + "shaft1", quarry.getRotation(), quarry.getPosition().below(2), false, building.getPosition()); + final Tuple shaft = getShaftPath(quarry); + final WorkOrderMiner wo = new WorkOrderMiner(quarry.getStructurePack(), shaft.getA(), shaft.getB(), quarry.getRotation(), quarry.getPosition().below(2), false, building.getPosition()); + wo.setClaimedBy(building.getPosition()); building.getColony().getWorkManager().addWorkOrder(wo, false); job.setWorkOrder(wo); } @@ -146,23 +151,71 @@ public IAIState loadRequirements() return super.loadRequirements(); } + /** + * Get the path of the quarry shaft blueprint. + * + * The shaft path is either based on an explicit shaft= tag on the building, or based on the actual schematic used. + * The directory can be explicitly specified, or it will default to the same as the building. + * + * @param quarry the quarry building. + * @return tuple of (structureName, workOrderName) for work order, aka (path, desc). + */ + private Tuple getShaftPath(@NotNull final IBuilding quarry) + { + String path = "infrastructure/mineshafts/" + quarry.getSchematicName() + "shaft1.blueprint"; + + final AbstractTileEntityColonyBuilding tileEntity = quarry.getTileEntity(); + if (tileEntity != null) + { + path = quarry.getBlueprintPath().replace('\\', '/') + .replace("1.blueprint", "shaft1.blueprint"); + if (!path.endsWith("shaft1.blueprint")) + { + path = path.replace(".blueprint", "shaft.blueprint"); + } + + for (final String tag : tileEntity.getPositionedTags().getOrDefault(BlockPos.ZERO, Collections.emptyList())) + { + if (tag.startsWith("shaft=")) + { + if (tag.contains("/")) + { + path = tag.substring(6); + } + else + { + path = path.substring(0, path.lastIndexOf('/') + 1) + tag.substring(6); + } + } + break; + } + + if (!path.endsWith(".blueprint")) + { + path += ".blueprint"; + } + } + + final String name = path.substring(path.lastIndexOf('/') + 1).replace(".blueprint", ""); + return new Tuple<>(path, name); + } + @Override public void loadStructure( - @NotNull final String packName, - final String blueprintPath, - final int rotateTimes, - final BlockPos position, - final boolean isMirrored, - final boolean removal) + @NotNull final IWorkOrder workOrder, + final int rotateTimes, + final BlockPos position, + final boolean isMirrored, + final boolean removal) { - final Future blueprintFuture = StructurePacks.getBlueprintFuture(packName, blueprintPath); + final Future blueprintFuture = workOrder.getBlueprintFuture(); this.loadingBlueprint = true; ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(blueprintFuture, world, (blueprint -> { if (blueprint == null) { handleSpecificCancelActions(); - Log.getLogger().warn("Couldn't find structure with name: " + blueprintPath + " in: " + packName + ". Aborting loading procedure"); + Log.getLogger().warn("Couldn't find structure with name: " + workOrder.getStructurePath() + " in: " + workOrder.getStructurePack() + ". Aborting loading procedure"); this.loadingBlueprint = false; return; } @@ -178,7 +231,7 @@ public void loadStructure( if (!structure.hasBluePrint()) { handleSpecificCancelActions(); - Log.getLogger().warn("Couldn't find structure with name: " + blueprintPath + " aborting loading procedure"); + Log.getLogger().warn("Couldn't find structure with name: " + workOrder.getStructurePath() + " aborting loading procedure"); this.loadingBlueprint = false; return; } @@ -215,8 +268,6 @@ protected IAIState structureStep() return INVENTORY_FULL; } - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.building")); - checkForExtraBuildingActions(); // some things to do first! then we go to the actual phase! @@ -311,6 +362,7 @@ else if (progress.getY() != -1 && result.getIteratorPos().getY() > progress.getY { building.nextStage(); building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); return COMPLETE_BUILD; } else if (progress.getY() != -1 && (result.getIteratorPos().getY() < progress.getY() || result.getBlockResult().getWorldPos().getY() < worldPos.getY())) @@ -346,10 +398,12 @@ else if (progress.getY() != -1 && (result.getIteratorPos().getY() < progress.get if (currentWorldPos.getY() < worker.getLevel().getMinBuildHeight() + 5) { building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); return COMPLETE_BUILD; } blockToMine = currentWorldPos; + worker.getCitizenData().setStatusPosition(blockToMine); return MINE_BLOCK; } @@ -492,21 +546,32 @@ else if (requestProgress.getY() != -1 && (result.getIteratorPos().getY() < reque @Override protected boolean checkIfCanceled() { + boolean isCanceled = false; if (job.findQuarry() == null) { worker.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(QUARRY_MINER_NO_QUARRY), ChatPriority.BLOCKING)); - return true; + isCanceled = true; } else if (job.findQuarry().getFirstModuleOccurance(QuarryModule.class).isFinished()) { worker.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(QUARRY_MINER_FINISHED_QUARRY), ChatPriority.BLOCKING)); - return true; + isCanceled = true; } else if(job.getWorkOrder() != null && !job.getWorkOrder().getLocation().equals(job.findQuarry().getPosition().below(2))) { + isCanceled = true; + } + + if (isCanceled) + { + if (job.hasWorkOrder()) + { + job.getColony().getWorkManager().removeWorkOrder(job.getWorkOrderId()); + job.setWorkOrder(null); + } blockToMine = null; - job.complete(); building.setProgressPos(null, null); + worker.getCitizenData().setStatusPosition(null); return true; } return super.checkIfCanceled(); @@ -680,6 +745,11 @@ public boolean walkToConstructionSite(final BlockPos currentBlock) return false; } + if (BlockPosUtil.getDistance(worker.blockPosition(), currentBlock) <= 5 + 5 * pathBackupFactor) + { + return true; + } + if (walkToBlock(workFrom)) { return false; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIStructureMiner.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIStructureMiner.java index a8193e58e19..aead7833009 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIStructureMiner.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/EntityAIStructureMiner.java @@ -419,7 +419,6 @@ public ItemStack getTotalAmount(final ItemStack stack) private IAIState doShaftMining() { - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.mining")); minerWorkingLocation = getNextBlockInShaftToMine(); if (minerWorkingLocation == null) @@ -871,11 +870,19 @@ public void executeSpecificCompleteActions() else { final MinerLevel currentLevel = module.getCurrentLevel(); + if (currentLevel == null) + { + Log.getLogger().error("The mine state of the mine at: " + building.getID().toShortString() + " got corrupted. Trying to recover from this somehow...."); - currentLevel.closeNextNode(structurePlacer.getB().getSettings().rotation.ordinal(), module.getActiveNode(), world); - module.setActiveNode(null); - module.setOldNode(workingNode); - WorkerUtil.updateLevelSign(world, currentLevel, module.getLevelId(currentLevel)); + // This can only happen if something with the state got broken. Safest option is not handling the node closing and just doing the normal complete actions, it will potentially recover. + } + else + { + currentLevel.closeNextNode(structurePlacer.getB().getSettings().rotation.ordinal(), module.getActiveNode(), world); + module.setActiveNode(null); + module.setOldNode(workingNode); + WorkerUtil.updateLevelSign(world, currentLevel, module.getLevelId(currentLevel)); + } } } super.executeSpecificCompleteActions(); @@ -947,7 +954,8 @@ protected void triggerMinedBlock(@NotNull final BlockState blockToMine) if (IColonyManager.getInstance().getCompatibilityManager().isLuckyBlock(blockToMine.getBlock())) { - InventoryUtils.transferItemStackIntoNextBestSlotInItemHandler(IColonyManager.getInstance().getCompatibilityManager().getRandomLuckyOre(chance), + final int level = building.getBuildingLevel(); + InventoryUtils.transferItemStackIntoNextBestSlotInItemHandler(IColonyManager.getInstance().getCompatibilityManager().getRandomLuckyOre(chance, level), worker.getInventoryCitizen()); } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/MinerLevel.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/MinerLevel.java index 11d90daac43..ab305182bbd 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/MinerLevel.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/MinerLevel.java @@ -147,7 +147,7 @@ public MinerLevel(@NotNull final CompoundTag compound) { this.depth = compound.getInt(TAG_DEPTH); - if (compound.getAllKeys().contains(TAG_LEVEL_SIGN)) + if (compound.contains(TAG_LEVEL_SIGN)) { this.levelSign = BlockPosUtil.read(compound, TAG_LEVEL_SIGN); } @@ -163,7 +163,7 @@ public MinerLevel(@NotNull final CompoundTag compound) this.nodes.put(new Vec2i(node.getX(), node.getZ()), node); } - final boolean hasDoubles = compound.getAllKeys().contains(TAG_LADDERX); + final boolean hasDoubles = compound.contains(TAG_LADDERX); final int ladderX; final int ladderZ; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/Node.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/Node.java index 577d450dc33..b152a2cabd4 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/Node.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/miner/Node.java @@ -98,7 +98,7 @@ public Node(final int x, final int z, @Nullable final Vec2i parent) public static Node createFromNBT(@NotNull final CompoundTag compound) { // for backwards compatibility check if the types are doubles - final boolean hasDoubles = compound.getAllKeys().contains(TAG_X); + final boolean hasDoubles = compound.contains(TAG_X); final int x; final int z; @@ -126,7 +126,7 @@ public static Node createFromNBT(@NotNull final CompoundTag compound) final NodeStatus status = NodeStatus.valueOf(compound.getString(TAG_STATUS)); Vec2i parent = null; - if (compound.getAllKeys().contains(TAG_PARENTX)) + if (compound.contains(TAG_PARENTX)) { if (hasDoubles) { @@ -149,7 +149,7 @@ public static Node createFromNBT(@NotNull final CompoundTag compound) node.setStyle(style); node.setStatus(status); - if(compound.getAllKeys().contains(TAG_ROT)) + if(compound.contains(TAG_ROT)) { node.setRot(compound.getInt(TAG_ROT)); } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/netherworker/EntityAIWorkNether.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/netherworker/EntityAIWorkNether.java index 35666c1cab7..3d973bbb9f0 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/netherworker/EntityAIWorkNether.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/netherworker/EntityAIWorkNether.java @@ -27,6 +27,7 @@ import com.minecolonies.coremod.colony.jobs.JobNetherWorker; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAICrafting; import com.minecolonies.coremod.items.ItemAdventureToken; +import com.minecolonies.coremod.util.TeleportHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -183,8 +184,7 @@ private void goToVault() BlockPos vaultPos = building.getVaultLocation(); if (vaultPos != null) { - worker.moveTo(vaultPos.getX() + 0.5, vaultPos.getY(), vaultPos.getZ() + 0.5, worker.getRotationYaw(), worker.getRotationPitch()); - worker.getNavigation().stop(); + TeleportHelper.teleportCitizen(worker, world, vaultPos); } } @@ -194,8 +194,7 @@ private void returnFromVault(final boolean force) BlockPos portalPos = building.getPortalLocation(); if (portalPos != null && vaultPos != null && EntityUtils.isLivingAtSite(worker, vaultPos.getX(), vaultPos.getY(), vaultPos.getZ(), 2)) { - worker.moveTo(portalPos.getX() + 0.5, portalPos.getY(), portalPos.getZ() + 0.5, worker.getRotationYaw(), worker.getRotationPitch()); - worker.getNavigation().stop(); + TeleportHelper.teleportCitizen(worker, world, portalPos); worker.setSilent(false); worker.playSound(SoundEvents.PORTAL_TRIGGER, worker.getRandom().nextFloat() * 0.5F + 0.25F, 0.25F); @@ -800,19 +799,26 @@ private void setEquipSlot(EquipmentSlot equipSlot, boolean equip) { for (final GuardGear item : itemList) { - if (ItemStackUtils.isEmpty(worker.getItemBySlot(item.getType())) && item.getType().equals(equipSlot) + if (item.getType().equals(equipSlot) && building.getBuildingLevel() >= item.getMinBuildingLevelRequired() && building.getBuildingLevel() <= item.getMaxBuildingLevelRequired()) { - final ItemStack toBeEquipped = findItem(item::test); - worker.setItemSlot(item.getType(), toBeEquipped); - virtualEquipmentSlots.put(item.getType(), toBeEquipped); + if (!item.test(worker.getInventoryCitizen().getArmorInSlot(item.getType()))) + { + final int toBeEquipped = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(worker.getItemHandlerCitizen(), item); + if (toBeEquipped > -1) + { + final ItemStack stack = worker.getInventoryCitizen().getStackInSlot(toBeEquipped); + worker.getInventoryCitizen().transferArmorToSlot(item.getType(), toBeEquipped); + virtualEquipmentSlots.put(item.getType(), stack); + } + } } } } } else { - worker.setItemSlot(equipSlot, ItemStack.EMPTY); + worker.getInventoryCitizen().moveArmorToInventory(equipSlot); virtualEquipmentSlots.put(equipSlot, ItemStack.EMPTY); } } @@ -836,10 +842,12 @@ private void logAllEquipment(@NotNull final ExpeditionLog expeditionLog, final b final List equipment = new ArrayList<>(); equipment.add(findTool(ToolType.SWORD)); - equipment.add(worker.getItemBySlot(EquipmentSlot.HEAD)); - equipment.add(worker.getItemBySlot(EquipmentSlot.CHEST)); - equipment.add(worker.getItemBySlot(EquipmentSlot.LEGS)); - equipment.add(worker.getItemBySlot(EquipmentSlot.FEET)); + + equipment.add(worker.getInventoryCitizen().getArmorInSlot(EquipmentSlot.HEAD)); + equipment.add(worker.getInventoryCitizen().getArmorInSlot(EquipmentSlot.CHEST)); + equipment.add(worker.getInventoryCitizen().getArmorInSlot(EquipmentSlot.LEGS)); + equipment.add(worker.getInventoryCitizen().getArmorInSlot(EquipmentSlot.FEET)); + equipment.add(findTool(ToolType.PICKAXE)); equipment.add(findTool(ToolType.AXE)); equipment.add(findTool(ToolType.SHOVEL)); @@ -873,16 +881,14 @@ protected void attemptToEat() if (slot > -1) { final ItemStack stack = worker.getInventoryCitizen().getStackInSlot(slot); - final FoodProperties itemFood = stack.getItem().getFoodProperties(); + final FoodProperties itemFood = stack.getItem().getFoodProperties(stack, worker); final double satIncrease = itemFood.getNutrition() * (1.0 + worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(SATURATION)); citizenData.increaseSaturation(satIncrease / 2.0); - citizenData.getInventory().extractItem(slot, 1, false); - - final ItemStack containerItem = stack.getCraftingRemainingItem(); - if (containerItem != null && !(containerItem.getItem() instanceof AirItem)) + final ItemStack containerItem = stack.finishUsingItem(world, worker); + if (!containerItem.isEmpty() && containerItem.getItem() != stack.getItem()) { if (citizenData.getInventory().isFull()) { @@ -1023,10 +1029,6 @@ else if (citizenData.getSaturation() < LOW_SATURATION) } citizen.heal((float) healAmount); - if (healAmount > 0.1D) - { - citizenData.markDirty(); - } } return (float) healAmount; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/planter/EntityAIWorkPlanter.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/planter/EntityAIWorkPlanter.java index ff5218bcd91..f9b968025d0 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/planter/EntityAIWorkPlanter.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/planter/EntityAIWorkPlanter.java @@ -1,32 +1,41 @@ package com.minecolonies.coremod.entity.ai.citizen.planter; import com.ldtteam.structurize.util.BlockUtils; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.colony.interactionhandling.ChatPriority; +import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IConcreteDeliverable; +import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; import com.minecolonies.api.colony.requestsystem.requestable.Stack; +import com.minecolonies.api.colony.requestsystem.requestable.StackList; import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; -import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import com.minecolonies.api.util.InventoryUtils; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.Tuple; import com.minecolonies.api.util.constant.CitizenConstants; +import com.minecolonies.api.util.constant.TypeConstants; +import com.minecolonies.api.util.constant.translation.RequestSystemTranslationConstants; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingPlantation; +import com.minecolonies.coremod.colony.fields.PlantationField; +import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.JobPlanter; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAICrafting; -import net.minecraft.world.level.block.AirBlock; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; import static com.minecolonies.api.util.constant.CitizenConstants.TICKS_20; -import static com.minecolonies.api.util.constant.Constants.DEFAULT_SPEED; +import static com.minecolonies.api.util.constant.TranslationConstants.NO_FREE_FIELDS; /** * Planter AI class. @@ -34,24 +43,26 @@ public class EntityAIWorkPlanter extends AbstractEntityAICrafting { /** - * Return to chest after this amount of stacks. + * The amount of bonemeal the worker should have at any time. */ - private static final int MAX_BLOCKS_MINED = 64; + protected static final int BONEMEAL_TO_KEEP = 16; /** - * The quantity to request. + * Xp per harvesting block */ - private static final Integer PLANT_TO_REQUEST = 16; + private static final double XP_PER_HARVEST = 1; /** - * Xp per harvesting block + * The amount of actions performed on the current field. */ - private static final double XP_PER_HARVEST = 1; + private int currentFieldActionCount = 0; /** - * The current farm pos to take care of. + * The active result object. */ - private BuildingPlantation.PlantationSoilPosition plantableSoilPos; + private IPlantationModule.PlantationModuleResult activeModuleResult = null; + + private IConcreteDeliverable currentDeliverable; /** * Constructor for the planter. @@ -62,325 +73,389 @@ public EntityAIWorkPlanter(@NotNull final JobPlanter job) { super(job); super.registerTargets( - new AITarget(PLANTATION_MOVE_TO_SOIL, this::moveToSoil, TICKS_20), - new AITarget(PLANTATION_CHECK_SOIL, this::checkSoil, TICKS_20), - new AITarget(PLANTATION_CLEAR_OBSTACLE, this::clearObstacle, TICKS_20), - new AITarget(PLANTATION_FARM, this::farm, TICKS_20), - new AITarget(PLANTATION_PLANT, this::plant, TICKS_20)); + new AITarget(PREPARING, this::prepare, STANDARD_DELAY), + new AITarget(PLANTATION_PICK_FIELD, this::pickField, TICKS_20), + new AITarget(PLANTATION_MOVE_TO_FIELD, this::moveToField, TICKS_20), + new AITarget(PLANTATION_DECIDE_FIELD_WORK, this::decideFieldWork, TICKS_20), + new AITarget(PLANTATION_WORK_FIELD, this::workField, TICKS_20), + new AITarget(PLANTATION_RETURN_TO_BUILDING, this::returnToBuilding, TICKS_20)); worker.setCanPickUpLoot(true); } - @Override - protected void updateRenderMetaData() + private IAIState prepare() { - worker.setRenderMetadata(getState() == CRAFT - || getState() == PLANTATION_FARM - || getState() == PLANTATION_PLANT - || getState() == PLANTATION_CHECK_SOIL - || getState() == PLANTATION_MOVE_TO_SOIL - || getState() == PLANTATION_CLEAR_OBSTACLE ? RENDER_META_WORKING : ""); + if (activeModuleResult != null) + { + return PLANTATION_WORK_FIELD; + } + return PLANTATION_PICK_FIELD; } /** - * Plant something for the current state. + * Start the AI off by picking a field which to move towards. * - * @return the next state to go to. + * @return next state to go to. */ - private IAIState plant() + private IAIState pickField() { - if (plantableSoilPos == null) - { - return START_WORKING; - } + worker.getCitizenData().setIdleAtJob(true); - if (walkToBlock(plantableSoilPos.getPosition().above())) + if (building == null || building.getBuildingLevel() < 1) { - return getState(); + return IDLE; } - final ItemStack currentStack = new ItemStack(plantableSoilPos.getCombination().getItem()); - final int plantInInv = InventoryUtils.getItemCountInItemHandler((worker.getInventoryCitizen()), itemStack -> itemStack.sameItem(currentStack)); - if (plantInInv <= 0) + FieldsModule module = building.getFirstModuleOccurance(FieldsModule.class); + module.claimFields(); + + if (module.hasNoFields()) { - return START_WORKING; + if (worker.getCitizenData() != null) + { + worker.getCitizenData().triggerInteraction(new StandardInteraction(Component.translatable(NO_FREE_FIELDS), ChatPriority.BLOCKING)); + } + return IDLE; } - if (world.setBlockAndUpdate(plantableSoilPos.getPosition().above(), BlockUtils.getBlockStateFromStack(currentStack))) + // Get the next field to work on, if any. + final IField lastField = module.getCurrentField(); + final IField fieldToWork = module.getFieldToWorkOn(); + if (fieldToWork != null) { - InventoryUtils.reduceStackInItemHandler(worker.getInventoryCitizen(), currentStack); + // If we suddenly have to work on a new field, always reset the working position. + // This is because if a field is unassigned from the worker in the middle of an ongoing action inside a module + // the AI may not be able to return the appropriate information and accidentally end up in a situation + // where he thinks his working position is still on another field. + if (lastField != fieldToWork) + { + currentFieldActionCount = 0; + } + + worker.getCitizenData().setIdleAtJob(false); + worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); + + return PLANTATION_MOVE_TO_FIELD; } - return START_WORKING; + return IDLE; } /** - * Plantation has encountered a non-allowed block on a farming position, remove it. + * Start moving the AI towards a specific field to start working on said field. * * @return next state to go to. */ - private IAIState clearObstacle() + private IAIState moveToField() { - if (plantableSoilPos == null) + PlantationField currentPlantationField = getCurrentField(); + if (currentPlantationField == null) { - return START_WORKING; + return PLANTATION_PICK_FIELD; } - if (isItemPositionAir(plantableSoilPos)) - { - return START_WORKING; - } - - if (walkToBlock(plantableSoilPos.getPosition().above())) + if (walkToBlock(currentPlantationField.getPosition(), CitizenConstants.DEFAULT_RANGE_FOR_DELAY)) { return getState(); } - if (!holdEfficientTool(world.getBlockState(plantableSoilPos.getPosition().above()), plantableSoilPos.getPosition().above())) + return PLANTATION_DECIDE_FIELD_WORK; + } + + /** + * Start moving the AI towards a specific field and decide what to do on this field. + * + * @return next state to go to. + */ + private IAIState decideFieldWork() + { + PlantationField currentPlantationField = getCurrentField(); + if (currentPlantationField == null) { - return START_WORKING; + return PLANTATION_PICK_FIELD; } - if (positionHasInvalidBlock(plantableSoilPos)) + IPlantationModule planterModule = currentPlantationField.getModule(); + BlockPos position = planterModule.getNextWorkingPosition(world); + if (position == null) { - mineBlock(plantableSoilPos.getPosition().above()); - return getState(); + resetActiveField(); + return IDLE; } - return START_WORKING; + IPlantationModule.PlantationModuleResult.Builder result = planterModule.decideFieldWork(world, position); + activeModuleResult = result.build(planterModule, position); + return PLANTATION_WORK_FIELD; } /** - * Farm some plants. + * Start moving the AI towards a specific field and decide what to do on this field. * * @return next state to go to. */ - private IAIState farm() + private IAIState workField() { - if (plantableSoilPos == null) + IPlantationModule planterModule = activeModuleResult.getModule(); + if (!Objects.isNull(activeModuleResult.getActionPosition()) && walkToBlock(planterModule.getPositionToWalkTo(world, activeModuleResult.getActionPosition()))) { - return START_WORKING; + return PLANTATION_WORK_FIELD; } - if (isItemPositionAir(plantableSoilPos)) + ActionHandlerResult handlerResult = switch (activeModuleResult.getAction()) { - return START_WORKING; - } - - if (walkToBlock(plantableSoilPos.getPosition().above())) + case NONE -> ActionHandlerResult.FINISHED; + case PLANT -> handlePlantingAction(); + case BONEMEAL -> handleBonemealAction(); + case HARVEST -> handleMiningAction(true); + case CLEAR -> handleMiningAction(false); + }; + + if (handlerResult.equals(ActionHandlerResult.FINISHED)) { - return getState(); - } + worker.getCitizenItemHandler().removeHeldItem(); + + if (activeModuleResult.getAction().increasesActionCount()) + { + currentFieldActionCount++; + incrementActionsDoneAndDecSaturation(); + } + + IAIState result = PLANTATION_WORK_FIELD; + if (activeModuleResult.shouldResetWorkingPosition()) + { + result = PLANTATION_DECIDE_FIELD_WORK; + } + if (activeModuleResult.shouldResetCurrentField() || currentFieldActionCount >= planterModule.getActionLimit()) + { + resetActiveField(); - if (!holdEfficientTool(world.getBlockState(plantableSoilPos.getPosition().above()), plantableSoilPos.getPosition().above())) + result = PLANTATION_PICK_FIELD; + } + + activeModuleResult = null; + return result; + } + else if (handlerResult.equals(ActionHandlerResult.NEEDS_ITEM)) { - return START_WORKING; + activeModuleResult = null; + return PLANTATION_RETURN_TO_BUILDING; } - if (!positionHasInvalidBlock(plantableSoilPos)) + return PLANTATION_WORK_FIELD; + } + + /** + * Start moving the AI back to their building for pickup requests, if no pickup request was made, return to IDLE. + * + * @return next state to go to. + */ + private IAIState returnToBuilding() + { + if (walkToBuilding()) { - mineBlock(plantableSoilPos.getPosition().above()); return getState(); } - for (final ItemEntity item : world.getEntitiesOfClass(ItemEntity.class, - new AABB(worker.blockPosition()).expandTowards(4.0F, 1.0F, 4.0F).expandTowards(-4.0F, -1.0F, -4.0F))) + if (needsCurrently != null) { - if (item != null) - { - worker.getCitizenItemHandler().tryPickupItemEntity(item); - } + return GATHERING_REQUIRED_MATERIALS; } - worker.getCitizenExperienceHandler().addExperience(XP_PER_HARVEST); - - return START_WORKING; + return IDLE; } - /** - * Check the selected soil on what to do. - * - * @return next state to go to. - */ - private IAIState checkSoil() + @Nullable + private PlantationField getCurrentField() { - if (plantableSoilPos == null) + FieldsModule fieldsModule = building.getFirstModuleOccurance(FieldsModule.class); + if (fieldsModule.getCurrentField() instanceof PlantationField field) { - return START_WORKING; + return field; } + return null; + } - final BuildingPlantation plantation = building; - final List availablePlants = plantation.getAvailablePlants(); + private void resetActiveField() + { + FieldsModule fieldsModule = building.getFirstModuleOccurance(FieldsModule.class); + fieldsModule.resetCurrentField(); + currentFieldActionCount = 0; + } - if (isItemPositionAir(plantableSoilPos)) + /** + * Handles actions for planting an item on the ground. + * + * @return finished if the item was planted, busy if the worker is still busy planting, needs item if the item to plant does not exist. + */ + private ActionHandlerResult handlePlantingAction() + { + if (!Objects.isNull(activeModuleResult.getActionPosition())) { - final Item currentItem = plantableSoilPos.getCombination().getItem(); - final ItemStack currentStack = new ItemStack(currentItem); + IPlantationModule planterModule = activeModuleResult.getModule(); - if (!availablePlants.contains(currentItem)) + ItemStack currentStack = new ItemStack(planterModule.getItem()); + if (checkIfItemsUnavailable(new Stack(currentStack, planterModule.getPlantsToRequest(), 1))) { - return START_WORKING; + return ActionHandlerResult.NEEDS_ITEM; } - final int plantInInv = InventoryUtils.getItemCountInItemHandler((worker.getInventoryCitizen()), itemStack -> itemStack.sameItem(currentStack)); - final int plantInBuilding = InventoryUtils.getCountFromBuilding(building, itemStack -> itemStack.sameItem(currentStack)); - if (plantInInv + plantInBuilding <= 0) - { - requestPlantable(currentItem); - return START_WORKING; - } + final int slot = InventoryUtils.findFirstSlotInItemHandlerWith(worker.getItemHandlerCitizen(), currentStack.getItem()); + worker.getCitizenItemHandler().setMainHeldItem(slot); - if (plantInInv == 0 && plantInBuilding > 0) + BlockState blockState = planterModule.getPlantingBlockState(world, activeModuleResult.getWorkingPosition(), BlockUtils.getBlockStateFromStack(currentStack)); + if (world.setBlockAndUpdate(activeModuleResult.getActionPosition(), blockState)) { - needsCurrently = new Tuple<>(itemStack -> itemStack.sameItem(currentStack), Math.min(plantInBuilding, PLANT_TO_REQUEST)); - return GATHERING_REQUIRED_MATERIALS; + InventoryUtils.reduceStackInItemHandler(worker.getItemHandlerCitizen(), currentStack); + worker.getCitizenItemHandler().removeHeldItem(); + return ActionHandlerResult.FINISHED; } - return PLANTATION_PLANT; + return ActionHandlerResult.BUSY; } - else + return ActionHandlerResult.FINISHED; + } + + /** + * Handles actions for using bonemeal on the ground. + * + * @return finished result if bonemeal was used, busy if the planter is busy planting, needs item if he's missing bonemeal. + */ + private ActionHandlerResult handleBonemealAction() + { + if (!Objects.isNull(activeModuleResult.getActionPosition())) { - if (positionHasInvalidBlock(plantableSoilPos)) - { - return PLANTATION_CLEAR_OBSTACLE; - } + IPlantationModule planterModule = activeModuleResult.getModule(); - if (isSufficientHeight(plantableSoilPos) || !availablePlants.contains(plantableSoilPos.getCombination().getItem())) + List bonemeal = planterModule.getValidBonemeal().stream().map(ItemStack::new).toList(); + if (checkIfItemsUnavailable(new StackList(bonemeal, + RequestSystemTranslationConstants.REQUEST_TYPE_FERTILIZER, + BONEMEAL_TO_KEEP, + 1))) { - return PLANTATION_FARM; + return ActionHandlerResult.NEEDS_ITEM; } - } - return START_WORKING; + final int boneMealSlot = + InventoryUtils.findFirstSlotInItemHandlerWith(worker.getInventoryCitizen(), stack -> planterModule.getValidBonemeal().contains(stack.getItem())); + final ItemStack stackInSlot = worker.getInventoryCitizen().getStackInSlot(boneMealSlot); + planterModule.applyBonemeal(worker, activeModuleResult.getActionPosition(), stackInSlot, getFakePlayer()); + } + return ActionHandlerResult.FINISHED; } /** - * Move towards the selected soil. + * Handles actions for harvesting/clearing plants/blocks. * - * @return next state to go to. + * @return finished if the item was harvested, busy if the worker is still busy harvesting, needs item if he's missing the necessary tool. */ - private IAIState moveToSoil() + private ActionHandlerResult handleMiningAction(boolean isHarvest) { - if (plantableSoilPos == null) + if (!Objects.isNull(activeModuleResult.getActionPosition())) { - return START_WORKING; - } + if (!holdEfficientTool(world.getBlockState(activeModuleResult.getActionPosition()), activeModuleResult.getActionPosition())) + { + return ActionHandlerResult.NEEDS_ITEM; + } - if (walkToBlock(plantableSoilPos.getPosition().above(), CitizenConstants.DEFAULT_RANGE_FOR_DELAY * 2)) - { - return getState(); - } + boolean mineResult = mineBlock(activeModuleResult.getActionPosition()); + if (mineResult) + { + worker.getCitizenItemHandler().pickupItems(); - return PLANTATION_CHECK_SOIL; - } + if (isHarvest) + { + worker.getCitizenExperienceHandler().addExperience(XP_PER_HARVEST); + } + } - @Override - protected int getActionsDoneUntilDumping() - { - return MAX_BLOCKS_MINED; + return mineResult ? ActionHandlerResult.FINISHED : ActionHandlerResult.BUSY; + } + return ActionHandlerResult.FINISHED; } - @Override - protected int getActionRewardForCraftingSuccess() + /** + * Checks if the planter has enough of a certain item in their inventory, or in their hut. + * + * @param deliverable the request that needs to be delivered. + * @return false if the items are present in their own inventory, true if the items are in the hut or not present at all. + */ + private boolean checkIfItemsUnavailable(final IConcreteDeliverable deliverable) { - return MAX_BLOCKS_MINED; + final int invCount = + InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), deliverable::matches); + if (invCount >= deliverable.getMinimumCount()) + { + return false; + } + + currentDeliverable = deliverable; + needsCurrently = new Tuple<>(deliverable::matches, deliverable.getCount()); + return true; } @Override - public Class getExpectedBuildingClass() + protected void updateRenderMetaData() { - return BuildingPlantation.class; + worker.setRenderMetadata(getState() == CRAFT + || getState() == PLANTATION_WORK_FIELD + || getState() == PLANTATION_DECIDE_FIELD_WORK ? RENDER_META_WORKING : ""); } @Override protected IAIState decide() { - worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING); - if (!job.getTaskQueue().isEmpty() && job.getCurrentTask() != null) - { - return getNextCraftingState(); - } + IAIState state = super.decide(); - if (!building.isInBuilding(worker.blockPosition()) && walkToBuilding()) + if (state == IDLE) { - return START_WORKING; + return PREPARING; } + return state; + } - if (job.getActionsDone() >= getActionsDoneUntilDumping()) + @Override + public IAIState getStateAfterPickUp() + { + if (currentDeliverable != null && !InventoryUtils.hasItemInItemHandler(worker.getInventoryCitizen(), currentDeliverable.getResult().getItem()) + && building.getOpenRequestsOfTypeFiltered(worker.getCitizenData(), TypeConstants.DELIVERABLE, + (IRequest r) -> currentDeliverable.getRequestedItems().stream().anyMatch(r.getRequest()::matches)).isEmpty() + && building.getCompletedRequestsOfTypeFiltered(worker.getCitizenData(), TypeConstants.DELIVERABLE, + (IRequest r) -> currentDeliverable.getRequestedItems().stream().anyMatch(r.getRequest()::matches)).isEmpty()) { - // Wait to dump before continuing. - return getState(); + worker.getCitizenData().createRequestAsync(currentDeliverable); } + currentDeliverable = null; + needsCurrently = null; - final BuildingPlantation plantation = building; - final List soilPositions = plantation.getAllSoilPositions(); + return super.getStateAfterPickUp(); + } - if (soilPositions.isEmpty()) + @Override + protected int getActionsDoneUntilDumping() + { + if (getState() != PLANTATION_DECIDE_FIELD_WORK && getState() != PLANTATION_WORK_FIELD) { - Log.getLogger().warn("Planter building returned 0 available soil positions, schematic is " + plantation.getSchematicName() + ", please report this to the developer!"); - return START_WORKING; + return super.getActionsDoneUntilDumping(); } - final int soilPositionIndex = worker.getRandom().nextInt(soilPositions.size()); - - plantableSoilPos = soilPositions.get(soilPositionIndex); - return PLANTATION_MOVE_TO_SOIL; - } - - /** - * Async request for paper to the colony. - * - * @param current the current plantable. - */ - private void requestPlantable(final Item current) - { - if (!building.hasWorkerOpenRequestsFiltered(worker.getCitizenData().getId(), - q -> q.getRequest() instanceof Stack && ((Stack) q.getRequest()).getStack().getItem() == current)) + PlantationField currentPlantationField = getCurrentField(); + if (currentPlantationField == null) { - worker.getCitizenData().createRequestAsync(new Stack(new ItemStack(current, PLANT_TO_REQUEST))); + return super.getActionsDoneUntilDumping(); } - } - /** - * Check if the position is air. - * - * @param plantationSoilPosition the item position data. - * @return true if so. - */ - private boolean isItemPositionAir(final BuildingPlantation.PlantationSoilPosition plantationSoilPosition) - { - Block foundBlock = world.getBlockState(plantationSoilPosition.getPosition().above(1)).getBlock(); - return foundBlock instanceof AirBlock; + return currentPlantationField.getModule().getActionLimit(); } - /** - * Check if the position has a valid plant. - * - * @param plantationSoilPosition the item position data. - * @return true if so. - */ - private boolean positionHasInvalidBlock(final BuildingPlantation.PlantationSoilPosition plantationSoilPosition) + @Override + public Class getExpectedBuildingClass() { - Block foundBlock = world.getBlockState(plantationSoilPosition.getPosition().above(1)).getBlock(); - return plantationSoilPosition.getCombination().getBlock() != foundBlock; + return BuildingPlantation.class; } - /** - * Check if the plant at pos it at least x blocks high. - * - * @param plantationSoilPosition the item position data. - * @return true if so. - */ - private boolean isSufficientHeight(final BuildingPlantation.PlantationSoilPosition plantationSoilPosition) + private enum ActionHandlerResult { - BlockPos position = plantationSoilPosition.getPosition(); - int minLength = plantationSoilPosition.getCombination().getMinimumLength(); - for (int i = 1; i <= minLength; i++) - { - if (world.getBlockState(position.above(i)).getBlock() != plantationSoilPosition.getCombination().getBlock()) - { - return false; - } - } - return true; + FINISHED, + BUSY, + NEEDS_ITEM, } -} +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/research/EntityAIWorkResearcher.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/research/EntityAIWorkResearcher.java index 423e8abb6fd..1161e52c181 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/research/EntityAIWorkResearcher.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/research/EntityAIWorkResearcher.java @@ -4,6 +4,7 @@ import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.research.ILocalResearch; +import com.minecolonies.api.util.Log; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingUniversity; import com.minecolonies.coremod.colony.jobs.JobResearch; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; @@ -62,6 +63,16 @@ public Class getExpectedBuildingClass() */ private IAIState study() { + if (studyPos == null) + { + studyPos = building.getRandomBookShelf(); + } + + if (walkToBlock(studyPos)) + { + return getState(); + } + final IColony colony = building.getColony(); final List inProgress = colony.getResearchManager().getResearchTree().getResearchInProgress(); if (!inProgress.isEmpty() && job.getCurrentMana() > 0) @@ -75,19 +86,10 @@ private IAIState study() { building.onSuccess(research); } + colony.getResearchManager().markDirty(); job.reduceCurrentMana(); } - if (studyPos == null) - { - studyPos = building.getRandomBookShelf(); - } - - if (walkToBlock(studyPos)) - { - return getState(); - } - worker.decreaseSaturationForContinuousAction(); worker.getCitizenExperienceHandler().addExperience(XP_PER_STUDYPOS); studyPos = null; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/smelter/EntityAIWorkSmelter.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/smelter/EntityAIWorkSmelter.java index 9912415ebbf..05b74c96edb 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/smelter/EntityAIWorkSmelter.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/smelter/EntityAIWorkSmelter.java @@ -8,6 +8,7 @@ import com.minecolonies.api.colony.requestsystem.requestable.StackList; import com.minecolonies.api.crafting.IRecipeStorage; import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.InventoryUtils; @@ -36,8 +37,7 @@ import java.util.List; import java.util.stream.Collectors; -import static com.minecolonies.api.util.constant.Constants.RESULT_SLOT; -import static com.minecolonies.api.util.constant.Constants.STACKSIZE; +import static com.minecolonies.api.util.constant.Constants.*; import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.*; @@ -64,9 +64,57 @@ public class EntityAIWorkSmelter extends AbstractEntityAIUsesFurnace getExpectedBuildingClass() { @@ -97,6 +145,11 @@ protected IRequestable getSmeltAbleClass() @Override protected IAIState checkForImportantJobs() { + if (!ItemStackUtils.isEmpty(worker.getMainHandItem())) + { + worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + if (InventoryUtils.isItemHandlerFull(worker.getInventoryCitizen())) { return INVENTORY_FULL; @@ -111,36 +164,7 @@ protected IAIState checkForImportantJobs() return super.checkForImportantJobs(); } - final ItemStack inputItem = currentRecipeStorage.getCleanedInput().stream() - .map(ItemStorage::getItemStack) - .findFirst().orElse(ItemStack.EMPTY); - - if(inputItem.isEmpty()) - { - return getState(); - } - - WorkerUtil.faceBlock(building.getPosition(), worker); - - if(!module.fullFillRecipe(currentRecipeStorage)) - { - return getState(); - } - else - { - worker.decreaseSaturationForContinuousAction(); - worker.getCitizenExperienceHandler().addExperience(0.2); - } - - Network.getNetwork() - .sendToTrackingEntity(new LocalizedParticleEffectMessage(inputItem, building.getID()), worker); - Network.getNetwork() - .sendToTrackingEntity(new LocalizedParticleEffectMessage(inputItem, building.getID().below()), worker); - - worker.swing(InteractionHand.MAIN_HAND); - SoundUtils.playSoundAtCitizen(world, building.getID(), SoundEvents.LEASH_KNOT_BREAK); - - return IDLE; + return BREAK_ORES; } /** diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/student/EntityAIStudy.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/student/EntityAIStudy.java index 5e9fe3e3566..c30c84c3e17 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/student/EntityAIStudy.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/student/EntityAIStudy.java @@ -6,6 +6,7 @@ import com.minecolonies.api.entity.ai.util.StudyItem; import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Tuple; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingLibrary; import com.minecolonies.coremod.colony.jobs.JobStudent; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAISkill; @@ -127,27 +128,23 @@ private IAIState study() // Create a new Request for items if (currentItems.isEmpty()) { - // Default levelup - data.getCitizenSkillHandler().tryLevelUpIntelligence(data.getRandom(), ONE_IN_X_CHANCE, data); - worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStackUtils.EMPTY); - for (final StudyItem studyItem : building.getStudyItems()) { final int bSlot = InventoryUtils.findFirstSlotInProviderWith(building, studyItem.getItem()); if (bSlot > -1) { - if (walkToBuilding()) - { - setDelay(WALK_DELAY); - return getState(); - } - takeItemStackFromProvider(building, bSlot); + needsCurrently = new Tuple<>(itemStack -> studyItem.getItem() == itemStack.getItem(), 10); + return GATHERING_REQUIRED_MATERIALS; } else { checkIfRequestForItemExistOrCreateAsync(new ItemStack(studyItem.getItem(), studyItem.getBreakPct() / 10 > 0 ? studyItem.getBreakPct() / 10 : 1)); } } + + // Default levelup + data.getCitizenSkillHandler().tryLevelUpIntelligence(data.getRandom(), ONE_IN_X_CHANCE, data); + worker.setItemInHand(InteractionHand.MAIN_HAND, ItemStackUtils.EMPTY); } // Use random item else diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/trainingcamps/EntityAICombatTraining.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/trainingcamps/EntityAICombatTraining.java index 7ba6544a8cf..9ff4937237f 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/trainingcamps/EntityAICombatTraining.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/trainingcamps/EntityAICombatTraining.java @@ -194,7 +194,7 @@ private IAIState attack() { worker.swing(InteractionHand.MAIN_HAND); worker.playSound(SoundEvents.PLAYER_ATTACK_SWEEP, (float) BASIC_VOLUME, (float) SoundUtils.getRandomPitch(worker.getRandom())); - trainingPartner.hurt(new NamedDamageSource("death.attack.entity.minecolonies.training", worker), 0.0F); + trainingPartner.hurt(new NamedDamageSource("entity.minecolonies.training", worker), 0.0F); worker.getCitizenItemHandler().damageItemInHand(InteractionHand.MAIN_HAND, 1); } worker.getNavigation().moveAwayFromXYZ(trainingPartner.blockPosition(), 4.0, 1.0, true); diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/undertaker/EntityAIWorkUndertaker.java b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/undertaker/EntityAIWorkUndertaker.java index 72ff66e0dec..ebfb00a320e 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/citizen/undertaker/EntityAIWorkUndertaker.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/citizen/undertaker/EntityAIWorkUndertaker.java @@ -19,14 +19,14 @@ import com.minecolonies.coremod.colony.jobs.JobUndertaker; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract; import com.minecolonies.coremod.util.AdvancementUtils; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.sounds.SoundEvents; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,7 +36,8 @@ import static com.minecolonies.api.research.util.ResearchConstants.*; import static com.minecolonies.api.util.constant.Constants.DEFAULT_SPEED; import static com.minecolonies.api.util.constant.ToolLevelConstants.TOOL_LEVEL_WOOD_OR_GOLD; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INFO_CITIZEN_UNDERTAKER_GRAVEYARD_NO_SPACE; +import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INFO_CITIZEN_UNDERTAKER_RESURRECTED_SUCCESS; import static com.minecolonies.api.util.constant.UndertakerConstants.*; /** @@ -139,7 +140,7 @@ private IAIState wander() { if (building.isInBuilding(worker.blockPosition())) { - worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ); + worker.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, false); } else { @@ -166,7 +167,6 @@ private IAIState emptyGrave() } worker.getCitizenData().setVisibleStatus(EMPTYING_ICON); - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(MESSAGE_INFO_CITIZEN_STATUS_UNDERTAKER_EMPTYING)); worker.setSprinting(worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(UNDERTAKER_RUN) > 0); unequip(); @@ -224,7 +224,6 @@ private IAIState digGrave() } worker.getCitizenData().setVisibleStatus(DIGGING_ICON); - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(MESSAGE_INFO_CITIZEN_STATUS_UNDERTAKER_DIGGING)); worker.setSprinting(worker.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(UNDERTAKER_RUN) > 0); @Nullable final BlockPos gravePos = buildingGraveyard.getGraveToWorkOn(); @@ -412,7 +411,6 @@ private IAIState buryCitizen() return IDLE; } worker.getCitizenData().setVisibleStatus(BURYING_ICON); - worker.getCitizenStatusHandler().setLatestStatus(Component.translatable(MESSAGE_INFO_CITIZEN_UNDERTAKER_BURYING)); if(burialPos == null || !world.getBlockState(burialPos.getA()).isAir()) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/combat/CombatUtils.java b/src/main/java/com/minecolonies/coremod/entity/ai/combat/CombatUtils.java index 304e62b8d40..a0edbfe7a4c 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/combat/CombatUtils.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/combat/CombatUtils.java @@ -4,7 +4,7 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.items.ItemSpear; @@ -43,7 +43,6 @@ public class CombatUtils public static AbstractArrow createArrowForShooter(final LivingEntity shooter) { AbstractArrow arrowEntity = ModEntities.MC_NORMAL_ARROW.create(shooter.level); - arrowEntity.setOwner(shooter); final ItemStack rangedWeapon = shooter.getItemInHand(InteractionHand.MAIN_HAND); final Item rangedWeaponItem = rangedWeapon.getItem(); @@ -60,6 +59,7 @@ else if (rangedWeaponItem instanceof TridentItem) arrowEntity = EntityType.TRIDENT.create(shooter.level); } + arrowEntity.setOwner(shooter); arrowEntity.setPos(shooter.getX(), shooter.getY() + 1, shooter.getZ()); return arrowEntity; } @@ -95,7 +95,7 @@ public static void notifyGuardsOfTarget(final AbstractEntityCitizen user, final } } - if (target instanceof AbstractEntityMinecoloniesMob) + if (target instanceof AbstractEntityRaiderMob) { for (final Map.Entry entry : user.getCitizenColonyHandler().getColony().getBuildingManager().getBuildings().entrySet()) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/combat/TargetAI.java b/src/main/java/com/minecolonies/coremod/entity/ai/combat/TargetAI.java index bf0f8e1a314..8cc006cc6a9 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/combat/TargetAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/combat/TargetAI.java @@ -6,12 +6,12 @@ import com.minecolonies.api.entity.combat.CombatAIStates; import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; import com.minecolonies.api.entity.combat.threat.ThreatTableEntry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.monster.Enemy; -import net.minecraft.core.Direction; import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; import java.util.List; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenAvoidEntity.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenAvoidEntity.java index d60092f3a41..06f5d392d76 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenAvoidEntity.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenAvoidEntity.java @@ -1,39 +1,30 @@ package com.minecolonies.coremod.entity.ai.minimal; +import com.minecolonies.api.entity.ai.IStateAI; import com.minecolonies.api.entity.ai.statemachine.AITarget; -import com.minecolonies.api.entity.ai.statemachine.states.IAIState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; +import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.CompatibilityUtils; -import com.minecolonies.api.util.Log; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingHospital; -import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.player.Player; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.EnumSet; import java.util.Optional; import java.util.Random; -import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.RUNNING; -import static com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState.SAFE; import static com.minecolonies.api.util.constant.CitizenConstants.MAX_GUARD_CALL_RANGE; -import static com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenDiseaseHandler.SEEK_DOCTOR_HEALTH; - -import net.minecraft.world.entity.ai.goal.Goal.Flag; +import static com.minecolonies.coremod.entity.ai.minimal.EntityAICitizenAvoidEntity.FleeStates.RUNNING; +import static com.minecolonies.coremod.entity.ai.minimal.EntityAICitizenAvoidEntity.FleeStates.SAFE; /** * AI task to avoid an Entity class. */ -public class EntityAICitizenAvoidEntity extends Goal +public class EntityAICitizenAvoidEntity implements IStateAI { /** * Defines how close the entity has to be to the mob to run away. @@ -43,13 +34,13 @@ public class EntityAICitizenAvoidEntity extends Goal /** * The amount of area checks before the citizen assumes it is safe. 40 are done in 10seconds. */ - private static final int CHECKS_BEFORE_SAFE = 40; + private static final int CHECKS_BEFORE_SAFE = 20 * 10 / 5; /** * Move away distances. */ - private static final float MIN_MOVE_AWAY_DIST = 5; - private static final float MED_MOVE_AWAY_DIST = 10; + private static final float MIN_MOVE_AWAY_DIST = 7; + private static final float MED_MOVE_AWAY_DIST = 15; private static final float MAX_MOVE_AWAY_DIST = 20; /** @@ -66,17 +57,18 @@ public class EntityAICitizenAvoidEntity extends Goal /** * Time spent fleeing. */ - private int fleeingCounter = 0; + private int safeTime = 0; /** * The pathresult of trying to move away */ private PathResult moveAwayPath; - /** - * This AI's state changer. - */ - private final ITickRateStateMachine stateMachine; + public enum FleeStates implements IState + { + SAFE, + RUNNING + } /** * The blockpos from where the citizen started fleeing. @@ -108,22 +100,13 @@ public EntityAICitizenAvoidEntity( this.distanceFromEntity = distanceFromEntity; this.farSpeed = farSpeed; this.nearSpeed = nearSpeed; - super.setFlags(EnumSet.of(Flag.MOVE)); - - stateMachine = new TickRateStateMachine<>(SAFE, this::onException); - - stateMachine.addTransition(new AITarget(SAFE, this::isEntityClose, () -> RUNNING, 5)); - stateMachine.addTransition(new AITarget(RUNNING, this::updateMoving, () -> SAFE, 5)); - } - /** - * Handles any exceptions for this AI. - * - * @param e exception to handle - */ - private void onException(final RuntimeException e) - { - Log.getLogger().warn("AvoidAI of:" + citizen.getName() + " threw an Exception:", e); + citizen.getCitizenAI().addTransition(new AITarget(CitizenAIState.FLEE, () -> true, () -> { + reset(); + return SAFE; + }, 1)); + citizen.getCitizenAI().addTransition(new AITarget(SAFE, () -> true, this::isEntityClose, 5)); + citizen.getCitizenAI().addTransition(new AITarget(RUNNING, this::updateMoving, () -> SAFE, 5)); } /** @@ -131,27 +114,26 @@ private void onException(final RuntimeException e) * * @return true if we should flee */ - public boolean isEntityClose() + public IState isEntityClose() { - if (!citizen.isCurrentlyFleeing()) + safeTime++; + + if (safeTime > CHECKS_BEFORE_SAFE) { - return false; + return CitizenAIState.IDLE; } - fleeingCounter++; - - // reset after 10s no target - if (fleeingCounter == CHECKS_BEFORE_SAFE) + final Entity currentClosest = getClosestToAvoid(); + if (currentClosest != null) { - fleeingCounter = 0; - citizen.setFleeingState(false); - citizen.getNavigation().tryMoveToBlockPos(startingPos, 1); - return false; + closestLivingEntity = currentClosest; + safeTime = 0; + startingPos = citizen.blockPosition(); + performMoveAway(); + return RUNNING; } - closestLivingEntity = citizen.getThreatTable().getTargetMob(); - - return closestLivingEntity != null && citizen.getSensing().hasLineOfSight(closestLivingEntity) && targetEntityClass.isInstance(closestLivingEntity); + return SAFE; } /** @@ -168,15 +150,15 @@ private Entity getClosestToAvoid() else { final Optional entityOptional = CompatibilityUtils.getWorldFromCitizen(citizen).getEntities( - citizen, - citizen.getBoundingBox().inflate( - (double) distanceFromEntity, - 3.0D, - (double) distanceFromEntity), - target -> target.isAlive() && citizen.getSensing().hasLineOfSight(target)) - .stream() - .filter(targetEntityClass::isInstance) - .findFirst(); + citizen, + citizen.getBoundingBox().inflate( + (double) distanceFromEntity, + 3.0D, + (double) distanceFromEntity), + target -> target.isAlive() && citizen.getSensing().hasLineOfSight(target)) + .stream() + .filter(targetEntityClass::isInstance) + .findFirst(); return entityOptional.orElse(null); } @@ -192,8 +174,8 @@ private boolean performMoveAway() if ((moveAwayPath == null || !moveAwayPath.isInProgress()) && citizen.getNavigation().isDone()) { moveAwayPath = - citizen.getNavigation().moveAwayFromXYZ(citizen.blockPosition().offset(rand.nextInt(2), 0, rand.nextInt(2)), distanceFromEntity + getMoveAwayDist(citizen), nearSpeed, true); - citizen.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.avoiding")); + citizen.getNavigation() + .moveAwayFromXYZ(citizen.blockPosition().offset(rand.nextInt(2), 0, rand.nextInt(2)), distanceFromEntity + getMoveAwayDist(citizen), nearSpeed, true); return true; } return false; @@ -241,7 +223,7 @@ private boolean updateMoving() if (moveAwayPath == null || !moveAwayPath.isInProgress()) { - fleeingCounter = 0; + safeTime = 0; return true; } else @@ -259,47 +241,17 @@ private boolean updateMoving() } /** - * Returns whether the Goal should begin execution of avoiding. - */ - @Override - public boolean canUse() - { - if (citizen.isCurrentlyFleeing() && citizen.getCitizenJobHandler().shouldRunAvoidance() && (citizen.getCitizenJobHandler().getColonyJob() == null - || citizen.getCitizenJobHandler().getColonyJob().canAIBeInterrupted())) - { - startingPos = citizen.blockPosition(); - fleeingCounter = 0; - - return !(citizen.getHealth() <= SEEK_DOCTOR_HEALTH) || citizen.getCitizenColonyHandler().getColony() == null - || citizen.getCitizenColonyHandler().getColony().getBuildingManager().getBestBuilding(citizen, BuildingHospital.class) == null; - } - return false; - } - - /** - * Returns whether an in-progress Goal should continue executing. + * Resets the task. */ - @Override - public boolean canContinueToUse() + public void reset() { - stateMachine.tick(); - if (citizen.getHealth() <= SEEK_DOCTOR_HEALTH && citizen.getCitizenColonyHandler().getColony() != null - && citizen.getCitizenColonyHandler().getColony().getBuildingManager().getBestBuilding(citizen, BuildingHospital.class) != null) + safeTime = 0; + if (startingPos != null) { - return false; + citizen.getNavigation().tryMoveToBlockPos(startingPos, 1); } - - return citizen.isCurrentlyFleeing() && citizen.getCitizenJobHandler().shouldRunAvoidance(); - } - - /** - * Resets the task. - */ - @Override - public void stop() - { closestLivingEntity = null; moveAwayPath = null; - stateMachine.reset(); + startingPos = null; } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenChild.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenChild.java index cfa882fcb97..8edb15338cd 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenChild.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenChild.java @@ -1,30 +1,25 @@ package com.minecolonies.coremod.entity.ai.minimal; -import com.minecolonies.api.entity.ai.DesiredActivity; +import com.minecolonies.api.entity.ai.IStateAI; import com.minecolonies.api.entity.ai.statemachine.AIEventTarget; import com.minecolonies.api.entity.ai.statemachine.AITarget; import com.minecolonies.api.entity.ai.statemachine.states.AIBlockingEventType; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IAIState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; +import com.minecolonies.api.entity.ai.statemachine.states.IState; +import com.minecolonies.api.entity.citizen.AbstractCivilianEntity; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.CompatibilityUtils; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.colony.colonyEvents.citizenEvents.CitizenGrownUpEvent; -import com.minecolonies.coremod.colony.jobs.JobPupil; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; import java.util.Random; @@ -34,7 +29,7 @@ /** * AI which controls child behaviour and growing. */ -public class EntityAICitizenChild extends Goal +public class EntityAICitizenChild implements IStateAI { /** @@ -42,7 +37,6 @@ public class EntityAICitizenChild extends Goal */ public enum State implements IAIState { - IDLE, BORED, PLAYING, VISITING, @@ -58,8 +52,6 @@ public boolean isOkayToEat() protected final EntityCitizen child; private final Random rand = new Random(); - private final ITickRateStateMachine stateMachine; - /** * Timer for actions/between actions */ @@ -114,57 +106,35 @@ public EntityAICitizenChild(@NotNull final EntityCitizen citizen) { super(); this.child = citizen; - super.setFlags(EnumSet.of(Goal.Flag.MOVE)); - stateMachine = new TickRateStateMachine<>(State.IDLE, this::handleAIException); - stateMachine.addTransition(new AIEventTarget(AIBlockingEventType.STATE_BLOCKING, this::updateTimers, stateMachine::getState, 1)); - stateMachine.addTransition(new AIEventTarget(AIBlockingEventType.EVENT, this::tryGrowUp, () -> State.IDLE, 500)); - stateMachine.addTransition(new AITarget(State.IDLE, this::searchEntityToFollow, () -> State.FOLLOWING, 150)); - stateMachine.addTransition(new AITarget(State.IDLE, this::isReadyForActivity, () -> State.VISITING, 300)); + citizen.getCitizenAI().addTransition(new AITarget(CitizenAIState.IDLE, this::isReadyForActivity, () -> State.VISITING, 200)); + citizen.getCitizenAI().addTransition(new AIEventTarget(AIBlockingEventType.EVENT, this::tryGrowUp, () -> citizen.getCitizenAI().getState(), 500)); + citizen.getCitizenAI().addTransition(new AITarget(CitizenAIState.IDLE, this::searchEntityToFollow, () -> State.FOLLOWING, 200)); - stateMachine.addTransition(new AITarget(State.FOLLOWING, this::followingEntity, 20)); - stateMachine.addTransition(new AITarget(State.VISITING, this::visitHuts, 120)); + citizen.getCitizenAI().addTransition(new AITarget(State.FOLLOWING, this::followingEntity, 20)); + citizen.getCitizenAI().addTransition(new AITarget(State.VISITING, this::visitHuts, 120)); } /** - * Exception handler for the statemachine - * - * @param ex the exception to handle - */ - private void handleAIException(final RuntimeException ex) - { - stateMachine.reset(); - Log.getLogger().warn("EntityAICitizenChild Child: " + child.getName() + " threw an exception:", ex); - } - - /** - * Updates all timers + * Whether the child moves to a new activity * - * @return false + * @return whether the child moves to a new activity */ - private boolean updateTimers() + private boolean isReadyForActivity() { - // Timer used for delays on actions if (actionTimer > 0) { - actionTimer -= MineColonies.getConfig().getServer().updateRate.get(); + actionTimer -= 100; } - aiActiveTime += MineColonies.getConfig().getServer().updateRate.get() * (child.getCitizenJobHandler().getColonyJob() instanceof JobPupil ? 2 : 1); - + if (canUse() && actionTimer <= 0 && rand.nextInt(10) == 0) + { + setDelayForNextAction(); + return true; + } return false; } - /** - * Whether the child moves to a new activity - * - * @return whether the child moves to a new activity - */ - private boolean isReadyForActivity() - { - return actionTimer <= 0; - } - /** * Sets the delay till the next activity can start */ @@ -195,7 +165,7 @@ private boolean searchEntityToFollow() 1.0D, (double) START_FOLLOW_DISTANCE), // Limit entity classes - target -> target.isAlive() && (target instanceof AgeableMob || target instanceof Player)) + target -> target.isAlive() && (target instanceof AbstractCivilianEntity || target instanceof Player)) // Take the first entity .stream() .findFirst() @@ -217,15 +187,16 @@ private boolean searchEntityToFollow() * * @return the next ai state to go into */ - private IAIState followingEntity() + private IState followingEntity() { + actionTimer -= 20; if (actionTimer <= 0 || followTarget.get() == null) { // run back to start position child.getNavigation().moveToXYZ(followStart.getX(), followStart.getY(), followStart.getZ(), 1.0d); setDelayForNextAction(); - return State.IDLE; + return CitizenAIState.IDLE; } child.getNavigation().moveToLivingEntity(followTarget.get(), 1.0d); @@ -237,7 +208,7 @@ private IAIState followingEntity() * * @return the next ai state to go into */ - private IAIState visitHuts() + private IState visitHuts() { // Find a hut to visit if (visitingPath == null && child.getCitizenColonyHandler().getColony() != null) @@ -258,6 +229,7 @@ private IAIState visitHuts() visitingPath = child.getNavigation().moveToXYZ(visitHutPos.getX(), visitHutPos.getY(), visitHutPos.getZ(), 1.0d); } + actionTimer -= 120; // Visiting if (actionTimer > 0) { @@ -275,7 +247,7 @@ private IAIState visitHuts() visitHutPos = null; setDelayForNextAction(); - return State.IDLE; + return CitizenAIState.IDLE; } /** @@ -285,6 +257,11 @@ private IAIState visitHuts() */ private boolean tryGrowUp() { + if (!child.isBaby()) + { + return false; + } + if (child.getCitizenColonyHandler().getColony() != null) { if (child.getCitizenColonyHandler().getColony().useAdditionalChildTime(BONUS_TIME_COLONY)) @@ -295,11 +272,6 @@ private boolean tryGrowUp() if (aiActiveTime >= MIN_ACTIVE_TIME) { - if (!child.isBaby()) - { - return true; - } - final double growthModifier = (1 + child.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(GROWTH)); // 1/144 Chance to grow up, every 25 seconds = avg 1h. Set to half since this AI isnt always active, e.g. sleeping. At 2h they directly grow @@ -324,24 +296,8 @@ private boolean tryGrowUp() /** * {@inheritDoc} Returns whether the Goal should begin execution. True when age less than 100, when a random (120) is chosen correctly, and when a citizen is nearby. */ - @Override public boolean canUse() { return child.isBaby() && child.getCitizenData() != null; } - - /** - * {@inheritDoc} Returns whether an in-progress Goal should continue executing. - */ - @Override - public boolean canContinueToUse() - { - if (child.getDesiredActivity() == DesiredActivity.SLEEP || !child.isBaby() || child.getCitizenData() == null || child.getDesiredActivity() == DesiredActivity.MOURN) - { - return false; - } - - stateMachine.tick(); - return true; - } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenWander.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenWander.java index d08eda6e09c..505db3e00db 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenWander.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAICitizenWander.java @@ -1,21 +1,19 @@ package com.minecolonies.coremod.entity.ai.minimal; import com.ldtteam.structurize.blockentities.interfaces.IBlueprintDataProviderBE; -import com.minecolonies.api.entity.ai.DesiredActivity; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; -import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; -import com.minecolonies.api.util.Log; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingLibrary; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.entity.SittingEntity; import com.minecolonies.coremod.entity.ai.citizen.student.EntityAIStudy; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.entity.BlockEntity; @@ -27,12 +25,10 @@ import static com.minecolonies.api.util.constant.SchematicTagConstants.TAG_SITTING; import static com.minecolonies.coremod.entity.ai.minimal.EntityAICitizenWander.WanderState.*; -import net.minecraft.world.entity.ai.goal.Goal.Flag; - /** * Entity action to wander randomly around. */ -public class EntityAICitizenWander extends Goal +public class EntityAICitizenWander implements IStateAI { /** * Chance to enter the leisure state. @@ -44,7 +40,6 @@ public class EntityAICitizenWander extends Goal */ public enum WanderState implements IState { - IDLE, GO_TO_LEISURE_SITE, WANDER_AT_LEISURE_SITE, READ_A_BOOK @@ -53,17 +48,12 @@ public enum WanderState implements IState /** * The citizen that is wandering. */ - protected final AbstractEntityCitizen citizen; + protected final EntityCitizen citizen; /** * Wandering speed. */ - protected final double speed; - - /** - * AI statemachine - */ - private final TickRateStateMachine stateMachine; + protected final double speed; /** * Position to path to. @@ -78,29 +68,27 @@ public enum WanderState implements IState /** * Instantiates this task. * - * @param citizen the citizen. - * @param speed the speed. + * @param citizen the citizen. + * @param speed the speed. */ - public EntityAICitizenWander(final AbstractEntityCitizen citizen, final double speed) + public EntityAICitizenWander(final EntityCitizen citizen, final double speed) { super(); this.citizen = citizen; this.speed = speed; - this.setFlags(EnumSet.of(Flag.MOVE)); - stateMachine = new TickRateStateMachine<>(IDLE, e -> Log.getLogger().warn("Wandering AI threw exception:", e)); - stateMachine.addTransition(new TickingTransition<>(IDLE, () -> true, this::decide, 100)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_LEISURE_SITE, () -> true, this::goToLeisureSite, 20)); - stateMachine.addTransition(new TickingTransition<>(WANDER_AT_LEISURE_SITE, () -> true, this::wanderAtLeisureSite, 20)); - stateMachine.addTransition(new TickingTransition<>(READ_A_BOOK, () -> true, this::readABook, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(CitizenAIState.IDLE, () -> true, this::decide, 100)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_LEISURE_SITE, () -> true, this::goToLeisureSite, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(WANDER_AT_LEISURE_SITE, () -> true, this::wanderAtLeisureSite, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(READ_A_BOOK, () -> true, this::readABook, 20)); } - private WanderState readABook() + private IState readABook() { if (leisureSite == null) { walkTo = null; - return IDLE; + return CitizenAIState.IDLE; } if (walkTo != null) @@ -115,8 +103,10 @@ private WanderState readABook() citizen.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY); walkTo = null; leisureSite = null; - citizen.getCitizenData().getCitizenSkillHandler().tryLevelUpIntelligence(citizen.getCitizenData().getRandom(), EntityAIStudy.ONE_IN_X_CHANCE, citizen.getCitizenData()); - return IDLE; + citizen.getCitizenData() + .getCitizenSkillHandler() + .tryLevelUpIntelligence(citizen.getCitizenData().getRandom(), EntityAIStudy.ONE_IN_X_CHANCE, citizen.getCitizenData()); + return CitizenAIState.IDLE; } citizen.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.BOOK)); @@ -132,12 +122,12 @@ private WanderState readABook() return READ_A_BOOK; } - private WanderState goToLeisureSite() + private IState goToLeisureSite() { if (leisureSite == null) { walkTo = null; - return IDLE; + return CitizenAIState.IDLE; } if (!citizen.isWorkerAtSiteWithMove(leisureSite, 3)) @@ -148,13 +138,13 @@ private WanderState goToLeisureSite() return WANDER_AT_LEISURE_SITE; } - private WanderState wanderAtLeisureSite() + private IState wanderAtLeisureSite() { if (leisureSite == null || citizen.getRandom().nextInt(60 * 5) < 1) { leisureSite = null; walkTo = null; - return IDLE; + return CitizenAIState.IDLE; } if (walkTo != null && !citizen.isWorkerAtSiteWithMove(walkTo, 3)) @@ -172,9 +162,11 @@ private WanderState wanderAtLeisureSite() { if (walkTo == null && citizen.getRandom().nextBoolean()) { - citizen.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, ((IBlueprintDataProviderBE) blockEntity).getInWorldCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ); + citizen.getNavigation() + .moveToRandomPos(10, DEFAULT_SPEED, ((IBlueprintDataProviderBE) blockEntity).getInWorldCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, false); } - if (walkTo == null && blockEntity instanceof TileEntityColonyBuilding && ((TileEntityColonyBuilding) blockEntity).getBuilding() instanceof BuildingLibrary && citizen.getRandom().nextInt(100) < 5) + if (walkTo == null && blockEntity instanceof TileEntityColonyBuilding && ((TileEntityColonyBuilding) blockEntity).getBuilding() instanceof BuildingLibrary + && citizen.getRandom().nextInt(100) < 5) { return READ_A_BOOK; } @@ -199,52 +191,41 @@ private WanderState wanderAtLeisureSite() return WANDER_AT_LEISURE_SITE; } - return IDLE; + return CitizenAIState.IDLE; } - private WanderState decide() + private IState decide() { + if (!canUse()) + { + return CitizenAIState.IDLE; + } + final int randomBit = citizen.getRandom().nextInt(100); if (randomBit < LEISURE_CHANCE) { leisureSite = citizen.getCitizenColonyHandler().getColony().getBuildingManager().getRandomLeisureSite(); - if (leisureSite != null) + if (leisureSite == null) + { + if (citizen.getCitizenData().getHomeBuilding() != null) + { + leisureSite = citizen.getCitizenData().getHomeBuilding().getPosition(); + } + } + else { + citizen.getCitizenAI().setCurrentDelay(60 * 20); return GO_TO_LEISURE_SITE; } } citizen.getNavigation().moveToRandomPos(10, this.speed); - return IDLE; + return CitizenAIState.IDLE; } - @Override public boolean canUse() { - if (citizen.getDesiredActivity() == DesiredActivity.SLEEP) - { - return false; - } - return citizen.getDesiredActivity() != DesiredActivity.SLEEP && citizen.getNavigation().isDone() && !citizen.isBaby() + return citizen.getNavigation().isDone() && !citizen.isBaby() && !(citizen.getCitizenData().getJob() instanceof AbstractJobGuard); } - - @Override - public void tick() - { - stateMachine.tick(); - } - - @Override - public boolean canContinueToUse() - { - return !citizen.getNavigation().isDone() || stateMachine.getState() != IDLE; - } - - @Override - public void stop() - { - stateMachine.reset(); - citizen.getCitizenData().setVisibleStatus(null); - } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIEatTask.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIEatTask.java index 844ffe63673..246ad536415 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIEatTask.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIEatTask.java @@ -7,13 +7,11 @@ import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.crafting.ItemStorage; -import com.minecolonies.api.entity.ai.DesiredActivity; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; -import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.util.InventoryUtils; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.SoundUtils; import com.minecolonies.api.util.WorldUtil; import com.minecolonies.api.util.constant.CitizenConstants; @@ -26,31 +24,26 @@ import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.network.messages.client.ItemParticleEffectMessage; import com.minecolonies.coremod.util.AdvancementUtils; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.item.*; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.InteractionHand; -import net.minecraft.sounds.SoundEvents; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; - -import java.util.EnumSet; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.*; import static com.minecolonies.api.research.util.ResearchConstants.SATURATION; import static com.minecolonies.api.util.ItemStackUtils.CAN_EAT; import static com.minecolonies.api.util.ItemStackUtils.ISCOOKABLE; -import static com.minecolonies.api.util.constant.CitizenConstants.LOW_SATURATION; import static com.minecolonies.api.util.constant.Constants.SECONDS_A_MINUTE; import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; import static com.minecolonies.api.util.constant.GuardConstants.BASIC_VOLUME; import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.coremod.entity.ai.minimal.EntityAIEatTask.EatingState.*; -import static com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenDiseaseHandler.SEEK_DOCTOR_HEALTH; /** * The AI task for citizens to execute when they are supposed to eat. */ -public class EntityAIEatTask extends Goal +public class EntityAIEatTask implements IStateAI { /** * Max waiting time for food in minutes.. @@ -75,14 +68,13 @@ public class EntityAIEatTask extends Goal /** * Limit to go to the restaurant. */ - private static final double RESTAURANT_LIMIT = 2.5; + public static final double RESTAURANT_LIMIT = 2.5; /** * The different types of AIStates related to eating. */ public enum EatingState implements IState { - IDLE, CHECK_FOR_FOOD, GO_TO_HUT, SEARCH_RESTAURANT, @@ -90,7 +82,8 @@ public enum EatingState implements IState WAIT_FOR_FOOD, GET_FOOD_YOURSELF, GO_TO_EAT_POS, - EAT + EAT, + DONE } /** @@ -103,11 +96,6 @@ public enum EatingState implements IState */ private final EntityCitizen citizen; - /** - * AI statemachine - */ - private final TickRateStateMachine stateMachine; - /** * Ticks since we're waiting for something. */ @@ -142,19 +130,18 @@ public EntityAIEatTask(final EntityCitizen citizen) { super(); this.citizen = citizen; - this.setFlags(EnumSet.of(Goal.Flag.MOVE)); - - stateMachine = new TickRateStateMachine<>(IDLE, e -> Log.getLogger().warn("Eating AI threw exception:", e)); - - stateMachine.addTransition(new TickingTransition<>(IDLE, this::shouldEat, () -> CHECK_FOR_FOOD, 60)); - stateMachine.addTransition(new TickingTransition<>(CHECK_FOR_FOOD, () -> true, this::getFood, 20)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_HUT, () -> true, this::goToHut, 20)); - stateMachine.addTransition(new TickingTransition<>(EAT, () -> true, this::eat, 20)); - stateMachine.addTransition(new TickingTransition<>(SEARCH_RESTAURANT, () -> true, this::searchRestaurant, 20)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_RESTAURANT, () -> true, this::goToRestaurant, 20)); - stateMachine.addTransition(new TickingTransition<>(WAIT_FOR_FOOD, () -> true, this::waitForFood, 20)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_EAT_POS, () -> true, this::goToEatingPlace, 20)); - stateMachine.addTransition(new TickingTransition<>(GET_FOOD_YOURSELF, () -> true, this::getFoodYourself, 20)); + + citizen.getCitizenAI().addTransition(new TickingTransition<>(CitizenAIState.EATING,() -> true,() ->{ reset(); return CHECK_FOR_FOOD;},20)); + + citizen.getCitizenAI().addTransition(new TickingTransition<>(DONE, () -> true,() -> CitizenAIState.IDLE, 1)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(CHECK_FOR_FOOD, () -> true, this::getFood, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_HUT, () -> true, this::goToHut, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(EAT, () -> true, this::eat, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(SEARCH_RESTAURANT, () -> true, this::searchRestaurant, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_RESTAURANT, () -> true, this::goToRestaurant, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(WAIT_FOR_FOOD, () -> true, this::waitForFood, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_EAT_POS, () -> true, this::goToEatingPlace, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GET_FOOD_YOURSELF, () -> true, this::getFoodYourself, 20)); } /** @@ -172,64 +159,6 @@ private EatingState getFood() return GO_TO_HUT; } - /** - * Whether we should eat sth - * - * @return true if so - */ - public boolean shouldEat() - { - if (citizen.getDesiredActivity() == DesiredActivity.SLEEP) - { - return false; - } - - if (citizen.getCitizenDiseaseHandler().isSick() && citizen.getCitizenSleepHandler().isAsleep()) - { - return false; - } - - final ICitizenData citizenData = citizen.getCitizenData(); - if (citizenData == null || !citizen.isOkayToEat()) - { - return false; - } - - if (citizenData.getSaturation() <= CitizenConstants.AVERAGE_SATURATION) - { - if (citizenData.getSaturation() <= RESTAURANT_LIMIT || (citizenData.getSaturation() < LOW_SATURATION && citizen.getHealth() < SEEK_DOCTOR_HEALTH)) - { - return true; - } - - waitingTicks++; - if (waitingTicks >= SECONDS_A_MINUTE / 3 * MINUTES_BETWEEN_FOOD_CHECKS || citizenData.getWorkBuilding() == null) - { - waitingTicks = 0; - return true; - } - } - - return false; - } - - @Override - public boolean canUse() - { - if (citizen.getDesiredActivity() == DesiredActivity.SLEEP) - { - return false; - } - stateMachine.tick(); - return stateMachine.getState() != IDLE; - } - - @Override - public void tick() - { - stateMachine.tick(); - } - /** * Check if a citizen can eat something. * @@ -247,7 +176,7 @@ private boolean canEat(final ICitizenData citizenData, final ItemStack stack) * * @return the next state to go to, if successful idle. */ - private EatingState eat() + private IState eat() { if (!hasFood()) { @@ -255,13 +184,13 @@ private EatingState eat() } final ICitizenData citizenData = citizen.getCitizenData(); - final ItemStack stack = citizenData.getInventory().getStackInSlot(foodSlot); - if (!CAN_EAT.test(stack) || !canEat(citizenData, stack)) + final ItemStack foodStack = citizenData.getInventory().getStackInSlot(foodSlot); + if (!CAN_EAT.test(foodStack) || !canEat(citizenData, foodStack)) { return CHECK_FOR_FOOD; } - citizen.setItemInHand(InteractionHand.MAIN_HAND, stack); + citizen.setItemInHand(InteractionHand.MAIN_HAND, foodStack); citizen.swing(InteractionHand.MAIN_HAND); citizen.playSound(SoundEvents.GENERIC_EAT, (float) BASIC_VOLUME, (float) SoundUtils.getRandomPitch(citizen.getRandom())); @@ -280,22 +209,16 @@ private EatingState eat() return EAT; } + final FoodProperties itemFood = foodStack.getItem().getFoodProperties(foodStack, citizen); - final FoodProperties itemFood = stack.getItem().getFoodProperties(); - - Item containerItem = stack.getItem().getCraftingRemainingItem(); - if (containerItem == null && stack.getItem() instanceof BowlFoodItem) - { - containerItem = Items.BOWL; - } + ItemStack itemUseReturn = foodStack.finishUsingItem(citizen.level, citizen); final double satIncrease = itemFood.getNutrition() * (1.0 + citizen.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(SATURATION)); citizenData.increaseSaturation(satIncrease / 2.0); - citizenData.getInventory().extractItem(foodSlot, 1, false); - if (containerItem != null && !(containerItem instanceof AirItem)) + if (!itemUseReturn.isEmpty() && itemUseReturn.getItem() != foodStack.getItem()) { if (citizenData.getInventory().isFull()) { @@ -304,22 +227,22 @@ private EatingState eat() citizen.getX(), citizen.getY(), citizen.getZ(), - new ItemStack(containerItem, 1) + itemUseReturn ); } else { - InventoryUtils.addItemStackToItemHandler(citizenData.getInventory(), new ItemStack(containerItem, 1)); + InventoryUtils.addItemStackToItemHandler(citizenData.getInventory(), itemUseReturn); } } IColony citizenColony = citizen.getCitizenColonyHandler().getColony(); if (citizenColony != null) { - AdvancementUtils.TriggerAdvancementPlayersForColony(citizenColony, playerMP -> AdvancementTriggers.CITIZEN_EAT_FOOD.trigger(playerMP, stack)); + AdvancementUtils.TriggerAdvancementPlayersForColony(citizenColony, playerMP -> AdvancementTriggers.CITIZEN_EAT_FOOD.trigger(playerMP, foodStack)); } - citizenData.markDirty(); + citizenData.markDirty(60); citizen.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); if (citizenData.getSaturation() < CitizenConstants.FULL_SATURATION && !citizenData.getInventory().getStackInSlot(foodSlot).isEmpty()) @@ -327,7 +250,9 @@ private EatingState eat() waitingTicks = 0; return EAT; } - return IDLE; + + citizenData.setJustAte(true); + return CitizenAIState.IDLE; } /** @@ -603,18 +528,4 @@ private void reset() restaurantPos = null; eatPos = null; } - - @Override - public void stop() - { - reset(); - stateMachine.reset(); - citizen.getCitizenData().setVisibleStatus(null); - } - - @Override - public void start() - { - citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.EAT); - } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIInteractToggleAble.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIInteractToggleAble.java index c96b1e696eb..5e01b5d0aef 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIInteractToggleAble.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIInteractToggleAble.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.entity.ai.minimal; import com.minecolonies.api.util.WorldUtil; +import com.minecolonies.api.util.constant.ColonyConstants; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.goal.Goal; @@ -129,6 +130,13 @@ public boolean canUse() return false; } + @Override + public void start() + { + super.start(); + updateTimer = 0; + } + /** * Checks if there exists a path. * @@ -377,7 +385,7 @@ public void tick() { return; } - updateTimer = 20 + offSet; + updateTimer = ColonyConstants.rand.nextInt(40 + offSet); if (!checkPath()) { diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIMournCitizen.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIMournCitizen.java index 050986cb5f0..57b60ee8a42 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIMournCitizen.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIMournCitizen.java @@ -2,44 +2,42 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.Status; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; -import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import com.minecolonies.api.tileentities.TileEntityNamedGrave; -import com.minecolonies.api.util.*; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.MathUtils; +import com.minecolonies.api.util.Tuple; +import com.minecolonies.api.util.WorldUtil; import com.minecolonies.coremod.colony.buildings.modules.GraveyardManagementModule; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingGraveyard; import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.targeting.TargetingConditions; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; import org.apache.commons.lang3.StringUtils; -import java.util.*; +import java.util.Iterator; +import java.util.List; +import java.util.Set; import static com.minecolonies.api.util.constant.Constants.DEFAULT_SPEED; -import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; - -import net.minecraft.world.entity.ai.goal.Goal.Flag; /** * Citizen mourning goal. Has citizens randomly walk around townhall. */ -public class EntityAIMournCitizen extends Goal +public class EntityAIMournCitizen implements IStateAI { /** * Different mourning states. */ public enum MourningState implements IState { - IDLE, DECIDE, WALKING_TO_TOWNHALL, WANDERING, @@ -49,11 +47,6 @@ public enum MourningState implements IState WALK_TO_GRAVE } - /** - * AI statemachine - */ - private final TickRateStateMachine stateMachine; - /** * handler to the citizen thisis located */ @@ -97,52 +90,36 @@ public EntityAIMournCitizen(final EntityCitizen citizen, final double speed) super(); this.citizen = citizen; this.speed = speed; - this.setFlags(EnumSet.of(Flag.MOVE)); - - stateMachine = new TickRateStateMachine<>(MourningState.IDLE, e -> Log.getLogger().warn("Mourning AI threw exception:", e)); - - stateMachine.addTransition(new TickingTransition<>(MourningState.IDLE, () -> true, () -> MourningState.DECIDE, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.DECIDE, () -> true, this::decide, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.WALKING_TO_TOWNHALL, () -> true, this::walkToTownHall, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.WANDERING, () -> true, this::wander, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.STARING, () -> true, this::stare, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.WALKING_TO_GRAVEYARD, () -> true, this::walkToGraveyard, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.WANDER_AT_GRAVEYARD, () -> true, this::wanderAtGraveyard, 20)); - stateMachine.addTransition(new TickingTransition<>(MourningState.WALK_TO_GRAVE, () -> true, this::walkToGrave, 20)); - } - /** - * Check if the citizen should still be mourning. - * @return true if so. - */ - private boolean shouldMourn() - { - final boolean shouldMourn = citizen.getDesiredActivity() == DesiredActivity.MOURN; - if (shouldMourn && this.citizen.getRandom().nextInt(AVERAGE_MOURN_TIME) < 1) - { - this.citizen.getCitizenData().getCitizenMournHandler().clearDeceasedCitizen(); - this.citizen.getCitizenData().getCitizenMournHandler().setMourning(false); - citizen.getCitizenData().setVisibleStatus(null); - } - return shouldMourn; + citizen.getCitizenAI().addTransition(new TickingTransition<>(CitizenAIState.MOURN, () -> { + reset(); + return true; + }, () -> MourningState.DECIDE, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.DECIDE, () -> true, this::decide, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.WALKING_TO_TOWNHALL, () -> true, this::walkToTownHall, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.WANDERING, () -> true, this::wander, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.STARING, () -> true, this::stare, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.WALKING_TO_GRAVEYARD, () -> true, this::walkToGraveyard, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.WANDER_AT_GRAVEYARD, () -> true, this::wanderAtGraveyard, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(MourningState.WALK_TO_GRAVE, () -> true, this::walkToGrave, 20)); } /** * Path to the townhall. * @return IDLE again. */ - private MourningState walkToTownHall() + private IState walkToTownHall() { final BlockPos pos = getMournLocation(); citizen.getNavigation().moveToXYZ(pos.getX(), pos.getY(), pos.getZ(), this.speed); - return MourningState.IDLE; + return CitizenAIState.IDLE; } /** * Path to the graveyard. * @return the next state to go to. */ - private MourningState walkToGraveyard() + private IState walkToGraveyard() { if (graveyard == null) { @@ -162,19 +139,13 @@ private MourningState walkToGraveyard() * While wandering at the graveyard, the chance to stop mourning is doubled. * @return the next state to go to. */ - private MourningState wanderAtGraveyard() + private IState wanderAtGraveyard() { if (graveyard == null) { return MourningState.DECIDE; } - // Double the chance to stop mourning by checking here as well. - if (!shouldMourn()) - { - return MourningState.IDLE; - } - final IBuilding graveyardBuilding = citizen.getCitizenColonyHandler().getColony().getBuildingManager().getBuilding(graveyard); if (!(graveyardBuilding instanceof BuildingGraveyard)) { @@ -190,7 +161,7 @@ private MourningState wanderAtGraveyard() // Wander around randomly. if (MathUtils.RANDOM.nextInt(100) < 90) { - citizen.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, graveyardBuilding.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ); + citizen.getNavigation().moveToRandomPos(10, DEFAULT_SPEED, graveyardBuilding.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, false); return MourningState.WANDER_AT_GRAVEYARD; } @@ -229,19 +200,13 @@ private MourningState wanderAtGraveyard() * Walk to grave state. * @return next state. */ - private MourningState walkToGrave() + private IState walkToGrave() { if (gravePos == null) { return MourningState.DECIDE; } - // Double the chance to stop mourning by checking here as well. - if (!shouldMourn()) - { - return MourningState.IDLE; - } - if (!citizen.isWorkerAtSiteWithMove(gravePos, 3)) { return MourningState.WALK_TO_GRAVE; @@ -254,22 +219,22 @@ private MourningState walkToGrave() * Wander around randomly. * @return also IDLE again. */ - private MourningState wander() + private IState wander() { citizen.getNavigation().moveToRandomPos(10, this.speed); - return MourningState.IDLE; + return CitizenAIState.IDLE; } /** * State at a random player around. * @return Staring if there is a player, else IDLE. */ - private MourningState stare() + private IState stare() { if (this.citizen.getRandom().nextInt(AVERAGE_STARE_TIME) < 1) { closestEntity = null; - return MourningState.IDLE; + return CitizenAIState.IDLE; } if (closestEntity == null) @@ -284,7 +249,7 @@ private MourningState stare() if (closestEntity == null) { - return MourningState.IDLE; + return CitizenAIState.IDLE; } } @@ -296,23 +261,11 @@ private MourningState stare() * Decide what to do next. * @return the next state to go to. */ - private MourningState decide() + private IState decide() { - if (citizen.getDesiredActivity() != DesiredActivity.MOURN) - { - return MourningState.IDLE; - } - if (!citizen.getNavigation().isDone()) { - return MourningState.IDLE; - } - - if (citizen.getCitizenStatusHandler().getStatus() != Status.MOURN) - { - citizen.getCitizenItemHandler().removeHeldItem(); - citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.MOURNING); - citizen.getCitizenStatusHandler().setStatus(Status.MOURN); + return CitizenAIState.IDLE; } if (this.citizen.getRandom().nextBoolean()) @@ -342,26 +295,8 @@ private MourningState decide() return MourningState.WANDERING; } - @Override - public boolean canUse() - { - if (citizen.getDesiredActivity() == DesiredActivity.MOURN && MathUtils.RANDOM.nextInt(20) < 1) - { - return shouldMourn(); - } - return citizen.getDesiredActivity() == DesiredActivity.MOURN; - } - - @Override - public void tick() - { - stateMachine.tick(); - } - - @Override - public void stop() + public void reset() { - stateMachine.reset(); citizen.getCitizenData().setVisibleStatus(null); this.graveyard = null; this.gravePos = null; diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISickTask.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISickTask.java index e5b872bcd90..a08556731b3 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISickTask.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISickTask.java @@ -5,55 +5,44 @@ import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.interactionhandling.ChatPriority; -import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.statemachine.AIEventTarget; -import com.minecolonies.api.entity.ai.statemachine.states.AIBlockingEventType; -import com.minecolonies.api.entity.ai.statemachine.states.IAIState; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; -import com.minecolonies.api.util.*; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.Disease; +import com.minecolonies.api.util.InventoryUtils; +import com.minecolonies.api.util.SoundUtils; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingHospital; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; -import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.network.messages.client.CircleParticleEffectMessage; -import net.minecraft.world.level.block.BedBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.item.ItemStack; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.level.block.state.properties.BedPart; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BedPart; -import java.util.EnumSet; import java.util.List; -import static com.minecolonies.api.util.constant.CitizenConstants.LOW_SATURATION; -import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; import static com.minecolonies.api.util.constant.GuardConstants.BASIC_VOLUME; import static com.minecolonies.api.util.constant.TranslationConstants.NO_HOSPITAL; import static com.minecolonies.api.util.constant.TranslationConstants.WAITING_FOR_CURE; import static com.minecolonies.coremod.entity.ai.minimal.EntityAISickTask.DiseaseState.*; import static com.minecolonies.coremod.entity.citizen.citizenhandlers.CitizenDiseaseHandler.SEEK_DOCTOR_HEALTH; -import net.minecraft.world.entity.ai.goal.Goal.Flag; - /** * The AI task for citizens to execute when they are supposed to eat. */ -public class EntityAISickTask extends Goal +public class EntityAISickTask implements IStateAI { /** * Min distance to hut before pathing to hospital. @@ -105,7 +94,6 @@ public class EntityAISickTask extends Goal */ public enum DiseaseState implements IState { - IDLE, CHECK_FOR_CURE, GO_TO_HUT, SEARCH_HOSPITAL, @@ -126,11 +114,6 @@ public enum DiseaseState implements IState */ private BlockPos placeToPath; - /** - * AI statemachine - */ - private final ITickRateStateMachine stateMachine; - /** * Instantiates this task. * @@ -141,53 +124,35 @@ public EntityAISickTask(final EntityCitizen citizen) super(); this.citizen = citizen; this.citizenData = citizen.getCitizenData(); - this.setFlags(EnumSet.of(Flag.MOVE)); - - stateMachine = new TickRateStateMachine<>(IDLE, e -> Log.getLogger().warn("Disease AI threw exception:", e)); - stateMachine.addTransition(new TickingTransition<>(IDLE, this::isSick, () -> CHECK_FOR_CURE, 20)); - stateMachine.addTransition(new AIEventTarget(AIBlockingEventType.AI_BLOCKING, () -> true, this::setNotWorking, 20)); - stateMachine.addTransition(new TickingTransition<>(CHECK_FOR_CURE, () -> true, this::checkForCure, 20)); - stateMachine.addTransition(new TickingTransition<>(WANDER, () -> true, this::wander, 200)); - - stateMachine.addTransition(new TickingTransition<>(CHECK_FOR_CURE, () -> true, this::checkForCure, 20)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_HUT, () -> true, this::goToHut, 20)); - stateMachine.addTransition(new TickingTransition<>(SEARCH_HOSPITAL, () -> true, this::searchHospital, 20)); - stateMachine.addTransition(new TickingTransition<>(GO_TO_HOSPITAL, () -> true, this::goToHospital, 20)); - stateMachine.addTransition(new TickingTransition<>(WAIT_FOR_CURE, () -> true, this::waitForCure, 20)); - stateMachine.addTransition(new TickingTransition<>(APPLY_CURE, () -> true, this::applyCure, 20)); - stateMachine.addTransition(new TickingTransition<>(FIND_EMPTY_BED, () -> true, this::findEmptyBed, 20)); - } - private DiseaseState setNotWorking() - { - final IJob job = citizen.getCitizenJobHandler().getColonyJob(); - if (job != null && stateMachine.getState() != IDLE) - { - citizenData.setWorking(false); - citizen.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, TICKS_SECOND * 30)); - } - - return null; + citizen.getCitizenAI().addTransition(new TickingTransition<>(CitizenAIState.SICK, this::isSick, () -> CHECK_FOR_CURE, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(CHECK_FOR_CURE, () -> true, this::checkForCure, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(WANDER, () -> true, this::wander, 200)); + + citizen.getCitizenAI().addTransition(new TickingTransition<>(CHECK_FOR_CURE, () -> true, this::checkForCure, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_HUT, () -> true, this::goToHut, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(SEARCH_HOSPITAL, () -> true, this::searchHospital, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(GO_TO_HOSPITAL, () -> true, this::goToHospital, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(WAIT_FOR_CURE, () -> true, this::waitForCure, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(APPLY_CURE, () -> true, this::applyCure, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(FIND_EMPTY_BED, () -> true, this::findEmptyBed, 20)); } private boolean isSick() { - if (citizen.getDesiredActivity() == DesiredActivity.SLEEP && !citizen.isSleeping()) - { - return false; - } - - if (citizen.getCitizenJobHandler().getColonyJob() != null && !citizen.getCitizenJobHandler().getColonyJob().canAIBeInterrupted()) + if (citizen.getCitizenDiseaseHandler().isSick() + || citizen.getCitizenDiseaseHandler().isHurt()) { - return false; + reset(); + return true; } - return citizen.getCitizenDiseaseHandler().isSick() - || (!(citizen.getCitizenJobHandler() instanceof AbstractJobGuard) && citizen.getHealth() < SEEK_DOCTOR_HEALTH && citizenData.getSaturation() > LOW_SATURATION); + return false; } /** * Do a bit of wandering. + * * @return start over. */ public DiseaseState wander() @@ -196,18 +161,6 @@ public DiseaseState wander() return CHECK_FOR_CURE; } - - @Override - public boolean canUse() - { - if (citizen.getDesiredActivity() == DesiredActivity.SLEEP) - { - return false; - } - stateMachine.tick(); - return stateMachine.getState() != IDLE; - } - /** * Find an empty bed to ly in. * @@ -247,6 +200,7 @@ private DiseaseState findEmptyBed() && state.getValue(BedBlock.PART).equals(BedPart.HEAD) && world.isEmptyBlock(pos.above())) { + citizen.getCitizenDiseaseHandler().setSleepsAtHospital(); usedBed = pos; ((BuildingHospital) hospital).registerPatient(usedBed, citizen.getCivilianID()); return FIND_EMPTY_BED; @@ -284,7 +238,7 @@ private DiseaseState findEmptyBed() * * @return the next state to go to, if successful idle. */ - private DiseaseState applyCure() + private IState applyCure() { if (checkForCure() != APPLY_CURE) { @@ -311,12 +265,11 @@ private DiseaseState applyCure() } cure(); - return IDLE; + return CitizenAIState.IDLE; } /** * Cure the citizen. - * */ private void cure() { @@ -343,7 +296,6 @@ private void cure() citizen.getCitizenData().setBedPos(BlockPos.ZERO); } citizen.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); - citizenData.markDirty(); citizen.getCitizenDiseaseHandler().cure(); citizen.setHealth(citizen.getMaxHealth()); reset(); @@ -354,7 +306,7 @@ private void cure() * * @return the next state to go to. */ - private DiseaseState waitForCure() + private IState waitForCure() { final IColony colony = citizenData.getColony(); placeToPath = colony.getBuildingManager().getBestBuilding(citizen, BuildingHospital.class); @@ -364,21 +316,21 @@ private DiseaseState waitForCure() return SEARCH_HOSPITAL; } - final DiseaseState state = checkForCure(); + final IState state = checkForCure(); if (state == APPLY_CURE) { return APPLY_CURE; } - else if (state == IDLE) + else if (state == CitizenAIState.IDLE) { reset(); - return IDLE; + return CitizenAIState.IDLE; } if (citizen.getRandom().nextInt(10000) < CHANCE_FOR_RANDOM_CURE) { cure(); - return IDLE; + return CitizenAIState.IDLE; } if (citizen.getCitizenSleepHandler().isAsleep()) @@ -412,7 +364,7 @@ else if (state == IDLE) * * @return the next state to go to. */ - private DiseaseState goToHut() + private IState goToHut() { final IBuilding buildingWorker = citizenData.getWorkBuilding(); if (buildingWorker == null) @@ -432,7 +384,7 @@ private DiseaseState goToHut() * * @return the next state to go to. */ - private DiseaseState goToHospital() + private IState goToHospital() { if (placeToPath == null) { @@ -451,7 +403,7 @@ private DiseaseState goToHospital() * * @return the next state to go to. */ - private DiseaseState searchHospital() + private IState searchHospital() { final IColony colony = citizenData.getColony(); placeToPath = colony.getBuildingManager().getBestBuilding(citizen, BuildingHospital.class); @@ -461,7 +413,7 @@ private DiseaseState searchHospital() final String id = citizen.getCitizenDiseaseHandler().getDisease(); if (id.isEmpty()) { - return IDLE; + return CitizenAIState.IDLE; } final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(id); citizenData.triggerInteraction(new StandardInteraction(Component.translatable(NO_HOSPITAL, disease.getName(), disease.getCureString()), @@ -485,7 +437,7 @@ else if (!citizen.getCitizenDiseaseHandler().getDisease().isEmpty()) * * @return the next state to go to. */ - private DiseaseState checkForCure() + private IState checkForCure() { final String id = citizen.getCitizenDiseaseHandler().getDisease(); if (id.isEmpty()) @@ -493,7 +445,7 @@ private DiseaseState checkForCure() if (citizen.getHealth() > SEEK_DOCTOR_HEALTH) { reset(); - return IDLE; + return CitizenAIState.IDLE; } return GO_TO_HUT; } @@ -509,7 +461,7 @@ private DiseaseState checkForCure() } reset(); - return IDLE; + return CitizenAIState.IDLE; } } return APPLY_CURE; @@ -527,15 +479,7 @@ private void reset() placeToPath = null; } - @Override - public void stop() - { - reset(); - stateMachine.reset(); - citizen.getCitizenData().setVisibleStatus(null); - } - - @Override + // TODO: Citizen AI should set status icons public void start() { citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISleep.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISleep.java index 53425976f4f..22a755c4e49 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISleep.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAISleep.java @@ -1,46 +1,44 @@ package com.minecolonies.coremod.entity.ai.minimal; +import com.ldtteam.domumornamentum.block.decorative.PanelBlock; import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.Status; +import com.minecolonies.api.entity.ai.IStateAI; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; import com.minecolonies.api.entity.ai.statemachine.states.IState; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.sounds.EventType; import com.minecolonies.api.util.CompatibilityUtils; -import com.minecolonies.api.util.Log; import com.minecolonies.api.util.SoundUtils; import com.minecolonies.api.util.WorldUtil; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.modules.BedHandlingModule; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.network.messages.client.SleepingParticleMessage; +import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.block.state.properties.BedPart; -import net.minecraft.tags.BlockTags; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; import static com.minecolonies.api.util.constant.CitizenConstants.RANGE_TO_BE_HOME; +import static com.minecolonies.api.util.constant.HappinessConstants.SLEPTTONIGHT; import static com.minecolonies.coremod.entity.ai.minimal.EntityAISleep.SleepState.*; -import net.minecraft.world.entity.ai.goal.Goal.Flag; - /** * AI to send Entity to sleep. */ -public class EntityAISleep extends Goal +public class EntityAISleep implements IStateAI { /** * Interval between sleeping particles @@ -74,17 +72,11 @@ public class EntityAISleep extends Goal public enum SleepState implements IState { - AWAKE, WALKING_HOME, FIND_BED, SLEEPING; } - /** - * The AI's state machine - */ - private TickRateStateMachine stateMachine; - /** * Initiate the sleep task. * @@ -92,28 +84,24 @@ public enum SleepState implements IState */ public EntityAISleep(final EntityCitizen citizen) { - super(); - this.setFlags(EnumSet.of(Flag.MOVE)); this.citizen = citizen; // 100 blocks - 30 seconds - straight line - stateMachine = new TickRateStateMachine<>(SleepState.AWAKE, e -> Log.getLogger().warn(e)); - stateMachine.addTransition(new TickingTransition<>(AWAKE, this::wantSleep, () -> { - initAI(); - return WALKING_HOME; - }, 20)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(CitizenAIState.SLEEP, () -> true, this::checkSleep, 20)); - stateMachine.addTransition(new TickingTransition<>(WALKING_HOME, () -> true, this::walkHome, 30)); - stateMachine.addTransition(new TickingTransition<>(FIND_BED, () -> !wantSleep(), () -> { - resetAI(); - return AWAKE; - }, 20)); - stateMachine.addTransition(new TickingTransition<>(FIND_BED, this::findBed, () -> SLEEPING, 30)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(WALKING_HOME, () -> true, this::walkHome, 30)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(FIND_BED, this::findBed, () -> SLEEPING, 30)); + citizen.getCitizenAI().addTransition(new TickingTransition<>(SLEEPING, () -> true, this::sleep, TICK_INTERVAL)); + } - stateMachine.addTransition(new TickingTransition<>(SLEEPING, () -> !wantSleep(), () -> { - resetAI(); - return AWAKE; - }, 20)); - stateMachine.addTransition(new TickingTransition<>(SLEEPING, () -> true, this::sleep, TICK_INTERVAL)); + /** + * Checks for sleep + * + * @return + */ + private IState checkSleep() + { + initAI(); + return WALKING_HOME; } /** @@ -121,7 +109,7 @@ public EntityAISleep(final EntityCitizen citizen) * * @return */ - private SleepState walkHome() + private IState walkHome() { final IBuilding homeBuilding = citizen.getCitizenData().getHomeBuilding(); if (homeBuilding == null) @@ -157,57 +145,14 @@ private boolean findBed() return true; } - /** - * Whether the citizen wants to sleep - * - * @return true if wants to sleep - */ - private boolean wantSleep() - { - return citizen.getLastHurtByMob() == null && (citizen.getDesiredActivity() == DesiredActivity.SLEEP); - } - - /** - * Tests if the sleeping should be executed. Only execute if he should sleep and he is at home. - * - * @return true if so. - */ - @Override - public boolean canUse() - { - stateMachine.tick(); - return stateMachine.getState() != AWAKE; - } - - /** - * Continue executing if he should sleep. Call the wake up method as soon as this isn't the case anymore. Might search a bed while he is trying to sleep. - * - * @return true while he should sleep. - */ - @Override - public boolean canContinueToUse() - { - return stateMachine.getState() != AWAKE && wantSleep(); - } - /** * On init set his status to sleeping. */ public void initAI() { - citizen.getCitizenStatusHandler().setStatus(Status.SLEEPING); usedBed = null; } - /** - * Called while he is trying to sleep. Might add sleeping sounds here. - */ - @Override - public void tick() - { - stateMachine.tick(); - } - private void findBedAndTryToSleep() { // Finding bed @@ -240,7 +185,8 @@ private void findBedAndTryToSleep() && !state.getValue(BedBlock.OCCUPIED) && state.getValue(BedBlock.PART).equals(BedPart.HEAD) && !isBedOccupied(hut, pos) - && (above.is(BlockTags.BEDS) || !above.getMaterial().isSolid())) + && (above.is(BlockTags.BEDS) || above.getBlock() instanceof PanelBlock || above.getBlock() instanceof TrapDoorBlock || !above.getMaterial() + .isSolid())) { usedBed = pos; setBedOccupied(true); @@ -260,7 +206,7 @@ private void findBedAndTryToSleep() citizen.getCitizenData().setBedPos(BlockPos.ZERO); usedBed = null; } - citizen.getCitizenData().getCitizenHappinessHandler().resetModifier("slepttonight"); + citizen.getCitizenData().getCitizenHappinessHandler().resetModifier(SLEPTTONIGHT); } } } @@ -268,8 +214,13 @@ private void findBedAndTryToSleep() /** * Make sleeping */ - private SleepState sleep() + private IState sleep() { + if (usedBed != null && usedBed.distSqr(citizen.blockPosition()) > 3 * 3) + { + return WALKING_HOME; + } + Network.getNetwork().sendToTrackingEntity(new SleepingParticleMessage(citizen.getX(), citizen.getY() + 1.0d, citizen.getZ()), citizen); //TODO make sleeping noises here. return null; @@ -281,7 +232,10 @@ private SleepState sleep() private void goHome() { final BlockPos pos = citizen.getCitizenSleepHandler().findHomePos(); - citizen.isWorkerAtSiteWithMove(pos, 2); + if (!citizen.isWorkerAtSiteWithMove(pos, 2) && citizen.getPose() == Pose.SLEEPING) + { + citizen.setPose(Pose.STANDING); + } final int chance = citizen.getRandom().nextInt(CHANCE); if (chance <= 1 && citizen.getCitizenColonyHandler().getWorkBuilding() != null && citizen.getCitizenJobHandler().getColonyJob() != null) @@ -331,41 +285,4 @@ private boolean isBedOccupied(IBuilding hut, BlockPos bed) } return false; } - - @Override - public void stop() - { - resetAI(); - stateMachine.reset(); - } - - /** - * Resets the AI state - */ - private void resetAI() - { - citizen.getCitizenData().setVisibleStatus(null); - citizen.getCitizenSleepHandler().onWakeUp(); - - // Clean bed state - if (usedBed != null) - { - final BlockState state = citizen.level.getBlockState(usedBed); - if (state.is(BlockTags.BEDS)) - { - final IColony colony = citizen.getCitizenColonyHandler().getColony(); - if (colony != null && colony.getBuildingManager().getBuilding(citizen.getRestrictCenter()) != null) - { - final IBuilding hut = colony.getBuildingManager().getBuilding(citizen.getRestrictCenter()); - if (hut.hasModule(BedHandlingModule.class)) - { - setBedOccupied(false); - } - } - } - usedBed = null; - } - - bedTicks = 0; - } } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/LookAtEntityGoal.java b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/LookAtEntityGoal.java new file mode 100644 index 00000000000..367f660316b --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/entity/ai/minimal/LookAtEntityGoal.java @@ -0,0 +1,113 @@ +package com.minecolonies.coremod.entity.ai.minimal; + +import java.util.EnumSet; +import javax.annotation.Nullable; + +import com.minecolonies.api.util.WorldUtil; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; + +public class LookAtEntityGoal extends Goal +{ + public static final float DEFAULT_PROBABILITY = 0.02F; + protected final Mob mob; + @Nullable + protected Entity lookAt; + protected final float lookDistance; + private int lookTime; + protected final float probability; + private final boolean onlyHorizontal; + protected final Class lookAtType; + + public LookAtEntityGoal(Mob mob, Class lookAtType, float lookDistance) + { + this(mob, lookAtType, lookDistance, DEFAULT_PROBABILITY); + } + + public LookAtEntityGoal(Mob mob, Class lookAtType, float lookDistance, float probability) + { + this(mob, lookAtType, lookDistance, probability, false); + } + + public LookAtEntityGoal(Mob mob, Class lookAtType, float lookDistance, float probability, boolean p_148122_) + { + this.mob = mob; + this.lookAtType = lookAtType; + this.lookDistance = lookDistance; + this.probability = probability; + this.onlyHorizontal = p_148122_; + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); + } + + @Override + public boolean canUse() + { + if (this.mob.getRandom().nextFloat() >= this.probability) + { + return false; + } + else + { + if (this.mob.getTarget() != null) + { + this.lookAt = this.mob.getTarget(); + } + + if (this.lookAtType == Player.class) + { + this.lookAt = WorldUtil.getNearestPlayer(this.mob, this.mob.getBlockX(), this.mob.getBlockY() + 1, this.mob.getBlockZ(), lookDistance); + } + else + { + this.lookAt = WorldUtil.getNearestEntity(this.mob.level.getEntitiesOfClass(this.lookAtType, + this.mob.getBoundingBox().inflate(this.lookDistance, 3.0D, this.lookDistance), + (entity) -> true), this.mob, this.mob.getBlockX(), this.mob.getBlockY() + 1, this.mob.getBlockZ(), lookDistance); + } + + return this.lookAt != null; + } + } + + @Override + public boolean canContinueToUse() + { + if (!this.lookAt.isAlive()) + { + return false; + } + else if (this.mob.distanceToSqr(this.lookAt) > (double) (this.lookDistance * this.lookDistance)) + { + return false; + } + else + { + return this.lookTime > 0; + } + } + + @Override + public void start() + { + this.lookTime = this.adjustedTickDelay(40 + this.mob.getRandom().nextInt(40)); + } + + @Override + public void stop() + { + this.lookAt = null; + } + + @Override + public void tick() + { + if (this.lookAt.isAlive()) + { + double d0 = this.onlyHorizontal ? this.mob.getEyeY() : this.lookAt.getEyeY(); + this.mob.getLookControl().setLookAt(this.lookAt.getX(), d0, this.lookAt.getZ()); + --this.lookTime; + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/registry/MobAIRegistry.java b/src/main/java/com/minecolonies/coremod/entity/ai/registry/MobAIRegistry.java index f19a6bff035..cc42da13414 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/registry/MobAIRegistry.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/registry/MobAIRegistry.java @@ -4,10 +4,9 @@ import com.google.common.collect.Multimap; import com.minecolonies.api.entity.ai.IStateAI; import com.minecolonies.api.entity.ai.registry.IMobAIRegistry; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.IArcherMobEntity; import com.minecolonies.api.entity.mobs.IRangedMobEntity; -import com.minecolonies.api.entity.mobs.ISpearmanMobEntity; import com.minecolonies.coremod.entity.ai.minimal.EntityAIInteractToggleAble; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.entity.mobs.aitasks.EntityAIBreakDoor; @@ -31,9 +30,9 @@ public class MobAIRegistry implements IMobAIRegistry { - private final List> mobAiTasks = Lists.newArrayList(); - private final List> mobAiTargetTasks = Lists.newArrayList(); - private final List> mobStateAITasks = Lists.newArrayList(); + private final List> mobAiTasks = Lists.newArrayList(); + private final List> mobAiTargetTasks = Lists.newArrayList(); + private final List> mobStateAITasks = Lists.newArrayList(); public MobAIRegistry() { @@ -60,7 +59,7 @@ private static void setupMobAiTasks(final IMobAIRegistry registry) @NotNull @Override - public Multimap getEntityAiTasksForMobs(final AbstractEntityMinecoloniesMob mob) + public Multimap getEntityAiTasksForMobs(final AbstractEntityRaiderMob mob) { return mobAiTasks.stream().filter(wrapper -> wrapper.entityPredicate.test(mob)).collect(MultimapCollector.toMultimap( TaskInformationWrapper::getPriority, @@ -72,7 +71,7 @@ public Multimap getEntityAiTasksForMobs(final AbstractEntityMinec @NotNull @Override public IMobAIRegistry registerNewAiTaskForMobs( - final int priority, final Function aiTaskProducer, final Predicate applyPredicate) + final int priority, final Function aiTaskProducer, final Predicate applyPredicate) { mobAiTasks.add(new TaskInformationWrapper<>(priority, aiTaskProducer, applyPredicate)); return this; @@ -81,7 +80,7 @@ public IMobAIRegistry registerNewAiTaskForMobs( @NotNull @Override public IMobAIRegistry registerNewStateAI( - final Function aiTaskProducer, final Predicate applyPredicate) + final Function aiTaskProducer, final Predicate applyPredicate) { mobStateAITasks.add(new TaskInformationWrapper<>(0, aiTaskProducer, applyPredicate)); return this; @@ -89,9 +88,9 @@ public IMobAIRegistry registerNewStateAI( @NotNull @Override - public void applyToMob(final AbstractEntityMinecoloniesMob mob) + public void applyToMob(final AbstractEntityRaiderMob mob) { - for (final TaskInformationWrapper task : mobStateAITasks) + for (final TaskInformationWrapper task : mobStateAITasks) { if (task.entityPredicate.test(mob)) { @@ -99,7 +98,7 @@ public void applyToMob(final AbstractEntityMinecoloniesMob mob) } } - for (final TaskInformationWrapper task : mobAiTargetTasks) + for (final TaskInformationWrapper task : mobAiTargetTasks) { if (task.entityPredicate.test(mob)) { @@ -107,7 +106,7 @@ public void applyToMob(final AbstractEntityMinecoloniesMob mob) } } - for (final TaskInformationWrapper task : mobAiTasks) + for (final TaskInformationWrapper task : mobAiTasks) { if (task.entityPredicate.test(mob)) { @@ -118,7 +117,7 @@ public void applyToMob(final AbstractEntityMinecoloniesMob mob) @NotNull @Override - public Multimap getEntityAiTargetTasksForMobs(final AbstractEntityMinecoloniesMob mob) + public Multimap getEntityAiTargetTasksForMobs(final AbstractEntityRaiderMob mob) { return mobAiTargetTasks.stream().filter(wrapper -> wrapper.getEntityPredicate().test(mob)).collect(MultimapCollector.toMultimap( TaskInformationWrapper::getPriority, @@ -130,7 +129,7 @@ public Multimap getEntityAiTargetTasksForMobs(final AbstractEntit @NotNull @Override public IMobAIRegistry registerNewAiTargetTaskForMobs( - final int priority, final Function aiTaskProducer, final Predicate applyPredicate) + final int priority, final Function aiTaskProducer, final Predicate applyPredicate) { mobAiTargetTasks.add(new TaskInformationWrapper<>(priority, aiTaskProducer, applyPredicate)); return this; @@ -143,13 +142,13 @@ public IMobAIRegistry registerNewAiTargetTaskForMobs( */ private static final class TaskInformationWrapper { - private final int priority; - private final Function aiTaskProducer; - private final Predicate entityPredicate; + private final int priority; + private final Function aiTaskProducer; + private final Predicate entityPredicate; TaskInformationWrapper( final int priority, - final Function aiTaskProducer, final Predicate entityPredicate) + final Function aiTaskProducer, final Predicate entityPredicate) { this.priority = priority; this.aiTaskProducer = aiTaskProducer; @@ -161,7 +160,7 @@ public int getPriority() return priority; } - public Function getAiTaskProducer() + public Function getAiTaskProducer() { return aiTaskProducer; } diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/util/BuildingStructureHandler.java b/src/main/java/com/minecolonies/coremod/entity/ai/util/BuildingStructureHandler.java index 3ee8a46bd83..3c6fd48ea67 100755 --- a/src/main/java/com/minecolonies/coremod/entity/ai/util/BuildingStructureHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/util/BuildingStructureHandler.java @@ -10,6 +10,7 @@ import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; +import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.api.util.constant.ToolType; @@ -28,6 +29,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.ToolActions; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -214,6 +216,7 @@ public void triggerSuccess(final BlockPos pos, final List list, final for (final ItemStack stack : list) { structureAI.reduceNeededResources(stack); + structureAI.getWorker().getCitizenColonyHandler().getColony().getStatisticsManager().increment(BLOCKS_PLACED); } } @@ -233,7 +236,6 @@ public void triggerEntitySuccess(final BlockPos blockPos, final List for (final ItemStack stack : list) { structureAI.reduceNeededResources(stack); - structureAI.getWorker().getCitizenColonyHandler().getColony().getStatisticsManager().increment(BLOCKS_PLACED); } } } @@ -246,7 +248,6 @@ public boolean hasRequiredItems(@NotNull final List requiredItems) { if (ItemStackUtils.isTool(stack, ToolType.FLINT_N_STEEL)) { - //todo after 1.17 port try to find a generic way to handle this in Structurize. if (structureAI.checkForToolOrWeapon(ToolType.FLINT_N_STEEL)) { return false; @@ -259,6 +260,21 @@ public boolean hasRequiredItems(@NotNull final List requiredItems) return AbstractEntityAIStructure.hasListOfResInInvOrRequest(structureAI, itemList, itemList.size() > 1) == AbstractEntityAIStructure.ItemCheckResult.SUCCESS; } + @Override + public void consume(final List requiredItems) + { + if (this.getInventory() != null) + { + for (final ItemStack tempStack : requiredItems) + { + if (!ItemStackUtils.isEmpty(tempStack)) + { + InventoryUtils.reduceStackInItemHandler(this.getInventory(), tempStack); + } + } + } + } + @Override public boolean isCreative() { @@ -333,7 +349,9 @@ public boolean shouldBlocksBeConsideredEqual(final BlockState state1, final Bloc return block1 == block2; } - return block1 == Blocks.GRASS_BLOCK && block2 == Blocks.DIRT || block2 == Blocks.GRASS_BLOCK && block1 == Blocks.DIRT; + return (block1 == Blocks.GRASS_BLOCK && block2 == Blocks.DIRT) + || (block2 == Blocks.GRASS_BLOCK && block1 == Blocks.DIRT) + || (block1 == ModBlocks.blockRack && block2 == ModBlocks.blockRack); } /** diff --git a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIVisitor.java b/src/main/java/com/minecolonies/coremod/entity/ai/visitor/EntityAIVisitor.java similarity index 87% rename from src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIVisitor.java rename to src/main/java/com/minecolonies/coremod/entity/ai/visitor/EntityAIVisitor.java index e3c90868879..beb03214fb9 100644 --- a/src/main/java/com/minecolonies/coremod/entity/ai/minimal/EntityAIVisitor.java +++ b/src/main/java/com/minecolonies/coremod/entity/ai/visitor/EntityAIVisitor.java @@ -1,9 +1,9 @@ -package com.minecolonies.coremod.entity.ai.minimal; +package com.minecolonies.coremod.entity.ai.visitor; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.entity.ai.statemachine.states.EntityState; import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; -import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.util.Log; @@ -14,20 +14,15 @@ import com.minecolonies.coremod.entity.SittingEntity; import com.minecolonies.coremod.entity.citizen.VisitorCitizen; import com.minecolonies.coremod.util.NamedDamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.InteractionHand; import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.NotNull; -import java.util.EnumSet; - -import net.minecraft.world.entity.ai.goal.Goal.Flag; - /** * AI for visitors, they do sometimes nap on their place, sit on their place, randomly walk around inside building outline */ -public class EntityAIVisitor extends Goal +public class EntityAIVisitor implements IState { /** * Update interval during combat @@ -39,7 +34,6 @@ public class EntityAIVisitor extends Goal */ public enum VisitorState implements IState { - INIT, IDLE, SLEEPING, SITTING, @@ -52,11 +46,6 @@ public enum VisitorState implements IState */ private final VisitorCitizen citizen; - /** - * This AI's state changer. - */ - private final ITickRateStateMachine stateMachine; - /** * The tavern building for the citizen */ @@ -81,9 +70,9 @@ public EntityAIVisitor(@NotNull final AbstractEntityCitizen entity) { super(); this.citizen = (VisitorCitizen) entity; - stateMachine = new TickRateStateMachine<>(VisitorState.INIT, this::onException); - stateMachine.addTransition(new TickingTransition<>(VisitorState.INIT, this::isEntityLoaded, () -> VisitorState.IDLE, 50)); + ITickRateStateMachine stateMachine = entity.getEntityStateController(); + stateMachine.addTransition(new TickingTransition<>(EntityState.INIT, this::isEntityLoaded, () -> VisitorState.IDLE, 50)); stateMachine.addTransition(new TickingTransition<>(VisitorState.IDLE, () -> true, this::decide, 50)); stateMachine.addTransition(new TickingTransition<>(VisitorState.WANDERING, this::wander, () -> VisitorState.IDLE, 200)); stateMachine.addTransition(new TickingTransition<>(VisitorState.WANDERING, this::shouldFight, () -> VisitorState.COMBAT, 200)); @@ -93,7 +82,6 @@ public EntityAIVisitor(@NotNull final AbstractEntityCitizen entity) stateMachine.addTransition(new TickingTransition<>(VisitorState.IDLE, this::reduceTime, stateMachine::getState, 50)); stateMachine.addTransition(new TickingTransition<>(VisitorState.WANDERING, this::reduceTime, stateMachine::getState, 50)); stateMachine.addTransition(new TickingTransition<>(VisitorState.SITTING, this::reduceTime, stateMachine::getState, 50)); - setFlags(EnumSet.of(Flag.JUMP)); } /** @@ -104,7 +92,7 @@ public EntityAIVisitor(@NotNull final AbstractEntityCitizen entity) private boolean reduceTime() { citizen.getCitizenData().decreaseSaturation(0.02); - citizen.getCitizenData().markDirty(); + citizen.getCitizenData().markDirty(20 * 20); if (citizen.getCitizenData().getSaturation() <= 0) { citizen.getCitizenColonyHandler().getColony().getVisitorManager().removeCivilian(citizen.getCitizenData()); @@ -135,7 +123,7 @@ private boolean doFight() if (citizen.isWorkerAtSiteWithMove(new BlockPos(target.position()), 2) && citizen.hasLineOfSight(target)) { citizen.swing(InteractionHand.MAIN_HAND); - target.hurt(new NamedDamageSource("death.attack.entity.minecolonies.visitor", citizen), 10.0f); + target.hurt(new NamedDamageSource("entity.minecolonies.visitor", citizen), 10.0f); } return false; @@ -278,25 +266,6 @@ private void onException(final RuntimeException e) Log.getLogger().warn("Visitor AI of:" + citizen.getName() + " threw an Exception:", e); } - /** - * Returns whether the Goal should begin execution of avoiding. - */ - @Override - public boolean canUse() - { - return true; - } - - /** - * Returns whether an in-progress Goal should continue executing. - */ - @Override - public boolean canContinueToUse() - { - stateMachine.tick(); - return true; - } - /** * Resets saved data of internal logic */ @@ -308,10 +277,8 @@ private void resetLogic() /** * Resets the task. */ - @Override public void stop() { - stateMachine.reset(); resetLogic(); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenColonyHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenColonyHandler.java index f1cf4a0cf5d..92facd116e3 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenColonyHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenColonyHandler.java @@ -1,12 +1,12 @@ package com.minecolonies.coremod.entity.citizen; -import com.minecolonies.api.client.render.modeltype.registry.IModelTypeRegistry; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenColonyHandler; import com.minecolonies.api.util.Log; +import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; @@ -27,7 +27,7 @@ public class CitizenColonyHandler implements ICitizenColonyHandler /** * It's colony id. */ - protected int colonyId; + protected int colonyId = 0; /** * The colony reference. @@ -40,6 +40,8 @@ public class CitizenColonyHandler implements ICitizenColonyHandler */ protected boolean registered = false; + private boolean needsClientUpdate = false; + /** * Constructor for the experience handler. * @@ -101,6 +103,12 @@ public void registerWithColony(final int colonyID, final int citizenID) return; } + if (colony.getWorld() == null) + { + // Wait until colony loads world + return; + } + this.colony = colony; colony.getCitizenManager().registerCivilian(citizen); registered = true; @@ -112,7 +120,7 @@ public void registerWithColony(final int colonyID, final int citizenID) @Override public void updateColonyClient() { - if (citizen.getEntityData().isDirty()) + if (needsClientUpdate) { if (colonyId == 0) { @@ -130,7 +138,19 @@ public void updateColonyClient() citizen.setTextureId(citizen.getEntityData().get(DATA_TEXTURE)); citizen.setRenderMetadata(citizen.getEntityData().get(DATA_RENDER_METADATA)); citizen.setTexture(); - citizen.getEntityData().clearDirty(); + + needsClientUpdate = false; + } + } + + @Override + public void onSyncDataUpdate(final EntityDataAccessor data) + { + if (data.equals(DATA_COLONY_ID) || data.equals(DATA_CITIZEN_ID) || data.equals(DATA_IS_FEMALE) || data.equals(DATA_IS_CHILD.getId()) || data.equals(DATA_MODEL) + || data.equals(DATA_TEXTURE) + || data.equals(DATA_TEXTURE_SUFFIX) || data.equals(DATA_STYLE) || data.equals(DATA_RENDER_METADATA)) + { + needsClientUpdate = true; } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenCombatTracker.java b/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenCombatTracker.java new file mode 100644 index 00000000000..38ab46cd628 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/CitizenCombatTracker.java @@ -0,0 +1,116 @@ +package com.minecolonies.coremod.entity.citizen; + +import com.minecolonies.api.colony.jobs.IJob; +import com.minecolonies.api.util.constant.TranslationConstants; +import net.minecraft.network.chat.Component; +import net.minecraft.world.damagesource.CombatEntry; +import net.minecraft.world.damagesource.CombatTracker; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Adaptation of CombatTracker to properly handle citizen death messages. + */ +public class CitizenCombatTracker extends CombatTracker +{ + public CitizenCombatTracker(EntityCitizen citizen) + { + super(citizen); + } + + @Override + @NotNull + public Component getDeathMessage() + { + final IJob job = citizen().getCitizenJobHandler().getColonyJob(); + Component nameComponent; + if (job != null) + { + nameComponent = Component.translatable( + TranslationConstants.WORKER_DESC, + Component.translatable(job.getJobRegistryEntry().getTranslationKey()), + citizen().getCitizenData().getName()); + } + else + { + nameComponent = Component.translatable( + TranslationConstants.COLONIST_DESC, + citizen().getCitizenData().getName()); + } + //adapted from supermethod + CombatEntry lastEntry = getLastEntry(); + if (lastEntry == null) + { + return Component.translatable("death.attack.generic", nameComponent); + } + else + { + CombatEntry fall = getMostSignificantFall(); + Component attacker = lastEntry.getAttackerName(); + Entity entity = lastEntry.getSource().getEntity(); + Component result; + if (fall != null && lastEntry.getSource() == DamageSource.FALL) + { + Component fallAttacker = fall.getAttackerName(); + if (fall.getSource() != DamageSource.FALL && fall.getSource() != DamageSource.OUT_OF_WORLD) + { + if (fallAttacker != null && !fallAttacker.equals(attacker)) + { + Entity fallEntity = fall.getSource().getEntity(); + ItemStack stack = fallEntity instanceof LivingEntity ? ((LivingEntity) fallEntity).getMainHandItem() : ItemStack.EMPTY; + if (!stack.isEmpty() && stack.hasCustomHoverName()) + { + result = Component.translatable("death.fell.assist.item", nameComponent, fallAttacker, stack.getDisplayName()); + } + else + { + result = Component.translatable("death.fell.assist", nameComponent, fallAttacker); + } + } + else if (attacker != null) + { + ItemStack stack = entity instanceof LivingEntity ? ((LivingEntity) entity).getMainHandItem() : ItemStack.EMPTY; + if (!stack.isEmpty() && stack.hasCustomHoverName()) + { + result = Component.translatable("death.fell.finish.item", nameComponent, attacker, stack.getDisplayName()); + } + else + { + result = Component.translatable("death.fell.finish", nameComponent, attacker); + } + } + else + { + result = Component.translatable("death.fell.killer", nameComponent); + } + } + else + { + result = Component.translatable("death.fell.accident." + (fall.getLocation() == null ? "generic" : fall.getLocation()), nameComponent); + } + } + else + { + //adapted from DamageSource#getLocalizedDeathMessage + LivingEntity killer = citizen().getKillCredit(); + String s = "death.attack." + lastEntry.getSource().msgId; + result = killer != null + ? Component.translatable(killer instanceof Player ? s + ".player" : s, nameComponent, killer.getDisplayName()) + : Component.translatable(s, nameComponent); + } + return result; + } + } + + /** + * Helper method to cast the superclass's mob field to EntityCitizen. + */ + private EntityCitizen citizen() + { + return (EntityCitizen) getMob(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/EntityCitizen.java b/src/main/java/com/minecolonies/coremod/entity/citizen/EntityCitizen.java index 486de153283..54b1f5792ec 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/EntityCitizen.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/EntityCitizen.java @@ -6,7 +6,7 @@ import com.minecolonies.api.colony.buildings.IGuardBuilding; import com.minecolonies.api.colony.buildings.modules.IBuildingModule; import com.minecolonies.api.colony.buildings.registry.BuildingEntry; -import com.minecolonies.api.colony.interactionhandling.ChatPriority; +import com.minecolonies.api.colony.citizens.event.CitizenRemovedEvent; import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.colony.permissions.Action; import com.minecolonies.api.colony.permissions.IPermissions; @@ -14,9 +14,10 @@ import com.minecolonies.api.colony.requestsystem.location.ILocation; import com.minecolonies.api.compatibility.Compatibility; import com.minecolonies.api.entity.CustomGoalSelector; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.Status; import com.minecolonies.api.entity.ai.pathfinding.IWalkToProxy; +import com.minecolonies.api.entity.ai.statemachine.AIOneTimeEventTarget; +import com.minecolonies.api.entity.ai.statemachine.states.CitizenAIState; +import com.minecolonies.api.entity.ai.statemachine.states.EntityState; import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; @@ -25,6 +26,8 @@ import com.minecolonies.api.entity.citizen.Skill; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; import com.minecolonies.api.entity.citizen.citizenhandlers.*; +import com.minecolonies.api.entity.citizen.happiness.ExpirationBasedHappinessModifier; +import com.minecolonies.api.entity.citizen.happiness.StaticHappinessSupplier; import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; import com.minecolonies.api.entity.combat.threat.ThreatTable; import com.minecolonies.api.entity.pathfinding.PathResult; @@ -33,24 +36,32 @@ import com.minecolonies.api.items.ModItems; import com.minecolonies.api.sounds.EventType; import com.minecolonies.api.util.*; +import com.minecolonies.api.util.constant.HappinessConstants; import com.minecolonies.api.util.constant.TypeConstants; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.colony.Colony; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; import com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule; import com.minecolonies.coremod.colony.colonyEvents.citizenEvents.CitizenDiedEvent; -import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; -import com.minecolonies.coremod.colony.jobs.*; +import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; +import com.minecolonies.coremod.colony.jobs.JobKnight; +import com.minecolonies.coremod.colony.jobs.JobNetherWorker; +import com.minecolonies.coremod.colony.jobs.JobRanger; import com.minecolonies.coremod.entity.SittingEntity; import com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIBasic; +import com.minecolonies.coremod.entity.ai.citizen.CitizenAI; import com.minecolonies.coremod.entity.ai.citizen.guard.AbstractEntityAIGuard; -import com.minecolonies.coremod.entity.ai.minimal.*; +import com.minecolonies.coremod.entity.ai.minimal.EntityAICitizenChild; +import com.minecolonies.coremod.entity.ai.minimal.EntityAIInteractToggleAble; +import com.minecolonies.coremod.entity.ai.minimal.LookAtEntityGoal; import com.minecolonies.coremod.entity.citizen.citizenhandlers.*; import com.minecolonies.coremod.entity.pathfinding.EntityCitizenWalkToProxy; import com.minecolonies.coremod.entity.pathfinding.MovementHandler; import com.minecolonies.coremod.event.EventHandler; import com.minecolonies.coremod.network.messages.client.ItemParticleEffectMessage; import com.minecolonies.coremod.network.messages.client.VanillaParticleMessage; +import com.minecolonies.coremod.network.messages.client.colony.ColonyViewCitizenViewMessage; import com.minecolonies.coremod.network.messages.client.colony.PlaySoundForCitizenMessage; import com.minecolonies.coremod.network.messages.server.colony.OpenInventoryMessage; import com.minecolonies.coremod.util.TeleportHelper; @@ -60,12 +71,14 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.CombatRules; +import net.minecraft.world.damagesource.CombatTracker; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; @@ -73,9 +86,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.InteractGoal; -import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -86,10 +97,10 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Team; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidType; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -100,12 +111,13 @@ import java.util.*; import java.util.function.Supplier; -import static com.minecolonies.api.entity.citizen.VisibleCitizenStatus.*; import static com.minecolonies.api.research.util.ResearchConstants.*; import static com.minecolonies.api.util.ItemStackUtils.ISFOOD; import static com.minecolonies.api.util.constant.CitizenConstants.*; import static com.minecolonies.api.util.constant.Constants.*; -import static com.minecolonies.api.util.constant.NbtTagConstants.*; +import static com.minecolonies.api.util.constant.HappinessConstants.DAMAGE; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_CITIZEN; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_COLONY_ID; import static com.minecolonies.api.util.constant.StatisticsConstants.DEATH; import static com.minecolonies.api.util.constant.Suppression.INCREMENT_AND_DECREMENT_OPERATORS_SHOULD_NOT_BE_USED_IN_A_METHOD_CALL_OR_MIXED_WITH_OTHER_OPERATORS_IN_AN_EXPRESSION; import static com.minecolonies.api.util.constant.TranslationConstants.*; @@ -131,10 +143,6 @@ public class EntityCitizen extends AbstractEntityCitizen implements IThreatTable private static final double MAX_SPEED_FACTOR = 0.5; private static final int CALL_TO_HELP_AMOUNT = 2; - /** - * The citizen status handler. - */ - private final ICitizenStatusHandler citizenStatusHandler; /** * It's citizen Id. */ @@ -184,6 +192,11 @@ public class EntityCitizen extends AbstractEntityCitizen implements IThreatTable */ private ICitizenDiseaseHandler citizenDiseaseHandler; + /** + * Our custom combat tracker. + */ + private final CitizenCombatTracker combatTracker; + /** * The path-result of trying to move away */ @@ -194,11 +207,6 @@ public class EntityCitizen extends AbstractEntityCitizen implements IThreatTable */ private boolean child = false; - /** - * Whether the citizen is currently running away - */ - private boolean currentlyFleeing = false; - /** * Timer for the call for help cd. */ @@ -241,25 +249,9 @@ public class EntityCitizen extends AbstractEntityCitizen implements IThreatTable private Team cachedTeam; /** - * The entities states + * The citizen AI */ - private enum EntityState implements IState - { - INIT, - ACTIVE_SERVER, - ACTIVE_CLIENT, - INACTIVE; - } - - /** - * The statemachine for citizens - */ - private ITickRateStateMachine entityStatemachine = new TickRateStateMachine<>(EntityState.INIT, e -> Log.getLogger().warn(e)); - - /** - * The desired activity of the citizen - */ - private DesiredActivity desiredActivity = DesiredActivity.IDLE; + private ITickRateStateMachine citizenAI = new TickRateStateMachine<>(CitizenAIState.IDLE, e -> {}); /** * Constructor for a new citizen typed entity. @@ -267,14 +259,13 @@ private enum EntityState implements IState * @param type the entity type. * @param world the world. */ - public EntityCitizen(final EntityType type, final Level world) + public EntityCitizen(final EntityType type, final Level world) { super(type, world); this.goalSelector = new CustomGoalSelector(this.goalSelector); this.targetSelector = new CustomGoalSelector(this.targetSelector); this.citizenExperienceHandler = new CitizenExperienceHandler(this); this.citizenChatHandler = new CitizenChatHandler(this); - this.citizenStatusHandler = new CitizenStatusHandler(this); this.citizenItemHandler = new CitizenItemHandler(this); this.citizenInventoryHandler = new CitizenInventoryHandler(this); this.citizenColonyHandler = new CitizenColonyHandler(this); @@ -282,27 +273,32 @@ public EntityCitizen(final EntityType type, final Level wo this.citizenSleepHandler = new CitizenSleepHandler(this); this.citizenDiseaseHandler = new CitizenDiseaseHandler(this); + this.combatTracker = new CitizenCombatTracker(this); this.moveControl = new MovementHandler(this); this.setPersistenceRequired(); this.setCustomNameVisible(MineColonies.getConfig().getServer().alwaysRenderNameTag.get()); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.INIT, () -> true, this::initialize, 40)); + entityStateController.addTransition(new TickingTransition<>(EntityState.INIT, () -> true, this::initialize, 40)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, () -> { + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, () -> { citizenColonyHandler.updateColonyClient(); return false; }, () -> null, 1)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, this::shouldBeInactive, () -> EntityState.INACTIVE, TICKS_20)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, this::refreshCitizenDataView, () -> null, TICKS_20)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::updateSaturation, () -> null, HEAL_CITIZENS_AFTER)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::updateVisualData, () -> null, 200)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::onServerUpdateHandlers, () -> null, TICKS_20)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::onTickDecrements, () -> null, 1)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::shouldBeInactive, () -> EntityState.INACTIVE, TICKS_20)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::determineDesiredActivity, () -> null, 100)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, this::shouldBeInactive, () -> EntityState.INACTIVE, TICKS_20)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_CLIENT, this::refreshCitizenDataView, () -> null, TICKS_20)); - entityStatemachine.addTransition(new TickingTransition<>(EntityState.INACTIVE, this::isAlive, () -> EntityState.INIT, 100)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::updateSaturation, () -> null, HEAL_CITIZENS_AFTER)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::updateVisualData, () -> null, 200)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::onServerUpdateHandlers, () -> null, TICKS_20)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::onTickDecrements, () -> null, 1)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, this::shouldBeInactive, () -> EntityState.INACTIVE, TICKS_20)); + entityStateController.addTransition(new TickingTransition<>(EntityState.ACTIVE_SERVER, () -> { + citizenAI.tick(); + return false; + }, () -> null, 1)); + + entityStateController.addTransition(new TickingTransition<>(EntityState.INACTIVE, this::isAlive, () -> EntityState.INIT, 100)); } /** @@ -362,19 +358,14 @@ private EntityState initialize() @SuppressWarnings(INCREMENT_AND_DECREMENT_OPERATORS_SHOULD_NOT_BE_USED_IN_A_METHOD_CALL_OR_MIXED_WITH_OTHER_OPERATORS_IN_AN_EXPRESSION) private void initTasks() { + new CitizenAI(this); + int priority = 0; this.goalSelector.addGoal(priority, new FloatGoal(this)); - this.goalSelector.addGoal(++priority, - new EntityAICitizenAvoidEntity(this, Monster.class, (float) DISTANCE_OF_ENTITY_AVOID, LATER_RUN_SPEED_AVOID, INITIAL_RUN_SPEED_AVOID)); - this.goalSelector.addGoal(++priority, new EntityAIEatTask(this)); - this.goalSelector.addGoal(++priority, new EntityAISickTask(this)); - this.goalSelector.addGoal(++priority, new EntityAISleep(this)); this.goalSelector.addGoal(priority, new EntityAIInteractToggleAble(this, FENCE_TOGGLE, TRAP_TOGGLE, DOOR_TOGGLE)); this.goalSelector.addGoal(++priority, new InteractGoal(this, Player.class, WATCH_CLOSEST2, 1.0F)); this.goalSelector.addGoal(++priority, new InteractGoal(this, EntityCitizen.class, WATCH_CLOSEST2_FAR, WATCH_CLOSEST2_FAR_CHANCE)); - this.goalSelector.addGoal(++priority, new EntityAIMournCitizen(this, DEFAULT_SPEED)); - this.goalSelector.addGoal(++priority, new EntityAICitizenWander(this, DEFAULT_SPEED)); - this.goalSelector.addGoal(++priority, new LookAtPlayerGoal(this, LivingEntity.class, WATCH_CLOSEST)); + this.goalSelector.addGoal(++priority, new LookAtEntityGoal(this, LivingEntity.class, WATCH_CLOSEST)); } /** @@ -419,6 +410,19 @@ public InteractionResult checkAndHandleImportantInteractions(final Player player } } } + + if (!level.isClientSide && getCitizenData() != null) + { + final ColonyViewCitizenViewMessage message = new ColonyViewCitizenViewMessage((Colony) getCitizenData().getColony(), getCitizenData()); + Network.getNetwork().sendToPlayer(message, (ServerPlayer) player); + } + + if (citizenData != null && citizenData.getJob() != null) + { + ((AbstractEntityAIBasic) citizenData.getJob().getWorkerAI()).setDelay(TICKS_SECOND * 3); + getNavigation().stop(); + getLookControl().setLookAt(player); + } return InteractionResult.SUCCESS; } @@ -576,7 +580,7 @@ private void childFoodInteraction(final ItemStack usedStack, final Player player if (!level.isClientSide()) { - final double satIncrease = usedStack.getItem().getFoodProperties().getNutrition() * (1.0 + getCitizenColonyHandler().getColony() + final double satIncrease = usedStack.getItem().getFoodProperties(usedStack, this).getNutrition() * (1.0 + getCitizenColonyHandler().getColony() .getResearchManager() .getResearchEffects() .getEffectStrength(SATURATION)); @@ -618,13 +622,9 @@ private void childFoodInteraction(final ItemStack usedStack, final Player player */ private void eatFoodInteraction(final ItemStack usedStack, final Player player, final InteractionHand hand) { - usedStack.shrink(1); - player.setItemInHand(hand, usedStack); - interactionCooldown = 100; - if (!level.isClientSide()) { - final double satIncrease = usedStack.getItem().getFoodProperties().getNutrition() * (1.0 + getCitizenColonyHandler().getColony() + final double satIncrease = usedStack.getItem().getFoodProperties(usedStack, this).getNutrition() * (1.0 + getCitizenColonyHandler().getColony() .getResearchManager() .getResearchEffects() .getEffectStrength(SATURATION)); @@ -642,6 +642,23 @@ private void eatFoodInteraction(final ItemStack usedStack, final Player player, getYRot(), getEyeHeight()), this); } + + final ItemStack remainingItem = usedStack.finishUsingItem(level, this); + if (!remainingItem.isEmpty() && remainingItem.getItem() != usedStack.getItem()) + { + if (!player.getInventory().add(remainingItem)) + { + InventoryUtils.spawnItemStack( + player.level, + player.getX(), + player.getY(), + player.getZ(), + remainingItem + ); + } + } + + interactionCooldown = 100; } @Override @@ -682,10 +699,11 @@ public ICitizenDataView getCitizenDataView() public void addAdditionalSaveData(final CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putInt(TAG_STATUS, citizenStatusHandler.getStatus().ordinal()); - if (citizenColonyHandler.getColony() != null && citizenData != null) + + // Avoid accessing chunks in here, may cause loads during unload + compound.putInt(TAG_COLONY_ID, citizenColonyHandler.getColonyId()); + if (citizenData != null) { - compound.putInt(TAG_COLONY_ID, citizenColonyHandler.getColony().getID()); compound.putInt(TAG_CITIZEN, citizenData.getId()); } citizenDiseaseHandler.write(compound); @@ -696,10 +714,17 @@ public void readAdditionalSaveData(final CompoundTag compound) { super.readAdditionalSaveData(compound); - citizenStatusHandler.setStatus(Status.values()[compound.getInt(TAG_STATUS)]); - citizenColonyHandler.setColonyId(compound.getInt(TAG_COLONY_ID)); - citizenId = compound.getInt(TAG_CITIZEN); + if (compound.contains(TAG_COLONY_ID)) + { + citizenColonyHandler.setColonyId(compound.getInt(TAG_COLONY_ID)); + if (compound.contains(TAG_CITIZEN)) + { + citizenId = compound.getInt(TAG_CITIZEN); + citizenColonyHandler.registerWithColony(citizenColonyHandler.getColonyId(), citizenId); + } + } citizenDiseaseHandler.read(compound); + setPose(Pose.STANDING); } /** @@ -709,7 +734,6 @@ public void readAdditionalSaveData(final CompoundTag compound) public void aiStep() { super.aiStep(); - entityStatemachine.tick(); if (interactionCooldown > 0) { interactionCooldown--; @@ -767,7 +791,7 @@ private boolean onServerUpdateHandlers() EventHandler.onEnteringChunkEntity(this, currentChunk); } - if (!this.getEyeInFluidType().isAir() && !this.level.getBlockState(new BlockPos(this.getX(), this.getEyeY(), this.getZ())).is(Blocks.BUBBLE_COLUMN)) + if (!this.getEyeInFluidType().isAir() && !this.level.getBlockState(this.blockPosition()).is(Blocks.BUBBLE_COLUMN)) { this.moveTo(this.position().add(random.nextBoolean() ? 1 : 0, 0, random.nextBoolean() ? 1 : 0)); } @@ -777,7 +801,8 @@ private boolean onServerUpdateHandlers() @Override public int getMaxAirSupply() { - if (getCitizenColonyHandler() != null && getCitizenColonyHandler().getColony() != null && getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(MORE_AIR) > 0) + if (getCitizenColonyHandler() != null && getCitizenColonyHandler().getColony() != null + && getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(MORE_AIR) > 0) { return super.getMaxAirSupply() * 2; } @@ -901,7 +926,7 @@ private void decreaseWalkingSaturation() */ private void checkHeal() { - if (getHealth() < getMaxHealth()) + if (getHealth() < (citizenDiseaseHandler.isSick() ? getMaxHealth() / 3 : getMaxHealth()) && getLastHurtByMob() == null) { final double limitDecrease = getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(SATLIMIT); @@ -920,10 +945,6 @@ else if (citizenData.getSaturation() < LOW_SATURATION) } heal((float) healAmount); - if (healAmount > 0.1D) - { - citizenData.markDirty(); - } } } @@ -967,7 +988,7 @@ public void setRenderMetadata(final String metadata) if (citizenJobHandler.getColonyJob() != null && MineColonies.getConfig().getServer().enableInDevelopmentFeatures.get()) { setCustomName(Component.literal( - citizenData.getName() + " (" + citizenStatusHandler.getStatus() + ")[" + citizenJobHandler.getColonyJob().getNameTagDescription() + "]")); + citizenData.getName() + "[" + citizenJobHandler.getColonyJob().getNameTagDescription() + "]")); } } @@ -1063,26 +1084,14 @@ public IItemHandler getItemHandlerCitizen() * Mark the citizen dirty to synch the data with the client. */ @Override - public void markDirty() + public void markDirty(final int time) { if (citizenData != null) { - citizenData.markDirty(); + citizenData.markDirty(time); } } - /** - * Sets the size of the citizen entity - * - * @param width Width - * @param height Height - */ - @Override - public void setCitizensize(final @NotNull float width, final @NotNull float height) - { - this.dimensions = new EntityDimensions(width, height, false); - } - /** * Sets whether this entity is a child * @@ -1093,20 +1102,26 @@ public void setIsChild(final boolean isChild) { if (isChild && !this.child) { - goalSelector.addGoal(50, new EntityAICitizenChild(this)); - setCitizensize((float) CITIZEN_WIDTH / 2, (float) CITIZEN_HEIGHT / 2); + new EntityAICitizenChild(this); } else { if (!isChild && this.child) { + this.child = isChild; getCitizenJobHandler().setModelDependingOnJob(citizenJobHandler.getColonyJob()); } - setCitizensize((float) CITIZEN_WIDTH, (float) CITIZEN_HEIGHT); } this.child = isChild; this.getEntityData().set(DATA_IS_CHILD, isChild); - markDirty(); + refreshDimensions(); + markDirty(0); + } + + @Override + public float getScale() + { + return child ? 0.5f * super.getScale() : super.getScale(); } /** @@ -1141,7 +1156,7 @@ public void decreaseSaturationForAction() if (citizenData != null) { citizenData.decreaseSaturation(citizenColonyHandler.getPerBuildingFoodCost()); - citizenData.markDirty(); + citizenData.markDirty(20 * 20); } } @@ -1154,7 +1169,7 @@ public void decreaseSaturationForContinuousAction() if (citizenData != null) { citizenData.decreaseSaturation(citizenColonyHandler.getPerBuildingFoodCost() / 100.0); - citizenData.markDirty(); + citizenData.markDirty(20 * 60 * 2); } } @@ -1202,17 +1217,6 @@ public ICitizenChatHandler getCitizenChatHandler() return citizenChatHandler; } - /** - * The Handler for all status related methods. - * - * @return the instance of the handler. - */ - @Override - public ICitizenStatusHandler getCitizenStatusHandler() - { - return citizenStatusHandler; - } - /** * The Handler for all item related methods. * @@ -1297,138 +1301,12 @@ public void setCitizenDiseaseHandler(final ICitizenDiseaseHandler citizenDisease this.citizenDiseaseHandler = citizenDiseaseHandler; } - /** - * Check if the citizen can eat now by considering the state and the job goalSelector. - * - * @return true if so. - */ - @Override - public boolean isOkayToEat() - { - return !getCitizenSleepHandler().isAsleep() && getDesiredActivity() != DesiredActivity.SLEEP && (citizenJobHandler.getColonyJob() == null - || citizenJobHandler.getColonyJob().canAIBeInterrupted()); - } - - /** - * Check if the citizen can be fed. - * - * @return true if so. - */ - @Override - public boolean shouldBeFed() - { - return this.getCitizenData() != null && this.getCitizenData().getSaturation() <= AVERAGE_SATURATION && !this.getCitizenData().justAte() && isOkayToEat(); - } - - /** - * Check if the citizen is just idling at their job and can eat now. - * - * @return true if so. - */ - @Override - public boolean isIdlingAtJob() - { - return isOkayToEat() && (citizenJobHandler.getColonyJob() == null || citizenJobHandler.getColonyJob().isIdling()); - } - - /** - * Determines the desired activity - */ - private boolean determineDesiredActivity() - { - if (citizenJobHandler.getColonyJob() instanceof AbstractJobGuard) - { - desiredActivity = DesiredActivity.WORK; - return false; - } - - if (getCitizenColonyHandler().getColony().getRaiderManager().isRaided()) - { - citizenData.triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_RAID), ChatPriority.IMPORTANT)); - setVisibleStatusIfNone(RAIDED); - desiredActivity = DesiredActivity.SLEEP; - return false; - } - - // Sleeping - if (!WorldUtil.isPastTime(CompatibilityUtils.getWorldFromCitizen(this), NIGHT - 2000)) - { - if (desiredActivity == DesiredActivity.SLEEP) - { - setVisibleStatusIfNone(SLEEP); - return false; - } - - if (citizenSleepHandler.shouldGoSleep()) - { - citizenData.onGoSleep(); - citizenData.decreaseSaturation(citizenColonyHandler.getPerBuildingFoodCost() * 2); - citizenData.markDirty(); - citizenStatusHandler.setLatestStatus(Component.translatable("com.minecolonies.coremod.status.sleeping")); - desiredActivity = DesiredActivity.SLEEP; - return false; - } - } - - // Mourning - if (citizenData.getCitizenMournHandler().isMourning() && citizenData.getCitizenMournHandler().shouldMourn()) - { - if (!getCitizenColonyHandler().getColony().getRaiderManager().isRaided()) - { - citizenData.triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_MOURNING, - citizenData.getCitizenMournHandler().getDeceasedCitizens().iterator().next()), - Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_MOURNING), - ChatPriority.IMPORTANT)); - } - setVisibleStatusIfNone(MOURNING); - desiredActivity = DesiredActivity.MOURN; - return false; - } - - if (citizenSleepHandler.isAsleep() && !citizenDiseaseHandler.isSick()) - { - citizenSleepHandler.onWakeUp(); - } - - // Raining - if (CompatibilityUtils.getWorldFromCitizen(this).isRaining() && !shouldWorkWhileRaining() && !WorldUtil.isNetherType(level)) - { - citizenStatusHandler.setLatestStatus(Component.translatable("com.minecolonies.coremod.status.waiting"), - Component.translatable("com.minecolonies.coremod.status.rainStop")); - setVisibleStatusIfNone(BAD_WEATHER); - if (!citizenData.getColony().getRaiderManager().isRaided() - && !citizenData.getCitizenMournHandler().isMourning()) - { - citizenData.triggerInteraction(new StandardInteraction(Component.translatable(COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_RAINING), ChatPriority.HIDDEN)); - } - desiredActivity = DesiredActivity.SLEEP; - return false; - } - - if (isBaby() && getCitizenJobHandler().getColonyJob() instanceof JobPupil && level.getDayTime() % 24000 > NOON) - { - setVisibleStatusIfNone(HOUSE); - desiredActivity = DesiredActivity.IDLE; - return false; - } - - if (getCitizenJobHandler().getColonyJob() != null) - { - desiredActivity = DesiredActivity.WORK; - return false; - } - - setVisibleStatusIfNone(HOUSE); - desiredActivity = DesiredActivity.IDLE; - return false; - } - /** * Sets the visible status if there is none * * @param status status to set */ - private void setVisibleStatusIfNone(final VisibleCitizenStatus status) + public void setVisibleStatusIfNone(final VisibleCitizenStatus status) { if (getCitizenData().getStatus() == null) { @@ -1436,27 +1314,6 @@ private void setVisibleStatusIfNone(final VisibleCitizenStatus status) } } - @Override - @NotNull - public DesiredActivity getDesiredActivity() - { - return desiredActivity; - } - - /** - * Checks if the citizen should work even when it rains. - * - * @return true if his building level is bigger than 5. - */ - private boolean shouldWorkWhileRaining() - { - return MineColonies.getConfig().getServer().workersAlwaysWorkInRain.get() || - getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(WORKING_IN_RAIN) > 0 || - (citizenColonyHandler.getWorkBuilding() != null - && citizenColonyHandler.getWorkBuilding().hasModule(WorkerBuildingModule.class) - && citizenColonyHandler.getWorkBuilding().getFirstModuleOccurance(WorkerBuildingModule.class).canWorkDuringTheRain()); - } - @Override public float getRotationYaw() { @@ -1595,24 +1452,6 @@ private boolean checkIfValidDamageSource(final DamageSource source, final float return true; } - @Override - public void move(final MoverType typeIn, final Vec3 pos) - { - //todo someaddons: remove this on the minimum AI rework. - if (pos.x != 0 || pos.z != 0) - { - if (getCitizenData() != null && getCitizenData().isAsleep()) - { - getCitizenSleepHandler().onWakeUp(); - } - else if (getPose() == Pose.SLEEPING) - { - updatePose(Pose.STANDING); - } - } - super.move(typeIn, pos); - } - @Override public float getSpeed() { @@ -1675,7 +1514,7 @@ && getHealth() < ((int) getMaxHealth() * 0.2D)) citizenItemHandler.updateArmorDamage(damageInc); if (citizenData != null) { - getCitizenData().getCitizenHappinessHandler().getModifier("damage").reset(); + getCitizenData().getCitizenHappinessHandler().addModifier(new ExpirationBasedHappinessModifier(DAMAGE, 2.0, new StaticHappinessSupplier(0.0), 1)); } } @@ -1689,10 +1528,9 @@ && getHealth() < ((int) getMaxHealth() * 0.2D)) */ private void performMoveAway(@Nullable final Entity attacker) { - this.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.avoiding")); - // Environmental damage - if (!(attacker instanceof LivingEntity)) + if (!(attacker instanceof LivingEntity) && + (!(getCitizenJobHandler().getColonyJob() instanceof AbstractJobGuard) || getCitizenJobHandler().getColonyJob().canAIBeInterrupted())) { if (moveAwayPath == null || !moveAwayPath.isInProgress()) { @@ -1701,19 +1539,15 @@ private void performMoveAway(@Nullable final Entity attacker) return; } - // Makes the avoidance AI take over. - currentlyFleeing = true; - if ((getCitizenJobHandler().getColonyJob() instanceof AbstractJobGuard)) { // 30 Blocks range callForHelp(attacker, 900); return; } - else - { - callForHelp(attacker, MAX_GUARD_CALL_RANGE); - } + + citizenAI.addTransition(new AIOneTimeEventTarget<>(CitizenAIState.FLEE)); + callForHelp(attacker, MAX_GUARD_CALL_RANGE); if (moveAwayPath == null || !moveAwayPath.isInProgress()) { moveAwayPath = this.getNavigation().moveAwayFromLivingEntity(attacker, 15, INITIAL_RUN_SPEED_AVOID); @@ -1748,7 +1582,7 @@ public void callForHelp(final Entity attacker, final int guardHelpRange) { final ThreatTable table = ((EntityCitizen) entry.getEntity().get()).getThreatTable(); table.addThreat((LivingEntity) attacker, 0); - if (((AbstractEntityAIGuard) entry.getJob().getWorkerAI()).canHelp()) + if (((AbstractEntityAIGuard) entry.getJob().getWorkerAI()).canHelp(attacker.blockPosition())) { possibleGuards.add(entry.getEntity().get()); } @@ -1782,7 +1616,8 @@ protected void doPush(final Entity entity) public void onPlayerCollide(final Player player) { super.onPlayerCollide(player); - if (citizenJobHandler.getColonyJob() != null && citizenJobHandler.getColonyJob().getWorkerAI() instanceof AbstractEntityAIBasic) + if (citizenJobHandler.getColonyJob() != null && citizenJobHandler.getColonyJob().getWorkerAI() instanceof AbstractEntityAIBasic && !citizenJobHandler.getColonyJob() + .isGuard()) { ((AbstractEntityAIBasic) citizenJobHandler.getColonyJob().getWorkerAI()).setDelay(TICKS_SECOND * 3); } @@ -1796,7 +1631,6 @@ public void onPlayerCollide(final Player player) @Override public void die(@NotNull final DamageSource damageSource) { - currentlyFleeing = false; if (citizenColonyHandler.getColony() != null && getCitizenData() != null) { citizenColonyHandler.getColony().getRaiderManager().onLostCitizen(getCitizenData()); @@ -1805,7 +1639,9 @@ public void die(@NotNull final DamageSource damageSource) this.remove(RemovalReason.KILLED); if (!(citizenJobHandler.getColonyJob() instanceof AbstractJobGuard)) { - citizenColonyHandler.getColony().getCitizenManager().updateModifier("death"); + citizenColonyHandler.getColony() + .getCitizenManager() + .injectModifier(new ExpirationBasedHappinessModifier(HappinessConstants.DEATH, 3.0, new StaticHappinessSupplier(0.0), 3)); } triggerDeathAchievement(damageSource, citizenJobHandler.getColonyJob()); citizenChatHandler.notifyDeath(damageSource); @@ -1836,6 +1672,8 @@ public void die(@NotNull final DamageSource damageSource) final String deathCause = Component.literal(damageSource.getLocalizedDeathMessage(this).getString()).getString().replaceFirst(this.getDisplayName().getString(), "Citizen"); citizenColonyHandler.getColony().getEventDescriptionManager().addEventDescription(new CitizenDiedEvent(blockPosition(), citizenData.getName(), deathCause)); + + MinecraftForge.EVENT_BUS.post(new CitizenRemovedEvent(citizenData, damageSource)); } super.die(damageSource); } @@ -2000,7 +1838,7 @@ public void setCustomName(@Nullable final Component name) } } this.citizenData.setName(name.getString()); - this.citizenData.markDirty(); + this.citizenData.markDirty(0); super.setCustomName(name); } return; @@ -2068,18 +1906,6 @@ public boolean startRiding(final Entity entity, final boolean force) return false; } - @Override - public boolean isCurrentlyFleeing() - { - return currentlyFleeing; - } - - @Override - public void setFleeingState(final boolean fleeing) - { - currentlyFleeing = fleeing; - } - @Nullable @Override public AbstractContainerMenu createMenu(final int id, @NotNull final Inventory inv, @NotNull final Player player) @@ -2093,16 +1919,6 @@ public void setTexture() super.setTexture(); } - /** - * Setter for the citizen pose. - * - * @param pose the pose to set. - */ - public void updatePose(final Pose pose) - { - setPose(pose); - } - @Override public void refreshDimensions() { @@ -2150,7 +1966,8 @@ public void queueSound(@NotNull final SoundEvent soundEvent, final BlockPos pos, @Override public void queueSound(@NotNull final SoundEvent soundEvent, final BlockPos pos, final int length, final int repetitions, final float volume, final float pitch) { - Network.getNetwork().sendToTrackingEntity(new PlaySoundForCitizenMessage(this.getId(), soundEvent, this.getSoundSource(), pos, level, volume, pitch, length, repetitions), this); + Network.getNetwork() + .sendToTrackingEntity(new PlaySoundForCitizenMessage(this.getId(), soundEvent, this.getSoundSource(), pos, level, volume, pitch, length, repetitions), this); } /** @@ -2160,7 +1977,7 @@ public void queueSound(@NotNull final SoundEvent soundEvent, final BlockPos pos, */ public boolean isActive() { - return level.isClientSide ? entityStatemachine.getState() == EntityState.ACTIVE_CLIENT : entityStatemachine.getState() == EntityState.ACTIVE_SERVER; + return level.isClientSide ? entityStateController.getState() == EntityState.ACTIVE_CLIENT : entityStateController.getState() == EntityState.ACTIVE_SERVER; } @Override @@ -2168,4 +1985,61 @@ public ThreatTable getThreatTable() { return threatTable; } + + /** + * Get the AI controlling the citizens behaviour + * + * @return + */ + public ITickRateStateMachine getCitizenAI() + { + return citizenAI; + } + + @Override + public boolean isSuppressingBounce() + { + if (citizenSleepHandler.isAsleep()) + { + return true; + } + return super.isSuppressingBounce(); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor dataAccessor) + { + super.onSyncedDataUpdated(dataAccessor); + if (citizenColonyHandler != null) + { + citizenColonyHandler.onSyncDataUpdate(dataAccessor); + } + } + + @Override + public CombatTracker getCombatTracker() + { + return combatTracker; + } + + @Nullable + @Override + public LivingEntity getKillCredit() + { + //necessary as the supermethod doesn't use getCombatTracker() here + if (getCombatTracker().getKiller() != null) + { + return getCombatTracker().getKiller(); + } + else + { + return super.getKillCredit(); + } + } + + @Override + public boolean isCurrentlyGlowing() + { + return level.isClientSide() ? hasGlowingTag() : super.isCurrentlyGlowing(); + } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/VisitorCitizen.java b/src/main/java/com/minecolonies/coremod/entity/citizen/VisitorCitizen.java index d551d4d029c..05e30dd9b1c 100644 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/VisitorCitizen.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/VisitorCitizen.java @@ -6,8 +6,6 @@ import com.minecolonies.api.colony.requestsystem.StandardFactoryController; import com.minecolonies.api.colony.requestsystem.location.ILocation; import com.minecolonies.api.entity.CustomGoalSelector; -import com.minecolonies.api.entity.ai.DesiredActivity; -import com.minecolonies.api.entity.ai.Status; import com.minecolonies.api.entity.ai.pathfinding.IWalkToProxy; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.citizenhandlers.*; @@ -19,7 +17,8 @@ import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.modules.TavernBuildingModule; import com.minecolonies.coremod.entity.ai.minimal.EntityAIInteractToggleAble; -import com.minecolonies.coremod.entity.ai.minimal.EntityAIVisitor; +import com.minecolonies.coremod.entity.ai.minimal.LookAtEntityGoal; +import com.minecolonies.coremod.entity.ai.visitor.EntityAIVisitor; import com.minecolonies.coremod.entity.citizen.citizenhandlers.*; import com.minecolonies.coremod.entity.pathfinding.EntityCitizenWalkToProxy; import com.minecolonies.coremod.entity.pathfinding.MovementHandler; @@ -27,6 +26,7 @@ import com.minecolonies.coremod.network.messages.server.colony.OpenInventoryMessage; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; @@ -36,11 +36,11 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.InteractGoal; -import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.OpenDoorGoal; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.BowlFoodItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.NameTagItem; import net.minecraft.world.level.Level; @@ -51,7 +51,8 @@ import static com.minecolonies.api.util.ItemStackUtils.ISFOOD; import static com.minecolonies.api.util.constant.CitizenConstants.TICKS_20; import static com.minecolonies.api.util.constant.Constants.*; -import static com.minecolonies.api.util.constant.NbtTagConstants.*; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_CITIZEN; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_COLONY_ID; import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INFO_COLONY_VISITOR_DIED; import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INTERACTION_VISITOR_FOOD; import static com.minecolonies.coremod.entity.ai.minimal.EntityAIInteractToggleAble.*; @@ -59,30 +60,27 @@ /** * Visitor citizen entity */ -public class VisitorCitizen extends AbstractEntityCitizen +public class +VisitorCitizen extends AbstractEntityCitizen { /** * The citizen experience handler */ private ICitizenExperienceHandler citizenExperienceHandler; - /** - * The citizen status handler. - */ - private ICitizenStatusHandler citizenStatusHandler; /** * It's citizen Id. */ - private int citizenId = 0; + private int citizenId = 0; /** * The Walk to proxy (Shortest path through intermediate blocks). */ - private IWalkToProxy proxy; + private IWalkToProxy proxy; /** * Reference to the data representation inside the colony. */ @Nullable - private ICitizenData citizenData; + private ICitizenData citizenData; /** * The citizen chat handler. @@ -111,11 +109,6 @@ public class VisitorCitizen extends AbstractEntityCitizen */ private ICitizenSleepHandler citizenSleepHandler; - /** - * Whether the citizen is currently running away - */ - private boolean currentlyFleeing = false; - /** * Citizen data view. */ @@ -133,13 +126,12 @@ public class VisitorCitizen extends AbstractEntityCitizen * @param type the Entity type. * @param world the world. */ - public VisitorCitizen(final EntityType type, final Level world) + public VisitorCitizen(final EntityType type, final Level world) { super(type, world); this.goalSelector = new CustomGoalSelector(this.goalSelector); this.targetSelector = new CustomGoalSelector(this.targetSelector); this.citizenChatHandler = new CitizenChatHandler(this); - this.citizenStatusHandler = new CitizenStatusHandler(this); this.citizenItemHandler = new CitizenItemHandler(this); this.citizenInventoryHandler = new CitizenInventoryHandler(this); this.citizenColonyHandler = new VisitorColonyHandler(this); @@ -162,8 +154,8 @@ private void initTasks() this.goalSelector.addGoal(priority, new EntityAIInteractToggleAble(this, FENCE_TOGGLE, TRAP_TOGGLE, DOOR_TOGGLE)); this.goalSelector.addGoal(++priority, new InteractGoal(this, Player.class, WATCH_CLOSEST2, 1.0F)); this.goalSelector.addGoal(++priority, new InteractGoal(this, EntityCitizen.class, WATCH_CLOSEST2_FAR, WATCH_CLOSEST2_FAR_CHANCE)); - this.goalSelector.addGoal(++priority, new LookAtPlayerGoal(this, LivingEntity.class, WATCH_CLOSEST)); - this.goalSelector.addGoal(++priority, new EntityAIVisitor(this)); + this.goalSelector.addGoal(++priority, new LookAtEntityGoal(this, LivingEntity.class, WATCH_CLOSEST)); + new EntityAIVisitor(this); } @Override @@ -179,7 +171,7 @@ public ILocation getLocation() @Override public boolean hurt(@NotNull final DamageSource damageSource, final float damage) { - if ( !( damageSource.getEntity() instanceof EntityCitizen ) && super.hurt(damageSource, damage)) + if (!(damageSource.getEntity() instanceof EntityCitizen) && super.hurt(damageSource, damage)) { if (damageSource.getEntity() instanceof LivingEntity && damage > 1.01f) { @@ -279,27 +271,14 @@ public IItemHandler getItemHandlerCitizen() * Mark the citizen dirty to synch the data with the client. */ @Override - public void markDirty() + public void markDirty(final int time) { if (citizenData != null) { - citizenData.markDirty(); + citizenData.markDirty(time); } } - @NotNull - @Override - public DesiredActivity getDesiredActivity() - { - return DesiredActivity.IDLE; - } - - @Override - public void setCitizensize(@NotNull final float width, @NotNull final float height) - { - this.dimensions = new EntityDimensions(width, height, false); - } - @Override public void setIsChild(final boolean isChild) { @@ -324,7 +303,7 @@ public void decreaseSaturationForAction() if (citizenData != null) { citizenData.decreaseSaturation(citizenColonyHandler.getPerBuildingFoodCost()); - citizenData.markDirty(); + citizenData.markDirty(20 * 20); } } @@ -337,7 +316,7 @@ public void decreaseSaturationForContinuousAction() if (citizenData != null) { citizenData.decreaseSaturation(citizenColonyHandler.getPerBuildingFoodCost() / 100.0); - citizenData.markDirty(); + citizenData.markDirty(20 * 60 * 2); } } @@ -375,12 +354,6 @@ public ICitizenChatHandler getCitizenChatHandler() return citizenChatHandler; } - @Override - public ICitizenStatusHandler getCitizenStatusHandler() - { - return citizenStatusHandler; - } - @Override public ICitizenItemHandler getCitizenItemHandler() { @@ -435,24 +408,6 @@ public void setCitizenDiseaseHandler(final ICitizenDiseaseHandler citizenDisease this.citizenDiseaseHandler = citizenDiseaseHandler; } - @Override - public boolean isOkayToEat() - { - return false; - } - - @Override - public boolean shouldBeFed() - { - return false; - } - - @Override - public boolean isIdlingAtJob() - { - return false; - } - @Override public float getRotationYaw() { @@ -501,24 +456,12 @@ public void setCitizenExperienceHandler(final ICitizenExperienceHandler citizenE this.citizenExperienceHandler = citizenExperienceHandler; } - @Override - public boolean isCurrentlyFleeing() - { - return currentlyFleeing; - } - @Override public void callForHelp(final Entity attacker, final int guardHelpRange) { } - @Override - public void setFleeingState(final boolean fleeing) - { - currentlyFleeing = fleeing; - } - @Nullable @Override public AbstractContainerMenu createMenu(final int id, final Inventory playerInventory, final Player playerEntity) @@ -582,12 +525,24 @@ private InteractionResult directPlayerInteraction(final Player player, final Int final ItemStack usedStack = player.getItemInHand(hand); if (ISFOOD.test(usedStack)) { - usedStack.setCount(usedStack.getCount() - 1); - player.setItemInHand(hand, usedStack); + final ItemStack remainingItem = usedStack.finishUsingItem(level, this); + if (!remainingItem.isEmpty() && remainingItem.getItem() != usedStack.getItem()) + { + if (!player.getInventory().add(remainingItem)) + { + InventoryUtils.spawnItemStack( + player.level, + player.getX(), + player.getY(), + player.getZ(), + remainingItem + ); + } + } if (!level.isClientSide()) { - getCitizenData().increaseSaturation(usedStack.getItem().getFoodProperties().getNutrition()); + getCitizenData().increaseSaturation(usedStack.getItem().getFoodProperties(usedStack, this).getNutrition()); playSound(SoundEvents.GENERIC_EAT, 1.5f, (float) SoundUtils.getRandomPitch(getRandom())); // Position needs to be centered on citizen, Eat AI wrong too? @@ -646,7 +601,7 @@ public void aiStep() if (lastHurtByPlayerTime > 0) { - markDirty(); + markDirty(0); } if (CompatibilityUtils.getWorldFromCitizen(this).isClientSide) @@ -676,10 +631,10 @@ public void aiStep() public void addAdditionalSaveData(final CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putInt(TAG_STATUS, citizenStatusHandler.getStatus().ordinal()); - if (citizenColonyHandler.getColony() != null && citizenData != null) + + compound.putInt(TAG_COLONY_ID, citizenColonyHandler.getColonyId()); + if (citizenData != null) { - compound.putInt(TAG_COLONY_ID, citizenColonyHandler.getColony().getID()); compound.putInt(TAG_CITIZEN, citizenData.getId()); } @@ -691,13 +646,14 @@ public void readAdditionalSaveData(final CompoundTag compound) { super.readAdditionalSaveData(compound); - citizenStatusHandler.setStatus(Status.values()[compound.getInt(TAG_STATUS)]); - citizenColonyHandler.setColonyId(compound.getInt(TAG_COLONY_ID)); - citizenId = compound.getInt(TAG_CITIZEN); - - if (isEffectiveAi()) + if (compound.contains(TAG_COLONY_ID)) { - citizenColonyHandler.registerWithColony(citizenColonyHandler.getColonyId(), citizenId); + citizenColonyHandler.setColonyId(compound.getInt(TAG_COLONY_ID)); + if (compound.contains(TAG_CITIZEN)) + { + citizenId = compound.getInt(TAG_CITIZEN); + citizenColonyHandler.registerWithColony(citizenColonyHandler.getColonyId(), citizenId); + } } citizenDiseaseHandler.read(compound); @@ -751,4 +707,14 @@ public void queueSound(final @NotNull SoundEvent soundEvent, final BlockPos pos, { } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor dataAccessor) + { + super.onSyncedDataUpdated(dataAccessor); + if (citizenColonyHandler != null) + { + citizenColonyHandler.onSyncDataUpdate(dataAccessor); + } + } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenChatHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenChatHandler.java index a339b27b806..8b849b7da72 100644 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenChatHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenChatHandler.java @@ -3,16 +3,12 @@ import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenChatHandler; -import com.minecolonies.api.util.CompatibilityUtils; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.constant.TranslationConstants; -import com.minecolonies.coremod.util.ServerUtils; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Component; /** * The citizen chat handler which handles all possible notifications (blocking or not). @@ -44,33 +40,15 @@ public void notifyDeath(final DamageSource damageSource) { if (citizen.getCitizenColonyHandler().getColony() != null && citizen.getCitizenData() != null) { - final IJob job = citizen.getCitizenJobHandler().getColonyJob(); - MutableComponent contentComponent; - if (job != null) - { - contentComponent = Component.translatable( - TranslationConstants.WORKER_DIED, - Component.translatable(job.getJobRegistryEntry().getTranslationKey()), - citizen.getCitizenData().getName(), - Math.round(citizen.getX()), - Math.round(citizen.getY()), - Math.round(citizen.getZ()), - Component.translatable(damageSource.msgId)); - } - else - { - contentComponent = Component.translatable( - TranslationConstants.COLONIST_DIED, - citizen.getCitizenData().getName(), - Math.round(citizen.getX()), - Math.round(citizen.getY()), - Math.round(citizen.getZ()), - Component.translatable(damageSource.msgId)); - } - - MessageUtils.format(contentComponent) - .with(ChatFormatting.RED) - .sendTo(citizen.getCitizenColonyHandler().getColony()).forManagers(); + MessageUtils.format("") + .with(ChatFormatting.RED) + .append(citizen.getCombatTracker().getDeathMessage()) + .append(Component.literal("! ")) + .append(Component.translatable(TranslationConstants.COLONIST_GRAVE_LOCATION, + Math.round(citizen.getX()), + Math.round(citizen.getY()), + Math.round(citizen.getZ()))) + .sendTo(citizen.getCitizenColonyHandler().getColony()).forManagers(); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java index d37a015489b..de03bed9edb 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java @@ -8,6 +8,7 @@ import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenDiseaseHandler; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingCook; +import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.colony.jobs.JobHealer; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -15,8 +16,7 @@ import static com.minecolonies.api.research.util.ResearchConstants.MASKS; import static com.minecolonies.api.research.util.ResearchConstants.VACCINES; -import static com.minecolonies.api.util.constant.CitizenConstants.TAG_DISEASE; -import static com.minecolonies.api.util.constant.CitizenConstants.TAG_IMMUNITY; +import static com.minecolonies.api.util.constant.CitizenConstants.*; import static com.minecolonies.api.util.constant.Constants.ONE_HUNDRED_PERCENT; import static com.minecolonies.api.util.constant.StatisticsConstants.CITIZENS_HEALED; @@ -60,6 +60,11 @@ public class CitizenDiseaseHandler implements ICitizenDiseaseHandler */ private int immunityTicks = 0; + /** + * Whether the citizen sleeps at the hostpital + */ + private boolean sleepsAtHospital = false; + /** * The initial citizen count */ @@ -130,6 +135,12 @@ && canBecomeSick() } } + @Override + public boolean isHurt() + { + return !(citizen.getCitizenJobHandler() instanceof AbstractJobGuard) && citizen.getHealth() < SEEK_DOCTOR_HEALTH && citizen.getCitizenData().getSaturation() > LOW_SATURATION; + } + @Override public boolean isSick() { @@ -164,6 +175,7 @@ public String getDisease() public void cure() { this.disease = ""; + sleepsAtHospital = false; if (citizen.getCitizenSleepHandler().isAsleep()) { citizen.stopSleeping(); @@ -186,5 +198,19 @@ public void cure() citizen.getCitizenColonyHandler().getColony().getStatisticsManager().increment(CITIZENS_HEALED); } + + citizen.markDirty(0); + } + + @Override + public boolean sleepsAtHospital() + { + return sleepsAtHospital; + } + + @Override + public void setSleepsAtHospital() + { + sleepsAtHospital = true; } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenHappinessHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenHappinessHandler.java index 6f05da56bef..44a81787142 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenHappinessHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenHappinessHandler.java @@ -9,8 +9,9 @@ import com.minecolonies.api.util.Tuple; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; -import com.minecolonies.coremod.colony.jobs.JobPupil; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import java.util.ArrayList; @@ -18,7 +19,9 @@ import java.util.List; import java.util.Map; +import static com.minecolonies.api.entity.citizen.happiness.HappinessRegistry.*; import static com.minecolonies.api.research.util.ResearchConstants.HAPPINESS; +import static com.minecolonies.api.research.util.ResearchConstants.TAG_ID; import static com.minecolonies.api.util.constant.HappinessConstants.*; import static com.minecolonies.api.util.constant.TranslationConstants.DEMANDS; import static com.minecolonies.api.util.constant.TranslationConstants.NO; @@ -45,33 +48,35 @@ public class CitizenHappinessHandler implements ICitizenHappinessHandler */ public CitizenHappinessHandler(final ICitizenData data) { - add(new TimeBasedHappinessModifier(HOMELESSNESS, - 4.0, - () -> data.getHomeBuilding() == null ? 0.25 : data.getHomeBuilding().getBuildingLevel() / 2.5, - new Tuple[] {new Tuple<>(COMPLAIN_DAYS_WITHOUT_HOUSE, 0.75), new Tuple<>(DEMANDS_DAYS_WITHOUT_HOUSE, 0.5)})); - add(new TimeBasedHappinessModifier(UNEMPLOYMENT, + // Add static modifiers. These modifiers are on/off. + addModifier(new StaticHappinessModifier(SCHOOL, 1.0, new DynamicHappinessSupplier(SCHOOL_FUNCTION))); + addModifier(new StaticHappinessModifier(SECURITY, 4.0, new DynamicHappinessSupplier(SECURITY_FUNCTION))); + addModifier(new StaticHappinessModifier(SOCIAL, 2.0, new DynamicHappinessSupplier(SOCIAL_FUNCTION))); + addModifier(new StaticHappinessModifier(SATURATION, 2.0, new DynamicHappinessSupplier(SATURATION_FUNCTION))); + addModifier(new StaticHappinessModifier(MYSTICAL_SITE, 1.0, new DynamicHappinessSupplier(MYSTICAL_SITE_FUNCTION))); + + // Add time based modifiers. These modifiers change their value over time. + addModifier(new TimeBasedHappinessModifier(HOMELESSNESS, + 3.0, + new DynamicHappinessSupplier(HOUSING_FUNCTION), + new Tuple<>(COMPLAIN_DAYS_WITHOUT_HOUSE, 0.75), new Tuple<>(DEMANDS_DAYS_WITHOUT_HOUSE, 0.5))); + + addModifier(new TimeBasedHappinessModifier(UNEMPLOYMENT, 2.0, - () -> data.isChild() ? 1.0 : (data.getWorkBuilding() == null ? 0.5 : data.getWorkBuilding().getBuildingLevel() > 3 ? 2.0 : 1.0), - new Tuple[] {new Tuple<>(COMPLAIN_DAYS_WITHOUT_JOB, 0.75), new Tuple<>(DEMANDS_DAYS_WITHOUT_JOB, 0.5)})); - add(new TimeBasedHappinessModifier(HEALTH, + new DynamicHappinessSupplier(UNEMPLOYMENT_FUNCTION), + new Tuple<>(COMPLAIN_DAYS_WITHOUT_JOB, 0.75), new Tuple<>(DEMANDS_DAYS_WITHOUT_JOB, 0.5))); + + addModifier(new TimeBasedHappinessModifier(HEALTH, 2.0, - () -> data.getEntity().isPresent() ? (data.getEntity().get().getCitizenDiseaseHandler().isSick() ? 0.5 : 1.0) : 1.0, - new Tuple[] {new Tuple<>(COMPLAIN_DAYS_SICK, 0.5), new Tuple<>(DEMANDS_CURE_SICK, 0.1)})); - add(new TimeBasedHappinessModifier(IDLEATJOB, + new DynamicHappinessSupplier(HEALTH_FUNCTION), + new Tuple<>(COMPLAIN_DAYS_SICK, 0.5), new Tuple<>(DEMANDS_CURE_SICK, 0.1))); + + addModifier(new TimeBasedHappinessModifier(IDLEATJOB, 1.0, - () -> data.isIdleAtJob() ? 0.5 : 1.0, - new Tuple[] {new Tuple<>(IDLE_AT_JOB_COMPLAINS_DAYS, 0.5), new Tuple<>(IDLE_AT_JOB_DEMANDS_DAYS, 0.1)})); - - add(new StaticHappinessModifier(SCHOOL, 1.0, () -> data.isChild() ? data.getJob() instanceof JobPupil ? 2 : 0 : 1)); - add(new StaticHappinessModifier(SECURITY, 4.0, () -> getGuardFactor(data.getColony()))); - add(new StaticHappinessModifier(SOCIAL, 2.0, () -> getSocialModifier(data.getColony()))); - add(new StaticHappinessModifier(SATURATION, 2.0, () -> (data.getSaturation() + 5.0) / 10.0)); - add(new StaticHappinessModifier(MYSTICAL_SITE, 1.0, () -> getMysticalSiteFactor(data.getColony()))); - - add(new ExpirationBasedHappinessModifier(DAMAGE, 2.0, () -> 0.0, 1)); - add(new ExpirationBasedHappinessModifier(DEATH, 3.0, () -> 0.0, 3)); - add(new ExpirationBasedHappinessModifier(RAIDWITHOUTDEATH, 1.0, () -> 2.0, 3)); - add(new ExpirationBasedHappinessModifier(SLEPTTONIGHT, 2.0, () -> data.getJob() instanceof AbstractJobGuard ? 1 : 0.0, 3, true)); + new DynamicHappinessSupplier(IDLEATJOB_FUNCTION), + new Tuple<>(IDLE_AT_JOB_COMPLAINS_DAYS, 0.5), new Tuple<>(IDLE_AT_JOB_DEMANDS_DAYS, 0.1))); + + addModifier(new ExpirationBasedHappinessModifier(SLEPTTONIGHT, 1.5, new DynamicHappinessSupplier(SLEPTTONIGHT_FUNCTION), 3, true)); } /** @@ -79,31 +84,25 @@ public CitizenHappinessHandler(final ICitizenData data) */ public CitizenHappinessHandler() { - add(new ClientHappinessModifier(HOMELESSNESS, 4.0)); - add(new ClientHappinessModifier(UNEMPLOYMENT, 2.0)); - add(new ClientHappinessModifier(HEALTH, 2.0)); - add(new ClientHappinessModifier(IDLEATJOB, 1.0)); - - add(new ClientHappinessModifier(SCHOOL, 1.0)); - add(new ClientHappinessModifier(SECURITY, 2.0)); - add(new ClientHappinessModifier(SOCIAL, 2.0)); - add(new ClientHappinessModifier(SATURATION, 1.0)); - add(new ClientHappinessModifier(MYSTICAL_SITE, 1.0)); - - add(new ClientHappinessModifier(DAMAGE, 1.0)); - add(new ClientHappinessModifier(DEATH, 2.0)); - add(new ClientHappinessModifier(RAIDWITHOUTDEATH, 1.0)); - add(new ClientHappinessModifier(SLEPTTONIGHT, 2.0)); + super(); + } + + @Override + public void addModifier(final IHappinessModifier modifier) + { + this.happinessFactors.put(modifier.getId(), modifier); + cachedHappiness = -1; } @Override public void resetModifier(final String name) { - if (happinessFactors.containsKey(name)) + final IHappinessModifier modifier = happinessFactors.get(name); + if (modifier instanceof ITimeBasedHappinessModifier) { - happinessFactors.get(name).reset(); + ((ITimeBasedHappinessModifier) modifier).reset(); + cachedHappiness = -1; } - cachedHappiness = -1; } @Override @@ -117,7 +116,10 @@ public void processDailyHappiness(final ICitizenData citizenData) { for (final IHappinessModifier happinessModifier : happinessFactors.values()) { - happinessModifier.dayEnd(); + if (happinessModifier instanceof TimeBasedHappinessModifier) + { + ((TimeBasedHappinessModifier) happinessModifier).dayEnd(citizenData); + } if (InteractionValidatorRegistry.hasValidator(Component.translatable(NO + happinessModifier.getId()))) { citizenData.triggerInteraction(new StandardInteraction(Component.translatable(NO + happinessModifier.getId()), ChatPriority.CHITCHAT)); @@ -131,7 +133,7 @@ public void processDailyHappiness(final ICitizenData citizenData) } @Override - public double getHappiness(final IColony colony) + public double getHappiness(final IColony colony, final ICitizenData citizenData) { if (cachedHappiness == -1) { @@ -139,7 +141,10 @@ public double getHappiness(final IColony colony) double totalWeight = 0.0; for (final IHappinessModifier happinessModifier : happinessFactors.values()) { - total += happinessModifier.getFactor() * happinessModifier.getWeight(); + final double factor = happinessModifier.getFactor(citizenData); + if (factor == 1.0) + continue; + total += factor * happinessModifier.getWeight(); totalWeight += happinessModifier.getWeight(); } @@ -153,12 +158,26 @@ public double getHappiness(final IColony colony) @Override public void read(final CompoundTag compound) { - final CompoundTag tag = compound.getCompound(TAG_HAPPINESS); - for (final IHappinessModifier happinessModifier : happinessFactors.values()) + // Only deserialize for new version. Old can keep the above defaults just fine. + if (compound.contains(TAG_NEW_HAPPINESS)) { - if (tag.contains(happinessModifier.getId())) + final ListTag tag = compound.getList(TAG_NEW_HAPPINESS, Tag.TAG_COMPOUND); + for (int i = 0; i < tag.size(); i++) { - happinessModifier.read(tag.getCompound(happinessModifier.getId())); + final CompoundTag compoundTag = tag.getCompound(i); + final String id = compoundTag.getString(TAG_ID); + if (happinessFactors.containsKey(id)) + { + happinessFactors.get(id).read(compoundTag); + } + else + { + final IHappinessModifier modifier = HappinessRegistry.loadFrom(compoundTag); + if (modifier != null) + { + happinessFactors.put(modifier.getId(), modifier); + } + } } } } @@ -166,16 +185,15 @@ public void read(final CompoundTag compound) @Override public void write(final CompoundTag compound) { - final CompoundTag tag = new CompoundTag(); - + final ListTag listTag = new ListTag(); for (final IHappinessModifier happinessModifier : happinessFactors.values()) { final CompoundTag compoundNbt = new CompoundTag(); happinessModifier.write(compoundNbt); - tag.put(happinessModifier.getId(), compoundNbt); + listTag.add(compoundNbt); } - compound.put(TAG_HAPPINESS, tag); + compound.put(TAG_NEW_HAPPINESS, listTag); } @Override @@ -184,15 +202,7 @@ public List getModifiers() return new ArrayList<>(happinessFactors.keySet()); } - /** - * Add the modifier to the handler. - * - * @param modifier the modifier. - */ - private void add(final IHappinessModifier modifier) - { - this.happinessFactors.put(modifier.getId(), modifier); - } + // --------------------------------------------- Static Utility Methods --------------------------------------------- // /** * Get the social modifier for the colony. @@ -200,7 +210,7 @@ private void add(final IHappinessModifier modifier) * @param colony the colony. * @return true if so. */ - private double getSocialModifier(final IColony colony) + public static double getSocialModifier(final IColony colony) { final double total = colony.getCitizenManager().getCitizens().size(); double unemployment = 0; @@ -240,7 +250,7 @@ private double getSocialModifier(final IColony colony) * @param colony the colony. * @return true if so. */ - private double getGuardFactor(final IColony colony) + public static double getGuardFactor(final IColony colony) { double guards = 1; double workers = 1; @@ -266,8 +276,8 @@ private double getGuardFactor(final IColony colony) * @param colony the colony. * @return double supply factor. */ - private double getMysticalSiteFactor(final IColony colony) + public static double getMysticalSiteFactor(final IColony colony) { - return 1 + ((double)colony.getBuildingManager().getMysticalSiteMaxBuildingLevel()/2.0); + return Math.max(1, ((double)colony.getBuildingManager().getMysticalSiteMaxBuildingLevel() / 2.0)); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenItemHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenItemHandler.java index dfcb109c75d..697e76ed77c 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenItemHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenItemHandler.java @@ -327,40 +327,28 @@ public ItemEntity entityDropItem(@NotNull final ItemStack itemstack) @Override public void updateArmorDamage(final double damage) { - for (final ItemStack stack : citizen.getArmorSlots()) + if (citizen.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(ARMOR_DURABILITY) > 0) { - if (ItemStackUtils.isEmpty(stack) || !(stack.getItem() instanceof ArmorItem)) - { - continue; - } - - if (citizen.getCitizenColonyHandler().getColony().getResearchManager().getResearchEffects().getEffectStrength(ARMOR_DURABILITY) > 0) - { - if (citizen.getRandom().nextDouble() > (1 / (1 + citizen.getCitizenColonyHandler() - .getColony() - .getResearchManager() - .getResearchEffects() - .getEffectStrength(ARMOR_DURABILITY)))) - { - return; - } - } - - final int armorDmg = Math.max(1, (int) (damage / 4)); - final int slot = InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(citizen.getInventoryCitizen(), - invStack -> invStack != stack && ItemStackUtils.compareItemStacksIgnoreStackSize(invStack, stack, false, true)); - if (slot != -1) + if (citizen.getRandom().nextDouble() > (1 / (1 + citizen.getCitizenColonyHandler() + .getColony() + .getResearchManager() + .getResearchEffects() + .getEffectStrength(ARMOR_DURABILITY)))) { - if (citizen.getInventoryCitizen().damageInventoryItem(slot, armorDmg, citizen, (entityCitizen) -> {entityCitizen.broadcastBreakEvent(InteractionHand.MAIN_HAND);})) - { - stack.setCount(0); - return; - } + return; } + } - stack.hurtAndBreak(armorDmg, citizen, (i) -> { - i.broadcastBreakEvent(InteractionHand.MAIN_HAND); - }); + final int armorDmg = Math.max(1, (int) (damage / 4)); + for (int i = 0; i < 4; i++) + { + final EquipmentSlot equipmentSlot = EquipmentSlot.byTypeAndIndex(EquipmentSlot.Type.ARMOR, i); + final ItemStack equipment = citizen.getInventoryCitizen().getArmorInSlot(equipmentSlot); + equipment.hurtAndBreak(armorDmg, citizen, (s) -> { + s.broadcastBreakEvent(equipmentSlot); + citizen.onArmorRemove(equipment, equipmentSlot); + citizen.getInventoryCitizen().markDirty(); + }); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenJobHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenJobHandler.java index ffaf22eddb6..c88b610b595 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenJobHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenJobHandler.java @@ -4,19 +4,14 @@ import com.minecolonies.api.client.render.modeltype.ModModelTypes; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.entity.ai.DesiredActivity; +import com.minecolonies.api.entity.ai.ITickingStateAI; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenJobHandler; -import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; -import com.minecolonies.coremod.entity.ai.basic.AbstractAISkeleton; import com.minecolonies.coremod.util.AdvancementUtils; -import net.minecraft.world.entity.ai.goal.WrappedGoal; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; - import static com.minecolonies.api.entity.citizen.AbstractEntityCitizen.DATA_MODEL; /** @@ -29,6 +24,11 @@ public class CitizenJobHandler implements ICitizenJobHandler */ private final AbstractEntityCitizen citizen; + /** + * The job's work AI + */ + private ITickingStateAI workAI = null; + /** * Constructor for the experience handler. * @@ -100,24 +100,9 @@ public void onJobChanged(@Nullable final IJob job) // Model setModelDependingOnJob(job); - // AI Tasks - for (@NotNull final WrappedGoal task : new ArrayList<>(citizen.getTasks().availableGoals)) - { - if (task.getGoal() instanceof AbstractAISkeleton) - { - citizen.getTasks().removeGoal(task.getGoal()); - } - } - - citizen.getCitizenData().setIdleAtJob(false); - if (job != null) { - job.addWorkerAIToTaskList(citizen.getTasks()); - if (citizen.getTicksExisted() > 0 && citizen.getCitizenColonyHandler().getWorkBuilding() != null && citizen.getDesiredActivity() == DesiredActivity.WORK) - { - BlockPosUtil.tryMoveBaseCitizenEntityToXYZ(citizen, citizen.getCitizenColonyHandler().getWorkBuilding().getPosition()); - } + job.createAI(); // Calculate the number of guards for some advancements if (job instanceof AbstractJobGuard) @@ -166,4 +151,16 @@ public boolean shouldRunAvoidance() { return getColonyJob() == null || getColonyJob().allowsAvoidance(); } + + @Override + public void setWorkAI(final ITickingStateAI workAI) + { + this.workAI = workAI; + } + + @Override + public ITickingStateAI getWorkAI() + { + return workAI; + } } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSkillHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSkillHandler.java index fa6308b523d..cc38994a48a 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSkillHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSkillHandler.java @@ -24,6 +24,9 @@ import java.util.Map; import java.util.Random; +import static com.minecolonies.api.sounds.EventType.GREETING; +import static com.minecolonies.api.sounds.EventType.SUCCESS; +import static com.minecolonies.api.util.SoundUtils.playSoundAtCitizenWith; import static com.minecolonies.api.util.constant.CitizenConstants.MAX_CITIZEN_LEVEL; import static com.minecolonies.api.util.constant.Constants.MAX_BUILDING_LEVEL; import static com.minecolonies.api.util.constant.NbtTagConstants.*; @@ -149,7 +152,7 @@ public void tryLevelUpIntelligence(@NotNull final Random random, final double cu return; } - final int levelCap = (int) citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony()); + final int levelCap = (int) citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony(), citizen); if (skillMap.get(Skill.Intelligence).getA() < levelCap * 9) { addXpToSkill(Skill.Intelligence, 10, citizen); @@ -205,7 +208,7 @@ public void addXpToSkill(final Skill skill, final double xp, final ICitizenData if (level > tuple.getA()) { levelUp(data); - data.markDirty(); + data.markDirty(10); } } @@ -234,7 +237,7 @@ public void removeXpFromSkill(@NotNull final Skill skill, final double xp, @NotN if (level < tuple.getA()) { - data.markDirty(); + data.markDirty(10); } } @@ -245,7 +248,7 @@ public void levelUp(final ICitizenData data) if (data.getEntity().isPresent()) { final AbstractEntityCitizen citizen = data.getEntity().get(); - citizen.playSound(SoundEvents.PLAYER_LEVELUP, 1.0f, (float) SoundUtils.getRandomPitch(citizen.getRandom())); + playSoundAtCitizenWith(citizen.level, citizen.blockPosition(), SUCCESS, data); Network.getNetwork() .sendToTrackingEntity(new VanillaParticleMessage(citizen.getX(), citizen.getY(), citizen.getZ(), ParticleTypes.HAPPY_VILLAGER), data.getEntity().get()); diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSleepHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSleepHandler.java index 0fd48e1774d..9a6f94af317 100755 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSleepHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenSleepHandler.java @@ -10,24 +10,21 @@ import com.minecolonies.coremod.colony.interactionhandling.SimpleNotificationInteraction; import com.minecolonies.coremod.colony.interactionhandling.StandardInteraction; import com.minecolonies.coremod.colony.jobs.JobMiner; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Pose; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.Pose; -import net.minecraft.tags.BlockTags; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.properties.BedPart; import net.minecraft.world.phys.Vec3; -import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import java.util.Optional; import static com.minecolonies.api.entity.citizen.AbstractEntityCitizen.DATA_BED_POS; import static com.minecolonies.api.entity.citizen.AbstractEntityCitizen.DATA_IS_ASLEEP; import static com.minecolonies.api.research.util.ResearchConstants.WORK_LONGER; import static com.minecolonies.api.util.constant.CitizenConstants.NIGHT; -import static com.minecolonies.api.util.constant.Constants.*; +import static com.minecolonies.api.util.constant.Constants.HALF_BLOCK; import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ENTITY_CITIZEN_SLEEPING; /** @@ -69,6 +66,11 @@ public CitizenSleepHandler(final AbstractEntityCitizen citizen) @Override public boolean isAsleep() { + if (citizen.getCitizenData() != null) + { + return citizen.getCitizenData().isAsleep(); + } + return citizen.getEntityData().get(DATA_IS_ASLEEP); } @@ -102,11 +104,16 @@ public boolean trySleep(final BlockPos bedLocation) return false; } - citizen.updatePose(Pose.SLEEPING); + + citizen.setPose(Pose.SLEEPING); citizen.getNavigation().stop(); - citizen.setPos(((float) bedLocation.getX() + HALF_BLOCK), - (float) bedLocation.getY() + 0.8F, - ((float) bedLocation.getZ() + HALF_BLOCK)); + + final double zOffset = state.getValue(BedBlock.FACING).getAxis() == Direction.Axis.Z && citizen.getCitizenData().isChild() ? 0 : HALF_BLOCK; + final double xOffset = state.getValue(BedBlock.FACING).getAxis() == Direction.Axis.X && citizen.getCitizenData().isChild() ? 0 : HALF_BLOCK; + + citizen.setPos(((double) bedLocation.getX() + xOffset), + (double) bedLocation.getY() + 0.6875D, + ((double) bedLocation.getZ() + zOffset)); citizen.setSleepingPos(bedLocation); citizen.setDeltaMovement(Vec3.ZERO); @@ -139,20 +146,20 @@ public void onWakeUp() notifyCitizenHandlersOfWakeUp(); //Only do this if he really sleeps - if (!isAsleep()) + if (isAsleep()) { - return; + spawnCitizenFromBed(); } - citizen.updatePose(Pose.STANDING); + + citizen.setPose(Pose.STANDING); citizen.clearSleepingPos(); - spawnCitizenFromBed(); + setIsAsleep(false); } private void notifyCitizenHandlersOfWakeUp() { if (citizen.getCitizenColonyHandler().getWorkBuilding() != null) { - citizen.getCitizenStatusHandler().setLatestStatus(Component.translatable("com.minecolonies.coremod.status.working")); citizen.getCitizenColonyHandler().getWorkBuilding().onWakeUp(); } if (citizen.getCitizenJobHandler().getColonyJob() != null) @@ -170,14 +177,14 @@ private void notifyCitizenHandlersOfWakeUp() private void spawnCitizenFromBed() { final BlockPos spawn; - final BlockState bedState = citizen.level.getBlockState(getBedLocation()); + final BlockState bedState = getBedLocation().equals(BlockPos.ZERO) ? null : citizen.level.getBlockState(getBedLocation()); if (!getBedLocation().equals(BlockPos.ZERO) && bedState.is(BlockTags.BEDS)) { if (bedState.getValue(BedBlock.PART) == BedPart.HEAD) { final BlockPos relPos = getBedLocation().relative(bedState.getValue(BedBlock.FACING).getOpposite()); final BlockState lowerState = citizen.level.getBlockState(relPos); - if (lowerState.getValue(BedBlock.PART) == BedPart.FOOT) + if (lowerState.is(BlockTags.BEDS) && lowerState.getValue(BedBlock.PART) == BedPart.FOOT) { spawn = EntityUtils.getSpawnPoint(citizen.level, relPos); } diff --git a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenStatusHandler.java b/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenStatusHandler.java deleted file mode 100755 index c912089f77e..00000000000 --- a/src/main/java/com/minecolonies/coremod/entity/citizen/citizenhandlers/CitizenStatusHandler.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.minecolonies.coremod.entity.citizen.citizenhandlers; - -import com.minecolonies.api.entity.ai.Status; -import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; -import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenStatusHandler; -import com.minecolonies.coremod.MineColonies; -import net.minecraft.network.chat.Component; - -import java.util.Objects; - -import static com.minecolonies.api.util.constant.CitizenConstants.MAX_LINES_OF_LATEST_LOG; - -/** - * Handles the status updates of the citizen. - */ -public class CitizenStatusHandler implements ICitizenStatusHandler -{ - /** - * The citizen assigned to this manager. - */ - private final AbstractEntityCitizen citizen; - - /** - * The Current Status. - */ - protected Status status = Status.IDLE; - - /** - * Whether the status display is enabled - */ - private boolean enabled = MineColonies.getConfig().getServer().enableInDevelopmentFeatures.get(); - - /** - * The 4 lines of the latest status. - */ - private final Component[] latestStatus = new Component[MAX_LINES_OF_LATEST_LOG]; - - /** - * Constructor for the experience handler. - * - * @param citizen the citizen owning the handler. - */ - public CitizenStatusHandler(final AbstractEntityCitizen citizen) - { - this.citizen = citizen; - } - - /** - * Get the latest status of the citizen. - * - * @return a Component with the length 4 describing it. - */ - @Override - public Component[] getLatestStatus() - { - return latestStatus.clone(); - } - - /** - * Set the latest status of the citizen and clear the existing status - * - * @param status the new status to set. - */ - @Override - public void setLatestStatus(final Component... status) - { - if (!enabled) - { - return; - } - - boolean hasChanged = false; - for (int i = 0; i < latestStatus.length; i++) - { - final Component newStatus; - if (i >= status.length) - { - newStatus = null; - } - else - { - newStatus = status[i]; - } - - if (!Objects.equals(latestStatus[i], newStatus)) - { - latestStatus[i] = newStatus; - hasChanged = true; - } - } - - if (hasChanged) - { - citizen.markDirty(); - } - } - - /** - * Append to the existing latestStatus list. This will override the oldest one if full and move the others one down in the array. - * - * @param status the latest status to append - */ - @Override - public void addLatestStatus(final Component status) - { - System.arraycopy(latestStatus, 0, latestStatus, 1, latestStatus.length - 1); - latestStatus[0] = status; - citizen.markDirty(); - } - - /** - * Getter for the current status. - * - * @return the status. - */ - @Override - public Status getStatus() - { - return status; - } - - /** - * Setter for the current status. - * - * @param status the status to set. - */ - @Override - public void setStatus(final Status status) - { - this.status = status; - } -} diff --git a/src/main/java/com/minecolonies/coremod/entity/mobs/EntityMercenary.java b/src/main/java/com/minecolonies/coremod/entity/mobs/EntityMercenary.java index 931081b1213..24919642f54 100755 --- a/src/main/java/com/minecolonies/coremod/entity/mobs/EntityMercenary.java +++ b/src/main/java/com/minecolonies/coremod/entity/mobs/EntityMercenary.java @@ -9,6 +9,7 @@ import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; +import com.minecolonies.api.entity.AbstractFastMinecoloniesEntity; import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; import com.minecolonies.api.sounds.MercenarySounds; import com.minecolonies.api.util.ItemStackUtils; @@ -61,7 +62,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.npc.Npc; import net.minecraft.world.entity.Entity.RemovalReason; @@ -70,7 +70,7 @@ * Class for Mercenary entities, which can be spawned to protect the colony */ @SuppressWarnings("PMD.ExcessiveImports") -public class EntityMercenary extends PathfinderMob implements Npc, IColonyRelated +public class EntityMercenary extends AbstractFastMinecoloniesEntity implements Npc, IColonyRelated { /** * The minimum time inbetween, in ticks. @@ -346,7 +346,7 @@ public void addAdditionalSaveData(final CompoundTag compound) public void readAdditionalSaveData(final CompoundTag compound) { worldTimeAtSpawn = compound.getLong(TAG_TIME); - if (compound.getAllKeys().contains(TAG_COLONY_ID)) + if (compound.contains(TAG_COLONY_ID)) { final int colonyId = compound.getInt(TAG_COLONY_ID); if (colonyId != 0) diff --git a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/EntityAIBreakDoor.java b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/EntityAIBreakDoor.java index 6b61a5113db..74c309639d6 100755 --- a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/EntityAIBreakDoor.java +++ b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/EntityAIBreakDoor.java @@ -2,7 +2,7 @@ import com.minecolonies.api.blocks.decorative.AbstractBlockGate; import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.coremod.MineColonies; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.Mob; @@ -14,8 +14,6 @@ import static com.minecolonies.api.research.util.ResearchConstants.MECHANIC_ENHANCED_GATES; -import net.minecraft.world.entity.ai.goal.Goal.Flag; - /** * Break door entity AI with mutex. */ @@ -60,9 +58,9 @@ public void start() hardness = (int) (1 + mob.level.getBlockState(doorPos).getDestroySpeed(mob.level, doorPos)); // No stuck during door break - if (mob instanceof AbstractEntityMinecoloniesMob) + if (mob instanceof AbstractEntityRaiderMob) { - ((AbstractEntityMinecoloniesMob) mob).setCanBeStuck(false); + ((AbstractEntityRaiderMob) mob).setCanBeStuck(false); } } @@ -70,9 +68,9 @@ public void stop() { super.stop(); this.mob.level.destroyBlockProgress(this.mob.getId(), this.doorPos, -1); - if (mob instanceof AbstractEntityMinecoloniesMob) + if (mob instanceof AbstractEntityRaiderMob) { - ((AbstractEntityMinecoloniesMob) mob).setCanBeStuck(true); + ((AbstractEntityRaiderMob) mob).setCanBeStuck(true); } } @@ -82,6 +80,7 @@ public void tick() if (mob.getCommandSenderWorld().getDifficulty().getId() < 2 || !MineColonies.getConfig().getServer().shouldRaidersBreakDoors.get()) { breakTime = 0; + return; } // Only advances breaking time in relation to hardness @@ -93,14 +92,14 @@ public void tick() { int fasterBreakPerXNearby = 5; - if (mob instanceof AbstractEntityMinecoloniesMob && !mob.level.isClientSide()) + if (mob instanceof AbstractEntityRaiderMob && !mob.level.isClientSide()) { - final IColony colony = ((AbstractEntityMinecoloniesMob) mob).getColony(); + final IColony colony = ((AbstractEntityRaiderMob) mob).getColony(); fasterBreakPerXNearby += colony.getResearchManager().getResearchEffects().getEffectStrength(MECHANIC_ENHANCED_GATES); } breakChance = Math.max(1, - hardness / (1 + (mob.level.getEntitiesOfClass(AbstractEntityMinecoloniesMob.class, mob.getBoundingBox().inflate(5)).size() / fasterBreakPerXNearby))); + hardness / (1 + (mob.level.getEntitiesOfClass(AbstractEntityRaiderMob.class, mob.getBoundingBox().inflate(5)).size() / fasterBreakPerXNearby))); } if (this.breakTime == this.getDoorBreakTime() - 1) diff --git a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderMeleeAI.java b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderMeleeAI.java index 1deed0ecdce..ab73f7a3e10 100644 --- a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderMeleeAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderMeleeAI.java @@ -3,7 +3,7 @@ import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.SoundUtils; import com.minecolonies.coremod.MineColonies; @@ -21,7 +21,7 @@ /** * Raider AI for melee attacking a target */ -public class RaiderMeleeAI extends AttackMoveAI +public class RaiderMeleeAI extends AttackMoveAI { /** * Extended reach based on difficulty @@ -53,7 +53,7 @@ public RaiderMeleeAI( protected void doAttack(final LivingEntity target) { double damageToBeDealt = user.getAttribute(MOB_ATTACK_DAMAGE.get()).getValue(); - target.hurt(new NamedDamageSource("death.attack." + ((TranslatableContents) user.getName().getContents()).getKey(), user), (float) damageToBeDealt); + target.hurt(new NamedDamageSource(((TranslatableContents) user.getName().getContents()).getKey(), user), (float) damageToBeDealt); user.swing(InteractionHand.MAIN_HAND); user.playSound(SoundEvents.PLAYER_ATTACK_SWEEP, (float) 1.0D, (float) SoundUtils.getRandomPitch(user.getRandom())); target.setLastHurtByMob(user); diff --git a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderRangedAI.java b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderRangedAI.java index 801f22f5e8c..24108832aa8 100644 --- a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderRangedAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderRangedAI.java @@ -4,7 +4,7 @@ import com.minecolonies.api.entity.ai.statemachine.states.IState; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.combat.threat.IThreatTableEntity; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; import com.minecolonies.api.entity.mobs.IRangedMobEntity; import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.EntityUtils; @@ -25,7 +25,7 @@ /** * Raider AI for shooting arrows at a target */ -public class RaiderRangedAI extends AttackMoveAI +public class RaiderRangedAI extends AttackMoveAI { /** * Max delay between attacks is 3s, aka 60 ticks. diff --git a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderWalkAI.java b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderWalkAI.java index 4958702da18..5bf5b0a6d60 100644 --- a/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderWalkAI.java +++ b/src/main/java/com/minecolonies/coremod/entity/mobs/aitasks/RaiderWalkAI.java @@ -1,5 +1,8 @@ package com.minecolonies.coremod.entity.mobs.aitasks; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.ModBuildings; +import com.minecolonies.api.colony.buildings.registry.IBuildingRegistry; import com.minecolonies.api.colony.colonyEvents.EventStatus; import com.minecolonies.api.colony.colonyEvents.IColonyEvent; import com.minecolonies.api.colony.colonyEvents.IColonyRaidEvent; @@ -8,12 +11,18 @@ import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.ITickRateStateMachine; import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickingTransition; import com.minecolonies.api.entity.combat.CombatAIStates; -import com.minecolonies.api.entity.mobs.AbstractEntityMinecoloniesMob; +import com.minecolonies.api.entity.mobs.AbstractEntityRaiderMob; +import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; +import com.minecolonies.api.entity.pathfinding.PathResult; import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.buildings.AbstractBuilding; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.HordeRaidEvent; import com.minecolonies.coremod.colony.colonyEvents.raidEvents.pirateEvent.ShipBasedRaiderUtils; import net.minecraft.core.BlockPos; +import java.util.List; + import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; /** @@ -24,7 +33,7 @@ public class RaiderWalkAI implements IStateAI /** * The entity using this AI */ - private final AbstractEntityMinecoloniesMob raider; + private final AbstractEntityRaiderMob raider; /** * Target block we're walking to @@ -36,7 +45,17 @@ public class RaiderWalkAI implements IStateAI */ private long walkTimer = 0; - public RaiderWalkAI(final AbstractEntityMinecoloniesMob raider, final ITickRateStateMachine stateMachine) + /** + * Random path result. + */ + private PathResult randomPathResult; + + /** + * If we are currently trying to move to a random block. + */ + private boolean walkInBuildingState = false; + + public RaiderWalkAI(final AbstractEntityRaiderMob raider, final ITickRateStateMachine stateMachine) { this.raider = raider; stateMachine.addTransition(new TickingTransition<>(CombatAIStates.NO_TARGET, this::walk, () -> null, 80)); @@ -62,24 +81,95 @@ private boolean walk() walkToCampFire(); return false; } + raider.setTempEnvDamageImmunity(false); - if (targetBlock == null || raider.blockPosition().distSqr(targetBlock) < 25 || raider.level.getGameTime() > walkTimer) + if (targetBlock == null || raider.level.getGameTime() > walkTimer) { targetBlock = raider.getColony().getRaiderManager().getRandomBuilding(); walkTimer = raider.level.getGameTime() + TICKS_SECOND * 240; - final BlockPos moveToPos = ShipBasedRaiderUtils.chooseWaypointFor(((IColonyRaidEvent) event).getWayPoints(), raider.blockPosition(), targetBlock); - raider.getNavigation().moveToXYZ(moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), 1.1); + + final List wayPoints = ((IColonyRaidEvent) event).getWayPoints(); + final BlockPos moveToPos = ShipBasedRaiderUtils.chooseWaypointFor(wayPoints, raider.blockPosition(), targetBlock); + raider.getNavigation().moveToXYZ(moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), !moveToPos.equals(targetBlock) && moveToPos.distManhattan(wayPoints.get(0)) > 50 ? 1.8 : 1.1); + walkInBuildingState = false; + randomPathResult = null; + } + else if (walkInBuildingState) + { + final BlockPos moveToPos = findRandomPositionToWalkTo(); + if (moveToPos != null) + { + if (moveToPos == BlockPos.ZERO) + { + walkInBuildingState = false; + targetBlock = null; + return false; + } + raider.getNavigation().moveToXYZ(moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), 0.9); + if (raider.blockPosition().distSqr(moveToPos) < 4) + { + if (raider.getRandom().nextDouble() < 0.25) + { + walkInBuildingState = false; + targetBlock = null; + } + else + { + randomPathResult = null; + walkTimer = raider.level.getGameTime() + TICKS_SECOND * 60; + findRandomPositionToWalkTo(); + } + } + } + } + else if (raider.blockPosition().distSqr(targetBlock) < 25) + { + findRandomPositionToWalkTo(); + walkTimer = raider.level.getGameTime() + TICKS_SECOND * 30; + walkInBuildingState = true; } else if (raider.getNavigation().isDone() || raider.getNavigation().getDesiredPos() == null) { - final BlockPos moveToPos = ShipBasedRaiderUtils.chooseWaypointFor(((IColonyRaidEvent) event).getWayPoints(), raider.blockPosition(), targetBlock); - raider.getNavigation().moveToXYZ(moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), 1.1); + final List wayPoints = ((IColonyRaidEvent) event).getWayPoints(); + final BlockPos moveToPos = ShipBasedRaiderUtils.chooseWaypointFor(wayPoints, raider.blockPosition(), targetBlock); + raider.getNavigation() + .moveToXYZ(moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), !moveToPos.equals(targetBlock) && moveToPos.distManhattan(wayPoints.get(0)) > 50 ? 1.8 : 1.1); } } return false; } + protected BlockPos findRandomPositionToWalkTo() + { + if (randomPathResult == null || randomPathResult.failedToReachDestination()) + { + if (raider.getColony().getBuildingManager().getBuilding(targetBlock) instanceof AbstractBuilding building + && building.getBuildingLevel() > 0 + && !building.getCorners().getA().equals(building.getCorners().getB())) + { + randomPathResult = raider.getNavigation().moveToRandomPos(10, 0.9, building.getCorners(), AbstractAdvancedPathNavigate.RestrictionType.XYZ, true); + } + else + { + return BlockPos.ZERO; + } + } + + if (randomPathResult.isPathReachingDestination()) + { + return randomPathResult.getPath().getEndNode().asBlockPos(); + } + + if (randomPathResult.isCancelled()) + { + randomPathResult = null; + return null; + } + + return null; + } + /** * Chooses and walks to a random campfire */ diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/CachingBlockLookup.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/CachingBlockLookup.java new file mode 100644 index 00000000000..bc848253ff6 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/CachingBlockLookup.java @@ -0,0 +1,120 @@ +package com.minecolonies.coremod.entity.pathfinding; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Small block lookup cache, to avoid repeated lookups + */ +public class CachingBlockLookup +{ + /** + * Center of the cache + */ + private int centerX; + private int centerY; + private int centerZ; + + /** + * Original world lookup + */ + private final LevelReader world; + + /** + * Temp world access + */ + private final BlockPos.MutableBlockPos temp = new BlockPos.MutableBlockPos(); + + /** + * States array + */ + private final BlockState[][][] states = new BlockState[5][5][5]; + + public CachingBlockLookup(final BlockPos center, final LevelReader world) + { + centerX = center.getX() + 2; + centerY = center.getY() + 2; + centerZ = center.getZ() + 2; + this.world = world; + } + + /** + * Get a blockstate + * @param pos + * @return + */ + public BlockState getBlockState(final BlockPos pos) + { + final int xPos = centerX - pos.getX(); + final int yPos = centerY - pos.getY(); + final int zPos = centerZ - pos.getZ(); + + if (xPos < 0 || xPos > 4 || yPos < 0 || yPos > 4 || zPos < 0 || zPos > 4) + { + return world.getBlockState(pos); + } + else + { + BlockState state = states[xPos][yPos][zPos]; + if (state == null) + { + state = world.getBlockState(pos); + states[xPos][yPos][zPos] = state; + } + return state; + } + } + + /** + * Get a blockstate + * @param x + * @param y + * @param z + * @return + */ + public BlockState getBlockState(final int x, final int y, final int z) + { + final int xPos = centerX - x; + final int yPos = centerY - y; + final int zPos = centerZ - z; + + if (xPos < 0 || xPos > 4 || yPos < 0 || yPos > 4 || zPos < 0 || zPos > 4) + { + return world.getBlockState(temp.set(x, y, z)); + } + else + { + BlockState state = states[xPos][yPos][zPos]; + if (state == null) + { + state = world.getBlockState(temp.set(x, y, z)); + states[xPos][yPos][zPos] = state; + } + + return state; + } + } + + /** + * Resets the cache's position and data + * @param next + */ + public void resetToNextPos(final BlockPos next) + { + for (int i = 0; i < 5; i++) + { + for (int j = 0; j < 5; j++) + { + for (int k = 0; k < 5; k++) + { + states[i][j][k] = null; + } + } + } + + centerX = next.getX() + 2; + centerY = next.getY() + 2; + centerZ = next.getZ() + 2; + } +} diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/ChunkCache.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/ChunkCache.java index 7ade53267f1..1071e75280a 100755 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/ChunkCache.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/ChunkCache.java @@ -1,39 +1,37 @@ package com.minecolonies.coremod.entity.pathfinding; import com.minecolonies.api.util.WorldUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.world.phys.AABB; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.border.WorldBorder; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.lighting.LevelLightEngine; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; public class ChunkCache implements LevelReader { @@ -53,6 +51,12 @@ public class ChunkCache implements LevelReader */ protected Level world; + /** + * Dimension limits + */ + private final int minBuildHeight; + private final int maxBuildHeight; + public ChunkCache(Level worldIn, BlockPos posFromIn, BlockPos posToIn, int subIn, final DimensionType type) { this.world = worldIn; @@ -67,9 +71,9 @@ public ChunkCache(Level worldIn, BlockPos posFromIn, BlockPos posToIn, int subIn { for (int l = this.chunkZ; l <= j; ++l) { - if (WorldUtil.isEntityChunkLoaded(world, new ChunkPos(k, l))) + if (WorldUtil.isEntityChunkLoaded(world, new ChunkPos(k, l)) && worldIn.getChunkSource() instanceof ServerChunkCache serverChunkCache) { - final ChunkHolder holder = ((ServerChunkCache) worldIn.getChunkSource()).chunkMap.visibleChunkMap.get(ChunkPos.asLong(k, l)); + final ChunkHolder holder = serverChunkCache.chunkMap.visibleChunkMap.get(ChunkPos.asLong(k, l)); if (holder != null) { this.chunkArray[k - this.chunkX][l - this.chunkZ] = holder.getFullChunkFuture().getNow(ChunkHolder.UNLOADED_LEVEL_CHUNK).left().orElse(null); @@ -78,6 +82,9 @@ public ChunkCache(Level worldIn, BlockPos posFromIn, BlockPos posToIn, int subIn } } this.dimType = type; + + minBuildHeight = worldIn.getMinBuildHeight(); + maxBuildHeight = worldIn.getMaxBuildHeight(); } /** @@ -110,6 +117,18 @@ public BlockEntity getTileEntity(BlockPos pos, LevelChunk.EntityCreationType cre return this.chunkArray[i][j].getBlockEntity(pos, createType); } + @Override + public int getMinBuildHeight() + { + return minBuildHeight; + } + + @Override + public int getMaxBuildHeight() + { + return maxBuildHeight; + } + @NotNull @Override public BlockState getBlockState(BlockPos pos) diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java index 4c3501b5307..c2686985b1b 100755 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java @@ -35,8 +35,6 @@ import java.util.HashSet; import java.util.List; -import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate.RestrictionType; - /** * Minecolonies async PathNavigate. */ @@ -114,7 +112,7 @@ public BlockPos getDestination() } @Nullable - public PathResult moveAwayFromXYZ(final BlockPos avoid, final double range, final double speedFactor, final boolean safeDestination) + public PathResult moveAwayFromXYZ(final BlockPos avoid, final double range, final double speedFactor, final boolean safeDestination) { @NotNull final BlockPos start = AbstractPathJob.prepareStart(ourEntity); @@ -127,7 +125,7 @@ public PathResult moveAwayFromXYZ(final BlockPos avoid, final double range, fina } @Nullable - public PathResult moveToRandomPos(final double range, final double speedFactor) + public PathResult moveToRandomPos(final double range, final double speedFactor) { if (pathResult != null && pathResult.getJob() instanceof PathJobRandomPos) { @@ -146,7 +144,7 @@ public PathResult moveToRandomPos(final double range, final double speedFactor) } @Nullable - public PathResult moveToRandomPosAroundX(final int range, final double speedFactor, final BlockPos pos) + public PathResult moveToRandomPosAroundX(final int range, final double speedFactor, final BlockPos pos) { if (pathResult != null && pathResult.getJob() instanceof PathJobRandomPos @@ -156,16 +154,18 @@ public PathResult moveToRandomPosAroundX(final int range, final double speedFact } desiredPos = BlockPos.ZERO; - return setPathJob(new PathJobRandomPos(CompatibilityUtils.getWorldFromEntity(ourEntity), + final PathResult result = setPathJob(new PathJobRandomPos(CompatibilityUtils.getWorldFromEntity(ourEntity), AbstractPathJob.prepareStart(ourEntity), 3, (int) ourEntity.getAttribute(Attributes.FOLLOW_RANGE).getValue(), range, ourEntity, pos), pos, speedFactor, true); + result.getJob().getPathingOptions().withToggleCost(1).withJumpCost(1).withDropCost(1); + return result; } @Override - public PathResult moveToRandomPos(final int range, final double speedFactor, final net.minecraft.util.Tuple corners, final RestrictionType restrictionType) + public PathResult moveToRandomPos(final int range, final double speedFactor, final net.minecraft.util.Tuple corners, final RestrictionType restrictionType, final boolean prioDoors) { if (pathResult != null && pathResult.getJob() instanceof PathJobRandomPos) { @@ -173,10 +173,10 @@ public PathResult moveToRandomPos(final int range, final double speedFactor, fin } desiredPos = BlockPos.ZERO; - final int theRange = (int) (mob.getRandom().nextInt((int) range) + range / 2); + final int theRange = (mob.getRandom().nextInt(range) + range / 2); @NotNull final BlockPos start = AbstractPathJob.prepareStart(ourEntity); - return setPathJob(new PathJobRandomPos(CompatibilityUtils.getWorldFromEntity(ourEntity), + final PathResult result = setPathJob(new PathJobRandomPos(CompatibilityUtils.getWorldFromEntity(ourEntity), start, theRange, (int) ourEntity.getAttribute(Attributes.FOLLOW_RANGE).getValue(), @@ -184,10 +184,13 @@ public PathResult moveToRandomPos(final int range, final double speedFactor, fin corners.getA(), corners.getB(), restrictionType), null, speedFactor, true); + + result.getJob().getPathingOptions().withToggleCost(prioDoors ? 5 : 1).withJumpCost(1).withDropCost(1); + return result; } @Nullable - public PathResult setPathJob( + public PathResult setPathJob( @NotNull final AbstractPathJob job, final BlockPos dest, final double speedFactor, final boolean safeDestination) @@ -250,11 +253,6 @@ else if (pathResult.getStatus() == PathFindingStatus.CALCULATION_COMPLETE) int oldIndex = this.isDone() ? 0 : this.getPath().getNextNodeIndex(); - if (isSneaking) - { - isSneaking = false; - mob.setShiftKeyDown(false); - } this.ourEntity.setYya(0); if (handleLadders(oldIndex)) { @@ -262,6 +260,13 @@ else if (pathResult.getStatus() == PathFindingStatus.CALCULATION_COMPLETE) stuckHandler.checkStuck(this); return; } + + if (isSneaking) + { + isSneaking = false; + mob.setShiftKeyDown(false); + } + if (handleRails()) { stuckHandler.checkStuck(this); @@ -341,7 +346,7 @@ public static double getSmartGroundY(final BlockGetter world, final BlockPos pos } @Nullable - public PathResult moveToXYZ(final double x, final double y, final double z, final double speedFactor) + public PathResult moveToXYZ(final double x, final double y, final double z, final double speedFactor) { final int newX = Mth.floor(x); final int newY = (int) y; @@ -753,8 +758,11 @@ private boolean handlePathPointOnLadder(final PathPointExtended pEx) // Any other value is going down, so lets not move at all default: newSpeed = 0; - mob.setShiftKeyDown(true); - isSneaking = true; + if (!isSneaking) + { + mob.setShiftKeyDown(true); + isSneaking = true; + } this.ourEntity.getMoveControl().setWantedPosition(vec3.x, vec3.y, vec3.z, 0.2); break; } @@ -1013,14 +1021,14 @@ public TreePathResult moveToTree(final int range, final double speed, final List @Nullable @Override - public PathResult moveToLivingEntity(@NotNull final Entity e, final double speed) + public PathResult moveToLivingEntity(@NotNull final Entity e, final double speed) { return moveToXYZ(e.getX(), e.getY(), e.getZ(), speed); } @Nullable @Override - public PathResult moveAwayFromLivingEntity(@NotNull final Entity e, final double distance, final double speed) + public PathResult moveAwayFromLivingEntity(@NotNull final Entity e, final double distance, final double speed) { return moveAwayFromXYZ(new BlockPos(e.position()), distance, speed, true); } diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/MovementHandler.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/MovementHandler.java index 5e46bb515ba..6e9a78e0e8a 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/MovementHandler.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/MovementHandler.java @@ -27,18 +27,36 @@ public class MovementHandler extends MoveControl */ final AttributeInstance speedAtr; + /** + * Step height + */ + private float stepHeight; + + /** + * Speed value + */ + private float speedValue; + public MovementHandler(Mob mob) { super(mob); this.speedAtr = this.mob.getAttribute(Attributes.MOVEMENT_SPEED); + stepHeight = mob.getStepHeight(); + speedValue = (float) speedAtr.getValue(); } @Override public void tick() { + if (mob.tickCount % 20 == 0) + { + stepHeight = this.mob.getStepHeight(); + speedValue = (float) speedAtr.getValue(); + } + if (this.operation == net.minecraft.world.entity.ai.control.MoveControl.Operation.STRAFE) { - final float speedAtt = (float) speedAtr.getValue(); + final float speedAtt = speedValue; float speed = (float) this.speedModifier * speedAtt; float forward = this.strafeForwards; float strafe = this.strafeRight; @@ -88,12 +106,12 @@ else if (this.operation == net.minecraft.world.entity.ai.control.MoveControl.Ope final float range = (float) (Mth.atan2(zDif, xDif) * (double) (180F / (float) Math.PI)) - 90.0F; this.mob.setYRot(this.rotlerp(this.mob.getYRot(), range, 90.0F)); - this.mob.setSpeed((float) (this.speedModifier * speedAtr.getValue())); - final BlockPos blockpos = new BlockPos(this.mob.position()); + this.mob.setSpeed((float) (this.speedModifier * speedValue)); + final BlockPos blockpos = this.mob.blockPosition(); final BlockState blockstate = this.mob.level.getBlockState(blockpos); final Block block = blockstate.getBlock(); final VoxelShape voxelshape = blockstate.getCollisionShape(this.mob.level, blockpos); - if ((yDif > (double) this.mob.maxUpStep && xDif * xDif + zDif * zDif < (double) Math.max(1.0F, this.mob.getBbWidth())) + if ((yDif > (double) stepHeight && xDif * xDif + zDif * zDif < (double) Math.max(1.0F, this.mob.getBbWidth())) || (!voxelshape.isEmpty() && this.mob.getY() < voxelshape.max(Direction.Axis.Y) + (double) blockpos.getY() && !blockstate.is(BlockTags.DOORS) && !blockstate.is( BlockTags.FENCES) && !blockstate.is(BlockTags.FENCE_GATES)) && !block.isLadder(blockstate, this.mob.level, blockpos, this.mob)) @@ -104,7 +122,7 @@ else if (this.operation == net.minecraft.world.entity.ai.control.MoveControl.Ope } else if (this.operation == net.minecraft.world.entity.ai.control.MoveControl.Operation.JUMPING) { - this.mob.setSpeed((float) (this.speedModifier * speedAtr.getValue())); + this.mob.setSpeed((float) (this.speedModifier * speedValue)); // Avoid beeing stuck in jumping while in liquids final BlockPos blockpos = new BlockPos(this.mob.position()); diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/Pathfinding.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/Pathfinding.java index 22db27e7f4f..7453c94139c 100755 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/Pathfinding.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/Pathfinding.java @@ -58,9 +58,7 @@ public static ThreadPoolExecutor getExecutor() */ public static void shutdown() { - getExecutor().shutdownNow(); jobQueue.clear(); - executor = null; } private Pathfinding() diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/AbstractPathJob.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/AbstractPathJob.java index a4ac4c815f3..84b4b8015b7 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/AbstractPathJob.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/AbstractPathJob.java @@ -1,19 +1,16 @@ package com.minecolonies.coremod.entity.pathfinding.pathjobs; -import com.ldtteam.domumornamentum.block.AbstractBlock; import com.ldtteam.domumornamentum.block.decorative.FloatingCarpetBlock; import com.ldtteam.domumornamentum.block.decorative.PanelBlock; import com.minecolonies.api.blocks.decorative.AbstractBlockMinecoloniesConstructionTape; import com.minecolonies.api.blocks.huts.AbstractBlockMinecoloniesDefault; -import com.minecolonies.api.entity.pathfinding.AbstractAdvancedPathNavigate; -import com.minecolonies.api.entity.pathfinding.PathResult; -import com.minecolonies.api.entity.pathfinding.PathingOptions; -import com.minecolonies.api.entity.pathfinding.SurfaceType; +import com.minecolonies.api.entity.pathfinding.*; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.Log; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.blocks.BlockDecorationController; +import com.minecolonies.coremod.entity.pathfinding.CachingBlockLookup; import com.minecolonies.coremod.entity.pathfinding.ChunkCache; import com.minecolonies.coremod.entity.pathfinding.MNode; import com.minecolonies.coremod.entity.pathfinding.PathPointExtended; @@ -31,7 +28,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.Half; @@ -39,10 +35,8 @@ import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.level.pathfinder.Node; import net.minecraft.world.level.pathfinder.Path; -import net.minecraft.world.level.pathfinder.WalkNodeEvaluator; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.common.property.Properties; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,7 +49,7 @@ /** * Abstract class for Jobs that run in the multithreaded path finder. */ -public abstract class AbstractPathJob implements Callable +public abstract class AbstractPathJob implements Callable, IPathJob { /** * Start position to path from. @@ -74,6 +68,11 @@ public abstract class AbstractPathJob implements Callable @NotNull protected final LevelReader world; + /** + * Cached block lookup + */ + protected CachingBlockLookup cachedBlockLookup; + /** * The result of the path calculation. */ @@ -95,17 +94,17 @@ public abstract class AbstractPathJob implements Callable private final Map nodesVisited = new HashMap<>(); // Debug Rendering - protected boolean debugDrawEnabled = false; + protected boolean debugDrawEnabled = false; @Nullable - protected Set debugNodesVisited = new HashSet<>(); + protected Set debugNodesVisited = new HashSet<>(); @Nullable - protected Set debugNodesNotVisited = new HashSet<>(); + protected Set debugNodesNotVisited = new HashSet<>(); @Nullable - protected Set debugNodesPath = new HashSet<>(); + protected Set debugNodesPath = new HashSet<>(); // May be faster, but can produce strange results - private final boolean allowJumpPointSearchTypeWalk; - private int totalNodesAdded = 0; - private int totalNodesVisited = 0; + private final boolean allowJumpPointSearchTypeWalk; + private int totalNodesAdded = 0; + private int totalNodesVisited = 0; /** * Which citizens are being tracked by which players. @@ -182,6 +181,7 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul this.start = new BlockPos(start); this.end = end; + cachedBlockLookup = new CachingBlockLookup(start, this.world); this.maxRange = range; this.result = result; @@ -212,15 +212,16 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul * @param result path result. * @param entity the entity. */ - public AbstractPathJob(final Level world, - final BlockPos start, - final BlockPos startRestriction, - final BlockPos endRestriction, - final int range, - final boolean hardRestriction, - final PathResult result, - final LivingEntity entity, - final AbstractAdvancedPathNavigate.RestrictionType restrictionType) + public AbstractPathJob( + final Level world, + final BlockPos start, + final BlockPos startRestriction, + final BlockPos endRestriction, + final int range, + final boolean hardRestriction, + final PathResult result, + final LivingEntity entity, + final AbstractAdvancedPathNavigate.RestrictionType restrictionType) { this(world, start, startRestriction, endRestriction, range, Vec3i.ZERO, hardRestriction, result, entity, restrictionType); } @@ -241,16 +242,17 @@ public AbstractPathJob(final Level world, * @param result path result. * @param entity the entity. */ - public AbstractPathJob(final Level world, - @NotNull final BlockPos start, - final BlockPos startRestriction, - final BlockPos endRestriction, - final int range, - final Vec3i grow, - final boolean hardRestriction, - final PathResult result, - final LivingEntity entity, - final AbstractAdvancedPathNavigate.RestrictionType restrictionType) + public AbstractPathJob( + final Level world, + @NotNull final BlockPos start, + final BlockPos startRestriction, + final BlockPos endRestriction, + final int range, + final Vec3i grow, + final boolean hardRestriction, + final PathResult result, + final LivingEntity entity, + final AbstractAdvancedPathNavigate.RestrictionType restrictionType) { this.minX = Math.min(startRestriction.getX(), endRestriction.getX()) - grow.getX(); this.minZ = Math.min(startRestriction.getZ(), endRestriction.getZ()) - grow.getZ(); @@ -265,7 +267,7 @@ public AbstractPathJob(final Level world, this.world = new ChunkCache(world, new BlockPos(minX, world.getMinBuildHeight(), minZ), new BlockPos(maxX, world.getMaxBuildHeight(), maxZ), range, world.dimensionType()); this.start = start; - + cachedBlockLookup = new CachingBlockLookup(start, this.world); this.maxRange = range; this.result = result; @@ -285,6 +287,7 @@ public AbstractPathJob(final Level world, /** * Sync the path of a given mob to the client. + * * @param mob the tracked mob. */ public void synchToClient(final LivingEntity mob) @@ -305,8 +308,9 @@ else if (entry.getValue().equals(mob.getUUID())) /** * Set the set of reached blocks to the client. + * * @param reached the reached blocks. - * @param mob the tracked mob. + * @param mob the tracked mob. */ public static void synchToClient(final HashSet reached, final Mob mob) { @@ -431,12 +435,14 @@ else if (b instanceof FenceBlock || b instanceof WallBlock || b instanceof Abstr /** * Check if this a valid state to stand in. + * * @param state the state to check. * @return true if so. */ private static boolean canStandInSolidBlock(final BlockState state) { - return state.getBlock() instanceof DoorBlock || state.getBlock() instanceof TrapDoorBlock || state.getBlock() instanceof PanelBlock || !state.getBlock().properties.hasCollision; + return state.getBlock() instanceof DoorBlock || state.getBlock() instanceof TrapDoorBlock || (state.getBlock() instanceof PanelBlock && state.getValue(PanelBlock.OPEN)) + || !state.getBlock().properties.hasCollision; } /** @@ -531,15 +537,15 @@ protected double computeCost( final BlockState state, final BlockPos blockPos) { - double cost = Math.sqrt(dPos.getX() * dPos.getX() + dPos.getY() * dPos.getY() + dPos.getZ() * dPos.getZ()); + double cost = Math.sqrt(dPos.getX() * dPos.getX() + dPos.getZ() * dPos.getZ()); if (dPos.getY() != 0 && !(Math.abs(dPos.getY()) <= 1 && world.getBlockState(blockPos).getBlock() instanceof StairBlock)) { - if (dPos.getY() > 0) + if (dPos.getY() > 0 && pathingOptions.jumpCost != 1) { cost *= pathingOptions.jumpCost * Math.abs(dPos.getY()); } - else + else if (pathingOptions.dropCost != 1) { cost *= pathingOptions.dropCost * Math.abs(dPos.getY()); } @@ -595,11 +601,18 @@ private static boolean calculateSwimming(@NotNull final LevelReader world, @NotN return (node == null) ? SurfaceType.isWater(world, pos.below()) : node.isSwimming(); } + @Override public PathResult getResult() { return result; } + @Override + public PathingOptions getPathingOptions() + { + return pathingOptions; + } + /** * Callable method for initiating asynchronous task. * @@ -654,7 +667,8 @@ protected Path search() handleDebugOptions(currentNode); currentNode.setClosed(); - final boolean isViablePosition = isInRestrictedArea(currentNode.pos) && SurfaceType.getSurfaceType(world, world.getBlockState(currentNode.pos.below()), currentNode.pos.below()) == SurfaceType.WALKABLE; + final boolean isViablePosition = isInRestrictedArea(currentNode.pos) + && SurfaceType.getSurfaceType(world, world.getBlockState(currentNode.pos.below()), currentNode.pos.below()) == SurfaceType.WALKABLE; if (isViablePosition && isAtDestination(currentNode)) { bestNode = currentNode; @@ -711,6 +725,8 @@ private void addPathNodeToDebug(final MNode node) private void walkCurrentNode(@NotNull final MNode currentNode) { + cachedBlockLookup.resetToNextPos(currentNode.pos); + BlockPos dPos = BLOCKPOS_IDENTITY; if (currentNode.parent != null) { @@ -737,7 +753,7 @@ private void walkCurrentNode(@NotNull final MNode currentNode) } // Walk downwards node if passable - if (isPassable(currentNode.pos.below(), false, currentNode.parent) && (!currentNode.isSwimming() && isLiquid(world.getBlockState(currentNode.pos.below())))) + if (isPassable(currentNode.pos.below(), false, currentNode.parent) && (!currentNode.isSwimming() && isLiquid(cachedBlockLookup.getBlockState(currentNode.pos.below())))) { walk(currentNode, BLOCKPOS_DOWN); } @@ -799,6 +815,7 @@ else if (isLiquid(world.getBlockState(start.below()))) /** * Check if this is a liquid state for swimming. + * * @param state the state to check. * @return true if so. */ @@ -1008,7 +1025,7 @@ protected final boolean walk(@NotNull final MNode parent, @NotNull BlockPos dPos } // If we're going down, take the air-corner before going to the lower node else if (!parent.isCornerNode() && newY - parent.pos.getY() < 0 && (dPos.getX() != 0 || dPos.getZ() != 0) && (parent.parent == null || !parent.pos.below() - .equals(parent.parent.pos))) + .equals(parent.parent.pos))) { dPos = new BlockPos(dPos.getX(), 0, dPos.getZ()); pos = parent.pos.offset(dPos); @@ -1038,12 +1055,14 @@ else if (!parent.isCornerNode() && newY - parent.pos.getY() < 0 && (dPos.getX() } final boolean swimStart = isSwimming && !parent.isSwimming(); - final BlockState state = world.getBlockState(pos); - final boolean onRoad = WorkerUtil.isPathBlock(world.getBlockState(pos.below()).getBlock()); - final boolean onRails = pathingOptions.canUseRails() && world.getBlockState(corner ? pos.below() : pos).getBlock() instanceof BaseRailBlock; + final BlockState state = cachedBlockLookup.getBlockState(pos); + final boolean onRoad = WorkerUtil.isPathBlock(cachedBlockLookup.getBlockState(pos.below()).getBlock()); + final boolean onRails = pathingOptions.canUseRails() && cachedBlockLookup.getBlockState(corner ? pos.below() : pos).getBlock() instanceof BaseRailBlock; final boolean railsExit = !onRails && parent != null && parent.isOnRails(); // Cost may have changed due to a jump up or drop - final double stepCost = computeCost(dPos, isSwimming, onRoad, onRails, railsExit, swimStart, corner, state, pos); + double stepCost = computeCost(dPos, isSwimming, onRoad, onRails, railsExit, swimStart, corner, state, pos); + stepCost = calcAdditionalCost(stepCost, parent, pos, state); + final double heuristic = computeHeuristic(pos); final double cost = parent.getCost() + stepCost; final double score = cost + heuristic; @@ -1069,6 +1088,20 @@ else if (updateCurrentNode(parent, node, heuristic, cost, score)) return true; } + /** + * Calculates additional costs if needed for node + * + * @param stepCost + * @param parent + * @param pos + * @param state + * @return + */ + protected double calcAdditionalCost(final double stepCost, final MNode parent, final BlockPos pos, final BlockState state) + { + return stepCost; + } + private void performJumpPointSearch(@NotNull final MNode parent, @NotNull final BlockPos dPos, @NotNull final MNode node) { if (allowJumpPointSearchTypeWalk && node.getHeuristic() <= parent.getHeuristic()) @@ -1135,7 +1168,7 @@ private boolean updateCurrentNode(@NotNull final MNode parent, @NotNull final MN */ protected int getGroundHeight(final MNode parent, @NotNull final BlockPos pos) { - if (isLiquid(world.getBlockState(pos.above()))) + if (isLiquid(cachedBlockLookup.getBlockState(pos.above()))) { return -100; } @@ -1143,18 +1176,18 @@ protected int getGroundHeight(final MNode parent, @NotNull final BlockPos pos) // lower body (headroom drop) or lower body (jump up) if (checkHeadBlock(parent, pos)) { - return handleTargetNotPassable(parent, pos.above(), world.getBlockState(pos.above())); + return handleTargetNotPassable(parent, pos.above(), cachedBlockLookup.getBlockState(pos.above())); } // Now check the block we want to move to - final BlockState target = world.getBlockState(pos); + final BlockState target = cachedBlockLookup.getBlockState(pos); if (!isPassable(target, pos, parent, false)) { return handleTargetNotPassable(parent, pos, target); } // Do we have something to stand on in the target space? - final BlockState below = world.getBlockState(pos.below()); + final BlockState below = cachedBlockLookup.getBlockState(pos.below()); final SurfaceType walkability = SurfaceType.getSurfaceType(world, below, pos); if (walkability == SurfaceType.WALKABLE) { @@ -1191,14 +1224,14 @@ private int checkDrop(@Nullable final MNode parent, @NotNull final BlockPos pos, final boolean canDrop = parent != null && !parent.isLadder(); // Nothing to stand on if (!canDrop || ((parent.pos.getX() != pos.getX() || parent.pos.getZ() != pos.getZ()) && isPassable(parent.pos.below(), false, parent) - && SurfaceType.getSurfaceType(world, world.getBlockState(parent.pos.below()), parent.pos.below()) == SurfaceType.DROPABLE)) + && SurfaceType.getSurfaceType(world, cachedBlockLookup.getBlockState(parent.pos.below()), parent.pos.below()) == SurfaceType.DROPABLE)) { return -100; } for (int i = 2; i <= 10; i++) { - final BlockState below = world.getBlockState(pos.below(i)); + final BlockState below = cachedBlockLookup.getBlockState(pos.below(i)); if (SurfaceType.getSurfaceType(world, below, pos) == SurfaceType.WALKABLE && i <= 3 || isLiquid(below)) { // Level path @@ -1243,26 +1276,32 @@ private int handleTargetNotPassable(@Nullable final MNode parent, @NotNull final // Check for headroom in the target space if (!isPassable(pos.above(2), false, parent)) { - final VoxelShape bb1 = world.getBlockState(pos).getCollisionShape(world, pos); - final VoxelShape bb2 = world.getBlockState(pos.above(2)).getCollisionShape(world, pos.above(2)); + final VoxelShape bb1 = cachedBlockLookup.getBlockState(pos).getCollisionShape(world, pos); + final VoxelShape bb2 = cachedBlockLookup.getBlockState(pos.above(2)).getCollisionShape(world, pos.above(2)); if ((pos.above(2).getY() + getStartY(bb2, 1)) - (pos.getY() + getEndY(bb1, 0)) < 2) { return -100; } } + if (!canLeaveBlock(pos.above(2), parent, true)) + { + return -100; + } + // Check for jump room from the origin space if (!isPassable(parent.pos.above(2), false, parent)) { - final VoxelShape bb1 = world.getBlockState(pos).getCollisionShape(world, pos); - final VoxelShape bb2 = world.getBlockState(parent.pos.above(2)).getCollisionShape(world, parent.pos.above(2)); + final VoxelShape bb1 = cachedBlockLookup.getBlockState(pos).getCollisionShape(world, pos); + final VoxelShape bb2 = cachedBlockLookup.getBlockState(parent.pos.above(2)).getCollisionShape(world, parent.pos.above(2)); if ((parent.pos.above(2).getY() + getStartY(bb2, 1)) - (pos.getY() + getEndY(bb1, 0)) < 2) { return -100; } } - final BlockState parentBelow = world.getBlockState(parent.pos.below()); + + final BlockState parentBelow = cachedBlockLookup.getBlockState(parent.pos.below()); final VoxelShape parentBB = parentBelow.getCollisionShape(world, parent.pos.below()); double parentY = parentBB.max(Direction.Axis.Y); @@ -1285,7 +1324,7 @@ private int handleTargetNotPassable(@Nullable final MNode parent, @NotNull final private boolean checkHeadBlock(@Nullable final MNode parent, @NotNull final BlockPos pos) { BlockPos localPos = pos; - final VoxelShape bb = world.getBlockState(localPos).getCollisionShape(world, localPos); + final VoxelShape bb = cachedBlockLookup.getBlockState(localPos).getCollisionShape(world, localPos); if (bb.max(Direction.Axis.Y) < 1) { localPos = pos.above(); @@ -1298,15 +1337,15 @@ private boolean checkHeadBlock(@Nullable final MNode parent, @NotNull final Bloc if (!isPassable(pos.above(), true, parent)) { - final VoxelShape bb1 = world.getBlockState(pos.below()).getCollisionShape(world, pos.below()); - final VoxelShape bb2 = world.getBlockState(pos.above()).getCollisionShape(world, pos.above()); + final VoxelShape bb1 = cachedBlockLookup.getBlockState(pos.below()).getCollisionShape(world, pos.below()); + final VoxelShape bb2 = cachedBlockLookup.getBlockState(pos.above()).getCollisionShape(world, pos.above()); if ((pos.above().getY() + getStartY(bb2, 1)) - (pos.below().getY() + getEndY(bb1, 0)) < 2) { return true; } if (parent != null) { - final VoxelShape bb3 = world.getBlockState(parent.pos.below()).getCollisionShape(world, pos.below()); + final VoxelShape bb3 = cachedBlockLookup.getBlockState(parent.pos.below()).getCollisionShape(world, pos.below()); if ((pos.above().getY() + getStartY(bb2, 1)) - (parent.pos.below().getY() + getEndY(bb3, 0)) < 1.75) { return true; @@ -1316,10 +1355,10 @@ private boolean checkHeadBlock(@Nullable final MNode parent, @NotNull final Bloc if (parent != null) { - final BlockState hereState = world.getBlockState(localPos.below()); - final VoxelShape bb1 = world.getBlockState(pos).getCollisionShape(world, pos); - final VoxelShape bb2 = world.getBlockState(localPos.above()).getCollisionShape(world, localPos.above()); - if ((localPos.above().getY() + getStartY(bb2, 1)) - (pos.getY() + getEndY(bb1, 0) ) >= 2) + final BlockState hereState = cachedBlockLookup.getBlockState(localPos.below()); + final VoxelShape bb1 = cachedBlockLookup.getBlockState(pos).getCollisionShape(world, pos); + final VoxelShape bb2 = cachedBlockLookup.getBlockState(localPos.above()).getCollisionShape(world, localPos.above()); + if ((localPos.above().getY() + getStartY(bb2, 1)) - (pos.getY() + getEndY(bb1, 0)) >= 2) { return false; } @@ -1331,7 +1370,8 @@ private boolean checkHeadBlock(@Nullable final MNode parent, @NotNull final Bloc /** * Get the start y of a voxelshape. - * @param bb the voxelshape. + * + * @param bb the voxelshape. * @param def the default if empty. * @return the start y. */ @@ -1342,7 +1382,8 @@ private double getStartY(final VoxelShape bb, final int def) /** * Get the end y of a voxelshape. - * @param bb the voxelshape. + * + * @param bb the voxelshape. * @param def the default if empty. * @return the end y. */ @@ -1354,9 +1395,9 @@ private double getEndY(final VoxelShape bb, final int def) /** * Is the space passable. * - * @param block the block we are checking. + * @param block the block we are checking. * @param parent the parent node. - * @param head the head position. + * @param head the head position. * @return true if the block does not block movement. */ protected boolean isPassable(@NotNull final BlockState block, final BlockPos pos, final MNode parent, final boolean head) @@ -1379,17 +1420,26 @@ protected boolean isPassable(@NotNull final BlockState block, final BlockPos pos parentPos = parentPos.above(); } final BlockPos dir = pos.subtract(parentPos); - if (dir.getY() != 0 && dir.getX() == 0 && dir.getZ() == 0) - { - return true; - } - final Direction direction = BlockPosUtil.getXZFacing(parentPos, pos); final Direction facing = block.getValue(TrapDoorBlock.FACING); - if (block.getBlock() instanceof PanelBlock && !block.getValue(PanelBlock.OPEN) - && ((dir.getY() == 0 && block.getValue(PanelBlock.HALF) == Half.TOP) || (dir.getY() != 0 && block.getValue(PanelBlock.HALF) == Half.BOTTOM))) + if (block.getBlock() instanceof PanelBlock && !block.getValue(PanelBlock.OPEN)) { + if (dir.getY() == 0) + { + return (head && block.getValue(PanelBlock.HALF) == Half.TOP); + } + + if (head && dir.getY() == 1 && block.getValue(PanelBlock.HALF) == Half.TOP) + { + return true; + } + + if (!head && dir.getY() == -1 && block.getValue(PanelBlock.HALF) == Half.BOTTOM) + { + return true; + } + return false; } @@ -1429,7 +1479,7 @@ else if (block.getBlock() instanceof FireBlock || block.getBlock() instanceof Sw return true; } - if (shape.isEmpty() || shape.max(Direction.Axis.Y) <= 0.1 && !isLiquid((block)) && (block.getBlock() != Blocks.SNOW || block.getValue(SnowLayerBlock.LAYERS) == 1)) + if (shape.isEmpty() || shape.max(Direction.Axis.Y) <= 0.1 && !isLiquid((block)) && (block.getBlock() != Blocks.SNOW || block.getValue(SnowLayerBlock.LAYERS) == 1)) { final BlockPathTypes pathType = block.getBlockPathType(world, pos, (Mob) entity.get()); if (pathType == null || pathType.getDanger() == null) @@ -1446,7 +1496,7 @@ else if (block.getBlock() instanceof FireBlock || block.getBlock() instanceof Sw protected boolean isPassable(final BlockPos pos, final boolean head, final MNode parent) { - final BlockState state = world.getBlockState(pos); + final BlockState state = cachedBlockLookup.getBlockState(pos); final VoxelShape shape = state.getCollisionShape(world, pos); if (shape.isEmpty() || shape.max(Direction.Axis.Y) <= 0.1) { @@ -1459,7 +1509,8 @@ protected boolean isPassable(final BlockPos pos, final boolean head, final MNode /** * Check if we can leave the block at this pos. - * @param pos the pos to go to. + * + * @param pos the pos to go to. * @param parent the parent pos (to check if we can leave) * @return true if so. */ @@ -1470,10 +1521,19 @@ private boolean canLeaveBlock(final BlockPos pos, final MNode parent, final bool { parentPos = parentPos.above(); } - final BlockState parentBlock = world.getBlockState(parentPos); + final BlockState parentBlock = cachedBlockLookup.getBlockState(parentPos); if (parentBlock.getBlock() instanceof TrapDoorBlock || parentBlock.getBlock() instanceof PanelBlock) { final BlockPos dir = pos.subtract(parentPos); + if (!parentBlock.getValue(TrapDoorBlock.OPEN)) + { + if (dir.getY() != 0) + { + return (head && parentBlock.getValue(PanelBlock.HALF) == Half.TOP && dir.getY() < 0) || (!head && parentBlock.getValue(PanelBlock.HALF) == Half.BOTTOM + && dir.getY() > 0); + } + return true; + } if (dir.getX() != 0 || dir.getZ() != 0) { // Check if we can leave the current block, there might be a trapdoor or panel blocking us. @@ -1497,12 +1557,12 @@ private boolean canLeaveBlock(final BlockPos pos, final MNode parent, final bool */ protected boolean isLadder(@NotNull final Block block, final BlockPos pos) { - return block.isLadder(this.world.getBlockState(pos), world, pos, entity.get()) && (block != Blocks.VINE || pathingOptions.canClimbVines()); + return block.isLadder(this.cachedBlockLookup.getBlockState(pos), world, pos, entity.get()) && (block != Blocks.VINE || pathingOptions.canClimbVines()); } protected boolean isLadder(final BlockPos pos) { - return isLadder(world.getBlockState(pos).getBlock(), pos); + return isLadder(cachedBlockLookup.getBlockState(pos).getBlock(), pos); } /** @@ -1512,11 +1572,12 @@ protected boolean isLadder(final BlockPos pos) */ public void setPathingOptions(final PathingOptions pathingOptions) { - this.pathingOptions = pathingOptions; + this.pathingOptions.importFrom(pathingOptions); } /** * Check if in restricted area. + * * @param pos the pos to check. * @return true if so. */ diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveAwayFromLocation.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveAwayFromLocation.java index 28a295a356f..ce7a20bb231 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveAwayFromLocation.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveAwayFromLocation.java @@ -1,12 +1,14 @@ package com.minecolonies.coremod.entity.pathfinding.pathjobs; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.util.Log; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.entity.pathfinding.MNode; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.pathfinder.Path; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; +import net.minecraft.world.level.pathfinder.Path; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,6 +29,11 @@ public class PathJobMoveAwayFromLocation extends AbstractPathJob */ protected final int avoidDistance; + /** + * The blockposition we're trying to move away to + */ + private BlockPos preferredDirection; + /** * Prepares the PathJob for the path finding system. * @@ -49,6 +56,16 @@ public PathJobMoveAwayFromLocation( this.avoid = new BlockPos(avoid); this.avoidDistance = avoidDistance; + + preferredDirection = entity.blockPosition().offset(entity.blockPosition().subtract(avoid).multiply(range)); + if (entity instanceof AbstractEntityCitizen) + { + final IColony colony = ((AbstractEntityCitizen) entity).getCitizenColonyHandler().getColony(); + if (colony != null) + { + preferredDirection = colony.getCenter(); + } + } } /** @@ -78,7 +95,7 @@ protected Path search() @Override protected double computeHeuristic(@NotNull final BlockPos pos) { - return -avoid.distSqr(pos); + return Math.sqrt(preferredDirection.distSqr(pos)) + 100 / Math.max(1, Math.sqrt(avoid.distSqr(pos))); } /** diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveToLocation.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveToLocation.java index 6e9e0a246ac..ee825001e73 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveToLocation.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobMoveToLocation.java @@ -111,6 +111,6 @@ protected boolean isAtDestination(@NotNull final MNode n) protected double getNodeResultScore(@NotNull final MNode n) { // For Result Score lower is better - return destination.distSqr(n.pos); + return destination.distManhattan(n.pos); } } diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobPathway.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobPathway.java new file mode 100644 index 00000000000..5566f9c6a9a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobPathway.java @@ -0,0 +1,116 @@ +package com.minecolonies.coremod.entity.pathfinding.pathjobs; + +import com.minecolonies.api.colony.IColonyTagCapability; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.entity.pathfinding.PathingOptions; +import com.minecolonies.api.util.BlockPosUtil; +import com.minecolonies.coremod.entity.citizen.EntityCitizen; +import com.minecolonies.coremod.entity.pathfinding.MNode; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; + +/** + * Path job to find a path between buildings + */ +public class PathJobPathway extends AbstractPathJob +{ + /** + * Buildings to avoid + */ + private final List buildings; + + private int colonyid = -1; + + /** + * Additional cost multiplier + */ + private double addCost = 1.0; + + public PathJobPathway( + final int colonyID, + final List buildings, + final Level world, + @NotNull final BlockPos start, final BlockPos end, final int range, final EntityCitizen citizen) + { + super(world, start, end, range, citizen); + this.colonyid = colonyID; + this.buildings = buildings; + setPathingOptions(new PathingOptions().withJumpCost(100).withStartSwimCost(30).withSwimCost(5).withCanSwim(true).withCanEnterDoors(true)); + } + + @Override + protected double computeHeuristic(final BlockPos pos) + { + final LevelChunk chunk = (LevelChunk) world.getChunk(pos.getX() >> 4, pos.getZ() >> 4); + + final IColonyTagCapability colonyCap = chunk.getCapability(CLOSE_COLONY_CAP, null).resolve().orElse(null); + if (colonyCap != null && colonyCap.getOwningColony() == colonyid) + { + return Math.sqrt(end.distSqr(pos)) / (colonyCap.getAllClaimingBuildings().size() + 1); + } + + return Math.sqrt(end.distSqr(pos)); + } + + @Override + protected boolean isAtDestination(final MNode n) + { + return (end.distSqr(n.pos) < 5 * 5); + } + + @Override + protected double getNodeResultScore(final MNode n) + { + final double dist = Math.sqrt(end.distSqr(n.pos)); + if (dist < 15) + { + return n.getCost(); + } + + return dist; + } + + @Override + protected boolean isPassable(final BlockPos pos, final boolean head, final MNode currentnode) + { + if (super.isPassable(pos, head, currentnode)) + { + for (final IBuilding building : buildings) + { + if (BlockPosUtil.isInArea(building.getCorners().getA(), building.getCorners().getB(), pos) + && !BlockPosUtil.isInArea(building.getCorners().getA(), building.getCorners().getB(), end) + && !BlockPosUtil.isInArea(building.getCorners().getA(), building.getCorners().getB(), start)) + { + return false; + } + } + + return true; + } + + return false; + } + + @Override + protected double calcAdditionalCost(final double stepCost, final MNode parent, final BlockPos pos, final BlockState state) + { + if (parent.parent != null && parent.pos.getX() == parent.parent.pos.getX() && pos.getX() != parent.pos.getX()) + { + return stepCost * 10; + } + + if (parent.parent != null && parent.pos.getZ() == parent.parent.pos.getZ() && pos.getZ() != parent.pos.getZ()) + { + return stepCost * 10; + } + + return stepCost; + } +} diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobRandomPos.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobRandomPos.java index 6a17d121a9d..9d903d11c21 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobRandomPos.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobRandomPos.java @@ -139,13 +139,13 @@ protected Path search() @Override protected double computeHeuristic(@NotNull final BlockPos pos) { - return Math.sqrt(destination.distSqr(new BlockPos(pos.getX(), destination.getY(), pos.getZ()))); + return Math.sqrt(destination.distSqr(new BlockPos(pos.getX(), pos.getY(), pos.getZ()))); } @Override protected boolean isAtDestination(@NotNull final MNode n) { - if (random.nextInt(10) == 0 + if (random.nextInt(minDistFromStart*minDistFromStart) == 0 && isInRestrictedArea(n.pos) && (start.distSqr(n.pos) > minDistFromStart * minDistFromStart) && SurfaceType.getSurfaceType(world, world.getBlockState(n.pos.below()), n.pos.below()) == SurfaceType.WALKABLE @@ -162,7 +162,7 @@ protected double getNodeResultScore(@NotNull final MNode n) { return 0; } - + /** * Checks if position and range match the given parameters * diff --git a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobWalkRandomEdge.java b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobWalkRandomEdge.java index 8a9a32a7b9f..61cf3857870 100644 --- a/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobWalkRandomEdge.java +++ b/src/main/java/com/minecolonies/coremod/entity/pathfinding/pathjobs/PathJobWalkRandomEdge.java @@ -7,6 +7,8 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; +import java.util.Random; + /** * Walks to a random edge block nearby, a block next to air. Does not use ladders */ @@ -17,6 +19,11 @@ public class PathJobWalkRandomEdge extends AbstractPathJob */ private static final int NODE_EDGE_CHANCE = 10; + /** + * Walk-job specific random. + */ + private static final Random random = new Random(); + public PathJobWalkRandomEdge( final Level world, @NotNull final BlockPos start, final int range, final LivingEntity entity) @@ -38,7 +45,7 @@ protected boolean isAtDestination(final MNode n) return false; } - if (entity.get().getRandom().nextInt(NODE_EDGE_CHANCE) == 0) + if (random.nextInt(NODE_EDGE_CHANCE) == 0) { for (final Direction direction : Direction.Plane.HORIZONTAL) { diff --git a/src/main/java/com/minecolonies/coremod/event/ClientEventHandler.java b/src/main/java/com/minecolonies/coremod/event/ClientEventHandler.java index 30b734adf97..53bfd4da8ec 100644 --- a/src/main/java/com/minecolonies/coremod/event/ClientEventHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/ClientEventHandler.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.event; import com.google.common.collect.ImmutableMap; +import com.ldtteam.structurize.items.ModItems; import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.MinecoloniesAPIProxy; import com.minecolonies.api.blocks.AbstractBlockHut; @@ -10,7 +11,7 @@ import com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule; import com.minecolonies.api.colony.buildings.registry.BuildingEntry; import com.minecolonies.api.research.IGlobalResearch; -import com.minecolonies.api.sounds.ModSoundEvents; +import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.client.gui.WindowBuildingBrowser; @@ -18,6 +19,8 @@ import com.minecolonies.coremod.client.render.worldevent.WorldEventContext; import com.minecolonies.coremod.colony.crafting.CustomRecipe; import com.minecolonies.coremod.colony.crafting.CustomRecipeManager; +import com.minecolonies.coremod.util.DomumOrnamentumUtils; +import com.minecolonies.coremod.util.SchemAnalyzerUtil; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -45,6 +48,7 @@ import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; +import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,6 +58,7 @@ import java.util.Set; import java.util.function.Supplier; +import static com.minecolonies.api.sounds.ModSoundEvents.CITIZEN_SOUND_EVENT_PREFIX; import static com.minecolonies.api.util.constant.TranslationConstants.*; import static com.minecolonies.api.util.constant.translation.DebugTranslationConstants.*; @@ -63,8 +68,6 @@ @OnlyIn(Dist.CLIENT) public class ClientEventHandler { - private static final String MOB_SOUND_EVENT_PREFIX = "mob."; - /** * Lazy cache for crafting module lookups. */ @@ -91,77 +94,86 @@ public static void onPlaySoundEvent(final PlaySoundEvent event) return; } - if (event.getSound().getLocation().getNamespace().equals(Constants.MOD_ID) - && !MinecoloniesAPIProxy.getInstance().getConfig().getClient().citizenVoices.get()) + final ResourceLocation soundLocation = event.getSound().getLocation(); + if (!MinecoloniesAPIProxy.getInstance().getConfig().getClient().citizenVoices.get() + && soundLocation.getNamespace().equals(Constants.MOD_ID) + && soundLocation.getPath().startsWith(CITIZEN_SOUND_EVENT_PREFIX) + ) { - final String path = event.getSound().getLocation().getPath(); - if (!path.startsWith(MOB_SOUND_EVENT_PREFIX)) - { - return; - } - final int secondDotPos = path.indexOf('.', MOB_SOUND_EVENT_PREFIX.length()); - if (secondDotPos == -1) - { - return; - } - final String mobName = path.substring(MOB_SOUND_EVENT_PREFIX.length(), secondDotPos); - if (ModSoundEvents.CITIZEN_SOUND_EVENTS.containsKey(mobName)) - { - event.setSound(null); - } + event.setSound(null); } } /** * Fires when an item tooltip is requested, generally from inventory, JEI, or when minecraft is first populating the recipe book. + * * @param event An ItemTooltipEvent */ @SubscribeEvent public static void onItemTooltipEvent(final ItemTooltipEvent event) { // Vanilla recipe books populate tooltips once before the player exists on remote clients, some other cases. - if(event.getEntity() == null) + if (event.getEntity() == null) { return; } IColony colony = IMinecoloniesAPI.getInstance().getColonyManager().getIColony(event.getEntity().level, event.getEntity().blockPosition()); - if(colony == null) + if (colony == null) { colony = IMinecoloniesAPI.getInstance().getColonyManager().getIColonyByOwner(event.getEntity().level, event.getEntity()); } handleCrafterRecipeTooltips(colony, event.getToolTip(), event.getItemStack().getItem()); - if(event.getItemStack().getItem() instanceof BlockItem) + if (event.getItemStack().getItem() instanceof BlockItem) { final BlockItem blockItem = (BlockItem) event.getItemStack().getItem(); - if(blockItem.getBlock() instanceof AbstractBlockHut) + if (blockItem.getBlock() instanceof AbstractBlockHut) { handleHutBlockResearchUnlocks(colony, event.getToolTip(), blockItem.getBlock()); } + + if (event.getEntity().isCreative() && InventoryUtils.hasItemInItemHandler(new InvWrapper(event.getEntity().getInventory()), ModItems.scanTool.get())) + { + int tier = SchemAnalyzerUtil.getBlockTier(blockItem.getBlock()); + + if (DomumOrnamentumUtils.isDoBlock(blockItem.getBlock()) && event.getItemStack().hasTag()) + { + for (Block block : DomumOrnamentumUtils.getTextureData(event.getItemStack()).getTexturedComponents().values()) + { + tier = Math.max(tier, SchemAnalyzerUtil.getBlockTier(block)); + } + } + + event.getToolTip().add(Component.translatable("com.minecolonies.coremod.tooltip.schematic.tier", tier)); + } } } /** * Display crafter recipe-related information on the client. - * @param colony The colony to check against, if one is present. - * @param toolTip The tooltip to add the text onto. - * @param item The item that will have the tooltip text added. + * + * @param colony The colony to check against, if one is present. + * @param toolTip The tooltip to add the text onto. + * @param item The item that will have the tooltip text added. */ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, final List toolTip, final Item item) { final List recipes = CustomRecipeManager.getInstance().getRecipeByOutput(item); - if(recipes.isEmpty()) + if (recipes.isEmpty()) { return; } - for(CustomRecipe rec : recipes) + for (CustomRecipe rec : recipes) { - if(!rec.getShowTooltip() || rec.getCrafter().length() < 2) + if (!rec.getShowTooltip() || rec.getCrafter().length() < 2) { continue; } final BuildingEntry craftingBuilding = crafterToBuilding.get().get(rec.getCrafter()); - if (craftingBuilding == null) continue; + if (craftingBuilding == null) + { + continue; + } final Component craftingBuildingName = getFullBuildingName(craftingBuilding); if (rec.getMinBuildingLevel() > 0) { @@ -172,7 +184,7 @@ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, // unless we can change how colony.hasBuilding uses its parameter... final MutableComponent reqLevelText = Component.translatable(COM_MINECOLONIES_COREMOD_ITEM_BUILDLEVEL_TOOLTIP_GUI, craftingBuildingName, rec.getMinBuildingLevel()); - if(colony != null && colony.hasBuilding(schematicName, rec.getMinBuildingLevel(), true)) + if (colony != null && colony.hasBuilding(schematicName, rec.getMinBuildingLevel(), true)) { reqLevelText.setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA)); } @@ -185,13 +197,13 @@ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, else { final MutableComponent reqBuildingTxt = Component.translatable(COM_MINECOLONIES_COREMOD_ITEM_AVAILABLE_TOOLTIP_GUI, craftingBuildingName) - .setStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY)); + .setStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY)); toolTip.add(reqBuildingTxt); } - if(rec.getRequiredResearchId() != null) + if (rec.getRequiredResearchId() != null) { final Set researches; - if(IMinecoloniesAPI.getInstance().getGlobalResearchTree().hasResearch(rec.getRequiredResearchId())) + if (IMinecoloniesAPI.getInstance().getGlobalResearchTree().hasResearch(rec.getRequiredResearchId())) { researches = new HashSet<>(); researches.add(IMinecoloniesAPI.getInstance().getGlobalResearchTree().getResearch(rec.getRequiredResearchId())); @@ -200,7 +212,7 @@ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, { researches = IMinecoloniesAPI.getInstance().getGlobalResearchTree().getResearchForEffect(rec.getRequiredResearchId()); } - if(researches != null) + if (researches != null) { final ChatFormatting researchFormat; if (colony != null && (colony.getResearchManager().getResearchTree().hasCompletedResearch(rec.getRequiredResearchId()) || @@ -216,7 +228,7 @@ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, for (IGlobalResearch research : researches) { toolTip.add(Component.translatable(COM_MINECOLONIES_COREMOD_ITEM_REQUIRES_RESEARCH_TOOLTIP_GUI, - MutableComponent.create(research.getName())).setStyle(Style.EMPTY.withColor(researchFormat))); + MutableComponent.create(research.getName())).setStyle(Style.EMPTY.withColor(researchFormat))); } } } @@ -225,6 +237,7 @@ private static void handleCrafterRecipeTooltips(@Nullable final IColony colony, /** * Gets a string like "ModName Building Name" for the specified building entry. + * * @param building The building entry * @return The translated building name */ @@ -232,14 +245,15 @@ private static Component getFullBuildingName(@NotNull final BuildingEntry buildi { final String namespace = building.getBuildingBlock().getRegistryName().getNamespace(); final String modName = ModList.get().getModContainerById(namespace) - .map(m -> m.getModInfo().getDisplayName()) - .orElse(namespace); + .map(m -> m.getModInfo().getDisplayName()) + .orElse(namespace); final Component buildingName = building.getBuildingBlock().getName(); return Component.literal(modName + " ").append(buildingName); } /** * Builds a mapping from crafting module ids to the corresponding buildings. + * * @return The mapping */ private static Map buildCrafterToBuildingMap() @@ -248,14 +262,14 @@ private static Map buildCrafterToBuildingMap() for (final BuildingEntry building : IMinecoloniesAPI.getInstance().getBuildingRegistry()) { building.getModuleProducers().stream() - .map(Supplier::get) - .filter(m -> m instanceof ICraftingBuildingModule) - .map(m -> (ICraftingBuildingModule) m) - .filter(m -> m.getCraftingJob() != null) - .forEach(crafting -> - { - builder.put(crafting.getCustomRecipeKey(), building); - }); + .map(Supplier::get) + .filter(m -> m instanceof ICraftingBuildingModule) + .map(m -> (ICraftingBuildingModule) m) + .filter(m -> m.getCraftingJob() != null) + .forEach(crafting -> + { + builder.put(crafting.getCustomRecipeKey(), building); + }); } return builder.build(); } @@ -263,9 +277,10 @@ private static Map buildCrafterToBuildingMap() /** * Display research-related information on MineColonies Building hut blocks. * While this test can handle other non-hut blocks, research can only currently effect AbstractHutBlocks. - * @param colony The colony to check against, if one is present. - * @param tooltip The tooltip to add the text onto. - * @param block The hut block + * + * @param colony The colony to check against, if one is present. + * @param tooltip The tooltip to add the text onto. + * @param block The hut block */ private static void handleHutBlockResearchUnlocks(final IColony colony, final List tooltip, final Block block) { diff --git a/src/main/java/com/minecolonies/coremod/event/ClientRegistryHandler.java b/src/main/java/com/minecolonies/coremod/event/ClientRegistryHandler.java index ba2a95d0a0e..5ecab3d93cf 100644 --- a/src/main/java/com/minecolonies/coremod/event/ClientRegistryHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/ClientRegistryHandler.java @@ -1,7 +1,9 @@ package com.minecolonies.coremod.event; import com.minecolonies.api.blocks.ModBlocks; +import com.minecolonies.api.client.ModKeyMappings; import com.minecolonies.api.client.render.modeltype.CitizenModel; +import com.minecolonies.api.crafting.registry.ModRecipeSerializer; import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.items.ModItems; import com.minecolonies.api.tileentities.MinecoloniesTileEntities; @@ -27,6 +29,8 @@ import com.minecolonies.coremod.client.render.mobs.pirates.RendererPirate; import com.minecolonies.coremod.client.render.projectile.FireArrowRenderer; import com.minecolonies.coremod.client.render.projectile.RendererSpear; +import com.minecolonies.coremod.client.render.worldevent.ColonyBlueprintRenderer; +import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.ItemBlockRenderTypes; @@ -39,7 +43,11 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.RegisterItemDecorationsEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -248,6 +256,13 @@ public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDe event.registerLayerDefinition(CITIZEN, CitizenModel::createMesh); } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onRegisterItemDecorations(final RegisterItemDecorationsEvent event) + { + event.register(ModItems.clipboard, new ClipBoardDecorator()); + } + @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void doClientStuff(final EntityRenderersEvent.RegisterRenderers event) @@ -289,6 +304,7 @@ public static void doClientStuff(final EntityRenderersEvent.RegisterRenderers ev event.registerBlockEntityRenderer(MinecoloniesTileEntities.ENCHANTER.get(), TileEntityEnchanterRenderer::new); event.registerBlockEntityRenderer(MinecoloniesTileEntities.COLONY_FLAG.get(), TileEntityColonyFlagRenderer::new); event.registerBlockEntityRenderer(MinecoloniesTileEntities.NAMED_GRAVE.get(), TileEntityNamedGraveRenderer::new); + event.registerBlockEntityRenderer(MinecoloniesTileEntities.DECO_CONTROLLER.get(), TileEntityDecoControllerRenderer::new); Arrays.stream(ModBlocks.getHuts()) .forEach(hut -> ItemBlockRenderTypes.setRenderLayer(hut, renderType -> renderType.equals(RenderType.cutout()) || renderType.equals(RenderType.solid()))); @@ -301,6 +317,22 @@ public static void doClientStuff(final EntityRenderersEvent.RegisterRenderers ev ItemProperties.register(ModItems.spear, new ResourceLocation("throwing"), (item, world, entity, light) -> (entity != null && entity.isUsingItem() && entity.getUseItem() == item) ? 1.0F : 0.0F); + ItemProperties.register(ModItems.buildGoggles, new ResourceLocation("disabled"), (item, world, entity, light) -> + (ColonyBlueprintRenderer.willRenderBlueprints() ? 0.0F : 1.0F)); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerRecipeBookCategories(@NotNull final RegisterRecipeBookCategoriesEvent event) + { + // not worthwhile creating a category for compost, as we never unlock them in the book; this hides some warnings + event.registerRecipeCategoryFinder(ModRecipeSerializer.CompostRecipeType.get(), r -> RecipeBookCategories.UNKNOWN); + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerKeys(final RegisterKeyMappingsEvent event) + { + ModKeyMappings.register(event); } } diff --git a/src/main/java/com/minecolonies/coremod/event/DataPackSyncEventHandler.java b/src/main/java/com/minecolonies/coremod/event/DataPackSyncEventHandler.java index 76e0069a09d..281ffadeddf 100644 --- a/src/main/java/com/minecolonies/coremod/event/DataPackSyncEventHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/DataPackSyncEventHandler.java @@ -6,9 +6,12 @@ import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.crafting.CustomRecipeManager; import com.minecolonies.coremod.compatibility.CraftingTagAuditor; +import com.minecolonies.coremod.datalistener.QuestJsonListener; import com.minecolonies.coremod.network.messages.client.UpdateClientWithCompatibilityMessage; import com.minecolonies.coremod.util.FurnaceRecipes; +import com.mojang.authlib.GameProfile; import net.minecraft.client.Minecraft; +import net.minecraft.client.server.IntegratedServer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.client.event.RecipesUpdatedEvent; @@ -45,11 +48,12 @@ public static class ServerEvents * * @param server The server. */ - private static void loadRecipes(@NotNull final MinecraftServer server) + private static void discoverCompatLists(@NotNull final MinecraftServer server) { FurnaceRecipes.getInstance().loadRecipes(server.getRecipeManager()); IMinecoloniesAPI.getInstance().getColonyManager().getCompatibilityManager().discover(server.getRecipeManager()); - CustomRecipeManager.getInstance().buildLootData(server.getLootTables()); + CustomRecipeManager.getInstance().resolveTemplates(); + CustomRecipeManager.getInstance().buildLootData(server.getLootTables(), server.overworld()); } /** @@ -64,6 +68,7 @@ private static void sendPackets(@NotNull final ServerPlayer player, Network.getNetwork().sendToPlayer(compatMsg, player); CustomRecipeManager.getInstance().sendCustomRecipeManagerPackets(player); IGlobalResearchTree.getInstance().sendGlobalResearchTreePackets(player); + QuestJsonListener.sendGlobalQuestPackets(player); } /** @@ -78,23 +83,24 @@ public static void onDataPackSync(final OnDatapackSyncEvent event) { final CustomRecipeManager recipeManager = CustomRecipeManager.getInstance(); final MinecraftServer server = event.getPlayerList().getServer(); + final GameProfile owner = server.getSingleplayerProfile(); if (event.getPlayer() == null) { // for a reload event, we also want to rebuild various lists (mirroring FMLServerStartedEvent) - loadRecipes(server); + discoverCompatLists(server); - // and then finally update every player with the results (not needed for single player) - if (!server.isSingleplayer()) + // and then finally update every player with the results + final UpdateClientWithCompatibilityMessage compatMsg = new UpdateClientWithCompatibilityMessage(true); + for (final ServerPlayer player : event.getPlayerList().getPlayers()) { - final UpdateClientWithCompatibilityMessage compatMsg = new UpdateClientWithCompatibilityMessage(true); - for (final ServerPlayer player : event.getPlayerList().getPlayers()) + if (player.getGameProfile() != owner) // don't need to send them in SP, or LAN owner { sendPackets(player, compatMsg); } } } - else if (!server.isSingleplayer()) + else if (event.getPlayer().getGameProfile() != owner) { sendPackets(event.getPlayer(), new UpdateClientWithCompatibilityMessage(true)); } @@ -116,7 +122,7 @@ else if (!server.isSingleplayer()) @SubscribeEvent public static void onServerStarted(@NotNull final ServerStartedEvent event) { - loadRecipes(event.getServer()); + discoverCompatLists(event.getServer()); } } @@ -133,7 +139,10 @@ public static class ClientEvents @SubscribeEvent public static void onRecipesLoaded(@NotNull final RecipesUpdatedEvent event) { - if (Minecraft.getInstance().hasSingleplayerServer()) + final IntegratedServer server = Minecraft.getInstance().getSingleplayerServer(); + final GameProfile owner = server == null ? null : server.getSingleplayerProfile(); + + if (owner != null && owner == Minecraft.getInstance().player.getGameProfile()) { // don't need to update on single player, this already happened "server-side". return; diff --git a/src/main/java/com/minecolonies/coremod/event/EventHandler.java b/src/main/java/com/minecolonies/coremod/event/EventHandler.java index 47648859d32..bae012a353b 100755 --- a/src/main/java/com/minecolonies/coremod/event/EventHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/EventHandler.java @@ -8,6 +8,7 @@ import com.minecolonies.api.colony.interactionhandling.ChatPriority; import com.minecolonies.api.colony.permissions.Action; import com.minecolonies.api.entity.ModEntities; +import com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.Log; @@ -44,8 +45,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Enemy; @@ -78,9 +81,11 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import org.jetbrains.annotations.NotNull; +import java.awt.*; import java.time.LocalDateTime; import java.time.Month; import java.util.*; +import java.util.List; import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; import static com.minecolonies.api.research.util.ResearchConstants.SOFT_SHOES; @@ -128,7 +133,7 @@ public static void onEntityAdded(@NotNull final EntityJoinLevelEvent event) { if (!event.getLevel().isClientSide()) { - if (MineColonies.getConfig().getServer().mobAttackCitizens.get() && (event.getEntity() instanceof Enemy) && !(event.getEntity() + if (MineColonies.getConfig().getServer().mobAttackCitizens.get() && event.getEntity() instanceof Mob && event.getEntity() instanceof Enemy && !(event.getEntity() .getType() .is(ModTags.mobAttackBlacklist))) { @@ -158,7 +163,7 @@ public static void onAttachingCapabilitiesChunk(@NotNull final AttachCapabilitie public static void onAttachingCapabilitiesWorld(@NotNull final AttachCapabilitiesEvent event) { event.addCapability(new ResourceLocation(Constants.MOD_ID, "chunkupdate"), new MinecoloniesWorldCapabilityProvider()); - event.addCapability(new ResourceLocation(Constants.MOD_ID, "colonymanager"), new MinecoloniesWorldColonyManagerCapabilityProvider()); + event.addCapability(new ResourceLocation(Constants.MOD_ID, "colonymanager"), new MinecoloniesWorldColonyManagerCapabilityProvider(event.getObject().dimension() == Level.OVERWORLD)); } /** @@ -267,8 +272,8 @@ public static void onEnteringChunk(final TickEvent.PlayerTickEvent event) final Level world = event.player.level; final ChunkPos chunkPos = event.player.chunkPosition(); - final ChunkPos oldPos = playerPositions.computeIfAbsent(event.player.getUUID(), e -> event.player.chunkPosition()); - if (oldPos.equals(chunkPos)) + final ChunkPos oldPos = playerPositions.get(event.player.getUUID()); + if (oldPos != null && oldPos.equals(chunkPos)) { return; } @@ -420,6 +425,7 @@ public static void onPlayerLeaveWorld(final PlayerEvent.PlayerLoggedOutEvent eve { colony.getPackageManager().removeCloseSubscriber(player); colony.getPackageManager().removeImportantColonyPlayer(player); + playerPositions.remove(player.getUUID()); } } } @@ -678,6 +684,7 @@ public static void onWorldLoad(@NotNull final LevelEvent.Load event) || LocalDateTime.now().getDayOfMonth() == 1 && LocalDateTime.now().getMonth() == Month.NOVEMBER || LocalDateTime.now().getDayOfMonth() == 2 && LocalDateTime.now().getMonth() == Month.NOVEMBER)) { + // Re-enable for ghostly halloween RenderBipedCitizen.isItGhostTime = false; } } @@ -779,4 +786,17 @@ public static void onEntityConverted(@NotNull final LivingConversionEvent.Pre ev } } } + + @SubscribeEvent + public static void onServerTick(TickEvent.ServerTickEvent event) + { + final double lastTickMs = event.getServer().tickTimes[event.getServer().getTickCount() % 100] * 1.0E-6D; + if (lastTickMs > 50) + { + TickRateStateMachine.slownessFactor = Mth.clamp(lastTickMs / 50, 1.0D, 5.0D); + } else + { + TickRateStateMachine.slownessFactor = 1.0D; + } + } } diff --git a/src/main/java/com/minecolonies/coremod/event/FMLEventHandler.java b/src/main/java/com/minecolonies/coremod/event/FMLEventHandler.java index d2d8bd8f2ce..8d1a33e07b1 100755 --- a/src/main/java/com/minecolonies/coremod/event/FMLEventHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/FMLEventHandler.java @@ -2,10 +2,7 @@ import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.coremod.Network; -import com.minecolonies.coremod.datalistener.CitizenNameListener; -import com.minecolonies.coremod.datalistener.CrafterRecipeListener; -import com.minecolonies.coremod.datalistener.CustomVisitorListener; -import com.minecolonies.coremod.datalistener.ResearchListener; +import com.minecolonies.coremod.datalistener.*; import com.minecolonies.coremod.entity.pathfinding.Pathfinding; import com.minecolonies.coremod.network.messages.client.ServerUUIDMessage; import net.minecraft.server.level.ServerPlayer; @@ -54,6 +51,8 @@ public static void onAddReloadListenerEvent(@NotNull final AddReloadListenerEven event.addListener(new ResearchListener()); event.addListener(new CustomVisitorListener()); event.addListener(new CitizenNameListener()); + event.addListener(new QuestJsonListener()); + event.addListener(new ItemNbtListener()); } @SubscribeEvent diff --git a/src/main/java/com/minecolonies/coremod/event/GatherDataHandler.java b/src/main/java/com/minecolonies/coremod/event/GatherDataHandler.java index 1b68222732c..3ad24cb95e8 100755 --- a/src/main/java/com/minecolonies/coremod/event/GatherDataHandler.java +++ b/src/main/java/com/minecolonies/coremod/event/GatherDataHandler.java @@ -1,7 +1,9 @@ package com.minecolonies.coremod.event; import com.minecolonies.coremod.generation.DatagenLootTableManager; +import com.minecolonies.coremod.generation.ItemNbtCalculator; import com.minecolonies.coremod.generation.defaults.*; +import com.minecolonies.coremod.generation.defaults.workers.*; import com.minecolonies.coremod.util.SchemFixerUtil; import net.minecraft.data.DataGenerator; import net.minecraft.data.tags.BlockTagsProvider; @@ -22,18 +24,45 @@ public static void dataGeneratorSetup(final GatherDataEvent event) final DataGenerator generator = event.getGenerator(); final LootTables lootTableManager = new DatagenLootTableManager(event.getExistingFileHelper()); final BlockTagsProvider blockTagsProvider = new DefaultBlockTagsProvider(generator, event.getExistingFileHelper()); - generator.addProvider(true, new DefaultBlockLootTableProvider(generator)); - generator.addProvider(true, new DefaultAdvancementsProvider(generator, event.getExistingFileHelper())); - generator.addProvider(true, new DefaultSoundProvider(generator)); - generator.addProvider(true, blockTagsProvider); - generator.addProvider(true, new DefaultItemTagsProvider(generator, blockTagsProvider, event.getExistingFileHelper())); - generator.addProvider(true, new DefaultEntityTypeTagsProvider(generator, event.getExistingFileHelper())); - generator.addProvider(true, new DefaultResearchProvider(generator)); - generator.addProvider(true, new DefaultRecipeProvider(generator)); - generator.addProvider(true, new DefaultSifterCraftingProvider(generator, lootTableManager)); - generator.addProvider(true, new DefaultEnchanterCraftingProvider(generator)); - generator.addProvider(true, new DefaultFishermanLootProvider(generator)); - generator.addProvider(true, new DefaultConcreteMixerCraftingProvider(generator)); - generator.addProvider(true, new DefaultNetherWorkerLootProvider(generator, lootTableManager)); + + generator.addProvider(event.includeClient(), new DefaultSoundProvider(generator, event.getExistingFileHelper())); + generator.addProvider(event.includeClient(), new DefaultItemModelProvider(generator, event.getExistingFileHelper())); + generator.addProvider(event.includeClient(), new DefaultEntityIconProvider(generator)); + generator.addProvider(event.includeClient() && event.includeServer(), new QuestTranslationProvider(generator)); + + generator.addProvider(event.includeServer(), new DefaultBlockLootTableProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultEntityLootProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultSupplyLootProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultAdvancementsProvider(generator, event.getExistingFileHelper())); + generator.addProvider(event.includeServer(), blockTagsProvider); + generator.addProvider(event.includeServer(), new DefaultItemTagsProvider(generator, blockTagsProvider, event.getExistingFileHelper())); + generator.addProvider(event.includeServer(), new DefaultEntityTypeTagsProvider(generator, event.getExistingFileHelper())); + generator.addProvider(event.includeServer(), new DefaultResearchProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultRecipeProvider(generator)); + + // workers + generator.addProvider(event.includeServer(), new DefaultRecipeLootProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultAlchemistCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultBakerCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultBlacksmithCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultConcreteMixerCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultCookAssistantCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultCrusherCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultDyerCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultEnchanterCraftingProvider(generator, lootTableManager)); + generator.addProvider(event.includeServer(), new DefaultFarmerCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultFishermanLootProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultFletcherCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultGlassblowerCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultLumberjackCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultMechanicCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultNetherWorkerLootProvider(generator, lootTableManager)); + generator.addProvider(event.includeServer(), new DefaultPlanterCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultSawmillCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultSifterCraftingProvider(generator, lootTableManager)); + generator.addProvider(event.includeServer(), new DefaultStonemasonCraftingProvider(generator)); + generator.addProvider(event.includeServer(), new DefaultStoneSmelteryCraftingProvider(generator)); + + generator.addProvider(event.includeClient() && event.includeServer(), new ItemNbtCalculator(generator)); } } diff --git a/src/main/java/com/minecolonies/coremod/event/QuestObjectiveEventHandler.java b/src/main/java/com/minecolonies/coremod/event/QuestObjectiveEventHandler.java new file mode 100755 index 00000000000..28b44850330 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/event/QuestObjectiveEventHandler.java @@ -0,0 +1,202 @@ +package com.minecolonies.coremod.event; + +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestManager; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.quests.objectives.IBreakBlockObjectiveTemplate; +import com.minecolonies.coremod.quests.objectives.IKillEntityObjectiveTemplate; +import com.minecolonies.coremod.quests.objectives.IPlaceBlockObjectiveTemplate; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * This class handles all permission checks on events and cancels them if needed. + */ +@Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class QuestObjectiveEventHandler +{ + /** + * Mine block objective tracker. + */ + private static final Map> breakBlockObjectives = new HashMap<>(); + + /** + * Entity kill objective tracker. + */ + private static final Map, Map> entityKillObjectives = new HashMap<>(); + + /** + * Place block objective tracker. + */ + private static final Map> placeBlockObjectives = new HashMap<>(); + + /** + * BlockEvent.BreakEvent handler. + * + * @param event BlockEvent.BreakEvent + */ + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void on(final BlockEvent.BreakEvent event) + { + final LevelAccessor world = event.getLevel(); + if (world.isClientSide()) + { + return; + } + + final Block block = event.getLevel().getBlockState(event.getPos()).getBlock(); + if (breakBlockObjectives.containsKey(block) && breakBlockObjectives.get(block).containsKey(event.getPlayer().getUUID())) + { + final IQuestInstance colonyQuest = breakBlockObjectives.get(block).get(event.getPlayer().getUUID()); + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(colonyQuest.getId()).getObjective(colonyQuest.getObjectiveIndex()); + if (objective instanceof IBreakBlockObjectiveTemplate) + { + ((IBreakBlockObjectiveTemplate) objective).onBlockBreak(colonyQuest.getCurrentObjectiveInstance(), colonyQuest, event.getPlayer()); + } + else + { + breakBlockObjectives.get(block).remove(event.getPlayer().getUUID()); + } + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void on(final LivingDeathEvent event) + { + if (event.getSource().getEntity() instanceof Player + && entityKillObjectives.containsKey(event.getEntity().getType()) + && entityKillObjectives.get(event.getEntity().getType()).containsKey(event.getSource().getEntity().getUUID())) + { + final IQuestInstance colonyQuest = entityKillObjectives.get(event.getEntity().getType()).get(event.getSource().getEntity().getUUID()); + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(colonyQuest.getId()).getObjective(colonyQuest.getObjectiveIndex()); + if (objective instanceof IKillEntityObjectiveTemplate) + { + ((IKillEntityObjectiveTemplate) objective).onEntityKill(colonyQuest.getCurrentObjectiveInstance(), colonyQuest, (Player) event.getSource().getEntity()); + } + else + { + entityKillObjectives.get(event.getEntity().getType()).remove(event.getEntity().getUUID()); + } + } + } + + /** + * BlockEvent.Place handler. + * + * @param event BlockEvent.BreakEvent + */ + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void on(final BlockEvent.EntityPlaceEvent event) + { + final LevelAccessor world = event.getLevel(); + if (world.isClientSide() || !(event.getEntity() instanceof Player)) + { + return; + } + + final Block block = event.getPlacedBlock().getBlock(); + if (placeBlockObjectives.containsKey(block) && placeBlockObjectives.get(block).containsKey(event.getEntity().getUUID())) + { + final IQuestInstance colonyQuest = placeBlockObjectives.get(block).get(event.getEntity().getUUID()); + final IQuestObjectiveTemplate objective = IQuestManager.GLOBAL_SERVER_QUESTS.get(colonyQuest.getId()).getObjective(colonyQuest.getObjectiveIndex()); + if (objective instanceof IPlaceBlockObjectiveTemplate) + { + ((IPlaceBlockObjectiveTemplate) objective).onBlockPlace(colonyQuest.getCurrentObjectiveInstance(), colonyQuest, (Player) event.getEntity()); + } + else + { + placeBlockObjectives.get(block).remove(event.getEntity().getUUID()); + } + } + } + + /** + * Add an objective listener for block mining to this event handler. + * + * @param blockToMine the block that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void addQuestMineObjectiveListener(final Block blockToMine, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + final Map currentMap = breakBlockObjectives.getOrDefault(blockToMine, new HashMap<>()); + currentMap.put(assignedPlayer, colonyQuest); + breakBlockObjectives.put(blockToMine, currentMap); + } + + /** + * Remove an objective listener to this event handler. + * + * @param blockToMine the block that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void removeQuestMineObjectiveListener(final Block blockToMine, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + breakBlockObjectives.getOrDefault(blockToMine, new HashMap<>()).remove(assignedPlayer); + } + + /** + * Add an objective listener for block placement to this event handler. + * + * @param blockToPlace the block that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void addQuestPlaceObjectiveListener(final Block blockToPlace, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + final Map currentMap = placeBlockObjectives.getOrDefault(blockToPlace, new HashMap<>()); + currentMap.put(assignedPlayer, colonyQuest); + placeBlockObjectives.put(blockToPlace, currentMap); + } + + /** + * Remove an objective listener for block placement to this event handler. + * + * @param blockToPlace the block that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void removeQuestPlaceBlockObjectiveListener(final Block blockToPlace, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + placeBlockObjectives.getOrDefault(blockToPlace, new HashMap<>()).remove(assignedPlayer); + } + + /** + * Add an objective listener to this event handler. + * + * @param entityToKill the entity type that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void addKillQuestObjectiveListener(final EntityType entityToKill, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + final Map currentMap = entityKillObjectives.getOrDefault(entityToKill, new HashMap<>()); + currentMap.put(assignedPlayer, colonyQuest); + entityKillObjectives.put(entityToKill, currentMap); + } + + /** + * Remove an objective listener to this event handler. + * + * @param entityToKill the entity type that we listen for. + * @param assignedPlayer the player we check for. + * @param colonyQuest the colony quest it is related to. + */ + public static void removeKillQuestObjectiveListener(final EntityType entityToKill, final UUID assignedPlayer, final IQuestInstance colonyQuest) + { + entityKillObjectives.getOrDefault(entityToKill, new HashMap<>()).remove(assignedPlayer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/event/capabilityproviders/MinecoloniesWorldColonyManagerCapabilityProvider.java b/src/main/java/com/minecolonies/coremod/event/capabilityproviders/MinecoloniesWorldColonyManagerCapabilityProvider.java index 9b8378950c4..639b9e6c038 100755 --- a/src/main/java/com/minecolonies/coremod/event/capabilityproviders/MinecoloniesWorldColonyManagerCapabilityProvider.java +++ b/src/main/java/com/minecolonies/coremod/event/capabilityproviders/MinecoloniesWorldColonyManagerCapabilityProvider.java @@ -26,25 +26,31 @@ public class MinecoloniesWorldColonyManagerCapabilityProvider implements ICapabi */ private final IColonyManagerCapability colonyManager; + /** + * Is this the main overworld cap? + */ + private final boolean overworld; + /** * Constructor of the provider. */ - public MinecoloniesWorldColonyManagerCapabilityProvider() + public MinecoloniesWorldColonyManagerCapabilityProvider(final boolean overworld) { this.colonyManager = new IColonyManagerCapability.Impl(); this.colonyManagerOptional = LazyOptional.of(() -> colonyManager); + this.overworld = overworld; } @Override public Tag serializeNBT() { - return IColonyManagerCapability.Storage.writeNBT(COLONY_MANAGER_CAP, colonyManager, null); + return IColonyManagerCapability.Storage.writeNBT(COLONY_MANAGER_CAP, colonyManager, overworld); } @Override public void deserializeNBT(final Tag nbt) { - IColonyManagerCapability.Storage.readNBT(COLONY_MANAGER_CAP, colonyManager, null, nbt); + IColonyManagerCapability.Storage.readNBT(COLONY_MANAGER_CAP, colonyManager, overworld, nbt); } @Nonnull diff --git a/src/main/java/com/minecolonies/coremod/generation/CustomRecipeAndLootTableProvider.java b/src/main/java/com/minecolonies/coremod/generation/CustomRecipeAndLootTableProvider.java new file mode 100644 index 00000000000..6706b7e29fb --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/CustomRecipeAndLootTableProvider.java @@ -0,0 +1,77 @@ +package com.minecolonies.coremod.generation; + +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.function.Consumer; + +/** + * Abstract datagen for crafterrecipes that include loot tables. + */ +public abstract class CustomRecipeAndLootTableProvider implements DataProvider +{ + private final ChildRecipeProvider recipeProvider; + private final ChildLootTableProvider lootTableProvider; + + protected CustomRecipeAndLootTableProvider(@NotNull final DataGenerator generatorIn) + { + recipeProvider = new ChildRecipeProvider(generatorIn); + lootTableProvider = new ChildLootTableProvider(generatorIn); + } + + protected abstract void registerRecipes(@NotNull final Consumer consumer); + protected abstract void registerTables(@NotNull final SimpleLootTableProvider.LootTableRegistrar registrar); + + @Override + public void run(@NotNull final CachedOutput cache) throws IOException + { + recipeProvider.run(cache); + lootTableProvider.run(cache); + } + + private class ChildRecipeProvider extends CustomRecipeProvider + { + public ChildRecipeProvider(@NotNull final DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return CustomRecipeAndLootTableProvider.this.getName() + " recipes"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeAndLootTableProvider.this.registerRecipes(consumer); + } + } + + private class ChildLootTableProvider extends SimpleLootTableProvider + { + public ChildLootTableProvider(@NotNull final DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return CustomRecipeAndLootTableProvider.this.getName() + " loot tables"; + } + + @Override + protected void registerTables(@NotNull final LootTableRegistrar registrar) + { + CustomRecipeAndLootTableProvider.this.registerTables(registrar); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/CustomRecipeProvider.java b/src/main/java/com/minecolonies/coremod/generation/CustomRecipeProvider.java index 5cb9150ffc8..442c9dffeb8 100644 --- a/src/main/java/com/minecolonies/coremod/generation/CustomRecipeProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/CustomRecipeProvider.java @@ -46,7 +46,7 @@ public CustomRecipeProvider(final DataGenerator generatorIn) } @Override - public void run(final CachedOutput cache) throws IOException + public void run(@NotNull final CachedOutput cache) throws IOException { final Path path = this.generator.getOutputFolder(); final Set set = Sets.newHashSet(); @@ -80,17 +80,17 @@ public static class CustomRecipeBuilder private final ResourceLocation id; private Block intermediate = Blocks.AIR; - private CustomRecipeBuilder(final String crafter, final String id) + private CustomRecipeBuilder(final String crafter, final String module, final String id) { this.json.addProperty(CustomRecipe.RECIPE_TYPE_PROP, CustomRecipe.RECIPE_TYPE_RECIPE); - this.json.addProperty(CustomRecipe.RECIPE_CRAFTER_PROP, crafter); + this.json.addProperty(CustomRecipe.RECIPE_CRAFTER_PROP, crafter + "_" + module); this.id = new ResourceLocation(Constants.MOD_ID, crafter + "/" + id); } @NotNull - public static CustomRecipeBuilder create(final String crafter, final String id) + public static CustomRecipeBuilder create(final String crafter, final String module, final String id) { - return new CustomRecipeBuilder(crafter, id); + return new CustomRecipeBuilder(crafter, module, id); } @NotNull @@ -103,10 +103,12 @@ public CustomRecipeBuilder inputs(@NotNull final List inputs) @NotNull public CustomRecipeBuilder result(@NotNull final ItemStack result) { - this.json.addProperty(CustomRecipe.RECIPE_RESULT_PROP, ForgeRegistries.ITEMS.getKey(result.getItem()).toString()); - if (result.getCount() != 1) + final JsonObject jsonItemStack = stackAsJson(result); + + this.json.addProperty(CustomRecipe.RECIPE_RESULT_PROP, jsonItemStack.get(ITEM_PROP).getAsString()); + if (jsonItemStack.has(COUNT_PROP)) { - this.json.addProperty(COUNT_PROP, result.getCount()); + this.json.add(COUNT_PROP, jsonItemStack.get(COUNT_PROP)); } return this; } @@ -197,26 +199,32 @@ public void build(@NotNull final Consumer consumer) consumer.accept(new Result(this.json, this.id)); } + @NotNull + private JsonObject stackAsJson(final ItemStack stack) + { + final JsonObject jsonItemStack = new JsonObject(); + String name = ForgeRegistries.ITEMS.getKey(stack.getItem()).toString(); + // this could be incorrect for items with both damage and other NBT, + // but that should be rare, and this avoids some annoyance. + if (stack.hasTag() && !stack.isDamageableItem()) + { + name += stack.getTag().toString(); + } + jsonItemStack.addProperty(ITEM_PROP, name); + if (stack.getCount() != 1) + { + jsonItemStack.addProperty(COUNT_PROP, stack.getCount()); + } + return jsonItemStack; + } + @NotNull private JsonArray stackAsJson(final List itemStacks) { final JsonArray jsonItemStacks = new JsonArray(); for (final ItemStack itemStack : itemStacks) { - final JsonObject jsonItemStack = new JsonObject(); - String name = ForgeRegistries.ITEMS.getKey(itemStack.getItem()).toString(); - // this could be incorrect for items with both damage and other NBT, - // but that should be rare, and this avoids some annoyance. - if (itemStack.hasTag() && !itemStack.isDamageableItem()) - { - name += itemStack.getTag().toString(); - } - jsonItemStack.addProperty(ITEM_PROP, name); - if (itemStack.getCount() != 1) - { - jsonItemStack.addProperty(COUNT_PROP, itemStack.getCount()); - } - jsonItemStacks.add(jsonItemStack); + jsonItemStacks.add(stackAsJson(itemStack)); } return jsonItemStacks; } @@ -227,23 +235,18 @@ private JsonArray storageAsJson(final List itemStorages) final JsonArray jsonItemStorages = new JsonArray(); for (final ItemStorage itemStorage : itemStorages) { - final ItemStack stack = itemStorage.getItemStack(); - final JsonObject jsonItemStorage = new JsonObject(); - String name = ForgeRegistries.ITEMS.getKey(stack.getItem()).toString(); - // this could be incorrect for items with both damage and other NBT, - // but that should be rare, and this avoids some annoyance. - if (stack.hasTag() && !stack.isDamageableItem()) + final JsonObject jsonItemStorage = stackAsJson(itemStorage.getItemStack()); + if (itemStorage.getAmount() == 1) { - name += stack.getTag().toString(); + jsonItemStorage.remove(COUNT_PROP); } - jsonItemStorage.addProperty(ITEM_PROP, name); - if (itemStorage.ignoreNBT()) + else { - jsonItemStorage.addProperty(MATCHTYPE_PROP, MATCH_NBTIGNORE); + jsonItemStorage.addProperty(COUNT_PROP, itemStorage.getAmount()); } - if (itemStorage.getAmount() != 1) + if (itemStorage.ignoreNBT()) { - jsonItemStorage.addProperty(COUNT_PROP, itemStorage.getAmount()); + jsonItemStorage.addProperty(MATCHTYPE_PROP, MATCH_NBTIGNORE); } jsonItemStorages.add(jsonItemStorage); } diff --git a/src/api/java/com/minecolonies/coremod/generation/DataGeneratorConstants.java b/src/main/java/com/minecolonies/coremod/generation/DataGeneratorConstants.java similarity index 100% rename from src/api/java/com/minecolonies/coremod/generation/DataGeneratorConstants.java rename to src/main/java/com/minecolonies/coremod/generation/DataGeneratorConstants.java diff --git a/src/main/java/com/minecolonies/coremod/generation/ItemNbtCalculator.java b/src/main/java/com/minecolonies/coremod/generation/ItemNbtCalculator.java new file mode 100644 index 00000000000..3efffcd7288 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/ItemNbtCalculator.java @@ -0,0 +1,202 @@ +package com.minecolonies.coremod.generation; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlock; +import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlockComponent; +import com.minecolonies.api.items.CheckedNbtKey; +import com.minecolonies.api.items.ModTags; +import com.minecolonies.api.util.Log; +import net.minecraft.core.NonNullList; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.*; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; + +import static com.minecolonies.api.util.constant.Constants.MOD_ID; + +/** + * Automatically calculated vanilla level nbts of items. + */ +public class ItemNbtCalculator implements DataProvider +{ + private final DataGenerator generator; + + public ItemNbtCalculator(DataGenerator generator) + { + this.generator = generator; + } + + @NotNull + @Override + public String getName() + { + return "ItemNBTCalculator"; + } + + @Override + public void run(@NotNull final CachedOutput cache) throws IOException + { + final ImmutableList.Builder listBuilder = new ImmutableList.Builder<>(); + + for (final Item theItem : ForgeRegistries.ITEMS.getValues()) + { + final NonNullList list = NonNullList.create(); + try + { + theItem.fillItemCategory(CreativeModeTab.TAB_SEARCH, list); + } + catch (Exception e) + { + Log.getLogger().warn("Error populating items for " + ForgeRegistries.ITEMS.getKey(theItem) + "; using fallback", e); + list.add(new ItemStack(theItem)); + } + + for (final ItemStack item : list) + { + if (item.getItem() instanceof BlockItem blockItem && blockItem.getBlock() instanceof IMateriallyTexturedBlock texturedBlock) + { + final CompoundTag tag = item.hasTag() ? item.getTag() : new CompoundTag(); + final CompoundTag textureData = new CompoundTag(); + for (final IMateriallyTexturedBlockComponent key : texturedBlock.getComponents()) + { + textureData.putString(key.getId().toString(), key.getDefault().builtInRegistryHolder().key().location().toString()); + } + tag.put("textureData", textureData); + final ItemStack copy = item.copy(); + copy.setTag(tag); + listBuilder.add(copy); + } + else + { + listBuilder.add(item); + } + } + } + + final List allStacks = listBuilder.build(); + + final TreeMap> keyMapping = new TreeMap<>(); + for (final ItemStack stack : allStacks) + { + final ResourceLocation resourceLocation = stack.getItemHolder().unwrapKey().get().location(); + final CompoundTag tag = (stack.hasTag() && !stack.is(ModTags.ignoreNBT)) ? stack.getTag() : new CompoundTag(); + final Set keys = tag.isEmpty() ? new HashSet<>() : new HashSet<>(tag.getAllKeys()); + + if (stack.isEnchantable()) + { + keys.add("Enchantments"); + } + if (stack.isRepairable()) + { + keys.add("RepairCost"); + } + // We ignore damage in nbt. + keys.remove("Damage"); + + final Set keyObjectList = new HashSet<>(); + for (String key : keys) + { + keyObjectList.add(createKeyFromNbt(key, tag)); + } + + if (keyMapping.containsKey(resourceLocation.toString())) + { + final Set list = keyMapping.get(resourceLocation.toString()); + list.addAll(keyObjectList); + keyMapping.put(resourceLocation.toString(), list); + } + else + { + keyMapping.put(resourceLocation.toString(), keyObjectList); + } + } + + final Path path = generator.createPathProvider(DataGenerator.Target.DATA_PACK, "compatibility").file(new ResourceLocation(MOD_ID, "itemnbtmatching"), "json"); + final JsonArray jsonArray = new JsonArray(); + for (final Map.Entry> entry : keyMapping.entrySet()) + { + final JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("item", entry.getKey()); + + if (!entry.getValue().isEmpty()) + { + final JsonArray subArray = new JsonArray(); + entry.getValue().forEach(key -> subArray.add(serializeKeyToJson(key))); + jsonObject.add("checkednbtkeys", subArray); + } + + jsonArray.add(jsonObject); + } + + DataProvider.saveStable(cache, jsonArray, path); + } + + /** + * Serialize a checked nbt key to json. + * @param keyObject the key object to serialize. + * @return the output json. + */ + public static JsonObject serializeKeyToJson(final CheckedNbtKey keyObject) + { + final JsonObject obj = new JsonObject(); + obj.addProperty("key", keyObject.key); + + if (!keyObject.children.isEmpty()) + { + final JsonArray jsonArray = new JsonArray(); + keyObject.children.forEach(child -> jsonArray.add(serializeKeyToJson(child))); + obj.add("children", jsonArray); + } + return obj; + } + + /** + * Create a checked nbt key from nbt. + * @param key the key to retrieve. + * @param tag the tag to deserialize it from. + * @return a new checked nbt key. + */ + public static CheckedNbtKey createKeyFromNbt(final String key, final CompoundTag tag) + { + if (tag.get(key) instanceof CompoundTag) + { + final CompoundTag subTag = tag.getCompound(key); + return new CheckedNbtKey(key, subTag.getAllKeys().stream().map(subKey -> createKeyFromNbt(subKey, subTag)).collect(Collectors.toSet())); + } + else + { + return new CheckedNbtKey(key, Collections.emptySet()); + } + } + + /** + * Create a checked nbt key from json. + * @param jsonObject the object to serialize it from. + * @return the output key. + */ + public static CheckedNbtKey deserializeKeyFromJson(final JsonObject jsonObject) + { + final String key = jsonObject.get("key").getAsString(); + if (jsonObject.has("children")) + { + final Set children = new HashSet<>(); + jsonObject.getAsJsonArray("children").forEach(child -> children.add(deserializeKeyFromJson(child.getAsJsonObject()))); + return new CheckedNbtKey(key, children); + } + else + { + return new CheckedNbtKey(key, Collections.emptySet()); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockLootTableProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockLootTableProvider.java index 27f5036e9be..d740bf61579 100755 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockLootTableProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockLootTableProvider.java @@ -50,7 +50,9 @@ protected void registerTables(@NotNull final LootTableRegistrar registrar) saveBlock(ModBlocks.blockWayPoint, registrar); saveBlock(ModBlocks.blockBarrel, registrar); saveBlock(ModBlocks.blockScarecrow, registrar); + saveBlock(ModBlocks.blockPlantationField, registrar); saveBlock(ModBlocks.blockColonyBanner, registrar); + saveBlock(ModBlocks.blockColonyWallBanner, registrar); saveBlock(ModBlocks.blockIronGate, registrar); saveBlock(ModBlocks.blockWoodenGate, registrar); diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockTagsProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockTagsProvider.java index 3e233348ed3..9de927e7b80 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockTagsProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultBlockTagsProvider.java @@ -92,6 +92,9 @@ protected void addTags() .add(Blocks.CHISELED_NETHER_BRICKS) .add(Blocks.GRAVEL) .add(Blocks.DIRT_PATH) + .add(Blocks.MUD_BRICKS) + .add(Blocks.MUD_BRICK_SLAB) + .add(Blocks.MUD_BRICK_STAIRS) .add(Blocks.SMOOTH_STONE) .add(Blocks.SMOOTH_STONE_SLAB) .add(Blocks.SMOOTH_SANDSTONE) @@ -128,6 +131,14 @@ protected void addTags() .add(Blocks.DEEPSLATE_TILE_STAIRS) .addTag(com.ldtteam.domumornamentum.tag.ModTags.BRICKS); + tag(ModTags.mangroveTree) + .add(Blocks.MANGROVE_LOG) + .add(Blocks.MANGROVE_ROOTS); + + tag(ModTags.tree) + .addTag(BlockTags.LOGS) + .addTag(ModTags.mangroveTree); + tag(ModTags.colonyProtectionException) .addOptional(new ResourceLocation("waystones:waystone")) .addOptional(new ResourceLocation("waystones:sandy_waystone")) @@ -146,6 +157,7 @@ protected void addTags() .add(ModBlocks.blockRack) .add(ModBlocks.blockWoodenGate) .add(ModBlocks.blockScarecrow) + .add(ModBlocks.blockPlantationField) .add(ModBlocks.blockDecorationPlaceholder) .add(ModBlocks.blockColonyBanner) .add(ModBlocks.blockColonyWallBanner) diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEnchanterCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEnchanterCraftingProvider.java deleted file mode 100644 index 5f4e4f39a7b..00000000000 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEnchanterCraftingProvider.java +++ /dev/null @@ -1,449 +0,0 @@ -package com.minecolonies.coremod.generation.defaults; - -import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.crafting.ItemStorage; -import com.minecolonies.api.enchants.ModEnchants; -import com.minecolonies.api.items.ModItems; -import com.minecolonies.coremod.enchants.RaiderDamageEnchant; -import com.minecolonies.coremod.generation.CustomRecipeProvider; -import com.minecolonies.coremod.generation.SimpleLootTableProvider; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.data.HashCache; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.EnchantedBookItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentInstance; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; - -import static com.minecolonies.api.util.constant.Constants.MOD_ID; - -import com.minecolonies.coremod.generation.CustomRecipeProvider.CustomRecipeBuilder; -import com.minecolonies.coremod.generation.SimpleLootTableProvider.LootTableRegistrar; - -public class DefaultEnchanterCraftingProvider implements DataProvider -{ - private static final int MAX_BUILDING_LEVEL = 5; - - private final EnchanterRecipeProvider recipeProvider; - private final EnchanterLootTableProvider lootTableProvider; - private final List levels; - - public DefaultEnchanterCraftingProvider(@NotNull final DataGenerator generatorIn) - { - levels = new ArrayList<>(); - - // building level 1 - levels.add(LootTable.lootTable().withPool(LootPool.lootPool() - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FROST_WALKER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.KNOCKBACK, 1).setWeight(50)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 1).setWeight(50)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.RESPIRATION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SHARPNESS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SMITE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.UNBREAKING, 1).setWeight(50)) - )); - - // building level 2 - levels.add(LootTable.lootTable().withPool(LootPool.lootPool() - // also the level 1 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FROST_WALKER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.KNOCKBACK, 1).setWeight(50)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 1).setWeight(50)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.RESPIRATION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SHARPNESS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SMITE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.UNBREAKING, 1).setWeight(50)) - // plus new level 2 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FROST_WALKER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.KNOCKBACK, 2).setWeight(25)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 2).setWeight(25)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.RESPIRATION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SHARPNESS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SMITE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.UNBREAKING, 2).setWeight(25)) - )); - - // building level 3 - levels.add(LootTable.lootTable().withPool(LootPool.lootPool() - // also the level 1 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.FROST_WALKER, 1).setWeight(50)) - .add(enchantedBook(Enchantments.KNOCKBACK, 1).setWeight(50)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 1).setWeight(50)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.RESPIRATION, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SHARPNESS, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SMITE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 1).setWeight(50)) - .add(enchantedBook(Enchantments.UNBREAKING, 1).setWeight(50)) - // also the level 2 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FROST_WALKER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.KNOCKBACK, 2).setWeight(25)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 2).setWeight(25)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.RESPIRATION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SHARPNESS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SMITE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.UNBREAKING, 2).setWeight(25)) - // plus new level 3 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FROST_WALKER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.KNOCKBACK, 3).setWeight(15)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 3).setWeight(15)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.RESPIRATION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SHARPNESS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SMITE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.UNBREAKING, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 1).setWeight(1)) - .add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)) - )); - - // building level 4 - levels.add(LootTable.lootTable().withPool(LootPool.lootPool() - // no more level 1 enchants - // but still the level 2 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.FROST_WALKER, 2).setWeight(25)) - .add(enchantedBook(Enchantments.KNOCKBACK, 2).setWeight(25)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 2).setWeight(25)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.RESPIRATION, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SHARPNESS, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SMITE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 2).setWeight(25)) - .add(enchantedBook(Enchantments.UNBREAKING, 2).setWeight(25)) - // plus level 3 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FROST_WALKER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.KNOCKBACK, 3).setWeight(15)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 3).setWeight(15)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.RESPIRATION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SHARPNESS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SMITE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.UNBREAKING, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 1).setWeight(1)) - .add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)) - // plus new level 4 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FROST_WALKER, 4).setWeight(5)) - .add(enchantedBook(Enchantments.INFINITY_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.KNOCKBACK, 4).setWeight(5)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 4).setWeight(5)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.RESPIRATION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SHARPNESS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SMITE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.UNBREAKING, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 2).setWeight(1)) - )); - - // building level 5 - levels.add(LootTable.lootTable().withPool(LootPool.lootPool() - // no more level 1 or 2 enchants - // but still the level 3 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.FROST_WALKER, 3).setWeight(15)) - .add(enchantedBook(Enchantments.KNOCKBACK, 3).setWeight(15)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 3).setWeight(15)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.RESPIRATION, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SHARPNESS, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SMITE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 3).setWeight(15)) - .add(enchantedBook(Enchantments.UNBREAKING, 3).setWeight(15)) - .add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 1).setWeight(1)) - // plus level 4 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.FROST_WALKER, 4).setWeight(5)) - .add(enchantedBook(Enchantments.INFINITY_ARROWS, 1).setWeight(5)) - .add(enchantedBook(Enchantments.KNOCKBACK, 4).setWeight(5)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 4).setWeight(5)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.RESPIRATION, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SHARPNESS, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SMITE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 4).setWeight(5)) - .add(enchantedBook(Enchantments.UNBREAKING, 4).setWeight(5)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 2).setWeight(1)) - // plus new level 5 enchants - .add(enchantedBook(Enchantments.AQUA_AFFINITY, 5).setWeight(1)) - .add(enchantedBook(Enchantments.BANE_OF_ARTHROPODS, 5).setWeight(1)) - .add(enchantedBook(Enchantments.BLAST_PROTECTION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.DEPTH_STRIDER, 5).setWeight(1)) - .add(enchantedBook(Enchantments.BLOCK_EFFICIENCY, 5).setWeight(1)) - .add(enchantedBook(Enchantments.FALL_PROTECTION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.FIRE_ASPECT, 5).setWeight(1)) - .add(enchantedBook(Enchantments.FIRE_PROTECTION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.FLAMING_ARROWS, 5).setWeight(1)) - .add(enchantedBook(Enchantments.FROST_WALKER, 5).setWeight(1)) - .add(enchantedBook(Enchantments.INFINITY_ARROWS, 1).setWeight(1)) - .add(enchantedBook(Enchantments.KNOCKBACK, 5).setWeight(1)) - .add(enchantedBook(Enchantments.MOB_LOOTING, 5).setWeight(1)) - .add(enchantedBook(Enchantments.MENDING, 1).setWeight(1)) - .add(enchantedBook(Enchantments.MULTISHOT, 1).setWeight(1)) - .add(enchantedBook(Enchantments.POWER_ARROWS, 5).setWeight(1)) - .add(enchantedBook(Enchantments.PROJECTILE_PROTECTION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.PUNCH_ARROWS, 5).setWeight(1)) - .add(enchantedBook(Enchantments.QUICK_CHARGE, 5).setWeight(1)) - .add(enchantedBook(Enchantments.RESPIRATION, 5).setWeight(1)) - .add(enchantedBook(Enchantments.SHARPNESS, 5).setWeight(1)) - .add(enchantedBook(Enchantments.SILK_TOUCH, 1).setWeight(1)) - .add(enchantedBook(Enchantments.SMITE, 5).setWeight(1)) - .add(enchantedBook(Enchantments.SWEEPING_EDGE, 5).setWeight(1)) - .add(enchantedBook(Enchantments.UNBREAKING, 5).setWeight(1)) - .add(enchantedBook(Enchantments.BLOCK_FORTUNE, 3).setWeight(1)) - .add(enchantedBook(ModEnchants.raiderDamage.get(), 2).setWeight(1)) - )); - - recipeProvider = new EnchanterRecipeProvider(generatorIn); - lootTableProvider = new EnchanterLootTableProvider(generatorIn); - } - - @NotNull - private LootPoolSingletonContainer.Builder enchantedBook(final Enchantment enchantment, final int level) - { - final ItemStack stack = new ItemStack(Items.ENCHANTED_BOOK); - EnchantedBookItem.addEnchantment(stack, new EnchantmentInstance(enchantment, level)); - return SimpleLootTableProvider.itemStack(stack); - } - - @NotNull - @Override - public String getName() - { - return "EnchanterCraftingProvider"; - } - - @Override - public void run(@NotNull final CachedOutput cache) throws IOException - { - recipeProvider.run(cache); - lootTableProvider.run(cache); - } - - private static class EnchanterRecipeProvider extends CustomRecipeProvider - { - public EnchanterRecipeProvider(@NotNull final DataGenerator generatorIn) - { - super(generatorIn); - } - - @NotNull - @Override - public String getName() - { - return "EnchanterRecipeProvider"; - } - - @Override - protected void registerRecipes(@NotNull final Consumer consumer) - { - final List tome = Collections.singletonList(new ItemStorage( - new ItemStack(ModItems.ancientTome), true, true)); - - for (int buildingLevel = 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) - { - CustomRecipeBuilder.create(ModJobs.ENCHANTER_ID.getPath() + "_custom", "tome" + buildingLevel) - .minBuildingLevel(buildingLevel) - .maxBuildingLevel(buildingLevel) - .inputs(tome) - .secondaryOutputs(Collections.singletonList(new ItemStack(Items.ENCHANTED_BOOK))) - .lootTable(new ResourceLocation(MOD_ID, "recipes/enchanter" + buildingLevel)) - .build(consumer); - } - } - } - - private class EnchanterLootTableProvider extends SimpleLootTableProvider - { - public EnchanterLootTableProvider(@NotNull final DataGenerator dataGeneratorIn) - { - super(dataGeneratorIn); - } - - @NotNull - @Override - public String getName() - { - return "EnchanterLootTableProvider"; - } - - @Override - protected void registerTables(@NotNull final LootTableRegistrar registrar) - { - for (int i = 0; i < levels.size(); i++) - { - final int buildingLevel = i + 1; - final LootTable.Builder lootTable = levels.get(i); - - registrar.register(new ResourceLocation(MOD_ID, "recipes/enchanter" + buildingLevel), - LootContextParamSets.ALL_PARAMS, lootTable); - } - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityIconProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityIconProvider.java new file mode 100644 index 00000000000..b087b2c7c19 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityIconProvider.java @@ -0,0 +1,118 @@ +package com.minecolonies.coremod.generation.defaults; + +import com.google.common.hash.Hashing; +import com.google.common.hash.HashingOutputStream; +import com.mojang.blaze3d.platform.NativeImage; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.IModFileInfo; +import net.minecraftforge.resource.ResourcePackLoader; +import org.jetbrains.annotations.NotNull; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static com.minecolonies.api.util.constant.Constants.MOD_ID; +import static net.minecraft.client.gui.components.PlayerFaceRenderer.*; + +/** + * Datagen for entity_icon + */ +public class DefaultEntityIconProvider implements DataProvider +{ + private final DataGenerator generator; + + public DefaultEntityIconProvider(@NotNull final DataGenerator generator) + { + this.generator = generator; + } + + @NotNull + @Override + public String getName() + { + return "Default Citizen Icons"; + } + + private static boolean IsEntitySkin(@NotNull final ResourceLocation id) + { + return id.getPath().endsWith(".png") && + (id.getPath().startsWith("textures/entity/citizen/") || id.getPath().startsWith("textures/entity/raiders/")); + } + + @Override + public void run(@NotNull final CachedOutput cache) throws IOException + { + final DataGenerator.PathProvider outputProvider = generator.createPathProvider(DataGenerator.Target.RESOURCE_PACK, "textures/entity_icon"); + + final IModFileInfo modFileInfo = ModList.get().getModFileById(MOD_ID); + try (final PackResources pack = ResourcePackLoader.createPackForMod(modFileInfo)) + { + for (final ResourceLocation skinId : pack.getResources(PackType.CLIENT_RESOURCES, MOD_ID, + "textures/entity", DefaultEntityIconProvider::IsEntitySkin)) + { + try (final NativeImage skin = NativeImage.read(pack.getResource(PackType.CLIENT_RESOURCES, skinId))) + { + try (final NativeImage icon = createIconForSkin(skin)) + { + final ResourceLocation iconId = new ResourceLocation(skinId.getNamespace(), + skinId.getPath().replace("textures/entity/", "").replace(".png", "")); + saveIcon(outputProvider, iconId, icon, cache); + } + } + } + } + } + + private static NativeImage createIconForSkin(@NotNull final NativeImage skin) + { + final NativeImage icon = new NativeImage(16, 16, false); + + skin.resizeSubRectTo(SKIN_HEAD_U, SKIN_HEAD_V, SKIN_HEAD_WIDTH, SKIN_HEAD_HEIGHT, icon); + + for (int i = 0; i < 16; ++i) + { + icon.blendPixel(0, i, 0x80000000); + icon.blendPixel(15, i, 0x80000000); + + if (i > 0 && i < 15) + { + icon.blendPixel(i, 0, 0x80000000); + icon.blendPixel(i, 15, 0x80000000); + } + } + + return icon; + } + + @SuppressWarnings("UnstableApiUsage") + private static void saveIcon(@NotNull final DataGenerator.PathProvider outputProvider, + @NotNull final ResourceLocation id, + @NotNull final NativeImage icon, + @NotNull final CachedOutput cache) throws IOException + { + final BufferedImage image; + try (final ByteArrayInputStream stream = new ByteArrayInputStream(icon.asByteArray())) + { + image = ImageIO.read(stream); + } + + // convert to 24-bit, to reduce file size a bit + final BufferedImage optimized = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); + optimized.getGraphics().drawImage(image, 0, 0, null); + + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + final HashingOutputStream hashStream = new HashingOutputStream(Hashing.sha1(), outputStream); + ImageIO.write(optimized, "PNG", hashStream); + + cache.writeIfNeeded(outputProvider.file(id, "png"), outputStream.toByteArray(), hashStream.hash()); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityLootProvider.java new file mode 100644 index 00000000000..3da983078c8 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityLootProvider.java @@ -0,0 +1,157 @@ +package com.minecolonies.coremod.generation.defaults; + +import com.minecolonies.api.entity.ModEntities; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.coremod.generation.SimpleLootTableProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.EmptyLootItem; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.LootingEnchantFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Loot table generator for entities + */ +public class DefaultEntityLootProvider extends SimpleLootTableProvider +{ + public DefaultEntityLootProvider(@NotNull DataGenerator dataGenerator) + { + super(dataGenerator); + } + + @NotNull + @Override + public String getName() + { + return "Entity Loot Table Provider"; + } + + @Override + protected void registerTables(@NotNull final LootTableRegistrar registrar) + { + registerLoot(registrar, ModEntities.AMAZON, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(15)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.AMAZONSPEARMAN, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(ModItems.spear).setWeight(15)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.AMAZONCHIEF, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(80)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(30))); + + registerLoot(registrar, ModEntities.BARBARIAN, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.DIAMOND_AXE).setWeight(1)) + .add(LootItem.lootTableItem(Items.GOLDEN_AXE).setWeight(2)) + .add(LootItem.lootTableItem(Items.IRON_AXE).setWeight(5)) + .add(LootItem.lootTableItem(Items.STONE_AXE).setWeight(6)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(3))); + + registerLoot(registrar, ModEntities.ARCHERBARBARIAN, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(10)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.CHIEFBARBARIAN, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(50)) + .add(LootItem.lootTableItem(ModItems.chiefSword).setWeight(1).setQuality(1)) + .add(LootItem.lootTableItem(Items.DIAMOND_SWORD).setWeight(5)) + .add(LootItem.lootTableItem(Items.GOLDEN_SWORD).setWeight(5)) + .add(LootItem.lootTableItem(Items.IRON_SWORD).setWeight(10)) + .add(LootItem.lootTableItem(Items.STONE_SWORD).setWeight(20)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(30))); + + registerLoot(registrar, ModEntities.SHIELDMAIDEN, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.SHIELD).setWeight(10)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.NORSEMEN_ARCHER, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(10)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.NORSEMEN_CHIEF, builder -> builder + .setRolls(ConstantValue.exactly(2)) + .add(EmptyLootItem.emptyItem().setWeight(50)) + .add(LootItem.lootTableItem(Items.LEATHER).setWeight(15).setQuality(5)) + .add(LootItem.lootTableItem(Items.DIAMOND_AXE).setWeight(10).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(50))); + + registerLoot(registrar, ModEntities.PIRATE, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(ModItems.scimitar).setWeight(6)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(4))); + + registerLoot(registrar, ModEntities.ARCHERPIRATE, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(10)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.CHIEFPIRATE, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(50)) + .add(LootItem.lootTableItem(ModItems.pirateHelmet_1).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateLegs_1).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateBoots_1).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateChest_1).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateHelmet_2).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateLegs_2).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateBoots_2).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.pirateChest_2).setWeight(5).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.scimitar).setWeight(25).setQuality(1)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(30))); + + registerLoot(registrar, ModEntities.MUMMY, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(15))); + + registerLoot(registrar, ModEntities.ARCHERMUMMY, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(80)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(10)) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(5))); + + registerLoot(registrar, ModEntities.PHARAO, builder -> builder + .add(EmptyLootItem.emptyItem().setWeight(50)) + .add(LootItem.lootTableItem(ModItems.pharaoscepter).setWeight(3).setQuality(1)) + .add(LootItem.lootTableItem(Items.ARROW).setWeight(20) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 16))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(1, 32)))) + .add(LootItem.lootTableItem(ModItems.firearrow).setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 16))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(1, 32)))) + .add(LootItem.lootTableItem(ModItems.ancientTome).setWeight(30))); + } + + private void registerLoot(@NotNull final LootTableRegistrar registrar, + @NotNull final EntityType entity, + @NotNull final Consumer builder) + { + final ResourceLocation entityId = ForgeRegistries.ENTITY_TYPES.getKey(entity); + final ResourceLocation lootName = new ResourceLocation(entityId.getNamespace(), "entities/" + entityId.getPath()); + + final LootPool.Builder pool = LootPool.lootPool() + .name(entityId.toString()) + .setRolls(ConstantValue.exactly(1)); + builder.accept(pool); + + registrar.register(lootName, LootContextParamSets.ALL_PARAMS, + LootTable.lootTable().withPool(pool)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityTypeTagsProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityTypeTagsProvider.java index b5acecdec95..46da8bd1c25 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityTypeTagsProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultEntityTypeTagsProvider.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.generation.defaults; +import com.minecolonies.api.entity.ModEntities; import com.minecolonies.api.items.ModTags; import net.minecraft.data.DataGenerator; import net.minecraft.data.tags.EntityTypeTagsProvider; @@ -23,5 +24,8 @@ protected void addTags() { tag(ModTags.hostile).add(EntityType.SLIME); tag(ModTags.mobAttackBlacklist).add(EntityType.ENDERMAN, EntityType.LLAMA); + + final TagAppender> raiderTagAppender = tag(ModTags.raiders); + ModEntities.getRaiders().forEach(raiderTagAppender::add); } } \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemModelProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemModelProvider.java new file mode 100644 index 00000000000..395ad9b5a17 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemModelProvider.java @@ -0,0 +1,48 @@ +package com.minecolonies.coremod.generation.defaults; + +import com.minecolonies.api.items.ModItems; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; + +import static com.minecolonies.api.util.constant.Constants.MOD_ID; + +/** + * Datagen for item models + */ +public class DefaultItemModelProvider extends ItemModelProvider +{ + /** + * Constructor + */ + public DefaultItemModelProvider(final DataGenerator generator, final ExistingFileHelper existingFileHelper) + { + super(generator, MOD_ID, existingFileHelper); + } + + @Override + protected void registerModels() + { + final ResourceLocation disabledGoggles = modLoc("build_goggles_disabled"); + basicItem(disabledGoggles); + basicItem(ModItems.buildGoggles) + .override() + .predicate(new ResourceLocation("disabled"), 1.0F) + .model(getExistingFile(disabledGoggles)) + .end(); + } + + /** + * Apparently MineColonies does not use the correct path for item textures... + */ + @Override + public ItemModelBuilder basicItem(final ResourceLocation item) + { + return getBuilder(item.toString()) + .parent(new ModelFile.UncheckedModelFile("item/generated")) + .texture("layer0", new ResourceLocation(item.getNamespace(), "items/" + item.getPath())); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemTagsProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemTagsProvider.java index 92442b41032..4806d775aec 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemTagsProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultItemTagsProvider.java @@ -224,7 +224,9 @@ protected void addTags() .addTag(Tags.Items.DYES); tag(ModTags.crafterIngredient.get(TagConstants.CRAFTING_FARMER)) - .add(Items.HAY_BLOCK); + .add(Items.HAY_BLOCK) + .add(Items.GRASS) + .add(Items.FERN); tag(ModTags.crafterIngredientExclusions.get(TagConstants.CRAFTING_FARMER)); tag(ModTags.crafterProduct.get(TagConstants.CRAFTING_FARMER)) .add(Items.HAY_BLOCK) @@ -394,8 +396,15 @@ protected void addTags() .addTag(ItemTags.WOODEN_SLABS) .addTag(ItemTags.WOODEN_STAIRS) .add(Items.LECTERN, Items.PISTON) + .add(Items.PRISMARINE, Items.PRISMARINE_BRICKS) .add(paperExtras); + tag(ModTags.crafterDoIngredient.get(TagConstants.CRAFTING_STONEMASON)) + .add(Items.STONE) + .add(Items.NETHERRACK) + .add(Items.PRISMARINE) + .add(Items.DARK_PRISMARINE); + tag(ModTags.crafterIngredient.get(TagConstants.CRAFTING_STONE_SMELTERY)) .addTag(ModTags.crafterProduct.get(TagConstants.CRAFTING_STONEMASON)); tag(ModTags.crafterIngredientExclusions.get(TagConstants.CRAFTING_STONE_SMELTERY)); @@ -452,6 +461,9 @@ protected void addTags() .add(ModItems.rawPumpkinPie) .add(ModItems.cakeBatter); + + tag(ModTags.ignoreNBT) + .addTag(ItemTags.BANNERS); } @NotNull diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultNetherWorkerLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultNetherWorkerLootProvider.java deleted file mode 100644 index 771ef6c0728..00000000000 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultNetherWorkerLootProvider.java +++ /dev/null @@ -1,308 +0,0 @@ -package com.minecolonies.coremod.generation.defaults; - -import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.crafting.ItemStorage; -import com.minecolonies.api.items.ModItems; -import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; -import com.minecolonies.coremod.generation.CustomRecipeProvider; -import com.minecolonies.coremod.generation.SimpleLootTableProvider; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.LootTables; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer; -import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static com.minecolonies.api.util.constant.Constants.MOD_ID; -import static com.minecolonies.api.util.constant.NbtTagConstants.*; - -import com.minecolonies.coremod.generation.CustomRecipeProvider.CustomRecipeBuilder; -import com.minecolonies.coremod.generation.SimpleLootTableProvider.LootTableRegistrar; - -public class DefaultNetherWorkerLootProvider implements DataProvider -{ - private static final int MAX_BUILDING_LEVEL = 5; - - private final NetherWorkerRecipeProvider recipeProvider; - private final NetherWorkerLootTableProvider lootTableProvider; - private final List levels; - - public DefaultNetherWorkerLootProvider(@NotNull final DataGenerator generatorIn, - @NotNull final LootTables lootTableManager) - { - levels = new ArrayList<>(); - - for (int buildingLevel = 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) - { - levels.add(createTripLoot(buildingLevel)); - } - - recipeProvider = new NetherWorkerRecipeProvider(generatorIn, lootTableManager); - lootTableProvider = new NetherWorkerLootTableProvider(generatorIn); - } - - private LootTable.Builder createTripLoot(final int buildingLevel) - { - return new LootTable.Builder() - .withPool(createBlocksPool(buildingLevel)) - .withPool(createMobsPool(buildingLevel)); - } - - @NotNull - private LootPool.Builder createBlocksPool(final int buildingLevel) - { - final LootPool.Builder blocks = new LootPool.Builder() - .name("blocks") - .setRolls(UniformGenerator.between(3, 10)) - .setBonusRolls(UniformGenerator.between(0.3F, 0.3F)); - - blocks.add(LootItem.lootTableItem(Items.NETHERRACK) - .setWeight(20) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 25)))); - - blocks.add(LootItem.lootTableItem(Items.SOUL_SAND) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 7)))); - - blocks.add(LootItem.lootTableItem(Items.SOUL_SOIL) - .setWeight(8) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))); - - blocks.add(LootItem.lootTableItem(Items.GRAVEL) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 10)))); - - blocks.add(LootItem.lootTableItem(Items.NETHER_QUARTZ_ORE) - .setWeight(15) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))); - - if (buildingLevel >= 2) - { - blocks.add(LootItem.lootTableItem(Items.GLOWSTONE) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 4)))); - - blocks.add(LootItem.lootTableItem(Items.NETHER_WART) - .setWeight(3) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); - - blocks.add(LootItem.lootTableItem(Items.BROWN_MUSHROOM) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); - - blocks.add(LootItem.lootTableItem(Items.RED_MUSHROOM) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); - - blocks.add(LootItem.lootTableItem(Items.CRIMSON_NYLIUM) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 1)))); - - blocks.add(LootItem.lootTableItem(Items.CRIMSON_FUNGUS) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(0, 1)))); - - blocks.add(LootItem.lootTableItem(Items.CRIMSON_STEM) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); - } - - if (buildingLevel >= 3) - { - blocks.add(LootItem.lootTableItem(Items.BASALT) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); - - blocks.add(LootItem.lootTableItem(Items.WARPED_NYLIUM) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 1)))); - - blocks.add(LootItem.lootTableItem(Items.WARPED_FUNGUS) - .setWeight(10) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(0, 1)))); - - blocks.add(LootItem.lootTableItem(Items.WARPED_STEM) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); - } - - if (buildingLevel >= 4) - { - blocks.add(LootItem.lootTableItem(Items.NETHER_GOLD_ORE) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); - - blocks.add(LootItem.lootTableItem(Items.BLACKSTONE) - .setWeight(5) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); - } - - if (buildingLevel >= 5) - { - blocks.add(LootItem.lootTableItem(Items.ANCIENT_DEBRIS) - .setWeight(1) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); - } - - return blocks; - } - - @NotNull - private LootPool.Builder createMobsPool(final int buildingLevel) - { - final LootPool.Builder mobs = new LootPool.Builder() - .name("mobs") - .setRolls(UniformGenerator.between(2, 6)) - .setBonusRolls(UniformGenerator.between(0.1F, 0.1F)); - - mobs.add(createAdventureToken(EntityType.ZOMBIFIED_PIGLIN, 5, 5) - .setWeight(5500).setQuality(-10)); - - mobs.add(createAdventureToken(EntityType.MAGMA_CUBE, 3, 4) - .setWeight(300).setQuality(10)); - - mobs.add(createAdventureToken(EntityType.HOGLIN, 3, 5) - .setWeight(500).setQuality(-1)); - - mobs.add(createAdventureToken(EntityType.GHAST, 12, 5) - .setWeight(300).setQuality(-3)); - - mobs.add(createAdventureToken(EntityType.ENDERMAN, 7, 5) - .setWeight(300).setQuality(-3)); - - mobs.add(createAdventureToken(EntityType.BLAZE, 5, 10) - .setWeight(100).setQuality(1)); - - return mobs; - } - - private LootPoolSingletonContainer.Builder createAdventureToken(@NotNull final EntityType mob, final int damage_done, final int xp_gained) - { - final CompoundTag nbt = new CompoundTag(); - nbt.putString(TAG_ENTITY_TYPE, ForgeRegistries.ENTITY_TYPES.getKey(mob).toString()); - nbt.putInt(TAG_DAMAGE, damage_done); - nbt.putInt(TAG_XP_DROPPED, xp_gained); - - final ItemStack stack = new ItemStack(ModItems.adventureToken); - stack.setTag(nbt); - - return SimpleLootTableProvider.itemStack(stack); - } - - @NotNull - @Override - public String getName() - { - return "NetherWorkerLootProvider"; - } - - @Override - public void run(@NotNull final CachedOutput cache) throws IOException - { - recipeProvider.run(cache); - lootTableProvider.run(cache); - } - - private class NetherWorkerRecipeProvider extends CustomRecipeProvider - { - private final LootTables lootTableManager; - - public NetherWorkerRecipeProvider(@NotNull final DataGenerator generatorIn, - @NotNull LootTables lootTableManager) - { - super(generatorIn); - - this.lootTableManager = lootTableManager; - } - - @NotNull - @Override - public String getName() - { - return "NetherWorkerRecipeProvider"; - } - - @Override - protected void registerRecipes(@NotNull final Consumer consumer) - { - final List inputs = Arrays.asList( - new ItemStorage(new ItemStack(Items.COBBLESTONE, 64)), - new ItemStorage(new ItemStack(Items.TORCH, 32)), - new ItemStorage(new ItemStack(Items.LADDER, 16)) - ); - - for (int i = 0; i < levels.size(); ++i) - { - final int buildingLevel = i + 1; - - final List drops = LootTableAnalyzer.toDrops(lootTableManager, levels.get(i).build()); - final Stream loot = drops.stream().flatMap(drop -> drop.getItemStacks().stream().map(ItemStack::getItem)); - - CustomRecipeBuilder.create(ModJobs.NETHERWORKER_ID.getPath() + "_custom", "trip" + buildingLevel) - .minBuildingLevel(buildingLevel) - .maxBuildingLevel(buildingLevel) - .inputs(inputs) - .secondaryOutputs(loot.map(ItemStack::new).collect(Collectors.toList())) - .lootTable(new ResourceLocation(MOD_ID, "recipes/" + ModJobs.NETHERWORKER_ID.getPath() + "/trip" + buildingLevel)) - .build(consumer); - } - - // and also a lava bucket recipe for good measure - CustomRecipeBuilder.create(ModJobs.NETHERWORKER_ID.getPath() + "_custom", "lava") - .inputs(Collections.singletonList(new ItemStorage(new ItemStack(Items.BUCKET)))) - .result(new ItemStack(Items.LAVA_BUCKET)) - .build(consumer); - } - } - - private class NetherWorkerLootTableProvider extends SimpleLootTableProvider - { - public NetherWorkerLootTableProvider(@NotNull final DataGenerator dataGeneratorIn) - { - super(dataGeneratorIn); - } - - @NotNull - @Override - public String getName() - { - return "NetherWorkerLootTableProvider"; - } - - @Override - protected void registerTables(@NotNull final LootTableRegistrar registrar) - { - for (int i = 0; i < levels.size(); ++i) - { - final int buildingLevel = i + 1; - final LootTable.Builder lootTable = levels.get(i); - - registrar.register(new ResourceLocation(MOD_ID, "recipes/" + ModJobs.NETHERWORKER_ID.getPath() + "/trip" + buildingLevel), - LootContextParamSets.ALL_PARAMS, lootTable); - } - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultRecipeProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultRecipeProvider.java index 12f2407021e..94e4f2a2f0d 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultRecipeProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultRecipeProvider.java @@ -118,6 +118,7 @@ private void buildHutRecipes(@NotNull final Consumer consumer) registerHutRecipe1(consumer, ModBlocks.blockHutTavern, Items.BARREL); registerHutRecipe1(consumer, ModBlocks.blockHutTownHall, buildTool.get()); registerHutRecipe1(consumer, ModBlocks.blockHutWareHouse, Tags.Items.CHESTS); + registerHutRecipe1(consumer, ModBlocks.blockHutNetherWorker, Items.OBSIDIAN); registerHutRecipe1(consumer, ModBlocks.blockHutAlchemist, Items.BREWING_STAND); ShapedRecipeBuilder.shaped(ModBlocks.blockHutCrusher) @@ -182,6 +183,17 @@ private void buildHutRecipes(@NotNull final Consumer consumer) .unlockedBy("has_items", hasAllOf(buildTool.get(), ModBlocks.blockHutFarmer)) .save(consumer); + ShapedRecipeBuilder.shaped(ModBlocks.blockPlantationField) + .pattern(" T ") + .pattern("SIS") + .pattern("PPP") + .define('S', Items.STICK) + .define('P', ItemTags.PLANKS) + .define('I', Items.IRON_INGOT) + .define('T', buildTool.get()) + .unlockedBy("has_items", hasAllOf(buildTool.get(), ModBlocks.blockHutPlantation)) + .save(consumer); + ShapedRecipeBuilder.shaped(ModBlocks.blockSimpleQuarry) .pattern("XTX") .pattern("XDX") @@ -240,6 +252,12 @@ private static ResourceLocation append(@NotNull final ItemLike item, return append(ForgeRegistries.ITEMS.getKey(item.asItem()), "", text); } + /** + * Standard hut block recipe pattern, using build tool and one unique item surrounded by planks. + * @param consumer the recipe consumer. + * @param output the resulting hut block. + * @param input the unique input item. + */ private static void registerHutRecipe1(@NotNull final Consumer consumer, @NotNull final ItemLike output, @NotNull final ItemLike input) @@ -255,6 +273,12 @@ private static void registerHutRecipe1(@NotNull final Consumer c .save(consumer); } + /** + * Standard hut block recipe pattern, using build tool and one unique tag surrounded by planks. + * @param consumer the recipe consumer. + * @param output the resulting hut block. + * @param input the unique input tag. + */ private static void registerHutRecipe1(@NotNull final Consumer consumer, @NotNull final ItemLike output, @NotNull final TagKey input) @@ -272,6 +296,13 @@ private static void registerHutRecipe1(@NotNull final Consumer c .save(consumer); } + /** + * Cheap hut block recipe pattern, using build tool and one unique item surrounded by planks. + * @param consumer the recipe consumer. + * @param output the resulting hut block (produces 2). + * @param input the unique input item. + * @param name additional suffix for recipe name to avoid colliding with {@link #registerHutRecipe1}. + */ private static void registerHutRecipe1x2(@NotNull final Consumer consumer, @NotNull final ItemLike output, @NotNull final ItemLike input, @@ -288,6 +319,12 @@ private static void registerHutRecipe1x2(@NotNull final Consumer .save(consumer, append(output, name)); } + /** + * Expensive hut block recipe pattern, using build tool and one unique item (thrice) surrounded by planks. + * @param consumer the recipe consumer. + * @param output the resulting hut block. + * @param input the unique input item (used three times). + */ private static void registerHutRecipe3(@NotNull final Consumer consumer, @NotNull final ItemLike output, @NotNull final ItemLike input) @@ -484,6 +521,17 @@ private void buildOtherItems(@NotNull final Consumer consumer) .unlockedBy("has_build_tool", has(buildTool.get())) .save(consumer); + ShapedRecipeBuilder.shaped(ModItems.questLog) + .pattern("XTX") + .pattern("LPL") + .pattern("XPX") + .define('P', Items.PAPER) + .define('L', Items.LEATHER) + .define('X', Items.STICK) + .define('T', buildTool.get()) + .unlockedBy("has_build_tool", has(buildTool.get())) + .save(consumer); + ShapedRecipeBuilder.shaped(ModItems.resourceScroll) .pattern("XTX") .pattern("XPX") diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultResearchProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultResearchProvider.java index dff5c617449..826683607b4 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultResearchProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultResearchProvider.java @@ -5,6 +5,7 @@ import com.minecolonies.api.items.ModItems; import com.minecolonies.api.research.AbstractResearchProvider; import com.minecolonies.api.research.ResearchBranchType; +import com.minecolonies.api.util.constant.CitizenConstants; import com.minecolonies.api.util.constant.Constants; import net.minecraft.data.DataGenerator; import net.minecraft.world.item.Items; @@ -75,12 +76,15 @@ public Collection getResearchEffectCollection() effects.add(new ResearchEffect(BLOCK_ATTACKS).setTranslatedName("Knight Shield Blocking Chance +%3$s%%").setLevels(new double[] {0.05, 0.1, 0.25, 0.5})); effects.add(new ResearchEffect(BLOCK_BREAK_SPEED).setTranslatedName("Citizen Block Break Speed +%3$s%%").setLevels(new double[] {0.1, 0.25, 0.5, 1, 2})); effects.add(new ResearchEffect(BLOCK_PLACE_SPEED).setTranslatedName("Citizen Block Place Speed +%3$s%%").setLevels(new double[] {0.1, 0.25, 0.5, 1, 2})); - effects.add(new ResearchEffect(CITIZEN_CAP).setTranslatedName("Increase Max Citizens +%s").setLevels(new double[] {25, 75, 125, 1000})); + effects.add(new ResearchEffect(CITIZEN_CAP).setTranslatedName("Max Citizens to %2$s") + .setLevels(new double[] {CitizenConstants.CITIZEN_LIMIT_DEFAULT, CitizenConstants.CITIZEN_LIMIT_OUTPOST, CitizenConstants.CITIZEN_LIMIT_HAMLET, + CitizenConstants.CITIZEN_LIMIT_VILLAGE, + CitizenConstants.CITIZEN_LIMIT_MAX})); effects.add(new ResearchEffect(CITIZEN_INV_SLOTS).setTranslatedName("Citizen Inventory +%s Slots").setLevels(new double[] {9, 18, 27})); effects.add(new ResearchEffect(DOUBLE_ARROWS).setTranslatedName("Archer Multishot +%3$s%%").setLevels(new double[] {0.05, 0.1, 0.25, 0.5})); effects.add(new ResearchEffect(MECHANIC_ENHANCED_GATES).setTranslatedName("Gates Gain +100% Raider Swarm Resistance").setLevels(new double[] {5, 15})); effects.add(new ResearchEffect(FARMING).setTranslatedName("Farmers Harvest +%3$s%% Crops").setLevels(new double[] {0.1, 0.25, 0.5, 0.75, 2})); - effects.add(new ResearchEffect(FLEEING_DAMAGE).setTranslatedName("Guards Take -%3$s%% Damage When Fleeing").setLevels(new double[] {0.2, 0.3, 0.4, 1})); + effects.add(new ResearchEffect(FLEEING_DAMAGE).setTranslatedName("Guards Take -%3$s%% Damage When Fleeing").setLevels(new double[] {0.2, 0.3, 0.4, 0.75})); effects.add(new ResearchEffect(FLEEING_SPEED).setTranslatedName("Fleeing Guards Gain Swiftness %2$s").setLevels(new double[] {1, 2, 3, 5})); effects.add(new ResearchEffect(GROWTH).setTranslatedName("Child Growth Rate +%3$s%%").setLevels(new double[] {0.05, 0.1, 0.25, 0.5, 1})); effects.add(new ResearchEffect(HAPPINESS).setTranslatedName("Citizen Happiness +%3$s%%").setLevels(new double[] {0.05, 0.1, 0.15, 0.2, 0.5})); @@ -109,7 +113,11 @@ public Collection getResearchEffectCollection() effects.add(new ResearchEffect(KNIGHT_TAUNT).setTranslatedName("Knights Force Mobs to Target Them")); effects.add(new ResearchEffect(FIRE_RES).setTranslatedName("Miners Have Fire and Lava Immunity")); effects.add(new ResearchEffect(ARROW_PIERCE).setTranslatedName("Archers Gain Piercing II")); - effects.add(new ResearchEffect(PLANT_2).setTranslatedName("Plantations Grow Two Crops at Once")); + effects.add(new ResearchEffect(PLANTATION_LARGE).setTranslatedName("Plantations Unlock 1 Additional Field")); + effects.add(new ResearchEffect(PLANTATION_JUNGLE).setTranslatedName("Plantations Unlock Fields For: Bamboo, Cocoa and Vines")); + effects.add(new ResearchEffect(PLANTATION_SEA).setTranslatedName("Plantations Unlock Fields For: Kelp, Seagrass and Sea pickles")); + effects.add(new ResearchEffect(PLANTATION_EXOTIC).setTranslatedName("Plantations Unlock Fields For: Glowberries")); + effects.add(new ResearchEffect(PLANTATION_NETHER).setTranslatedName("Plantations Unlock Fields For: Crimson fungi and Warped fungi")); effects.add(new ResearchEffect(BEEKEEP_2).setTranslatedName("Beekeepers Can Harvest Both Honey Bottles and Combs at Once")); effects.add(new ResearchEffect(RAILS).setTranslatedName("Citizens use Rails")); effects.add(new ResearchEffect(VINES).setTranslatedName("Citizens can climb Vines")); @@ -160,23 +168,17 @@ public Collection getResearchEffectCollection() effects.add(new ResearchEffect(ModBuildings.alchemist.get().getBuildingBlock()).setTranslatedName("Unlocks Alchemist")); - // Crafter-recipe-only unlocks do not require static effect resource locations; the crafter recipe json checks against the research id resource locaiton itself. - // Assigning them for now to handle text cleanly, and to allow researches with both recipe and non-recipe effects. - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/knowledgeoftheendunlock")).setTranslatedName( - "Stonemasons Learn Endstone Recipe and Bakers Learn Chorus Bread Recipe")); - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/morescrollsunlock")).setTranslatedName( - "Enchanter Learns Scroll Recipes to Locate Workers and Summon Guards")); - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/platearmorunlock")).setTranslatedName("Blacksmith Learns Plate Armor Recipes")); + // Crafter-recipe-only unlocks + effects.add(new ResearchEffect(THE_END).setTranslatedName("Stonemasons Learn Endstone Recipe and Bakers Learn Chorus Bread Recipe")); + effects.add(new ResearchEffect(THE_DEPTHS).setTranslatedName("Crusher Learns Deepslate and Tuff Recipes")); + effects.add(new ResearchEffect(MORE_SCROLLS).setTranslatedName("Enchanter Learns Scroll Recipes to Locate Workers and Summon Guards")); + effects.add(new ResearchEffect(PLATE_ARMOR).setTranslatedName("Blacksmith Learns Plate Armor Recipes")); //Sifter Mesh triggers - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/sifterstringunlock")).setTranslatedName( - "Fletcher Learns How to Make String Meshes for the Sifter")); - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/sifterflintunlock")).setTranslatedName( - "Stonemason Learns How to Make Flint Meshes for the Sifter")); - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/sifterironunlock")).setTranslatedName( - "Blacksmith Learns How to Make Iron Meshes for the Sifter")); - effects.add(new ResearchEffect(new ResourceLocation(Constants.MOD_ID, "effects/sifterdiamondunlock")).setTranslatedName( - "Mechanic Learns How to Make Diamond Meshes for the Sifter")); + effects.add(new ResearchEffect(SIFTER_STRING).setTranslatedName("Fletcher Learns How to Make String Meshes for the Sifter")); + effects.add(new ResearchEffect(SIFTER_FLINT).setTranslatedName("Stonemason Learns How to Make Flint Meshes for the Sifter")); + effects.add(new ResearchEffect(SIFTER_IRON).setTranslatedName("Blacksmith Learns How to Make Iron Meshes for the Sifter")); + effects.add(new ResearchEffect(SIFTER_DIAMOND).setTranslatedName("Mechanic Learns How to Make Diamond Meshes for the Sifter")); return effects; } @@ -295,28 +297,28 @@ public Collection getCivilResearch(Collection r) .setIcon(ModBlocks.blockHutHome.asItem(), 50) .addBuildingRequirement(ModBuildings.HOME_ID, 4) .addItemCost(Items.COOKED_BEEF, 64) - .addEffect(CITIZEN_CAP, 1) + .addEffect(CITIZEN_CAP, 2) .addToList(r); final Research hamlet = new Research(new ResourceLocation(Constants.MOD_ID, "civilian/hamlet"), CIVIL).setParentResearch(outpost) .setTranslatedName("Hamlet") .setIcon(ModBlocks.blockHutHome.asItem(), 75) .addBuildingRequirement(ModBuildings.HOME_ID, 5) .addItemCost(Items.COOKED_BEEF, 128) - .addEffect(CITIZEN_CAP, 2) + .addEffect(CITIZEN_CAP, 3) .addToList(r); final Research village = new Research(new ResourceLocation(Constants.MOD_ID, "civilian/village"), CIVIL).setParentResearch(hamlet) .setTranslatedName("Village") .setIcon(ModBlocks.blockHutHome.asItem(), 100) .addBuildingRequirement(ModBuildings.TOWNHALL_ID, 4) .addItemCost(Items.COOKED_BEEF, 256) - .addEffect(CITIZEN_CAP, 3) + .addEffect(CITIZEN_CAP, 4) .addToList(r); new Research(new ResourceLocation(Constants.MOD_ID, "civilian/city"), CIVIL).setParentResearch(village) .setTranslatedName("City") .setIcon(ModBlocks.blockHutHome.asItem(), 200) .addBuildingRequirement(ModBuildings.TOWNHALL_ID, 5) .addItemCost(Items.COOKED_BEEF, 512) - .addEffect(CITIZEN_CAP, 4) + .addEffect(CITIZEN_CAP, 5) .addToList(r); final Research diligent = new Research(new ResourceLocation(Constants.MOD_ID, "civilian/diligent"), CIVIL).setParentResearch(keen) @@ -469,7 +471,7 @@ public Collection getCivilResearch(Collection r) .setIcon(new ResourceLocation("minecolonies:textures/icons/research/hp4.png")) .addBuildingRequirement(ModBuildings.LIBRARY_ID, 3) .addItemCost(Items.WHITE_WOOL, 32) - .addEffect(MASKS, 3) + .addEffect(MASKS, 1) .addToList(r); new Research(new ResourceLocation(Constants.MOD_ID, "civilian/vaccines"), CIVIL).setParentResearch(masks) @@ -478,7 +480,7 @@ public Collection getCivilResearch(Collection r) .setIcon(new ResourceLocation("minecolonies:textures/icons/research/hp5.png")) .addBuildingRequirement(ModBuildings.HOSPITAL_ID, 3) .addItemCost(Items.EGG, 64) - .addEffect(VACCINES, 3) + .addEffect(VACCINES, 1) .addToList(r); final Research circus = new Research(new ResourceLocation(Constants.MOD_ID, "civilian/circus"), CIVIL).setParentResearch(firstAid) @@ -1073,7 +1075,7 @@ public Collection getCombatResearch(Collection r) .setIcon(ModItems.bannerRallyGuards) .addBuildingRequirement(ModBuildings.BARRACKS_ID, 3) .addItemCost(Items.EMERALD, 16) - .addEffect(TELESCOPE, 3) + .addEffect(TELESCOPE, 1) .addToList(r); new Research(new ResourceLocation(Constants.MOD_ID, "combat/standard"), COMBAT).setParentResearch(telescope) @@ -1081,7 +1083,7 @@ public Collection getCombatResearch(Collection r) .setIcon(ModItems.bannerRallyGuards) .addBuildingRequirement(ModBuildings.BARRACKS_ID, 4) .addItemCost(Items.EMERALD, 32) - .addEffect(STANDARD, 3) + .addEffect(STANDARD, 1) .addToList(r); final Research regeneration = new Research(new ResourceLocation(Constants.MOD_ID, "combat/regeneration"), COMBAT).setParentResearch(improvedLeather) @@ -1262,15 +1264,56 @@ public Collection getTechnologyResearch(Collection r) .addItemCost(ModItems.compost, 16) .addEffect(ModBuildings.plantation.get().getBuildingBlock(), 1) .addToList(r); - new Research(new ResourceLocation(Constants.MOD_ID, "technology/doubletrouble"), TECH).setParentResearch(letItGrow) - .setTranslatedName("Double Trouble") - .setTranslatedSubtitle("Double Trouble") - .setIcon(Items.GREEN_DYE) - .addBuildingRequirement("plantation", 3) - .addItemCost(Items.BAMBOO, 64) - .addItemCost(Items.SUGAR_CANE, 64) - .addItemCost(Items.CACTUS, 64) - .addEffect(PLANT_2, 1) + final Research cropRotation = new Research(new ResourceLocation(Constants.MOD_ID, "technology/croprotation"), TECH).setParentResearch(letItGrow) + .setTranslatedName("Crop Rotation") + .setTranslatedSubtitle("Bigger = better") + .setIcon(Items.GREEN_DYE) + .addBuildingRequirement(ModBuildings.PLANTATION_ID, 3) + .addItemCost(Items.SUGAR_CANE, 32) + .addItemCost(Items.CACTUS, 32) + .addEffect(PLANTATION_LARGE, 1) + .addToList(r); + + new Research(new ResourceLocation(Constants.MOD_ID, "technology/junglemaster"), TECH).setParentResearch(letItGrow) + .setTranslatedName("Jungle Master") + .setTranslatedSubtitle("Wimoweh Wimoweh Wimoweh") + .setIcon(Items.VINE) + .addBuildingRequirement(ModBuildings.PLANTATION_ID, 2) + .addItemCost(Items.BAMBOO, 16) + .addItemCost(Items.COCOA_BEANS, 16) + .addItemCost(Items.VINE, 16) + .addEffect(PLANTATION_JUNGLE, 1) + .addToList(r); + + new Research(new ResourceLocation(Constants.MOD_ID, "technology/takingdivinglessons"), TECH).setParentResearch(letItGrow) + .setTranslatedName("Taking Diving Lessons") + .setTranslatedSubtitle("*Drowning Noises*") + .setIcon(Items.KELP) + .addBuildingRequirement(ModBuildings.PLANTATION_ID, 2) + .addItemCost(Items.KELP, 16) + .addItemCost(Items.SEAGRASS, 16) + .addItemCost(Items.SEA_PICKLE, 16) + .addEffect(PLANTATION_SEA, 1) + .addToList(r); + + new Research(new ResourceLocation(Constants.MOD_ID, "technology/exoticfruits"), TECH).setParentResearch(letItGrow) + .setTranslatedName("Exotic Fruits") + .setTranslatedSubtitle("Too Dark Here") + .setIcon(Items.GLOW_BERRIES) + .addBuildingRequirement(ModBuildings.PLANTATION_ID, 3) + .addItemCost(Items.GLOW_BERRIES, 32) + .addEffect(PLANTATION_EXOTIC, 1) + .addToList(r); + + new Research(new ResourceLocation(Constants.MOD_ID, "technology/gargamel"), TECH).setParentResearch(cropRotation) + .setTranslatedName("Gargamel") + .setTranslatedSubtitle("The Root of all Evil") + .setIcon(Items.CRIMSON_FUNGUS) + .addBuildingRequirement(ModBuildings.PLANTATION_ID, 3) + .addBuildingRequirement(ModBuildings.NETHERWORKER_ID, 3) + .addItemCost(Items.CRIMSON_FUNGUS, 16) + .addItemCost(Items.WARPED_FUNGUS, 16) + .addEffect(PLANTATION_NETHER, 1) .addToList(r); final Research bonemeal = new Research(new ResourceLocation(Constants.MOD_ID, "technology/bonemeal"), TECH).setParentResearch(biodegradable) @@ -1405,6 +1448,7 @@ public Collection getTechnologyResearch(Collection r) .setIcon(Items.COBBLED_DEEPSLATE) .addBuildingRequirement("crusher", 3) .addItemCost(Items.DEEPSLATE, 64) + .addEffect(THE_DEPTHS, 1) .addToList(r); new Research(new ResourceLocation(Constants.MOD_ID, "technology/pavetheroad"), TECH).setParentResearch(rockingRoll) diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSoundProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSoundProvider.java index 2454c918f44..d96b955588d 100755 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSoundProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSoundProvider.java @@ -2,74 +2,95 @@ import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; -import com.minecolonies.api.colony.jobs.registry.IJobRegistry; -import com.minecolonies.api.colony.jobs.registry.JobEntry; +import com.minecolonies.api.colony.jobs.ModJobs; import com.minecolonies.api.entity.mobs.RaiderType; import com.minecolonies.api.sounds.EventType; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.generation.DataGeneratorConstants; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.data.HashCache; import net.minecraft.data.DataProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.Resource; +import net.minecraftforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Locale; import static com.ldtteam.datagenerators.sounds.SoundsJson.createSoundJson; +import static com.minecolonies.api.sounds.ModSoundEvents.CITIZEN_SOUND_EVENT_PREFIX; public class DefaultSoundProvider implements DataProvider { private final DataGenerator generator; + private final ExistingFileHelper fileHelper; private JsonObject sounds; - public DefaultSoundProvider(final DataGenerator generator) + public DefaultSoundProvider(final DataGenerator generator, final ExistingFileHelper existingFileHelper) { this.generator = generator; + this.fileHelper = existingFileHelper; } @Override public void run(@NotNull final CachedOutput cache) throws IOException { sounds = new JsonObject(); - - final List defaultMaleSounds = new ArrayList<>(); - defaultMaleSounds.add("minecolonies:mob/citizen/male/say1"); - defaultMaleSounds.add("minecolonies:mob/citizen/male/say2"); - defaultMaleSounds.add("minecolonies:mob/citizen/male/say3"); - - final List defaultFemaleSounds = new ArrayList<>(); - defaultFemaleSounds.add("minecolonies:mob/citizen/female/say1"); - defaultFemaleSounds.add("minecolonies:mob/citizen/female/say2"); - defaultFemaleSounds.add("minecolonies:mob/citizen/female/say3"); - - final List childSounds = new ArrayList<>(); - childSounds.add("minecolonies:mob/citizen/child/laugh1"); - childSounds.add("minecolonies:mob/citizen/child/laugh2"); - - for (final JobEntry job : IJobRegistry.getInstance().getValues()) + final File soundFolder = this.generator.getOutputFolder() + .getParent() + .getParent() + .getParent() + .resolve("main") + .resolve("resources") + .resolve("assets") + .resolve("minecolonies") + .resolve("sounds") + .resolve("mob") + .resolve("citizen") + .toFile(); + final List mainTypes = new ArrayList<>(ModJobs.getJobs()); + mainTypes.remove(ModJobs.placeHolder.getId()); + mainTypes.add(new ResourceLocation(Constants.MOD_ID, "unemployed")); + mainTypes.add(new ResourceLocation(Constants.MOD_ID, "visitor")); + + if (soundFolder.isDirectory()) { - if (job.getKey().getNamespace().equals(Constants.MOD_ID) && !job.getKey().getPath().equals("placeholder")) + final File[] list = soundFolder.listFiles(); + for (final File file : list) { - for (final EventType soundEvents : EventType.values()) + final String name = file.getName(); + if (file.isDirectory()) { - sounds.add("mob." + job.getKey().getPath() + ".male." + soundEvents.name().toLowerCase(Locale.US), - createSoundJson("neutral", getDefaultProperties(), defaultMaleSounds)); - sounds.add("mob." + job.getKey().getPath() + ".female." + soundEvents.name().toLowerCase(Locale.US), - createSoundJson("neutral", getDefaultProperties(), defaultFemaleSounds)); + final List soundList = new ArrayList<>(); + final File[] subList = file.listFiles(); + + for (final File soundFile : subList) + { + final String soundName = soundFile.getName(); + soundList.add("minecolonies:mob/citizen/" + name + "/" + soundName.replace(".ogg", "")); + } + + for (final ResourceLocation job : mainTypes) + { + for (final EventType event : EventType.values()) + { + sounds.add(CITIZEN_SOUND_EVENT_PREFIX + job.getPath() + "." + name + "." + event.getId(), + createSoundJson("neutral", getDefaultProperties(), soundList)); + } + } } } } - for (final EventType soundEvents : EventType.values()) - { - sounds.add("mob.citizen.male." + soundEvents.name().toLowerCase(Locale.US), createSoundJson("neutral", getDefaultProperties(), defaultMaleSounds)); - sounds.add("mob.citizen.female." + soundEvents.name().toLowerCase(Locale.US), createSoundJson("neutral", getDefaultProperties(), defaultFemaleSounds)); - } + final List childSounds = new ArrayList<>(); + childSounds.add("minecolonies:mob/citizen/child/laugh1"); + childSounds.add("minecolonies:mob/citizen/child/laugh2"); for (final EventType soundEvents : EventType.values()) { diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSupplyLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSupplyLootProvider.java new file mode 100644 index 00000000000..693283582b4 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSupplyLootProvider.java @@ -0,0 +1,69 @@ +package com.minecolonies.coremod.generation.defaults; + +import com.minecolonies.api.items.ModItems; +import com.minecolonies.coremod.generation.SimpleLootTableProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.functions.SetNameFunction; +import net.minecraft.world.level.storage.loot.functions.SetNbtFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.Constants.*; + +/** + * Loot table generator for supply camp/ship + */ +public class DefaultSupplyLootProvider extends SimpleLootTableProvider +{ + public DefaultSupplyLootProvider(@NotNull DataGenerator dataGenerator) + { + super(dataGenerator); + } + + @NotNull + @Override + public String getName() + { + return "Supplies Loot Table Provider"; + } + + @Override + protected void registerTables(@NotNull final LootTableRegistrar registrar) + { + final CompoundTag instantTag = new CompoundTag(); + instantTag.putString(PLACEMENT_NBT, INSTANT_PLACEMENT); + + registrar.register(new ResourceLocation(MOD_ID, "chests/supplycamp"), LootContextParamSets.CHEST, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .add(LootItem.lootTableItem(ModItems.supplyCamp) + .when(LootItemRandomChanceCondition.randomChance(0.1f)) + .apply(SetNbtFunction.setTag(instantTag)) + .apply(SetNameFunction.setName(Component.translatable("item.minecolonies.supply.free", ModItems.supplyCamp.getDescription())))) + .add(LootItem.lootTableItem(ModItems.scrollBuff) + .when(LootItemRandomChanceCondition.randomChance(0.2f)) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(8)))) + )); + + registrar.register(new ResourceLocation(MOD_ID, "chests/supplyship"), LootContextParamSets.CHEST, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .add(LootItem.lootTableItem(ModItems.supplyChest) + .when(LootItemRandomChanceCondition.randomChance(0.1f)) + .apply(SetNbtFunction.setTag(instantTag)) + .apply(SetNameFunction.setName(Component.translatable("item.minecolonies.supply.free", ModItems.supplyChest.getDescription())))) + .add(LootItem.lootTableItem(ModItems.scrollBuff) + .when(LootItemRandomChanceCondition.randomChance(0.2f)) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(8)))) + )); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/QuestTranslationProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/QuestTranslationProvider.java new file mode 100644 index 00000000000..ca96449717c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/QuestTranslationProvider.java @@ -0,0 +1,115 @@ +package com.minecolonies.coremod.generation.defaults; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraft.util.GsonHelper; +import net.minecraftforge.resource.PathPackResources; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; + +import static com.minecolonies.api.quests.QuestParseConstant.*; +import static com.minecolonies.api.quests.registries.QuestRegistries.DIALOGUE_OBJECTIVE_ID; +import static com.minecolonies.api.util.constant.Constants.MOD_ID; +import static com.minecolonies.coremod.quests.QuestParsingConstants.*; + +/** + * Magic translator for quests. This parses the existing quest JSON files and moves the dialogue elements to + * translation resources, so that translations can be provided for them. + * + * This requires that the 'source' quests under src/main/resources/data/minecolonies/quests only contain en-US + * text and do not already contain translation keys. + */ +public class QuestTranslationProvider implements DataProvider +{ + private final DataGenerator generator; + + public QuestTranslationProvider(@NotNull final DataGenerator generator) + { + this.generator = generator; + } + + @NotNull + @Override + public String getName() + { + return "QuestTranslationProvider"; + } + + @Override + public void run(@NotNull final CachedOutput cache) throws IOException + { + final DataGenerator.PathProvider langProvider = generator.createPathProvider(DataGenerator.Target.RESOURCE_PACK, "lang"); + final DataGenerator.PathProvider questProvider = generator.createPathProvider(DataGenerator.Target.DATA_PACK, "quests"); + + final JsonObject langJson = new JsonObject(); + try (final PackResources pack = new PathPackResources(MOD_ID + ".src", Path.of("..", "src", "main", "resources"))) + { + for (final ResourceLocation questId : pack.getResources(PackType.SERVER_DATA, MOD_ID, + "quests", id -> id.getPath().endsWith(".json"))) + { + final ResourceLocation questPath = new ResourceLocation(questId.getNamespace(), questId.getPath().replace("quests/", "").replace(".json", "")); + final String baseKey = questPath.getNamespace() + ".quests." + questPath.getPath().replace("/", "."); + + final JsonObject json; + try (final InputStreamReader reader = new InputStreamReader(pack.getResource(PackType.SERVER_DATA, questId))) + { + json = GsonHelper.parse(reader); + } + + processQuest(langJson, baseKey, json); + + DataProvider.saveStable(cache, json, questProvider.json(questPath)); + } + } + + DataProvider.saveStable(cache, langJson, langProvider.file(new ResourceLocation(MOD_ID, "quests"), "json")); + } + + private void processQuest(final JsonObject langJson, final String baseKey, final JsonObject json) + { + final String name = json.get(NAME).getAsString(); + langJson.addProperty(baseKey, name); + json.addProperty(NAME, baseKey); + + int objectiveCount = 0; + for (final JsonElement objectivesJson : json.get(QUEST_OBJECTIVES).getAsJsonArray()) + { + final String objectiveKey = baseKey + ".obj" + objectiveCount; + final JsonObject objective = objectivesJson.getAsJsonObject(); + processObjective(langJson, objectiveKey, objective); + ++objectiveCount; + } + } + + private void processObjective(final JsonObject langJson, final String baseKey, final JsonObject json) + { + final ResourceLocation type = new ResourceLocation(json.get(TYPE).getAsString()); + if (type.equals(DIALOGUE_OBJECTIVE_ID)) + { + langJson.addProperty(baseKey, json.get(TEXT_ID).getAsString()); + json.addProperty(TEXT_ID, baseKey); + + int answerCount = 0; + for (final JsonElement answerJson : json.get(OPTIONS_ID).getAsJsonArray()) + { + final String answerKey = baseKey + ".answer" + answerCount; + langJson.addProperty(answerKey, answerJson.getAsJsonObject().get(ANSWER_ID).getAsString()); + answerJson.getAsJsonObject().addProperty(ANSWER_ID, answerKey); + + final JsonObject result = answerJson.getAsJsonObject().get(RESULT_ID).getAsJsonObject(); + processObjective(langJson, answerKey + ".reply", result); + ++answerCount; + } + } + } + +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultAlchemistCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultAlchemistCraftingProvider.java new file mode 100644 index 00000000000..30564aac408 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultAlchemistCraftingProvider.java @@ -0,0 +1,51 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Alchemist + */ +public class DefaultAlchemistCraftingProvider extends CustomRecipeProvider +{ + private final String ALCHEMIST = ModJobs.ALCHEMIST_ID.getPath(); + + public DefaultAlchemistCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultAlchemistCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeBuilder.create(ALCHEMIST, MODULE_CRAFTING, "magicpotion") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.mistletoe)), + new ItemStorage(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)))) + .result(new ItemStack(ModItems.magicpotion)) + .minResearchId(ResearchConstants.DRUID_USE_POTIONS) + .showTooltip(true) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBakerCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBakerCraftingProvider.java new file mode 100644 index 00000000000..07ed4743930 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBakerCraftingProvider.java @@ -0,0 +1,154 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_SMELTING; + +/** + * Datagen for Baker + */ +public class DefaultBakerCraftingProvider extends CustomRecipeProvider +{ + private static final String BAKER = ModJobs.BAKER_ID.getPath(); + + public DefaultBakerCraftingProvider(@NotNull final DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultBakerCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + final ItemStack waterBottle = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "water_bottle") + .inputs(List.of(new ItemStorage(new ItemStack(Items.GLASS_BOTTLE)))) + .result(waterBottle) + .minBuildingLevel(3) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "bread_dough") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 3)))) + .result(new ItemStack(ModItems.breadDough)) + .maxBuildingLevel(2) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "bread_dough3") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT)), new ItemStorage(waterBottle))) + .result(new ItemStack(ModItems.breadDough, 2)) + .minBuildingLevel(3) + .lootTable(DefaultRecipeLootProvider.LOOT_TABLE_BOTTLE) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_SMELTING, "bread") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.breadDough)))) + .result(new ItemStack(Items.BREAD)) + .intermediate(Blocks.FURNACE) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "sugary_bread") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 8)), + new ItemStorage(new ItemStack(Items.HONEY_BOTTLE)))) + .result(new ItemStack(ModItems.sugaryBread, 4)) + .minBuildingLevel(3) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "milky_bread") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 8)), + new ItemStorage(new ItemStack(Items.MILK_BUCKET)))) + .result(new ItemStack(ModItems.milkyBread, 4)) + .minBuildingLevel(4) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "golden_bread") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 8)), + new ItemStorage(new ItemStack(Items.GOLD_INGOT)))) + .result(new ItemStack(ModItems.goldenBread, 4)) + .minBuildingLevel(5) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "chorus_bread") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 8)), + new ItemStorage(new ItemStack(Items.CHORUS_FRUIT)))) + .result(new ItemStack(ModItems.chorusBread, 4)) + .minResearchId(ResearchConstants.THE_END) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "cake_batter") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 3)), + new ItemStorage(new ItemStack(Items.MILK_BUCKET, 3)), + new ItemStorage(new ItemStack(Items.SUGAR, 2)), + new ItemStorage(new ItemStack(Items.EGG)))) + .result(new ItemStack(ModItems.cakeBatter)) + .minBuildingLevel(2) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_SMELTING, "cake") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.cakeBatter)))) + .result(new ItemStack(Items.CAKE)) + .minBuildingLevel(2) + .intermediate(Blocks.FURNACE) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "raw_pumpkin_pie") + .inputs(List.of(new ItemStorage(new ItemStack(Items.PUMPKIN)), + new ItemStorage(new ItemStack(Items.SUGAR)), + new ItemStorage(new ItemStack(Items.EGG)))) + .result(new ItemStack(ModItems.rawPumpkinPie)) + .minBuildingLevel(3) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_SMELTING, "pumpkin_pie") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.rawPumpkinPie)))) + .result(new ItemStack(Items.PUMPKIN_PIE)) + .minBuildingLevel(3) + .intermediate(Blocks.FURNACE) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_CRAFTING, "cookie_dough") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHEAT, 2)), + new ItemStorage(new ItemStack(Items.COCOA_BEANS, 2)))) + .result(new ItemStack(ModItems.cookieDough, 8)) + .minBuildingLevel(4) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(BAKER, MODULE_SMELTING, "cookie") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.cookieDough)))) + .result(new ItemStack(Items.COOKIE)) + .minBuildingLevel(4) + .intermediate(Blocks.FURNACE) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBlacksmithCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBlacksmithCraftingProvider.java new file mode 100644 index 00000000000..085da8fbb6c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultBlacksmithCraftingProvider.java @@ -0,0 +1,87 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Blacksmith + */ +public class DefaultBlacksmithCraftingProvider extends CustomRecipeProvider +{ + private static final String BLACKSMITH = ModJobs.BLACKSMITH_ID.getPath(); + + public DefaultBlacksmithCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultBlacksmithCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + plate(consumer, 4, 1, ModItems.plateArmorHelmet); + plate(consumer, 7, 3, ModItems.plateArmorChest); + plate(consumer, 6, 4, ModItems.plateArmorLegs); + plate(consumer, 3, 1, ModItems.plateArmorBoots); + + netherite(consumer, Items.DIAMOND_SWORD, Items.NETHERITE_SWORD); + netherite(consumer, Items.DIAMOND_PICKAXE, Items.NETHERITE_PICKAXE); + netherite(consumer, Items.DIAMOND_AXE, Items.NETHERITE_AXE); + netherite(consumer, Items.DIAMOND_SHOVEL, Items.NETHERITE_SHOVEL); + netherite(consumer, Items.DIAMOND_HOE, Items.NETHERITE_HOE); + netherite(consumer, Items.DIAMOND_HELMET, Items.NETHERITE_HELMET); + netherite(consumer, Items.DIAMOND_CHESTPLATE, Items.NETHERITE_CHESTPLATE); + netherite(consumer, Items.DIAMOND_LEGGINGS, Items.NETHERITE_LEGGINGS); + netherite(consumer, Items.DIAMOND_BOOTS, Items.NETHERITE_BOOTS); + } + + private void plate(@NotNull final Consumer consumer, + final int ironCount, final int coalCount, + @NotNull final ItemLike output) + { + CustomRecipeBuilder.create(BLACKSMITH, MODULE_CRAFTING, + ForgeRegistries.ITEMS.getKey(output.asItem()).getPath()) + .inputs(List.of(new ItemStorage(new ItemStack(Items.IRON_INGOT, ironCount)), + new ItemStorage(new ItemStack(Items.LEATHER)), + new ItemStorage(new ItemStack(Items.COAL, coalCount)))) + .result(new ItemStack(output)) + .minBuildingLevel(4) + .minResearchId(ResearchConstants.PLATE_ARMOR) + .showTooltip(true) + .build(consumer); + } + + private void netherite(@NotNull final Consumer consumer, + @NotNull final ItemLike input, + @NotNull final ItemLike output) + { + CustomRecipeBuilder.create(BLACKSMITH, MODULE_CRAFTING, + ForgeRegistries.ITEMS.getKey(output.asItem()).getPath()) + .inputs(List.of(new ItemStorage(new ItemStack(input)), + new ItemStorage(new ItemStack(Items.NETHERITE_INGOT)))) + .result(new ItemStack(output)) + .minBuildingLevel(5) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultConcreteMixerCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultConcreteMixerCraftingProvider.java similarity index 89% rename from src/main/java/com/minecolonies/coremod/generation/defaults/DefaultConcreteMixerCraftingProvider.java rename to src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultConcreteMixerCraftingProvider.java index c073da358f8..9c3a1316828 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultConcreteMixerCraftingProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultConcreteMixerCraftingProvider.java @@ -1,9 +1,8 @@ -package com.minecolonies.coremod.generation.defaults; +package com.minecolonies.coremod.generation.defaults.workers; import com.minecolonies.api.colony.jobs.ModJobs; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.coremod.generation.CustomRecipeProvider; -import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.world.item.DyeColor; @@ -14,14 +13,13 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.function.Consumer; -import com.minecolonies.coremod.generation.CustomRecipeProvider.CustomRecipeBuilder; +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CUSTOM; /** Datagen for concrete mixer crafterrecipes */ public class DefaultConcreteMixerCraftingProvider extends CustomRecipeProvider @@ -61,12 +59,12 @@ protected void registerRecipes(@NotNull final Consumer consumer) final List customInput = new ArrayList<>(input); customInput.add(new ItemStorage(new ItemStack(dye))); - CustomRecipeBuilder.create(ModJobs.CONCRETE_ID.getPath() + "_custom", ForgeRegistries.ITEMS.getKey(powder).getPath()) + CustomRecipeBuilder.create(ModJobs.CONCRETE_ID.getPath(), MODULE_CUSTOM, ForgeRegistries.ITEMS.getKey(powder).getPath()) .inputs(customInput) .result(new ItemStack(powder, 8)) .build(consumer); - CustomRecipeBuilder.create(ModJobs.CONCRETE_ID.getPath() + "_custom", ForgeRegistries.ITEMS.getKey(concrete).getPath()) + CustomRecipeBuilder.create(ModJobs.CONCRETE_ID.getPath(), MODULE_CUSTOM, ForgeRegistries.ITEMS.getKey(concrete).getPath()) .inputs(Collections.singletonList(new ItemStorage(new ItemStack(powder)))) .result(new ItemStack(concrete)) //.intermediate(Blocks.WATER) diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCookAssistantCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCookAssistantCraftingProvider.java new file mode 100644 index 00000000000..648b12f2d49 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCookAssistantCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for Cook Assistant + */ +public class DefaultCookAssistantCraftingProvider extends CustomRecipeProvider +{ + private static final String COOKASSISTANT = ModJobs.COOKASSISTANT_ID.getPath(); + + public DefaultCookAssistantCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultCookAssistantCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCrusherCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCrusherCraftingProvider.java new file mode 100644 index 00000000000..75130562dee --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultCrusherCraftingProvider.java @@ -0,0 +1,86 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CUSTOM; + +/** + * Datagen for Crusher + */ +public class DefaultCrusherCraftingProvider extends CustomRecipeProvider +{ + private static final String CRUSHER = ModJobs.CRUSHER_ID.getPath(); + + public DefaultCrusherCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultCrusherCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + final Rule noGildedHammer = builder -> builder.maxResearchId(ResearchConstants.CRUSHING_11); + final Rule withGildedHammer = builder -> builder.minResearchId(ResearchConstants.CRUSHING_11); + final Rule withTheDepths = builder -> builder.minResearchId(ResearchConstants.THE_DEPTHS); + final Rule gravelLoot = builder -> builder.lootTable(DefaultRecipeLootProvider.LOOT_TABLE_GRAVEL); + + crush(consumer, "bonemeal1", new ItemStack(Items.BONE), new ItemStack(Items.BONE_MEAL, 3), noGildedHammer); + crush(consumer, "bonemeal2", new ItemStack(Items.BONE), new ItemStack(Items.BONE_MEAL, 5), withGildedHammer); + crush(consumer, "bonemeal3", new ItemStack(Items.BONE_BLOCK), new ItemStack(Items.BONE_MEAL, 9)); + + crush(consumer, "gravel1", new ItemStack(Items.COBBLESTONE, 2), new ItemStack(Items.GRAVEL), noGildedHammer, gravelLoot); + crush(consumer, "gravel2", new ItemStack(Items.COBBLESTONE), new ItemStack(Items.GRAVEL), withGildedHammer, gravelLoot); + + crush(consumer, "sand1", new ItemStack(Items.GRAVEL, 2), new ItemStack(Items.SAND), noGildedHammer); + crush(consumer, "sand2", new ItemStack(Items.GRAVEL), new ItemStack(Items.SAND), withGildedHammer); + + crush(consumer, "clay1", new ItemStack(Items.SAND, 2), new ItemStack(Items.CLAY), noGildedHammer); + crush(consumer, "clay2", new ItemStack(Items.SAND), new ItemStack(Items.CLAY), withGildedHammer); + crush(consumer, "clay_ball", new ItemStack(Items.CLAY), new ItemStack(Items.CLAY_BALL, 4)); + + crush(consumer, "cobble", new ItemStack(Items.TUFF, 2), new ItemStack(Items.COBBLESTONE), withTheDepths); + crush(consumer, "tuff", new ItemStack(Items.COBBLED_DEEPSLATE, 2), new ItemStack(Items.TUFF), withTheDepths); + // sadly you can't (yet) combine two required researches, so these two don't respect Gilded Hammer + } + + private void crush(@NotNull final Consumer consumer, + @NotNull final String name, + @NotNull final ItemStack input, + @NotNull final ItemStack output, + @NotNull final Rule... rules) + { + final CustomRecipeBuilder builder = CustomRecipeBuilder.create(CRUSHER, MODULE_CUSTOM, name) + .inputs(List.of(new ItemStorage(input))) + .result(output); + for (final Rule rule : rules) + { + rule.accept(builder); + } + builder.build(consumer); + } + + /** + * Convenience alias to stop the analyzer getting mad about variadic generics + */ + private interface Rule extends Consumer + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultDyerCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultDyerCraftingProvider.java new file mode 100644 index 00000000000..c0abbf84093 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultDyerCraftingProvider.java @@ -0,0 +1,58 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Dyer + */ +public class DefaultDyerCraftingProvider extends CustomRecipeProvider +{ + private static final String DYER = ModJobs.DYER_ID.getPath(); + + public DefaultDyerCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultDyerCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeBuilder.create(DYER, MODULE_CRAFTING, "red_sand") + .inputs(List.of(new ItemStorage(new ItemStack(Items.SAND, 4)), + new ItemStorage(new ItemStack(Items.RED_DYE)))) + .result(new ItemStack(Items.RED_SAND, 4)) + .build(consumer); + + CustomRecipeBuilder.create(DYER, MODULE_CRAFTING, "black_dye") + .inputs(List.of(new ItemStorage(new ItemStack(Items.CHARCOAL)))) + .result(new ItemStack(Items.BLACK_DYE)) + .minBuildingLevel(2) + .build(consumer); + + CustomRecipeBuilder.create(DYER, MODULE_CRAFTING, "dark_prismarine") + .inputs(List.of(new ItemStorage(new ItemStack(Items.PRISMARINE, 4)), + new ItemStorage(new ItemStack(Items.BLACK_DYE)))) + .result(new ItemStack(Items.DARK_PRISMARINE, 4)) + .minBuildingLevel(3) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultEnchanterCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultEnchanterCraftingProvider.java new file mode 100644 index 00000000000..17eb1c9d188 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultEnchanterCraftingProvider.java @@ -0,0 +1,301 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.google.common.collect.ImmutableMap; +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.enchants.ModEnchants; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; +import com.minecolonies.coremod.generation.CustomRecipeAndLootTableProvider; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import com.minecolonies.coremod.generation.SimpleLootTableProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.LootTables; +import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CUSTOM; +import static com.minecolonies.api.util.constant.Constants.MOD_ID; + +/** + * Datagen for Enchanter + */ +public class DefaultEnchanterCraftingProvider extends CustomRecipeAndLootTableProvider +{ + private final String ENCHANTER = ModJobs.ENCHANTER_ID.getPath(); + private static final int MAX_BUILDING_LEVEL = 5; + private static final int NEVER = 99; + + private static final int[] LEVEL_WEIGHTS = new int[] { 0, 50, 25, 15, 5, 1 }; + + /** + * Rules for a specific enchantment. + * @param firstLevel the first enchanter level to produce this enchantment, or {@link #NEVER} if none should. + * @param bonusLevels the number of extra levels above vanilla that the enchanter is allowed to produce. + * @param rare if true, this gets a weight of 1 instead of the typical weight for its level. + */ + private record EnchantmentRule(int firstLevel, int bonusLevels, boolean rare) {} + + /** The list of supported enchantments and rules. */ + private static final Map RULES = ImmutableMap.builder() + .put(Enchantments.AQUA_AFFINITY, new EnchantmentRule(1, 0, false)) + .put(Enchantments.BANE_OF_ARTHROPODS, new EnchantmentRule(1, 0, false)) + .put(Enchantments.BLAST_PROTECTION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.DEPTH_STRIDER, new EnchantmentRule(1, 0, false)) + .put(Enchantments.BLOCK_EFFICIENCY, new EnchantmentRule(1, 0, false)) + .put(Enchantments.FALL_PROTECTION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.FIRE_ASPECT, new EnchantmentRule(1, 1, false)) + .put(Enchantments.FIRE_PROTECTION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.FLAMING_ARROWS, new EnchantmentRule(1, 0, false)) + .put(Enchantments.KNOCKBACK, new EnchantmentRule(1, 1, false)) + .put(Enchantments.MOB_LOOTING, new EnchantmentRule(1, 1, false)) + .put(Enchantments.POWER_ARROWS, new EnchantmentRule(1, 0, false)) + .put(Enchantments.PROJECTILE_PROTECTION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.ALL_DAMAGE_PROTECTION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.PIERCING, new EnchantmentRule(1, 1, false)) + .put(Enchantments.PUNCH_ARROWS, new EnchantmentRule(1, 1, false)) + .put(Enchantments.QUICK_CHARGE, new EnchantmentRule(1, 1, false)) + .put(Enchantments.RESPIRATION, new EnchantmentRule(1, 1, false)) + .put(Enchantments.SHARPNESS, new EnchantmentRule(1, 0, false)) + .put(Enchantments.SMITE, new EnchantmentRule(1, 0, false)) + .put(Enchantments.SWEEPING_EDGE, new EnchantmentRule(1, 1, false)) + .put(Enchantments.UNBREAKING, new EnchantmentRule(1, 1, false)) + + .put(Enchantments.IMPALING, new EnchantmentRule(1, 0, true)) + .put(Enchantments.RIPTIDE, new EnchantmentRule(1, 1, true)) + .put(Enchantments.FROST_WALKER, new EnchantmentRule(2, 1, true)) + .put(Enchantments.LOYALTY, new EnchantmentRule(2, 1, true)) + .put(Enchantments.THORNS, new EnchantmentRule(2, 1, true)) + .put(Enchantments.BLOCK_FORTUNE, new EnchantmentRule(3, 0, true)) + .put(Enchantments.CHANNELING, new EnchantmentRule(3, 0, true)) + .put(Enchantments.SWIFT_SNEAK, new EnchantmentRule(3, 0, true)) + .put(Enchantments.SOUL_SPEED, new EnchantmentRule(3, 0, true)) + .put(Enchantments.INFINITY_ARROWS, new EnchantmentRule(4, 0, true)) + .put(Enchantments.SILK_TOUCH, new EnchantmentRule(5, 0, true)) + .put(Enchantments.MENDING, new EnchantmentRule(5, 0, true)) + .put(Enchantments.MULTISHOT, new EnchantmentRule(5, 0, false)) + + // we don't want to produce these enchantments + .put(Enchantments.FISHING_LUCK, new EnchantmentRule(NEVER, 0, false)) + .put(Enchantments.FISHING_SPEED, new EnchantmentRule(NEVER, 0, false)) + .build(); + + private final List levels; + private final LootTables lootTableManager; + + public DefaultEnchanterCraftingProvider(@NotNull final DataGenerator generatorIn, + @NotNull final LootTables lootTableManager) + { + super(generatorIn); + this.lootTableManager = lootTableManager; + + this.levels = buildLevels(); + } + + @NotNull + private List buildLevels() + { + final List levelPools = new ArrayList<>(); + for (int buildingLevel = 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) + { + levelPools.add(LootPool.lootPool()); + } + + for (int enchantLevel = 1; enchantLevel <= MAX_BUILDING_LEVEL; ++enchantLevel) + { + for (final Map.Entry entry : RULES.entrySet()) + { + final Enchantment enchantment = entry.getKey(); + final EnchantmentRule rule = entry.getValue(); + final int maxEnchantLevel = enchantment.getMaxLevel() + rule.bonusLevels(); + + if (rule.firstLevel() > MAX_BUILDING_LEVEL) + { + continue; + } + if (enchantLevel > maxEnchantLevel) + { + continue; + } + + final int firstBuildingLevel = rule.firstLevel() + enchantLevel - 1; + final int lastBuildingLevel = Math.min(firstBuildingLevel + 2, MAX_BUILDING_LEVEL); + final int weight = rule.rare() ? 1 : LEVEL_WEIGHTS[Math.min(enchantLevel + rule.firstLevel() - 1, MAX_BUILDING_LEVEL)]; + + for (int buildingLevel = firstBuildingLevel; buildingLevel <= lastBuildingLevel; ++buildingLevel) + { + levelPools.get(buildingLevel - 1).add(enchantedBook(enchantment, enchantLevel).setWeight(weight)); + } + if (enchantLevel == maxEnchantLevel) + { + // ensure the final enchant level is available at all building levels, but at reduced weight + for (int buildingLevel = lastBuildingLevel + 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) + { + levelPools.get(buildingLevel - 1).add(enchantedBook(enchantment, enchantLevel) + .setWeight(Math.min(weight, 5))); + } + } + } + } + + // special rules + levelPools.get(2).add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)); //L3 gets I + levelPools.get(3).add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)); //L4 gets I + levelPools.get(4).add(enchantedBook(ModEnchants.raiderDamage.get(), 1).setWeight(15)); //L5 gets I + levelPools.get(4).add(enchantedBook(ModEnchants.raiderDamage.get(), 2).setWeight(1)); //L5 gets II + + return levelPools.stream().map(pool -> LootTable.lootTable().withPool(pool)).toList(); + } + + @NotNull + private LootPoolSingletonContainer.Builder enchantedBook(final Enchantment enchantment, final int level) + { + final ItemStack stack = new ItemStack(Items.ENCHANTED_BOOK); + EnchantedBookItem.addEnchantment(stack, new EnchantmentInstance(enchantment, level)); + return SimpleLootTableProvider.itemStack(stack); + } + + @NotNull + @Override + public String getName() + { + return "EnchanterCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + final List tome = Collections.singletonList(new ItemStorage( + new ItemStack(ModItems.ancientTome), true, true)); + + for (int buildingLevel = 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) + { + CustomRecipeProvider.CustomRecipeBuilder.create(ENCHANTER, MODULE_CUSTOM, "tome" + buildingLevel) + .minBuildingLevel(buildingLevel) + .maxBuildingLevel(buildingLevel) + .inputs(tome) + .secondaryOutputs(Collections.singletonList(new ItemStack(Items.ENCHANTED_BOOK))) + .lootTable(new ResourceLocation(MOD_ID, "recipes/" + ENCHANTER + buildingLevel)) + .build(consumer); + } + + CustomRecipeProvider.CustomRecipeBuilder.create(ENCHANTER, MODULE_CUSTOM, "scroll_tp") + .inputs(List.of(new ItemStorage(new ItemStack(Items.PAPER, 3)), + new ItemStorage(new ItemStack(Items.COMPASS)), + new ItemStorage(new ItemStack(com.ldtteam.structurize.items.ModItems.buildTool.get())))) + .result(new ItemStack(ModItems.scrollColonyTP, 3)) + .showTooltip(true) + .build(consumer); + + CustomRecipeProvider.CustomRecipeBuilder.create(ENCHANTER, MODULE_CUSTOM, "scroll_area_tp") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.scrollColonyTP, 3)))) + .result(new ItemStack(ModItems.scrollColonyAreaTP)) + .minBuildingLevel(2) + .showTooltip(true) + .build(consumer); + + CustomRecipeProvider.CustomRecipeBuilder.create(ENCHANTER, MODULE_CUSTOM, "scroll_guard_help") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.scrollColonyTP)), + new ItemStorage(new ItemStack(Items.LAPIS_LAZULI, 5)), + new ItemStorage(new ItemStack(Items.ENDER_PEARL)), + new ItemStorage(new ItemStack(Items.PAPER)))) + .result(new ItemStack(ModItems.scrollGuardHelp, 2)) + .minBuildingLevel(3) + .minResearchId(ResearchConstants.MORE_SCROLLS) + .showTooltip(true) + .build(consumer); + + CustomRecipeProvider.CustomRecipeBuilder.create(ENCHANTER, MODULE_CUSTOM, "scroll_highlight") + .inputs(List.of(new ItemStorage(new ItemStack(ModItems.scrollColonyTP, 3)), + new ItemStorage(new ItemStack(Items.GLOWSTONE_DUST, 6)), + new ItemStorage(new ItemStack(Items.PAPER, 2)))) + .result(new ItemStack(ModItems.scrollHighLight, 5)) + .minBuildingLevel(3) + .minResearchId(ResearchConstants.MORE_SCROLLS) + .showTooltip(true) + .build(consumer); + } + + @Override + protected void registerTables(@NotNull final SimpleLootTableProvider.LootTableRegistrar registrar) + { + for (int i = 0; i < levels.size(); i++) + { + final int buildingLevel = i + 1; + final LootTable.Builder lootTable = levels.get(i); + + registrar.register(new ResourceLocation(MOD_ID, "recipes/" + ENCHANTER + buildingLevel), + LootContextParamSets.ALL_PARAMS, lootTable); + } + + validate(levels.get(MAX_BUILDING_LEVEL - 1).build()); + } + + private void validate(@NotNull final LootTable lootTable) + { + final List drops = LootTableAnalyzer.toDrops(lootTableManager, lootTable); + final Collection> enchantLevels = drops.stream() + .flatMap(drop -> drop.getItemStacks().stream()) + .flatMap(stack -> EnchantmentHelper.getEnchantments(stack).entrySet().stream()) + .collect(Collectors.toMap(Map.Entry::getKey, Function.identity(), BinaryOperator.maxBy(Map.Entry.comparingByValue()))) + .values(); + for (final Map.Entry entry : enchantLevels) + { + final EnchantmentRule rule = RULES.getOrDefault(entry.getKey(), new EnchantmentRule(NEVER, 0, false)); + if (entry.getValue() < entry.getKey().getMaxLevel() + rule.bonusLevels()) + { + Log.getLogger().warn("Enchanter max level produces {} but max is {}{}", + entry.getKey().getFullname(entry.getValue()).getString(), + entry.getKey().getFullname(entry.getKey().getMaxLevel() + rule.bonusLevels()).getString(), + rule.bonusLevels() > 0 ? " (with bonus)" : ""); + } + if (entry.getKey() != ModEnchants.raiderDamage.get()) // only check the vanilla ones + { + if (entry.getKey().isTreasureOnly() && !rule.rare()) + { + Log.getLogger().warn("{} is a treasure enchant but isn't marked as rare?", + Component.translatable(entry.getKey().getDescriptionId()).getString()); + } + if (entry.getKey().getRarity().equals(Enchantment.Rarity.VERY_RARE) && !rule.rare()) + { + Log.getLogger().warn("{} is a very_rare enchant but isn't marked as rare?", + Component.translatable(entry.getKey().getDescriptionId()).getString()); + } + } + } + + final Set enchantments = new HashSet<>(ForgeRegistries.ENCHANTMENTS.getValues()); + enchantLevels.stream().map(Map.Entry::getKey).forEach(enchantments::remove); + RULES.entrySet().stream().filter(entry -> entry.getValue().firstLevel() > MAX_BUILDING_LEVEL) + .map(Map.Entry::getKey).forEach(enchantments::remove); + enchantments.removeIf(Enchantment::isCurse); + + for (final Enchantment enchantment : enchantments) + { + Log.getLogger().info("Enchanter does not produce {}", + Component.translatable(enchantment.getDescriptionId()).getString()); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFarmerCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFarmerCraftingProvider.java new file mode 100644 index 00000000000..604fbcbeb94 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFarmerCraftingProvider.java @@ -0,0 +1,55 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Farmer + */ +public class DefaultFarmerCraftingProvider extends CustomRecipeProvider +{ + private static final String FARMER = ModJobs.FARMER_ID.getPath(); + + public DefaultFarmerCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultFarmerCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeBuilder.create(FARMER, MODULE_CRAFTING, "carved_pumpkin") + .inputs(List.of(new ItemStorage(new ItemStack(Items.PUMPKIN)))) + .result(new ItemStack(Items.CARVED_PUMPKIN)) + .requiredTool(ToolType.SHEARS) + .build(consumer); + + CustomRecipeBuilder.create(FARMER, MODULE_CRAFTING, "mud") + .inputs(List.of(new ItemStorage(new ItemStack(Items.DIRT)), + new ItemStorage(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)))) + .result(new ItemStack(Items.MUD)) + .lootTable(DefaultRecipeLootProvider.LOOT_TABLE_BOTTLE) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultFishermanLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFishermanLootProvider.java similarity index 96% rename from src/main/java/com/minecolonies/coremod/generation/defaults/DefaultFishermanLootProvider.java rename to src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFishermanLootProvider.java index 20732b42e4c..0528eeb3e8a 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultFishermanLootProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFishermanLootProvider.java @@ -1,4 +1,4 @@ -package com.minecolonies.coremod.generation.defaults; +package com.minecolonies.coremod.generation.defaults.workers; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -23,8 +23,6 @@ import java.util.Map; -import com.minecolonies.coremod.generation.SimpleLootTableProvider.LootTableRegistrar; - /** * Datagen for fisherman loot tables */ diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFletcherCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFletcherCraftingProvider.java new file mode 100644 index 00000000000..449cdfd48c7 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultFletcherCraftingProvider.java @@ -0,0 +1,49 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Fletcher + */ +public class DefaultFletcherCraftingProvider extends CustomRecipeProvider +{ + private static final String FLETCHER = ModJobs.FLETCHER_ID.getPath(); + + public DefaultFletcherCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultFletcherCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeBuilder.create(FLETCHER, MODULE_CRAFTING, "flint") + .inputs(List.of(new ItemStorage(new ItemStack(Items.GRAVEL, 3)))) + .result(new ItemStack(Items.FLINT)) + .build(consumer); + + CustomRecipeBuilder.create(FLETCHER, MODULE_CRAFTING, "string") + .inputs(List.of(new ItemStorage(new ItemStack(Items.WHITE_WOOL)))) + .result(new ItemStack(Items.STRING, 4)) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultGlassblowerCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultGlassblowerCraftingProvider.java new file mode 100644 index 00000000000..b736258f7bb --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultGlassblowerCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for Glassblower + */ +public class DefaultGlassblowerCraftingProvider extends CustomRecipeProvider +{ + private static final String GLASSBLOWER = ModJobs.GLASSBLOWER_ID.getPath(); + + public DefaultGlassblowerCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultGlassblowerCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultLumberjackCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultLumberjackCraftingProvider.java new file mode 100644 index 00000000000..07b1133f737 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultLumberjackCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for Lumberjack + */ +public class DefaultLumberjackCraftingProvider extends CustomRecipeProvider +{ + private static final String LUMBERJACK = ModJobs.LUMBERJACK_ID.getPath(); + + public DefaultLumberjackCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultLumberjackCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultMechanicCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultMechanicCraftingProvider.java new file mode 100644 index 00000000000..15f9968e4c6 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultMechanicCraftingProvider.java @@ -0,0 +1,96 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.util.constant.ToolType; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Mechanic + */ +public class DefaultMechanicCraftingProvider extends CustomRecipeProvider +{ + private static final String MECHANIC = ModJobs.MECHANIC_ID.getPath(); + + public DefaultMechanicCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultMechanicCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "gate_wood") + .inputs(List.of(new ItemStorage(new ItemStack(Items.OAK_LOG, 5)))) + .result(new ItemStack(ModItems.woodgate)) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "gate_iron") + .inputs(List.of(new ItemStorage(new ItemStack(Items.IRON_NUGGET, 5)))) + .result(new ItemStack(ModItems.irongate)) + .showTooltip(true) + .build(consumer); + + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "rails") + .inputs(List.of(new ItemStorage(new ItemStack(Items.STICK, 5)), + new ItemStorage(new ItemStack(Items.IRON_INGOT, 2)))) + .result(new ItemStack(Items.RAIL, 16)) + .minBuildingLevel(3) + .build(consumer); + + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "lantern") + .inputs(List.of(new ItemStorage(new ItemStack(Items.IRON_NUGGET, 3)), + new ItemStorage(new ItemStack(Items.GLASS_BOTTLE)), + new ItemStorage(new ItemStack(Items.TORCH)))) + .result(new ItemStack(Items.LANTERN)) + .minBuildingLevel(3) + .build(consumer); + + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "soul_lantern") + .inputs(List.of(new ItemStorage(new ItemStack(Items.IRON_NUGGET, 3)), + new ItemStorage(new ItemStack(Items.GLASS_BOTTLE)), + new ItemStorage(new ItemStack(Items.SOUL_TORCH)))) + .result(new ItemStack(Items.SOUL_LANTERN)) + .minBuildingLevel(3) + .build(consumer); + + deoxidize(consumer, Items.OXIDIZED_COPPER, Items.WEATHERED_COPPER); + deoxidize(consumer, Items.OXIDIZED_CUT_COPPER, Items.WEATHERED_CUT_COPPER); + deoxidize(consumer, Items.WEATHERED_COPPER, Items.EXPOSED_COPPER); + deoxidize(consumer, Items.WEATHERED_CUT_COPPER, Items.EXPOSED_CUT_COPPER); + deoxidize(consumer, Items.EXPOSED_COPPER, Items.COPPER_BLOCK); + deoxidize(consumer, Items.EXPOSED_CUT_COPPER, Items.CUT_COPPER); + } + + private void deoxidize(@NotNull final Consumer consumer, + @NotNull final Item input, + @NotNull final Item output) + { + CustomRecipeBuilder.create(MECHANIC, MODULE_CRAFTING, "deoxidize_" + ForgeRegistries.ITEMS.getKey(input).getPath()) + .inputs(List.of(new ItemStorage(new ItemStack(input)))) + .result(new ItemStack(output)) + .requiredTool(ToolType.AXE) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultNetherWorkerLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultNetherWorkerLootProvider.java new file mode 100644 index 00000000000..ad23c08a9c1 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultNetherWorkerLootProvider.java @@ -0,0 +1,273 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; +import com.minecolonies.coremod.generation.CustomRecipeAndLootTableProvider; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import com.minecolonies.coremod.generation.SimpleLootTableProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.LootTables; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CUSTOM; +import static com.minecolonies.api.util.constant.Constants.MOD_ID; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; + +/** + * Datagen for Nether Worker + */ +public class DefaultNetherWorkerLootProvider extends CustomRecipeAndLootTableProvider +{ + public static final String NETHERWORKER = ModJobs.NETHERWORKER_ID.getPath(); + private static final int MAX_BUILDING_LEVEL = 5; + + private final LootTables lootTableManager; + private final List levels; + + public DefaultNetherWorkerLootProvider(@NotNull final DataGenerator generatorIn, + @NotNull final LootTables lootTableManager) + { + super(generatorIn); + this.lootTableManager = lootTableManager; + + levels = new ArrayList<>(); + + for (int buildingLevel = 1; buildingLevel <= MAX_BUILDING_LEVEL; ++buildingLevel) + { + levels.add(createTripLoot(buildingLevel)); + } + } + + private LootTable.Builder createTripLoot(final int buildingLevel) + { + return new LootTable.Builder() + .withPool(createBlocksPool(buildingLevel)) + .withPool(createMobsPool(buildingLevel)); + } + + @NotNull + private LootPool.Builder createBlocksPool(final int buildingLevel) + { + final LootPool.Builder blocks = new LootPool.Builder() + .name("blocks") + .setRolls(UniformGenerator.between(3, 10)) + .setBonusRolls(UniformGenerator.between(0.3F, 0.3F)); + + blocks.add(LootItem.lootTableItem(Items.NETHERRACK) + .setWeight(20) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 25)))); + + blocks.add(LootItem.lootTableItem(Items.SOUL_SAND) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 7)))); + + blocks.add(LootItem.lootTableItem(Items.SOUL_SOIL) + .setWeight(8) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))); + + blocks.add(LootItem.lootTableItem(Items.GRAVEL) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 10)))); + + blocks.add(LootItem.lootTableItem(Items.NETHER_QUARTZ_ORE) + .setWeight(15) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))); + + if (buildingLevel >= 2) + { + blocks.add(LootItem.lootTableItem(Items.GLOWSTONE) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 4)))); + + blocks.add(LootItem.lootTableItem(Items.NETHER_WART) + .setWeight(3) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); + + blocks.add(LootItem.lootTableItem(Items.BROWN_MUSHROOM) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); + + blocks.add(LootItem.lootTableItem(Items.RED_MUSHROOM) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); + + blocks.add(LootItem.lootTableItem(Items.CRIMSON_NYLIUM) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 1)))); + + blocks.add(LootItem.lootTableItem(Items.CRIMSON_FUNGUS) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0, 1)))); + + blocks.add(LootItem.lootTableItem(Items.CRIMSON_STEM) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); + } + + if (buildingLevel >= 3) + { + blocks.add(LootItem.lootTableItem(Items.BASALT) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); + + blocks.add(LootItem.lootTableItem(Items.WARPED_NYLIUM) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 1)))); + + blocks.add(LootItem.lootTableItem(Items.WARPED_FUNGUS) + .setWeight(10) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0, 1)))); + + blocks.add(LootItem.lootTableItem(Items.WARPED_STEM) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); + + blocks.add(LootItem.lootTableItem(Items.OCHRE_FROGLIGHT) + .setWeight(2)); + + blocks.add(LootItem.lootTableItem(Items.PEARLESCENT_FROGLIGHT) + .setWeight(1)); + + blocks.add(LootItem.lootTableItem(Items.VERDANT_FROGLIGHT) + .setWeight(1)); + } + + if (buildingLevel >= 4) + { + blocks.add(LootItem.lootTableItem(Items.NETHER_GOLD_ORE) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); + + blocks.add(LootItem.lootTableItem(Items.BLACKSTONE) + .setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))); + } + + if (buildingLevel >= 5) + { + blocks.add(LootItem.lootTableItem(Items.ANCIENT_DEBRIS) + .setWeight(1) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))); + } + + return blocks; + } + + @NotNull + private LootPool.Builder createMobsPool(final int buildingLevel) + { + final LootPool.Builder mobs = new LootPool.Builder() + .name("mobs") + .setRolls(UniformGenerator.between(2, 6)) + .setBonusRolls(UniformGenerator.between(0.1F, 0.1F)); + + mobs.add(createAdventureToken(EntityType.ZOMBIFIED_PIGLIN, 5, 5) + .setWeight(5500).setQuality(-10)); + + mobs.add(createAdventureToken(EntityType.MAGMA_CUBE, 3, 4) + .setWeight(300).setQuality(10)); + + mobs.add(createAdventureToken(EntityType.HOGLIN, 3, 5) + .setWeight(500).setQuality(-1)); + + mobs.add(createAdventureToken(EntityType.GHAST, 12, 5) + .setWeight(300).setQuality(-3)); + + mobs.add(createAdventureToken(EntityType.ENDERMAN, 7, 5) + .setWeight(300).setQuality(-3)); + + mobs.add(createAdventureToken(EntityType.BLAZE, 5, 10) + .setWeight(100).setQuality(1)); + + return mobs; + } + + private LootPoolSingletonContainer.Builder createAdventureToken(@NotNull final EntityType mob, final int damage_done, final int xp_gained) + { + final CompoundTag nbt = new CompoundTag(); + nbt.putString(TAG_ENTITY_TYPE, ForgeRegistries.ENTITY_TYPES.getKey(mob).toString()); + nbt.putInt(TAG_DAMAGE, damage_done); + nbt.putInt(TAG_XP_DROPPED, xp_gained); + + final ItemStack stack = new ItemStack(ModItems.adventureToken); + stack.setTag(nbt); + + return SimpleLootTableProvider.itemStack(stack); + } + + @NotNull + @Override + public String getName() + { + return "NetherWorkerLootProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + final List inputs = Arrays.asList( + new ItemStorage(new ItemStack(Items.COBBLESTONE, 64)), + new ItemStorage(new ItemStack(Items.TORCH, 32)), + new ItemStorage(new ItemStack(Items.LADDER, 16)) + ); + + for (int i = 0; i < levels.size(); ++i) + { + final int buildingLevel = i + 1; + + final List drops = LootTableAnalyzer.toDrops(lootTableManager, levels.get(i).build()); + final Stream loot = drops.stream().flatMap(drop -> drop.getItemStacks().stream() + .sorted(Comparator.comparing(ItemStack::getCount).reversed().thenComparing(ItemStack::getDescriptionId)) + .map(ItemStack::getItem)); + + CustomRecipeProvider.CustomRecipeBuilder.create(NETHERWORKER, MODULE_CUSTOM, "trip" + buildingLevel) + .minBuildingLevel(buildingLevel) + .maxBuildingLevel(buildingLevel) + .inputs(inputs) + .secondaryOutputs(loot.map(ItemStack::new).collect(Collectors.toList())) + .lootTable(new ResourceLocation(MOD_ID, "recipes/" + NETHERWORKER + "/trip" + buildingLevel)) + .build(consumer); + } + + // and also a lava bucket recipe for good measure + CustomRecipeProvider.CustomRecipeBuilder.create(NETHERWORKER, MODULE_CUSTOM, "lava") + .inputs(Collections.singletonList(new ItemStorage(new ItemStack(Items.BUCKET)))) + .result(new ItemStack(Items.LAVA_BUCKET)) + .build(consumer); + } + + @Override + protected void registerTables(@NotNull final SimpleLootTableProvider.LootTableRegistrar registrar) + { + for (int i = 0; i < levels.size(); ++i) + { + final int buildingLevel = i + 1; + final LootTable.Builder lootTable = levels.get(i); + + registrar.register(new ResourceLocation(MOD_ID, "recipes/" + NETHERWORKER + "/trip" + buildingLevel), + LootContextParamSets.ALL_PARAMS, lootTable); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultPlanterCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultPlanterCraftingProvider.java new file mode 100644 index 00000000000..aa2726c2bb4 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultPlanterCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for Planter + */ +public class DefaultPlanterCraftingProvider extends CustomRecipeProvider +{ + private static final String PLANTER = ModJobs.PLANTER_ID.getPath(); + + public DefaultPlanterCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultPlanterCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultRecipeLootProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultRecipeLootProvider.java new file mode 100644 index 00000000000..ef6d0ca2569 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultRecipeLootProvider.java @@ -0,0 +1,52 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.coremod.generation.SimpleLootTableProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.EmptyLootItem; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.Constants.MOD_ID; + +/** + * Datagen for generic recipe loot. (This could be done in the individual crafter gens, but they're potentially + * useful across multiple, and there's not very many of them.) + */ +public class DefaultRecipeLootProvider extends SimpleLootTableProvider +{ + public static final ResourceLocation LOOT_TABLE_BOTTLE = new ResourceLocation(MOD_ID, "recipes/glass_bottle"); + public static final ResourceLocation LOOT_TABLE_GRAVEL = new ResourceLocation(MOD_ID, "recipes/gravel"); + + public DefaultRecipeLootProvider(@NotNull final DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultRecipeLootProvider"; + } + + @Override + protected void registerTables(@NotNull final LootTableRegistrar registrar) + { + registrar.register(LOOT_TABLE_BOTTLE, LootContextParamSets.ALL_PARAMS, LootTable.lootTable() + .withPool(LootPool.lootPool() + .name(LOOT_TABLE_BOTTLE.toString()) + .add(EmptyLootItem.emptyItem().setWeight(100).setQuality(-1)) + .add(LootItem.lootTableItem(Items.GLASS_BOTTLE).setWeight(0).setQuality(1)))); + + registrar.register(LOOT_TABLE_GRAVEL, LootContextParamSets.ALL_PARAMS, LootTable.lootTable() + .withPool(LootPool.lootPool() + .name(LOOT_TABLE_GRAVEL.toString()) + .add(EmptyLootItem.emptyItem().setWeight(90)) + .add(LootItem.lootTableItem(Items.FLINT).setWeight(10)))); + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSawmillCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSawmillCraftingProvider.java new file mode 100644 index 00000000000..b264b510b4c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSawmillCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for Sawmill + */ +public class DefaultSawmillCraftingProvider extends CustomRecipeProvider +{ + private static final String SAWMILL = ModJobs.SAWMILL_ID.getPath(); + + public DefaultSawmillCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultSawmillCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSifterCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSifterCraftingProvider.java similarity index 79% rename from src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSifterCraftingProvider.java rename to src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSifterCraftingProvider.java index 5518cd3e23e..b183e150756 100644 --- a/src/main/java/com/minecolonies/coremod/generation/defaults/DefaultSifterCraftingProvider.java +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultSifterCraftingProvider.java @@ -1,21 +1,20 @@ -package com.minecolonies.coremod.generation.defaults; +package com.minecolonies.coremod.generation.defaults.workers; import com.minecolonies.api.colony.jobs.ModJobs; -import com.minecolonies.api.colony.requestsystem.requestable.Food; import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.research.util.ResearchConstants; import com.minecolonies.coremod.colony.crafting.LootTableAnalyzer; +import com.minecolonies.coremod.generation.CustomRecipeAndLootTableProvider; import com.minecolonies.coremod.generation.CustomRecipeProvider; import com.minecolonies.coremod.generation.SimpleLootTableProvider; -import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.data.HashCache; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.LootTables; @@ -26,29 +25,30 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CUSTOM; import static com.minecolonies.api.util.constant.Constants.MOD_ID; -import com.minecolonies.coremod.generation.CustomRecipeProvider.CustomRecipeBuilder; -import com.minecolonies.coremod.generation.SimpleLootTableProvider.LootTableRegistrar; - -public class DefaultSifterCraftingProvider implements DataProvider +/** + * Datagen for Sifter + */ +public class DefaultSifterCraftingProvider extends CustomRecipeAndLootTableProvider { - private final SifterRecipeProvider recipeProvider; - private final SifterLootTableProvider lootTableProvider; + public static final String SIFTER = ModJobs.SIFTER_ID.getPath(); private final Map> inputs = new HashMap<>(); + private final LootTables lootTableManager; public DefaultSifterCraftingProvider(@NotNull final DataGenerator generatorIn, @NotNull final LootTables lootTableManager) { + super(generatorIn); + this.lootTableManager = lootTableManager; + inputs.put(Items.DIRT, Arrays.asList( new SifterMeshDetails(ModItems.sifterMeshString, 1, LootTable.lootTable() .withPool(LootPool.lootPool() @@ -236,9 +236,6 @@ public DefaultSifterCraftingProvider(@NotNull final DataGenerator generatorIn, )) )); - - recipeProvider = new SifterRecipeProvider(generatorIn, lootTableManager); - lootTableProvider = new SifterLootTableProvider(generatorIn); } @NotNull @@ -248,13 +245,6 @@ public String getName() return "SifterCraftingProvider"; } - @Override - public void run(@NotNull final CachedOutput cache) throws IOException - { - recipeProvider.run(cache); - lootTableProvider.run(cache); - } - private static class SifterMeshDetails { private final String name; @@ -282,78 +272,66 @@ public SifterMeshDetails(@NotNull final Item mesh, final int minBuildingLevel, @ public LootTable.Builder getLootTable() { return lootTable; } } - private class SifterRecipeProvider extends CustomRecipeProvider + @Override + protected void registerRecipes(@NotNull final Consumer consumer) { - private final LootTables lootTableManager; - - public SifterRecipeProvider(@NotNull final DataGenerator generatorIn, - @NotNull final LootTables lootTableManager) - { - super(generatorIn); - - this.lootTableManager = lootTableManager; - } - - @NotNull - @Override - public String getName() + for (final Map.Entry> inputEntry : inputs.entrySet()) { - return "SifterRecipeProvider"; - } - - @Override - protected void registerRecipes(@NotNull final Consumer consumer) - { - for (final Map.Entry> inputEntry : inputs.entrySet()) + for (final SifterMeshDetails mesh : inputEntry.getValue()) { - for (final SifterMeshDetails mesh : inputEntry.getValue()) - { - final String name = mesh.getName() + "/" + ForgeRegistries.ITEMS.getKey(inputEntry.getKey()).getPath(); - - final List drops = LootTableAnalyzer.toDrops(lootTableManager, mesh.getLootTable().build()); - final Stream loot = drops.stream().flatMap(drop -> drop.getItemStacks().stream().map(ItemStack::getItem)); - - CustomRecipeBuilder.create(ModJobs.SIFTER_ID.getPath() + "_custom", name) - .inputs(Stream.of( - new ItemStorage(new ItemStack(inputEntry.getKey())), - new ItemStorage(new ItemStack(mesh.getMesh()), true, false)) - .collect(Collectors.toList())) - .secondaryOutputs(Stream.concat(Stream.of(mesh.getMesh()), loot) - .map(ItemStack::new) - .collect(Collectors.toList())) - .lootTable(new ResourceLocation(MOD_ID, "recipes/" + name)) - .minBuildingLevel(mesh.getMinBuildingLevel()) - .build(consumer); - } + final String name = mesh.getName() + "/" + ForgeRegistries.ITEMS.getKey(inputEntry.getKey()).getPath(); + + final List drops = LootTableAnalyzer.toDrops(lootTableManager, mesh.getLootTable().build()); + final Stream loot = drops.stream().flatMap(drop -> drop.getItemStacks().stream() + .sorted(Comparator.comparing(ItemStack::getCount).reversed().thenComparing(ItemStack::getDescriptionId)) + .map(ItemStack::getItem)); + + CustomRecipeProvider.CustomRecipeBuilder.create(SIFTER, MODULE_CUSTOM, name) + .inputs(Stream.of( + new ItemStorage(new ItemStack(inputEntry.getKey())), + new ItemStorage(new ItemStack(mesh.getMesh()), true, false)) + .collect(Collectors.toList())) + .secondaryOutputs(Stream.concat(Stream.of(mesh.getMesh()), loot) + .map(ItemStack::new) + .collect(Collectors.toList())) + .lootTable(new ResourceLocation(MOD_ID, "recipes/" + name)) + .minBuildingLevel(mesh.getMinBuildingLevel()) + .build(consumer); } } + + // also mesh recipes for everyone else + mesh(consumer, ModJobs.FLETCHER_ID, Items.STRING, ModItems.sifterMeshString, ResearchConstants.SIFTER_STRING); + mesh(consumer, ModJobs.STONEMASON_ID, Items.FLINT, ModItems.sifterMeshFlint, ResearchConstants.SIFTER_FLINT); + mesh(consumer, ModJobs.BLACKSMITH_ID, Items.IRON_INGOT, ModItems.sifterMeshIron, ResearchConstants.SIFTER_IRON); + mesh(consumer, ModJobs.MECHANIC_ID, Items.DIAMOND, ModItems.sifterMeshDiamond, ResearchConstants.SIFTER_DIAMOND); } - private class SifterLootTableProvider extends SimpleLootTableProvider + private void mesh(@NotNull final Consumer consumer, + @NotNull final ResourceLocation job, + @NotNull final ItemLike input, + @NotNull final ItemLike output, + @NotNull final ResourceLocation research) { - public SifterLootTableProvider(@NotNull final DataGenerator dataGeneratorIn) - { - super(dataGeneratorIn); - } - - @NotNull - @Override - public String getName() - { - return "SifterLootTableProvider"; - } + CustomRecipeProvider.CustomRecipeBuilder.create(job.getPath(), MODULE_CRAFTING, + ForgeRegistries.ITEMS.getKey(output.asItem()).getPath()) + .inputs(List.of(new ItemStorage(new ItemStack(input)))) + .result(new ItemStack(output)) + .minResearchId(research) + .showTooltip(true) + .build(consumer); + } - @Override - protected void registerTables(@NotNull final LootTableRegistrar registrar) + @Override + protected void registerTables(@NotNull final SimpleLootTableProvider.LootTableRegistrar registrar) + { + for (final Map.Entry> inputEntry : inputs.entrySet()) { - for (final Map.Entry> inputEntry : inputs.entrySet()) + for (final SifterMeshDetails mesh : inputEntry.getValue()) { - for (final SifterMeshDetails mesh : inputEntry.getValue()) - { - final String name = mesh.getName() + "/" + ForgeRegistries.ITEMS.getKey(inputEntry.getKey()).getPath(); + final String name = mesh.getName() + "/" + ForgeRegistries.ITEMS.getKey(inputEntry.getKey()).getPath(); - registrar.register(new ResourceLocation(MOD_ID, "recipes/" + name), LootContextParamSets.ALL_PARAMS, mesh.getLootTable()); - } + registrar.register(new ResourceLocation(MOD_ID, "recipes/" + name), LootContextParamSets.ALL_PARAMS, mesh.getLootTable()); } } } diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStoneSmelteryCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStoneSmelteryCraftingProvider.java new file mode 100644 index 00000000000..6a1572b160a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStoneSmelteryCraftingProvider.java @@ -0,0 +1,34 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +/** + * Datagen for StoneSmeltery + */ +public class DefaultStoneSmelteryCraftingProvider extends CustomRecipeProvider +{ + private static final String STONE_SMELTERY = ModJobs.STONE_SMELTERY_ID.getPath(); + + public DefaultStoneSmelteryCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultStoneSmelteryCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + } +} diff --git a/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStonemasonCraftingProvider.java b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStonemasonCraftingProvider.java new file mode 100644 index 00000000000..91b35e142f8 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/generation/defaults/workers/DefaultStonemasonCraftingProvider.java @@ -0,0 +1,66 @@ +package com.minecolonies.coremod.generation.defaults.workers; + +import com.minecolonies.api.colony.jobs.ModJobs; +import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.research.util.ResearchConstants; +import com.minecolonies.coremod.generation.CustomRecipeProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.function.Consumer; + +import static com.minecolonies.api.util.constant.BuildingConstants.MODULE_CRAFTING; + +/** + * Datagen for Stonemason + */ +public class DefaultStonemasonCraftingProvider extends CustomRecipeProvider +{ + private static final String STONEMASON = ModJobs.STONEMASON_ID.getPath(); + + public DefaultStonemasonCraftingProvider(DataGenerator generatorIn) + { + super(generatorIn); + } + + @NotNull + @Override + public String getName() + { + return "DefaultStonemasonCraftingProvider"; + } + + @Override + protected void registerRecipes(@NotNull final Consumer consumer) + { + convert(consumer, Items.COBBLESTONE, Items.SAND, Items.SANDSTONE); + convert(consumer, Items.COBBLESTONE, Items.RED_SAND, Items.RED_SANDSTONE); + convert(consumer, Items.COBBLESTONE, Items.PRISMARINE_SHARD, Items.PRISMARINE); + convert(consumer, Items.STONE_BRICKS, Items.PRISMARINE_SHARD, Items.PRISMARINE_BRICKS); + + CustomRecipeBuilder.create(STONEMASON, MODULE_CRAFTING, "end_stone") + .inputs(List.of(new ItemStorage(new ItemStack(Items.SANDSTONE, 8)), + new ItemStorage(new ItemStack(Items.ENDER_PEARL)))) + .result(new ItemStack(Items.END_STONE, 8)) + .minResearchId(ResearchConstants.THE_END) + .build(consumer); + } + + private void convert(@NotNull final Consumer consumer, + @NotNull final ItemLike input1, + @NotNull final ItemLike input2, + @NotNull final ItemLike output) + { + CustomRecipeBuilder.create(STONEMASON, MODULE_CRAFTING, + ForgeRegistries.ITEMS.getKey(output.asItem()).getPath()) + .inputs(List.of(new ItemStorage(new ItemStack(input1)), new ItemStorage(new ItemStack(input2)))) + .result(new ItemStack(output)) + .build(consumer); + } +} diff --git a/src/main/java/com/minecolonies/coremod/items/ItemAdventureToken.java b/src/main/java/com/minecolonies/coremod/items/ItemAdventureToken.java index 13c91a41da1..5efbcea0dff 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemAdventureToken.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemAdventureToken.java @@ -1,13 +1,9 @@ package com.minecolonies.coremod.items; -import com.minecolonies.api.creativetab.ModCreativeTabs; -import com.minecolonies.api.util.constant.TranslationConstants; - import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; -import net.minecraft.network.chat.Component; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -17,14 +13,10 @@ import java.util.List; -import java.util.List; - import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ENTITY_TYPE; import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ADVENTURE_TOKEN_NAME_GUI; import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_COREMOD_ADVENTURE_TOKEN_TOOLTIP_GUI; -import net.minecraft.world.item.Item.Properties; - public class ItemAdventureToken extends AbstractItemMinecolonies { /** @@ -33,7 +25,7 @@ public class ItemAdventureToken extends AbstractItemMinecolonies */ public ItemAdventureToken(Properties properties) { - super("adventure_token", properties.tab(ModCreativeTabs.MINECOLONIES)); + super("adventure_token", properties); } @Override diff --git a/src/main/java/com/minecolonies/coremod/items/ItemBannerRallyGuards.java b/src/main/java/com/minecolonies/coremod/items/ItemBannerRallyGuards.java index 0ec5d2fbde6..878cdd661c7 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemBannerRallyGuards.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemBannerRallyGuards.java @@ -131,6 +131,7 @@ else if (context.getLevel().getBlockState(context.getClickedPos()).getBlock().eq MessageUtils.format(TOOL_RALLY_BANNER_NEEDS_RESEARCH).sendTo(context.getPlayer()); return InteractionResult.FAIL; } + compound.putBoolean(TAG_IS_ACTIVE, true); final int numGuards = broadcastPlayerToRally(banner, context.getPlayer().getCommandSenderWorld(), new StaticLocation(context.getClickedPos(), context.getLevel().dimension())); diff --git a/src/main/java/com/minecolonies/coremod/items/ItemBuildGoggles.java b/src/main/java/com/minecolonies/coremod/items/ItemBuildGoggles.java index de0d3ffa5bc..12be73a1522 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemBuildGoggles.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemBuildGoggles.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.items; +import com.minecolonies.coremod.client.render.worldevent.ColonyBlueprintRenderer; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; @@ -44,5 +45,9 @@ public void appendHoverText(@NotNull final ItemStack stack, Component.translatable("item.minecolonies.build_goggles.lore") .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)) .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); + + components.add(Component.translatable(ColonyBlueprintRenderer.willRenderBlueprints() + ? "item.minecolonies.build_goggles.enabled" : "item.minecolonies.build_goggles.disabled") + .withStyle(ChatFormatting.GRAY)); } } diff --git a/src/main/java/com/minecolonies/coremod/items/ItemClipboard.java b/src/main/java/com/minecolonies/coremod/items/ItemClipboard.java index b10ae637969..28fd873c954 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemClipboard.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemClipboard.java @@ -3,22 +3,21 @@ import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.creativetab.ModCreativeTabs; -import com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.constant.TranslationConstants; import com.minecolonies.coremod.MineColonies; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionHand; -import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; import static com.minecolonies.api.util.constant.Constants.STACKSIZE; @@ -32,7 +31,7 @@ public class ItemClipboard extends AbstractItemMinecolonies /** * Tag of the colony. */ - private static final String TAG_COLONY = "colony"; + public static final String TAG_COLONY = "colony"; /** * Sets the name, creative tab, and registers the Clipboard item. @@ -53,12 +52,12 @@ public InteractionResult useOn(final UseOnContext ctx) final CompoundTag compound = checkForCompound(clipboard); final BlockEntity entity = ctx.getLevel().getBlockEntity(ctx.getClickedPos()); - if (entity instanceof TileEntityColonyBuilding) + if (entity instanceof TileEntityColonyBuilding buildingEntity) { - compound.putInt(TAG_COLONY, ((AbstractTileEntityColonyBuilding) entity).getColonyId()); + compound.putInt(TAG_COLONY, buildingEntity.getColonyId()); if (!ctx.getLevel().isClientSide) { - MessageUtils.format(COM_MINECOLONIES_CLIPBOARD_COLONY_SET, ((TileEntityColonyBuilding) entity).getColony().getName()).sendTo(ctx.getPlayer()); + MessageUtils.format(COM_MINECOLONIES_CLIPBOARD_COLONY_SET, buildingEntity.getColony().getName()).sendTo(ctx.getPlayer()); } } else if (ctx.getLevel().isClientSide) @@ -114,7 +113,7 @@ private static CompoundTag checkForCompound(final ItemStack clipboard) */ private static void openWindow(CompoundTag compound, Level world, Player player) { - if (compound.getAllKeys().contains(TAG_COLONY)) + if (compound.contains(TAG_COLONY)) { final IColonyView colonyView = IColonyManager.getInstance().getColonyView(compound.getInt(TAG_COLONY), world.dimension()); if (colonyView != null) MineColonies.proxy.openClipboardWindow(colonyView); diff --git a/src/main/java/com/minecolonies/coremod/items/ItemCompost.java b/src/main/java/com/minecolonies/coremod/items/ItemCompost.java index 884f62385e4..bf27605cb3f 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemCompost.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemCompost.java @@ -2,17 +2,12 @@ import com.minecolonies.api.creativetab.ModCreativeTabs; import com.minecolonies.api.util.constant.Constants; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.InteractionResult; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.InteractionResult; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.event.ForgeEventFactory; + +import static net.minecraft.world.item.BoneMealItem.applyBonemeal; /** * Class used to handle the compost item. @@ -43,36 +38,6 @@ public InteractionResult useOn(final UseOnContext ctx) } return InteractionResult.FAIL; } - - public static boolean applyBonemeal(final ItemStack stack, final Level worldIn, final BlockPos target, final Player player) - { - final BlockState BlockState = worldIn.getBlockState(target); - final int hook = ForgeEventFactory.onApplyBonemeal(player, worldIn, target, BlockState, stack); - if (hook != 0) - { - return hook > 0; - } - else - { - if (BlockState.getBlock() instanceof BonemealableBlock) - { - final BonemealableBlock igrowable = (BonemealableBlock) BlockState.getBlock(); - if (igrowable.isValidBonemealTarget(worldIn, target, BlockState, worldIn.isClientSide)) - { - if (!worldIn.isClientSide) - { - if (igrowable.isBonemealSuccess(worldIn, worldIn.random, target, BlockState)) - { - igrowable.performBonemeal((ServerLevel) worldIn, worldIn.random, target, BlockState); - } - stack.shrink(1); - } - return true; - } - } - return false; - } - } } diff --git a/src/main/java/com/minecolonies/coremod/items/ItemQuestLog.java b/src/main/java/com/minecolonies/coremod/items/ItemQuestLog.java new file mode 100644 index 00000000000..10694e11a4b --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/items/ItemQuestLog.java @@ -0,0 +1,135 @@ +package com.minecolonies.coremod.items; + +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.creativetab.ModCreativeTabs; +import com.minecolonies.api.tileentities.TileEntityColonyBuilding; +import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.api.util.constant.TranslationConstants; +import com.minecolonies.coremod.client.gui.questlog.WindowQuestLog; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.NotNull; + +import static com.minecolonies.api.util.constant.Constants.STACKSIZE; +import static com.minecolonies.api.util.constant.TranslationConstants.COM_MINECOLONIES_QUEST_LOG_COLONY_SET; + +/** + * Class describing the quest log item. + */ +public class ItemQuestLog extends AbstractItemMinecolonies +{ + /** + * Tag of the colony. + */ + public static final String TAG_COLONY = "colony"; + + /** + * Sets the name, creative tab, and registers the quest log item. + * + * @param properties the properties. + */ + public ItemQuestLog(final Item.Properties properties) + { + super("questlog", properties.stacksTo(STACKSIZE).tab(ModCreativeTabs.MINECOLONIES)); + } + + @Override + @NotNull + public InteractionResult useOn(final UseOnContext ctx) + { + final ItemStack questLog = ctx.getPlayer().getItemInHand(ctx.getHand()); + + final CompoundTag compound = checkForCompound(questLog); + final BlockEntity entity = ctx.getLevel().getBlockEntity(ctx.getClickedPos()); + + if (entity instanceof TileEntityColonyBuilding buildingEntity) + { + compound.putInt(TAG_COLONY, buildingEntity.getColonyId()); + if (!ctx.getLevel().isClientSide) + { + MessageUtils.format(COM_MINECOLONIES_QUEST_LOG_COLONY_SET, buildingEntity.getColony().getName()).sendTo(ctx.getPlayer()); + } + } + else if (ctx.getLevel().isClientSide) + { + openWindow(compound, ctx.getLevel(), ctx.getPlayer()); + } + + return InteractionResult.SUCCESS; + } + + /** + * Handles mid air use. + * + * @param worldIn the world + * @param playerIn the player + * @param hand the hand + * @return the result + */ + @Override + @NotNull + public InteractionResultHolder use( + final Level worldIn, + final Player playerIn, + final InteractionHand hand) + { + final ItemStack questLog = playerIn.getItemInHand(hand); + + if (!worldIn.isClientSide) + { + return new InteractionResultHolder<>(InteractionResult.SUCCESS, questLog); + } + + openWindow(checkForCompound(questLog), worldIn, playerIn); + + return new InteractionResultHolder<>(InteractionResult.SUCCESS, questLog); + } + + /** + * Check for the compound and return it. If not available create and return it. + * + * @param questLog the quest log item to check for. + * @return the compound of the quest log. + */ + private static CompoundTag checkForCompound(final ItemStack questLog) + { + if (!questLog.hasTag()) + { + questLog.setTag(new CompoundTag()); + } + return questLog.getTag(); + } + + /** + * Opens the quest log window if there is a valid colony linked + * + * @param compound the item compound + * @param player the player entity opening the window + */ + private static void openWindow(CompoundTag compound, Level world, Player player) + { + if (compound.contains(TAG_COLONY)) + { + final IColonyView colonyView = IColonyManager.getInstance().getColonyView(compound.getInt(TAG_COLONY), world.dimension()); + if (colonyView != null) + { + new WindowQuestLog(colonyView).open(); + } + } + else + { + player.displayClientMessage(Component.translatable(TranslationConstants.COM_MINECOLONIES_QUEST_LOG_NEED_COLONY), true); + } + } +} + diff --git a/src/main/java/com/minecolonies/coremod/items/ItemResourceScroll.java b/src/main/java/com/minecolonies/coremod/items/ItemResourceScroll.java index 81212828f18..d4d0e0952ac 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemResourceScroll.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemResourceScroll.java @@ -188,7 +188,7 @@ private static CompoundTag checkForCompound(final ItemStack item) */ private static void openWindow(CompoundTag compound, Player player, BlockPos warehousePos) { - if (compound.getAllKeys().contains(TAG_COLONY_ID) && compound.getAllKeys().contains(TAG_BUILDER)) + if (compound.contains(TAG_COLONY_ID) && compound.contains(TAG_BUILDER)) { final int colonyId = compound.getInt(TAG_COLONY_ID); final BlockPos builderPos = BlockPosUtil.read(compound, TAG_BUILDER); diff --git a/src/main/java/com/minecolonies/coremod/items/ItemScanAnalyzer.java b/src/main/java/com/minecolonies/coremod/items/ItemScanAnalyzer.java new file mode 100644 index 00000000000..329d86952c2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/items/ItemScanAnalyzer.java @@ -0,0 +1,219 @@ +package com.minecolonies.coremod.items; + +import com.ldtteam.structurize.Structurize; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.blueprints.v1.BlueprintUtil; +import com.ldtteam.structurize.items.AbstractItemWithPosSelector; +import com.ldtteam.structurize.storage.rendering.RenderingCache; +import com.ldtteam.structurize.storage.rendering.types.BoxPreviewData; +import com.minecolonies.api.items.ModItems; +import com.minecolonies.coremod.client.gui.WindowSchematicAnalyzer; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +import static com.ldtteam.structurize.api.util.constant.NbtTagConstants.FIRST_POS_STRING; +import static com.ldtteam.structurize.api.util.constant.NbtTagConstants.SECOND_POS_STRING; +import static com.ldtteam.structurize.api.util.constant.TranslationConstants.MAX_SCHEMATIC_SIZE_REACHED; + +/** + * Item used to analyze schematics or selected blocks + */ +public class ItemScanAnalyzer extends AbstractItemWithPosSelector +{ + /** + * NBT constants + */ + public static String TEMP_SCAN = "selection.blueprint"; + public static String LAST_TIME = "lastworldtime"; + + /** + * Time after which the selection is ignored + */ + private static final int TIMEOUT_DELAY = 20 * 60 * 2; + + /** + * Client side selection caching + */ + private static BlockPos lastPos = BlockPos.ZERO; + private static BlockPos lastPos2 = BlockPos.ZERO; + public static Blueprint blueprint = null; + + /** + * Creates default scan tool item. + * + * @param tab creative tab + */ + public ItemScanAnalyzer( + @NotNull final String name, + @NotNull final CreativeModeTab tab, + final Item.Properties properties) + { + super(properties.durability(0).setNoRepair().rarity(Rarity.UNCOMMON).tab(tab)); + } + + /** + * MC constructor. + * + * @param properties properties + */ + public ItemScanAnalyzer(final Properties properties) + { + super(properties); + } + + /** + * Structurize: Prevent block breaking server side. + * {@inheritDoc} + */ + @Override + public boolean canAttackBlock(final BlockState state, final Level worldIn, final BlockPos pos, final Player player) + { + checkTimeout(player.getMainHandItem(), worldIn); + boolean result = super.canAttackBlock(state, worldIn, pos, player); + openAreaBox(player.getMainHandItem()); + return result; + } + + @Override + public InteractionResult useOn(final UseOnContext context) + { + checkTimeout(context.getItemInHand(), context.getLevel()); + InteractionResult result = super.useOn(context); + openAreaBox(context.getItemInHand()); + return result; + } + + @Override + public InteractionResultHolder use(final Level worldIn, final Player playerIn, final InteractionHand handIn) + { + checkTimeout(playerIn.getItemInHand(handIn), worldIn); + + final ItemStack itemstack = playerIn.getItemInHand(handIn); + final CompoundTag compound = itemstack.getOrCreateTag(); + + BlockPos firstPos = null; + if (compound.contains(FIRST_POS_STRING)) + { + firstPos = NbtUtils.readBlockPos(compound.getCompound(FIRST_POS_STRING)); + } + + BlockPos secondPos = null; + if (compound.contains(SECOND_POS_STRING)) + { + secondPos = NbtUtils.readBlockPos(compound.getCompound(SECOND_POS_STRING)); + } + + return new InteractionResultHolder<>( + onAirRightClick( + firstPos, + secondPos, + worldIn, + playerIn, + itemstack), + itemstack); + } + + @Override + public InteractionResult onAirRightClick(final BlockPos start, final BlockPos end, final Level worldIn, final Player playerIn, final ItemStack itemStack) + { + if (worldIn.isClientSide) + { + if (start != null && end != null && (!lastPos.equals(start) || !lastPos2.equals(end))) + { + lastPos = start; + lastPos2 = end; + + blueprint = saveStructure(worldIn, playerIn, new AABB(getBounds(itemStack).getA(), getBounds(itemStack).getB())); + } + + final WindowSchematicAnalyzer window = new WindowSchematicAnalyzer(); + window.open(); + } + return InteractionResult.SUCCESS; + } + + @Override + public AbstractItemWithPosSelector getRegisteredItemInstance() + { + return (AbstractItemWithPosSelector) ModItems.scanAnalyzer; + } + + /** + * Opens an area selection for the selected positions + * + * @param tool + */ + private void openAreaBox(final ItemStack tool) + { + final CompoundTag tag = tool.getOrCreateTag(); + if (tag.contains(FIRST_POS_STRING) && tag.contains(SECOND_POS_STRING)) + { + final BlockPos start = NbtUtils.readBlockPos(tag.getCompound(FIRST_POS_STRING)); + final BlockPos end = NbtUtils.readBlockPos(tag.getCompound(SECOND_POS_STRING)); + RenderingCache.queue("analyzer", + new BoxPreviewData(start, end, Optional.empty())); + } + } + + /** + * Checks the selection timeout + */ + protected void checkTimeout(final ItemStack stack, final Level level) + { + if (stack == null || level == null) + { + return; + } + + if (stack.getOrCreateTag().contains(LAST_TIME)) + { + final long prevTime = stack.getOrCreateTag().getLong(LAST_TIME); + if ((level.getGameTime() - prevTime) > TIMEOUT_DELAY) + { + stack.getOrCreateTag().remove(FIRST_POS_STRING); + stack.getOrCreateTag().remove(SECOND_POS_STRING); + } + } + + stack.getOrCreateTag().putLong(LAST_TIME, level.getGameTime()); + } + + /** + * Scan the structure and save it as blueprint + * + * @param world Current world. + * @param player causing this action. + */ + public static Blueprint saveStructure(final Level world, final Player player, AABB box) + { + if (box.getXsize() * box.getYsize() * box.getZsize() > Structurize.getConfig().getServer().schematicBlockLimit.get()) + { + player.displayClientMessage(Component.translatable(MAX_SCHEMATIC_SIZE_REACHED, Structurize.getConfig().getServer().schematicBlockLimit.get()), false); + return null; + } + + final String fileName = TEMP_SCAN; + final BlockPos zero = new BlockPos(box.minX, box.minY, box.minZ); + final Blueprint bp = + BlueprintUtil.createBlueprint(world, zero, false, (short) (box.getXsize() + 1), (short) (box.getYsize() + 1), (short) (box.getZsize() + 1), fileName, Optional.empty()); + + return bp; + } +} diff --git a/src/main/java/com/minecolonies/coremod/items/ItemScepterBeekeeper.java b/src/main/java/com/minecolonies/coremod/items/ItemScepterBeekeeper.java index b1461cfe39d..cfa1ffd3502 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemScepterBeekeeper.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemScepterBeekeeper.java @@ -2,34 +2,45 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.items.IBlockOverlayItem; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.SoundUtils; +import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingBeekeeper; -import net.minecraft.world.level.block.BeehiveBlock; -import net.minecraft.world.entity.player.Player; +import com.minecolonies.coremod.network.messages.client.colony.ColonyViewBuildingViewMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionResult; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BeehiveBlock; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ID; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS; import static com.minecolonies.api.util.constant.translation.ToolTranslationConstants.*; -import net.minecraft.world.item.Item.Properties; - /** * Beekeeper Scepter Item class. Used to give tasks to Beekeeper. */ -public class ItemScepterBeekeeper extends AbstractItemMinecolonies +public class ItemScepterBeekeeper extends AbstractItemMinecolonies implements IBlockOverlayItem { + private static final int RED_OVERLAY = 0xFFFF0000; + private static final int YELLOW_OVERLAY = 0xFFFFFF00; + /** * BeekeeperScepter constructor. Sets max stack to 1, like other tools. * @@ -70,6 +81,7 @@ public InteractionResult useOn(final UseOnContext useContext) MessageUtils.format(TOOL_BEEHIVE_SCEPTER_REMOVE_HIVE).sendTo(useContext.getPlayer()); building.removeHive(pos); SoundUtils.playSoundForPlayer((ServerPlayer) player, SoundEvents.NOTE_BLOCK_BELL, (float) SoundUtils.VOLUME * 2, 0.5f); + Network.getNetwork().sendToPlayer(new ColonyViewBuildingViewMessage(building), (ServerPlayer) player); } else { @@ -78,6 +90,7 @@ public InteractionResult useOn(final UseOnContext useContext) MessageUtils.format(TOOL_BEEHIVE_SCEPTER_ADD_HIVE).sendTo(useContext.getPlayer()); building.addHive(pos); SoundUtils.playSuccessSound(player, player.blockPosition()); + Network.getNetwork().sendToPlayer(new ColonyViewBuildingViewMessage(building), (ServerPlayer) player); } if (positions.size() >= building.getMaximumHives()) { @@ -93,4 +106,29 @@ public InteractionResult useOn(final UseOnContext useContext) return super.useOn(useContext); } + + @NotNull + @Override + public List getOverlayBoxes(@NotNull final Level world, @NotNull final Player player, @NotNull ItemStack stack) + { + final CompoundTag compound = stack.getOrCreateTag(); + final IColonyView colony = IColonyManager.getInstance().getColonyView(compound.getInt(TAG_ID), world.dimension()); + final BlockPos pos = BlockPosUtil.read(compound, TAG_POS); + + if (colony != null && colony.getBuilding(pos) instanceof final BuildingBeekeeper.View hut) + { + final List overlays = new ArrayList<>(); + + overlays.add(new OverlayBox(new AABB(pos), RED_OVERLAY, 0.02f, true)); + + for (final BlockPos hive : hut.getHives()) + { + overlays.add(new OverlayBox(new AABB(hive), YELLOW_OVERLAY, 0.04f, true)); + } + + return overlays; + } + + return Collections.emptyList(); + } } diff --git a/src/main/java/com/minecolonies/coremod/items/ItemScepterGuard.java b/src/main/java/com/minecolonies/coremod/items/ItemScepterGuard.java index b0eec51ddff..02166e32813 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemScepterGuard.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemScepterGuard.java @@ -59,7 +59,7 @@ public InteractionResult useOn(final UseOnContext ctx) } final CompoundTag compound = scepter.getTag(); - if (compound.getAllKeys().contains(TAG_LAST_POS)) + if (compound.contains(TAG_LAST_POS)) { final BlockPos lastPos = BlockPosUtil.read(compound, TAG_LAST_POS); if (lastPos.equals(ctx.getClickedPos())) @@ -84,7 +84,7 @@ public InteractionResult useOn(final UseOnContext ctx) @NotNull private static InteractionResult handleItemUsage(final Level worldIn, final BlockPos pos, final CompoundTag compound, final Player playerIn) { - if (!compound.getAllKeys().contains(TAG_ID)) + if (!compound.contains(TAG_ID)) { return InteractionResult.FAIL; } @@ -110,18 +110,18 @@ private static InteractionResult handleItemUsage(final Level worldIn, final Bloc if (hut.getSetting(AbstractBuildingGuards.GUARD_TASK).getValue().equals(GuardTaskSetting.GUARD)) { - MessageUtils.format(TOOL_GUARD_SCEPTER_ADD_GUARD_TARGET, pos).sendTo(playerIn); + MessageUtils.format(TOOL_GUARD_SCEPTER_ADD_GUARD_TARGET, pos.toShortString()).sendTo(playerIn); tower.setGuardPos(pos); playerIn.getInventory().removeItemNoUpdate(playerIn.getInventory().selected); } else { - if (!compound.getAllKeys().contains(TAG_LAST_POS)) + if (!compound.contains(TAG_LAST_POS)) { tower.resetPatrolTargets(); } tower.addPatrolTargets(pos); - MessageUtils.format(TOOL_GUARD_SCEPTER_ADD_PATROL_TARGET, pos).sendTo(playerIn); + MessageUtils.format(TOOL_GUARD_SCEPTER_ADD_PATROL_TARGET, pos.toShortString()).sendTo(playerIn); } BlockPosUtil.write(compound, TAG_LAST_POS, pos); diff --git a/src/main/java/com/minecolonies/coremod/items/ItemScepterLumberjack.java b/src/main/java/com/minecolonies/coremod/items/ItemScepterLumberjack.java index 46e5dcbefa1..46caf37e66a 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemScepterLumberjack.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemScepterLumberjack.java @@ -2,32 +2,41 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.items.IBlockOverlayItem; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.MessageUtils; +import com.minecolonies.api.util.Tuple; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingLumberjack; import com.minecolonies.coremod.entity.ai.citizen.lumberjack.EntityAIWorkLumberjack; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionResult; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ID; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS; import static com.minecolonies.api.util.constant.translation.ToolTranslationConstants.*; -import net.minecraft.world.item.Item.Properties; - /** * Lumberjack Scepter Item class. Used to give tasks to Lumberjacks. */ -public class ItemScepterLumberjack extends AbstractItemMinecolonies +public class ItemScepterLumberjack extends AbstractItemMinecolonies implements IBlockOverlayItem { + private static final int RED_OVERLAY = 0xFFFF0000; + private static final int GREEN_OVERLAY = 0xFF00FF00; private static final String NBT_START_POS = Constants.MOD_ID + ":" + "start_pos"; private static final String NBT_END_POS = Constants.MOD_ID + ":" + "end_pos"; @@ -52,10 +61,8 @@ public InteractionResult useOn(final UseOnContext context) final ItemStack scepter = context.getPlayer().getItemInHand(context.getHand()); MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_POSITION_B_SET).sendTo(context.getPlayer()); - if (setPosition(scepter.getOrCreateTag(), NBT_START_POS, context.getClickedPos(), context.getPlayer())) - { - storeRestrictedArea(context.getPlayer(), scepter.getOrCreateTag(), context.getLevel()); - } + BlockPosUtil.write(scepter.getOrCreateTag(), NBT_START_POS, context.getClickedPos()); + storeRestrictedArea(context.getPlayer(), scepter.getOrCreateTag(), context.getLevel()); return InteractionResult.FAIL; } @@ -66,10 +73,8 @@ public boolean canAttackBlock(@NotNull final BlockState state, @NotNull final Le { final ItemStack tool = player.getMainHandItem(); MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_POSITION_A_SET).sendTo(player); - if (setPosition(tool.getOrCreateTag(), NBT_END_POS, pos, player)) - { - storeRestrictedArea(player, tool.getOrCreateTag(), world); - } + BlockPosUtil.write(tool.getOrCreateTag(), NBT_END_POS, pos); + storeRestrictedArea(player, tool.getOrCreateTag(), world); } return false; @@ -81,60 +86,118 @@ public float getDestroySpeed(ItemStack stack, BlockState state) { private void storeRestrictedArea(final Player player, final CompoundTag compound, final Level worldIn) { - final BlockPos startRestriction = BlockPosUtil.read(compound, NBT_START_POS); - final BlockPos endRestriction = BlockPosUtil.read(compound, NBT_END_POS); + final Box box = getBox(worldIn, compound); + + if (box.anchor() == null || box.corners() == null) + { + return; + } + assert box.corners().getA() != null && box.corners().getB() != null; // Check restricted area isn't too large - final int minX = Math.min(startRestriction.getX(), endRestriction.getX()); - final int minZ = Math.min(startRestriction.getZ(), endRestriction.getZ()); - final int maxX = Math.max(startRestriction.getX(), endRestriction.getX()); - final int maxZ = Math.max(startRestriction.getZ(), endRestriction.getZ()); + final int minX = Math.min(box.corners().getA().getX(), box.corners().getB().getX()); + final int minY = Math.min(box.corners().getA().getY(), box.corners().getB().getY()); + final int minZ = Math.min(box.corners().getA().getZ(), box.corners().getB().getZ()); + final int maxX = Math.max(box.corners().getA().getX(), box.corners().getB().getX()); + final int maxY = Math.max(box.corners().getA().getY(), box.corners().getB().getY()); + final int maxZ = Math.max(box.corners().getA().getZ(), box.corners().getB().getZ()); final int distX = maxX - minX; + final int distY = maxY - minY; final int distZ = maxZ - minZ; - final int area = distX * distZ; - final int maxArea = (int) Math.floor(2 * Math.pow(EntityAIWorkLumberjack.SEARCH_RANGE, 2)); + final int volume = distX * distY * distZ; + final int maxVolume = (int) Math.floor(2 * Math.pow(EntityAIWorkLumberjack.SEARCH_RANGE, 3)); - if (area > maxArea) + if (volume > maxVolume) { - MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_AREA_TOO_BIG, area, maxArea).sendTo(player); + MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_AREA_TOO_BIG, volume, maxVolume).sendTo(player); return; } - MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_AREA_SET, minX, maxX, minZ, maxZ, area, maxArea).sendTo(player); + MessageUtils.format(TOOL_LUMBERJACK_SCEPTER_AREA_SET, minX, maxX, minY, maxY, minZ, maxZ, volume, maxVolume).sendTo(player); final IColony colony = IColonyManager.getInstance().getColonyByWorld(compound.getInt(TAG_ID), worldIn); - final BlockPos hutPos = BlockPosUtil.read(compound, TAG_POS); - final BuildingLumberjack hut = colony.getBuildingManager().getBuilding(hutPos, BuildingLumberjack.class); + final BuildingLumberjack hut = colony.getBuildingManager().getBuilding(box.anchor(), BuildingLumberjack.class); if (hut == null) { return; } - hut.setRestrictedArea(startRestriction, endRestriction); + hut.setRestrictedArea(box.corners().getA(), box.corners().getB()); } - /** - * Set the position into the compound with the right key. - * Decide if flux continues or stops. - * @param compound the set compound. - * @param key the key to set. - * @param pos the pos to set for the key. - * @param player the player entity. - * @return true if continue. - */ - private boolean setPosition(final CompoundTag compound, final String key, final BlockPos pos, final Player player) + @NotNull + @Override + public List getOverlayBoxes(@NotNull final Level world, @NotNull final Player player, @NotNull ItemStack stack) + { + final Box box = getBox(world, stack.getOrCreateTag()); + + if (box.anchor() != null) + { + final OverlayBox anchorBox = new OverlayBox(new AABB(box.anchor()), RED_OVERLAY, 0.02f, true); + + if (box.corners() != null) + { + assert box.corners().getA() != null && box.corners().getB() != null; + final AABB bounds = new AABB(box.corners().getA(), box.corners().getB().offset(1, 1, 1)).inflate(1); + // inflate(1) is due to implementation of BlockPosUtil.isInArea + + return List.of(anchorBox, new OverlayBox(bounds, GREEN_OVERLAY, 0.02f, true)); + } + + return Collections.singletonList(anchorBox); + } + + return Collections.emptyList(); + } + + private record Box(@Nullable BlockPos anchor, @Nullable Tuple corners) { } + + @NotNull + private Box getBox(@NotNull final Level world, final CompoundTag compound) { - if (compound.contains(key)) + final int colonyId = compound.getInt(TAG_ID); + final BlockPos pos = BlockPosUtil.read(compound, TAG_POS); + final BlockPos start = compound.contains(NBT_START_POS) ? BlockPosUtil.read(compound, NBT_START_POS) : null; + final BlockPos end = compound.contains(NBT_END_POS) ? BlockPosUtil.read(compound, NBT_END_POS) : null; + + if (world.isClientSide()) + { + return getBox(world, colonyId, pos, start, end); + } + + final IColony colony = IColonyManager.getInstance().getColonyByWorld(colonyId, world); + if (colony != null && colony.getBuildingManager().getBuilding(pos) instanceof final BuildingLumberjack hut) + { + final BlockPos startRestriction = start != null ? start : Objects.requireNonNullElse(hut.getStartRestriction(), BlockPos.ZERO); + final BlockPos endRestriction = end != null ? end : Objects.requireNonNullElse(hut.getEndRestriction(), BlockPos.ZERO); + if (!startRestriction.equals(BlockPos.ZERO) && !endRestriction.equals(BlockPos.ZERO)) + { + return new Box(pos, new Tuple<>(startRestriction, endRestriction)); + } + return new Box(pos, null); + } + + return new Box(null, null); + } + + @NotNull + private Box getBox(@NotNull final Level world, final int colonyId, @NotNull final BlockPos pos, + @Nullable final BlockPos start, @Nullable final BlockPos end) + { + final IColonyView colony = IColonyManager.getInstance().getColonyView(colonyId, world.dimension()); + + if (colony != null && colony.getBuilding(pos) instanceof final BuildingLumberjack.View hut) { - if (BlockPosUtil.read(compound, key).equals(pos)) + final BlockPos startRestriction = start != null ? start : hut.getStartRestriction(); + final BlockPos endRestriction = end != null ? end : hut.getEndRestriction(); + if (!startRestriction.equals(BlockPos.ZERO) && !endRestriction.equals(BlockPos.ZERO)) { - player.getInventory().removeItemNoUpdate(player.getInventory().selected); - return false; + return new Box(pos, new Tuple<>(startRestriction, endRestriction)); } + return new Box(pos, null); } - BlockPosUtil.write(compound, key, pos); - return compound.contains(NBT_END_POS) && compound.contains(NBT_START_POS); + return new Box(null, null); } } diff --git a/src/main/java/com/minecolonies/coremod/items/ItemScrollGuardHelp.java b/src/main/java/com/minecolonies/coremod/items/ItemScrollGuardHelp.java index d8a06fa048a..8d21eb219a0 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemScrollGuardHelp.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemScrollGuardHelp.java @@ -11,7 +11,7 @@ import com.minecolonies.api.util.SoundUtils; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.colony.buildings.AbstractBuildingGuards; -import com.minecolonies.coremod.colony.buildings.modules.settings.FollowModeSetting; +import com.minecolonies.coremod.colony.buildings.modules.settings.GuardFollowModeSetting; import com.minecolonies.coremod.colony.buildings.modules.settings.GuardTaskSetting; import com.minecolonies.coremod.colony.jobs.AbstractJobGuard; import com.minecolonies.coremod.entity.ai.citizen.guard.AbstractEntityAIGuard; @@ -44,8 +44,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.Item.Properties; /** * Magic scroll which summons guards to the users aid, with a limited duration. Only works within the same world as the colony. @@ -116,8 +114,8 @@ protected ItemStack onItemUseSuccess( ((AbstractBuildingGuards) building).getSetting(AbstractBuildingGuards.GUARD_TASK).set(GuardTaskSetting.FOLLOW); ((AbstractBuildingGuards) building).setPlayerToFollow(player); - final FollowModeSetting grouping = ((AbstractBuildingGuards) building).getSetting(AbstractBuildingGuards.FOLLOW_MODE); - if (grouping.getValue().equals(FollowModeSetting.LOOSE)) + final GuardFollowModeSetting grouping = ((AbstractBuildingGuards) building).getSetting(AbstractBuildingGuards.FOLLOW_MODE); + if (grouping.getValue().equals(GuardFollowModeSetting.LOOSE)) { grouping.trigger(); } diff --git a/src/main/java/com/minecolonies/coremod/items/ItemSpear.java b/src/main/java/com/minecolonies/coremod/items/ItemSpear.java index 4b1cbdb2ec7..fdaabb8494f 100644 --- a/src/main/java/com/minecolonies/coremod/items/ItemSpear.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemSpear.java @@ -1,11 +1,9 @@ package com.minecolonies.coremod.items; import com.minecolonies.api.creativetab.ModCreativeTabs; -import com.minecolonies.api.entity.SpearEntity; -import com.minecolonies.api.util.constant.Constants; +import com.minecolonies.coremod.entity.SpearEntity; import com.minecolonies.coremod.client.render.SpearItemTileEntityRenderer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -23,8 +21,6 @@ import java.util.function.Consumer; -import net.minecraft.world.item.Item.Properties; - public class ItemSpear extends TridentItem { public ItemSpear(final Properties properties) diff --git a/src/main/java/com/minecolonies/coremod/items/ItemSupplyCampDeployer.java b/src/main/java/com/minecolonies/coremod/items/ItemSupplyCampDeployer.java index f33337d5c1c..f76b1b5a440 100755 --- a/src/main/java/com/minecolonies/coremod/items/ItemSupplyCampDeployer.java +++ b/src/main/java/com/minecolonies/coremod/items/ItemSupplyCampDeployer.java @@ -135,7 +135,7 @@ public static boolean canCampBePlaced( if (world.getBlockState(new BlockPos(x, groundLevel + 1, z)).getMaterial().isSolid()) { - final PlacementError placementError = new PlacementError(PlacementError.PlacementErrorType.NEEDS_AIR_ABOVE, new BlockPos(x, pos.getY(), z)); + final PlacementError placementError = new PlacementError(PlacementError.PlacementErrorType.NEEDS_AIR_ABOVE, new BlockPos(x, groundLevel + 1, z)); placementErrorList.add(placementError); } } diff --git a/src/main/java/com/minecolonies/coremod/network/NetworkChannel.java b/src/main/java/com/minecolonies/coremod/network/NetworkChannel.java index 31ceea09fda..57fd3a178cf 100755 --- a/src/main/java/com/minecolonies/coremod/network/NetworkChannel.java +++ b/src/main/java/com/minecolonies/coremod/network/NetworkChannel.java @@ -15,8 +15,7 @@ import com.minecolonies.coremod.network.messages.server.colony.building.*; import com.minecolonies.coremod.network.messages.server.colony.building.builder.BuilderSelectWorkOrderMessage; import com.minecolonies.coremod.network.messages.server.colony.building.enchanter.EnchanterWorkerSetMessage; -import com.minecolonies.coremod.network.messages.server.colony.building.farmer.AssignFieldMessage; -import com.minecolonies.coremod.network.messages.server.colony.building.farmer.AssignmentModeMessage; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.*; import com.minecolonies.coremod.network.messages.server.colony.building.guard.GuardSetMinePosMessage; import com.minecolonies.coremod.network.messages.server.colony.building.home.AssignUnassignMessage; import com.minecolonies.coremod.network.messages.server.colony.building.miner.MinerRepairLevelMessage; @@ -31,12 +30,12 @@ import com.minecolonies.coremod.research.GlobalResearchTreeMessage; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.minecraft.world.entity.Entity; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModList; @@ -59,32 +58,78 @@ public class NetworkChannel { /** - * Forge network channel + * A class that handles the data wrapping for our inner index codec. + * + * @param The message type. */ - private final SimpleChannel rawChannel; + public static final class NetworkingMessageEntry + { + /** + * Atomic boolean that tracks if a splitting warning has been written to the log for a given packet type. + */ + private final AtomicBoolean hasWarned = new AtomicBoolean(true); + + /** + * A callback to create a new message instance. + */ + private final Supplier creator; + private NetworkingMessageEntry(final Supplier creator) {this.creator = creator;} + + /** + * Gives access to the callback that creates a new message instance. + * + * @return The callback. + */ + public Supplier getCreator() + { + return creator; + } + + /** + * Invoked to indicate that a packet is being split. + * + * @param packetIndex The index of the split packet that is being send. + */ + public void onSplitting(int packetIndex) + { + //We only log when the SECOND packet, so with index 1, is processed. + if (packetIndex != 1) + { + return; + } + + //Ensure we only log once for a given packet. + if (hasWarned.getAndSet(false)) + { + Log.getLogger().warn("Splitting message: " + creator.get().getClass() + " it is too big to send normally. This message is only printed once"); + } + } + } + + /** + * Forge network channel + */ + private final SimpleChannel rawChannel; /** * The messages that this channel can process, as viewed from a message id. */ - private final Map> messagesTypes = Maps.newHashMap(); - + private final Map> messagesTypes = Maps.newHashMap(); /** * The message that this channel can process, as viewed from a message type. */ private final Map, Integer> messageTypeToIdMap = Maps.newHashMap(); - /** * Cache of partially received messages, this holds the data untill it is processed. */ - private final Cache> messageCache = CacheBuilder.newBuilder() - .expireAfterAccess(1, TimeUnit.MINUTES) - .concurrencyLevel(8) - .build(); - + private final Cache> messageCache = CacheBuilder.newBuilder() + .expireAfterAccess(1, TimeUnit.MINUTES) + .concurrencyLevel(8) + .build(); /** * An atomic counter which keeps track of the split messages that have been send to somewhere from this network node. */ - private final AtomicInteger messageCounter = new AtomicInteger(); + private final AtomicInteger messageCounter = new AtomicInteger(); /** * Creates a new instance of network channel. @@ -95,7 +140,8 @@ public class NetworkChannel public NetworkChannel(final String channelName) { final String modVersion = ModList.get().getModContainerById(Constants.MOD_ID).get().getModInfo().getVersion().toString(); - rawChannel = NetworkRegistry.newSimpleChannel(new ResourceLocation(Constants.MOD_ID, channelName), () -> modVersion, str -> str.equals(modVersion), str -> str.equals(modVersion)); + rawChannel = + NetworkRegistry.newSimpleChannel(new ResourceLocation(Constants.MOD_ID, channelName), () -> modVersion, str -> str.equals(modVersion), str -> str.equals(modVersion)); } /** @@ -114,10 +160,12 @@ public void registerCommonMessages() registerMessage(++idx, ColonyViewRemoveCitizenMessage.class, ColonyViewRemoveCitizenMessage::new); registerMessage(++idx, ColonyViewBuildingViewMessage.class, ColonyViewBuildingViewMessage::new); registerMessage(++idx, ColonyViewRemoveBuildingMessage.class, ColonyViewRemoveBuildingMessage::new); + registerMessage(++idx, ColonyViewFieldsUpdateMessage.class, ColonyViewFieldsUpdateMessage::new); registerMessage(++idx, PermissionsMessage.View.class, PermissionsMessage.View::new); registerMessage(++idx, ColonyViewWorkOrderMessage.class, ColonyViewWorkOrderMessage::new); registerMessage(++idx, ColonyViewRemoveWorkOrderMessage.class, ColonyViewRemoveWorkOrderMessage::new); registerMessage(++idx, UpdateChunkCapabilityMessage.class, UpdateChunkCapabilityMessage::new); + registerMessage(++idx, ColonyViewResearchManagerViewMessage.class, ColonyViewResearchManagerViewMessage::new); // Permission Request messages registerMessage(++idx, PermissionsMessage.Permission.class, PermissionsMessage.Permission::new); @@ -167,6 +215,7 @@ public void registerCommonMessages() registerMessage(++idx, AssignFilterableItemMessage.class, AssignFilterableItemMessage::new); registerMessage(++idx, TeamColonyColorChangeMessage.class, TeamColonyColorChangeMessage::new); registerMessage(++idx, ColonyFlagChangeMessage.class, ColonyFlagChangeMessage::new); + registerMessage(++idx, ColonyStructureStyleMessage.class, ColonyStructureStyleMessage::new); registerMessage(++idx, ToggleHelpMessage.class, ToggleHelpMessage::new); registerMessage(++idx, PauseCitizenMessage.class, PauseCitizenMessage::new); registerMessage(++idx, RestartCitizenMessage.class, RestartCitizenMessage::new); @@ -184,7 +233,9 @@ public void registerCommonMessages() registerMessage(++idx, HireSpiesMessage.class, HireSpiesMessage::new); registerMessage(++idx, AddMinimumStockToBuildingModuleMessage.class, AddMinimumStockToBuildingModuleMessage::new); registerMessage(++idx, RemoveMinimumStockFromBuildingModuleMessage.class, RemoveMinimumStockFromBuildingModuleMessage::new); - registerMessage(++idx, FieldPlotResizeMessage.class, FieldPlotResizeMessage::new); + registerMessage(++idx, FarmFieldPlotResizeMessage.class, FarmFieldPlotResizeMessage::new); + registerMessage(++idx, FarmFieldRegistrationMessage.class, FarmFieldRegistrationMessage::new); + registerMessage(++idx, FarmFieldUpdateSeedMessage.class, FarmFieldUpdateSeedMessage::new); registerMessage(++idx, AdjustSkillCitizenMessage.class, AdjustSkillCitizenMessage::new); registerMessage(++idx, BuilderSelectWorkOrderMessage.class, BuilderSelectWorkOrderMessage::new); registerMessage(++idx, TriggerSettingMessage.class, TriggerSettingMessage::new); @@ -193,11 +244,13 @@ public void registerCommonMessages() registerMessage(++idx, SwitchBuildingWithToolMessage.class, SwitchBuildingWithToolMessage::new); registerMessage(++idx, ColonyTextureStyleMessage.class, ColonyTextureStyleMessage::new); registerMessage(++idx, MinerRepairLevelMessage.class, MinerRepairLevelMessage::new); + registerMessage(++idx, PlantationFieldBuildRequestMessage.class, PlantationFieldBuildRequestMessage::new); registerMessage(++idx, ResetFilterableItemMessage.class, ResetFilterableItemMessage::new); registerMessage(++idx, CourierHiringModeMessage.class, CourierHiringModeMessage::new); registerMessage(++idx, QuarryHiringModeMessage.class, QuarryHiringModeMessage::new); registerMessage(++idx, ToggleRecipeMessage.class, ToggleRecipeMessage::new); registerMessage(++idx, ColonyNameStyleMessage.class, ColonyNameStyleMessage::new); + registerMessage(++idx, InteractionClose.class, InteractionClose::new); //Client side only registerMessage(++idx, BlockParticleEffectMessage.class, BlockParticleEffectMessage::new); @@ -219,7 +272,10 @@ public void registerCommonMessages() registerMessage(++idx, SyncPathReachedMessage.class, SyncPathReachedMessage::new); registerMessage(++idx, ReactivateBuildingMessage.class, ReactivateBuildingMessage::new); registerMessage(++idx, PlaySoundForCitizenMessage.class, PlaySoundForCitizenMessage::new); - registerMessage(++idx, OpenDecoWindowMessage.class, OpenDecoWindowMessage::new); + registerMessage(++idx, OpenDecoBuildWindowMessage.class, OpenDecoBuildWindowMessage::new); + registerMessage(++idx, OpenPlantationFieldBuildWindowMessage.class, OpenPlantationFieldBuildWindowMessage::new); + registerMessage(++idx, SaveStructureNBTMessage.class, SaveStructureNBTMessage::new); + registerMessage(++idx, GlobalQuestSyncMessage.class, GlobalQuestSyncMessage::new); //JEI Messages registerMessage(++idx, TransferRecipeCraftingTeachingMessage.class, TransferRecipeCraftingTeachingMessage::new); @@ -238,6 +294,8 @@ public void registerCommonMessages() // Crafter Recipe-related messages registerMessage(++idx, CustomRecipeManagerMessage.class, CustomRecipeManagerMessage::new); + registerMessage(++idx, ColonyListMessage.class, ColonyListMessage::new); + // Resource scroll NBT share message registerMessage(++idx, ResourceScrollSaveWarehouseSnapshotMessage.class, ResourceScrollSaveWarehouseSnapshotMessage::new); } @@ -333,61 +391,6 @@ public void sendToPosition(final IMessage msg, final net.minecraftforge.network. handleSplitting(msg, s -> rawChannel.send(PacketDistributor.NEAR.with(() -> pos), s)); } - /** - * Sends to everyone. - * - * @param msg message to send - */ - public void sendToEveryone(final IMessage msg) - { - handleSplitting(msg, s -> rawChannel.send(PacketDistributor.ALL.noArg(), s)); - } - - /** - * Sends to everyone who is in range from entity's pos using formula below. - * - *

-     * Math.min(Entity.getType().getTrackingRange(), ChunkManager.this.viewDistance - 1) * 16;
-     * 
- *

- * as of 24-06-2019 - * - * @param msg message to send - * @param entity target entity to look at - */ - public void sendToTrackingEntity(final IMessage msg, final Entity entity) - { - handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), s)); - } - - /** - * Sends to everyone (including given entity) who is in range from entity's pos using formula below. - * - *

-     * Math.min(Entity.getType().getTrackingRange(), ChunkManager.this.viewDistance - 1) * 16;
-     * 
- *

- * as of 24-06-2019 - * - * @param msg message to send - * @param entity target entity to look at - */ - public void sendToTrackingEntityAndSelf(final IMessage msg, final Entity entity) - { - handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), s)); - } - - /** - * Sends to everyone in given chunk. - * - * @param msg message to send - * @param chunk target chunk to look at - */ - public void sendToTrackingChunk(final IMessage msg, final LevelChunk chunk) - { - handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), s)); - } - /** * Method that handles the splitting of the message into chunks if need be. * @@ -442,72 +445,77 @@ private void handleSplitting(final IMessage msg, final Consumer splitM } /** - * Gives access to the cache of messages that are being received. + * Gives access to the internal index codec. * - * @return The message cache. + * @return The internal index codec map. */ - public Cache> getMessageCache() + public Map> getMessagesTypes() { - return messageCache; + return messagesTypes; } /** - * Gives access to the internal index codec. + * Sends to everyone. * - * @return The internal index codec map. + * @param msg message to send */ - public Map> getMessagesTypes() + public void sendToEveryone(final IMessage msg) { - return messagesTypes; + handleSplitting(msg, s -> rawChannel.send(PacketDistributor.ALL.noArg(), s)); } /** - * A class that handles the data wrapping for our inner index codec. + * Sends to everyone who is in range from entity's pos using formula below. * - * @param The message type. + *

+     * Math.min(Entity.getType().getTrackingRange(), ChunkManager.this.viewDistance - 1) * 16;
+     * 
+ *

+ * as of 24-06-2019 + * + * @param msg message to send + * @param entity target entity to look at */ - public static final class NetworkingMessageEntry + public void sendToTrackingEntity(final IMessage msg, final Entity entity) { - /** - * Atomic boolean that tracks if a splitting warning has been written to the log for a given packet type. - */ - private final AtomicBoolean hasWarned = new AtomicBoolean(true); - - /** - * A callback to create a new message instance. - */ - private final Supplier creator; - - private NetworkingMessageEntry(final Supplier creator) {this.creator = creator;} + handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), s)); + } - /** - * Gives access to the callback that creates a new message instance. - * - * @return The callback. - */ - public Supplier getCreator() - { - return creator; - } + /** + * Sends to everyone (including given entity) who is in range from entity's pos using formula below. + * + *

+     * Math.min(Entity.getType().getTrackingRange(), ChunkManager.this.viewDistance - 1) * 16;
+     * 
+ *

+ * as of 24-06-2019 + * + * @param msg message to send + * @param entity target entity to look at + */ + public void sendToTrackingEntityAndSelf(final IMessage msg, final Entity entity) + { + handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), s)); + } - /** - * Invoked to indicate that a packet is being split. - * - * @param packetIndex The index of the split packet that is being send. - */ - public void onSplitting(int packetIndex) - { - //We only log when the SECOND packet, so with index 1, is processed. - if (packetIndex != 1) - { - return; - } + /** + * Sends to everyone in given chunk. + * + * @param msg message to send + * @param chunk target chunk to look at + */ + public void sendToTrackingChunk(final IMessage msg, final LevelChunk chunk) + { + handleSplitting(msg, s -> rawChannel.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), s)); + } - //Ensure we only log once for a given packet. - if (hasWarned.getAndSet(false)) - { - Log.getLogger().warn("Splitting message: " + creator.get().getClass() + " it is too big to send normally. This message is only printed once"); - } - } + /** + * Gives access to the cache of messages that are being received. + * + * @return The message cache. + */ + public Cache> getMessageCache() + { + return messageCache; } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/PermissionsMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/PermissionsMessage.java index 0e22503c52b..0975176076d 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/PermissionsMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/PermissionsMessage.java @@ -98,6 +98,7 @@ public void onExecute(final net.minecraftforge.network.NetworkEvent.Context ctxI @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + data.resetReaderIndex(); buf.writeInt(colonyID); buf.writeUtf(dimension.location().toString()); buf.writeBytes(data); @@ -329,7 +330,6 @@ public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalS colony.getPermissions().addRank(rankName); } } - } /** diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/CreateColonyMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/CreateColonyMessage.java index f3a49868c2d..8daa2031c8b 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/CreateColonyMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/CreateColonyMessage.java @@ -3,21 +3,20 @@ import com.ldtteam.structurize.storage.StructurePacks; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; -import com.minecolonies.api.items.ModItems; +import com.minecolonies.api.colony.event.ColonyCreatedEvent; import com.minecolonies.api.network.IMessage; import com.minecolonies.api.tileentities.TileEntityColonyBuilding; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.MessageUtils; -import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.MineColonies; import net.minecraft.ChatFormatting; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.stats.Stats; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import org.jetbrains.annotations.Nullable; @@ -161,7 +160,7 @@ else if (spawnDistance > MineColonies.getConfig().getServer().maxDistanceFromWor if (colony != null && !IColonyManager.getInstance().isFarEnoughFromColonies(world, townHall)) { - MessageUtils.format( MESSAGE_COLONY_CREATE_DENIED_TOO_CLOSE, colony.getName()).sendTo(sender); + MessageUtils.format(MESSAGE_COLONY_CREATE_DENIED_TOO_CLOSE, colony.getName()).sendTo(sender); return; } @@ -169,9 +168,14 @@ else if (spawnDistance > MineColonies.getConfig().getServer().maxDistanceFromWor if (ownedColony == null) { - IColonyManager.getInstance().createColony(world, townHall, sender, colonyName, pack); - IColonyManager.getInstance().getIColonyByOwner(world, sender).getBuildingManager().addNewBuilding((TileEntityColonyBuilding) tileEntity, world); + final IColony createdColony = IColonyManager.getInstance().createColony(world, townHall, sender, colonyName, pack); + createdColony.getBuildingManager().addNewBuilding((TileEntityColonyBuilding) tileEntity, world); MessageUtils.format(MESSAGE_COLONY_FOUNDED).with(ChatFormatting.GOLD).sendTo(sender); + + if (isLogicalServer) + { + MinecraftForge.EVENT_BUS.post(new ColonyCreatedEvent(createdColony)); + } return; } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/GlobalQuestSyncMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/GlobalQuestSyncMessage.java new file mode 100644 index 00000000000..ff36d15de5c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/GlobalQuestSyncMessage.java @@ -0,0 +1,73 @@ +package com.minecolonies.coremod.network.messages.client; + +import com.minecolonies.api.network.IMessage; +import com.minecolonies.coremod.datalistener.QuestJsonListener; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * The message used to synchronize global quest data from a server to a remote client. + */ +public class GlobalQuestSyncMessage implements IMessage +{ + + /** + * The buffer with the data. + */ + private FriendlyByteBuf questBuffer; + + /** + * Empty constructor used when registering the message + */ + public GlobalQuestSyncMessage() + { + super(); + } + + /** + * Add or Update QuestData on the client. + * + * @param buf the bytebuffer. + */ + public GlobalQuestSyncMessage(final FriendlyByteBuf buf) + { + this.questBuffer = new FriendlyByteBuf(buf.copy()); + } + + @Override + public void fromBytes(@NotNull final FriendlyByteBuf buf) + { + questBuffer = new FriendlyByteBuf(buf.retain()); + } + + @Override + public void toBytes(@NotNull final FriendlyByteBuf buf) + { + questBuffer.resetReaderIndex(); + buf.writeBytes(questBuffer); + } + + @Nullable + @Override + public LogicalSide getExecutionSide() + { + return LogicalSide.CLIENT; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + if (Minecraft.getInstance().level != null) + { + QuestJsonListener.readGlobalQuestPackets(questBuffer); + } + questBuffer.release(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/OpenBuildWindowMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenBuildWindowMessage.java new file mode 100644 index 00000000000..6aec135e4d4 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenBuildWindowMessage.java @@ -0,0 +1,97 @@ +package com.minecolonies.coremod.network.messages.client; + +import com.minecolonies.api.network.IMessage; +import com.minecolonies.coremod.client.gui.WindowBuildDecoration; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Message to open the build window, for example for decorations. + */ +public abstract class OpenBuildWindowMessage implements IMessage +{ + /** + * Town hall position to create building on. + */ + protected BlockPos pos; + + /** + * The colony name. + */ + protected String path; + + /** + * The structure pack name. + */ + protected String packName; + + /** + * The rotation. + */ + protected Rotation rotation; + + /** + * If mirrored. + */ + protected boolean mirror; + + protected OpenBuildWindowMessage() + { + super(); + } + + /** + * Create a new message. + * + * @param pos the position the deco will be anchored at. + * @param packName the pack of the deco. + * @param path the path in the pack. + */ + protected OpenBuildWindowMessage(final BlockPos pos, final String packName, final String path, final Rotation rotation, final Mirror mirror) + { + this.pos = pos; + this.path = path; + this.packName = packName; + this.rotation = rotation; + this.mirror = mirror != Mirror.NONE; + } + + @Override + public void toBytes(final FriendlyByteBuf buf) + { + buf.writeBlockPos(this.pos); + buf.writeUtf(this.path); + buf.writeUtf(this.packName); + buf.writeBoolean(this.mirror); + buf.writeInt(this.rotation.ordinal()); + } + + @Override + public void fromBytes(final FriendlyByteBuf buf) + { + this.pos = buf.readBlockPos(); + this.path = buf.readUtf(32767); + this.packName = buf.readUtf(32767); + this.mirror = buf.readBoolean(); + this.rotation = Rotation.values()[buf.readInt()]; + } + + @Override + public final @NotNull LogicalSide getExecutionSide() + { + return LogicalSide.CLIENT; + } + + @Override + public final void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + new WindowBuildDecoration(this.pos, this.packName, this.path, this.rotation, this.mirror, this::createWorkOrderMessage).open(); + } + + protected abstract IMessage createWorkOrderMessage(BlockPos builder); +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoBuildWindowMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoBuildWindowMessage.java new file mode 100644 index 00000000000..e9477d007d7 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoBuildWindowMessage.java @@ -0,0 +1,42 @@ +package com.minecolonies.coremod.network.messages.client; + +import com.minecolonies.api.colony.workorders.WorkOrderType; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.coremod.network.messages.server.DecorationBuildRequestMessage; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; + +/** + * Message to open the deco build window on the client. + */ +public class OpenDecoBuildWindowMessage extends OpenBuildWindowMessage +{ + public OpenDecoBuildWindowMessage() + { + } + + /** + * Create a new message. + * + * @param pos the position the deco will be anchored at. + * @param packName the pack of the deco. + * @param path the path in the pack. + */ + public OpenDecoBuildWindowMessage( + final BlockPos pos, + final String packName, + final String path, + final Rotation rotation, + final Mirror mirror) + { + super(pos, packName, path, rotation, mirror); + } + + @Override + public IMessage createWorkOrderMessage(final BlockPos builder) + { + return new DecorationBuildRequestMessage(WorkOrderType.BUILD, pos, packName, path, Minecraft.getInstance().level.dimension(), rotation, mirror, builder); + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoWindowMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoWindowMessage.java deleted file mode 100644 index 170743ef4d7..00000000000 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/OpenDecoWindowMessage.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.minecolonies.coremod.network.messages.client; - -import com.minecolonies.api.network.IMessage; -import com.minecolonies.coremod.client.gui.WindowBuildDecoration; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraftforge.fml.LogicalSide; -import net.minecraftforge.network.NetworkEvent; -import org.jetbrains.annotations.Nullable; - -/** - * Message to open the deco build window on the client. - */ -public class OpenDecoWindowMessage implements IMessage -{ - /** - * Town hall position to create building on. - */ - BlockPos pos; - - /** - * The colony name. - */ - String path; - - /** - * The structure pack name. - */ - String packName; - - /** - * The rotation. - */ - private Rotation rotation; - - /** - * If mirrored. - */ - private boolean mirror; - - public OpenDecoWindowMessage() - { - super(); - } - - /** - * Create a new message. - * @param pos the position the deco will be anchored at. - * @param packName the pack of the deco. - * @param path the path in the pack. - */ - public OpenDecoWindowMessage(final BlockPos pos, final String packName, final String path, final Rotation rotation, final Mirror mirror) - { - this.pos = pos; - this.path = path; - this.packName = packName; - this.rotation = rotation; - this.mirror = mirror != Mirror.NONE; - } - - @Override - public void toBytes(final FriendlyByteBuf buf) - { - buf.writeBlockPos(this.pos); - buf.writeUtf(this.path); - buf.writeUtf(this.packName); - buf.writeBoolean(this.mirror); - buf.writeInt(this.rotation.ordinal()); - } - - @Override - public void fromBytes(final FriendlyByteBuf buf) - { - this.pos = buf.readBlockPos(); - this.path = buf.readUtf(32767); - this.packName = buf.readUtf(32767); - this.mirror = buf.readBoolean(); - this.rotation = Rotation.values()[buf.readInt()]; - } - - @Nullable - @Override - public LogicalSide getExecutionSide() - { - return LogicalSide.CLIENT; - } - - @Override - public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) - { - new WindowBuildDecoration(pos, packName, path, rotation, mirror).open(); - } -} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/OpenPlantationFieldBuildWindowMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenPlantationFieldBuildWindowMessage.java new file mode 100644 index 00000000000..fb61c5d2c47 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/OpenPlantationFieldBuildWindowMessage.java @@ -0,0 +1,43 @@ +package com.minecolonies.coremod.network.messages.client; + +import com.minecolonies.api.colony.workorders.WorkOrderType; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.coremod.network.messages.server.PlantationFieldBuildRequestMessage; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; + +/** + * Message to open the plantation field build window on the client. + */ +public class OpenPlantationFieldBuildWindowMessage extends OpenBuildWindowMessage +{ + public OpenPlantationFieldBuildWindowMessage() + { + super(); + } + + /** + * Create a new message. + * + * @param pos the position the plantation field will be anchored at. + * @param packName the pack of the plantation field. + * @param path the path in the pack. + */ + public OpenPlantationFieldBuildWindowMessage( + final BlockPos pos, + final String packName, + final String path, + final Rotation rotation, + final Mirror mirror) + { + super(pos, packName, path, rotation, mirror); + } + + @Override + protected IMessage createWorkOrderMessage(final BlockPos builder) + { + return new PlantationFieldBuildRequestMessage(WorkOrderType.BUILD, pos, packName, path, Minecraft.getInstance().level.dimension(), rotation, mirror, builder); + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/SaveStructureNBTMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/SaveStructureNBTMessage.java new file mode 100644 index 00000000000..8758889d440 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/SaveStructureNBTMessage.java @@ -0,0 +1,114 @@ +package com.minecolonies.coremod.network.messages.client; + +import com.ldtteam.structurize.storage.StructurePacks; +import com.ldtteam.structurize.storage.rendering.RenderingCache; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.api.util.Log; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.Locale; + +import static com.ldtteam.structurize.api.util.constant.Constants.BLUEPRINT_FOLDER; +import static com.ldtteam.structurize.api.util.constant.Constants.SCANS_FOLDER; + +/** + * Handles sendScanMessages. + */ +public class SaveStructureNBTMessage implements IMessage +{ + private static final String TAG_MILLIS = "millies"; + public static final String TAG_SCHEMATIC = "schematic"; + + private CompoundTag compoundNBT; + private String fileName; + + /** + * Send a scan compound to the client. + */ + public SaveStructureNBTMessage() + { + super(); + } + + /** + * Send a scan compound to the client. + * + * @param CompoundNBT the stream. + * @param fileName String with the name of the file. + */ + public SaveStructureNBTMessage(final CompoundTag CompoundNBT, final String fileName) + { + this.fileName = fileName; + this.compoundNBT = CompoundNBT; + } + + @Override + public void fromBytes(final FriendlyByteBuf buf) + { + final FriendlyByteBuf buffer = new FriendlyByteBuf(buf); + try (ByteBufInputStream stream = new ByteBufInputStream(buffer)) + { + final CompoundTag wrapperCompound = NbtIo.readCompressed(stream); + this.compoundNBT = wrapperCompound.getCompound(TAG_SCHEMATIC); + this.fileName = wrapperCompound.getString(TAG_MILLIS); + } + catch (final RuntimeException e) + { + Log.getLogger().info("Structure too big to be processed", e); + } + catch (final IOException e) + { + Log.getLogger().info("Problem at retrieving structure on server.", e); + } + } + + @Override + public void toBytes(final FriendlyByteBuf buf) + { + final CompoundTag wrapperCompound = new CompoundTag(); + wrapperCompound.putString(TAG_MILLIS, fileName); + wrapperCompound.put(TAG_SCHEMATIC, compoundNBT); + + final FriendlyByteBuf buffer = new FriendlyByteBuf(buf); + try (ByteBufOutputStream stream = new ByteBufOutputStream(buffer)) + { + NbtIo.writeCompressed(wrapperCompound, stream); + } + catch (final IOException e) + { + Log.getLogger().info("Problem at retrieving structure on server.", e); + } + } + + @Nullable + @Override + public LogicalSide getExecutionSide() + { + return LogicalSide.CLIENT; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + if (compoundNBT != null) + { + final String packName = Minecraft.getInstance().getUser().getName().toLowerCase(Locale.US); + RenderingCache.getOrCreateBlueprintPreviewData("blueprint").setBlueprintFuture( + StructurePacks.storeBlueprint(packName, compoundNBT, Minecraft.getInstance().gameDirectory.toPath() + .resolve(BLUEPRINT_FOLDER) + .resolve(Minecraft.getInstance().getUser().getName().toLowerCase(Locale.US)) + .resolve(SCANS_FOLDER).resolve(fileName))); + Minecraft.getInstance().player.displayClientMessage(Component.translatable("Scan successfully saved as %s", fileName), false); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/UpdateClientWithCompatibilityMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/UpdateClientWithCompatibilityMessage.java index ec11cb76576..2eff3a63af0 100644 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/UpdateClientWithCompatibilityMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/UpdateClientWithCompatibilityMessage.java @@ -1,5 +1,6 @@ package com.minecolonies.coremod.network.messages.client; +import com.ldtteam.structurize.api.util.Log; import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.network.IMessage; import io.netty.buffer.Unpooled; @@ -60,7 +61,14 @@ public LogicalSide getExecutionSide() @Override public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) { - IMinecoloniesAPI.getInstance().getColonyManager().getCompatibilityManager().deserialize(this.buffer); + try + { + IMinecoloniesAPI.getInstance().getColonyManager().getCompatibilityManager().deserialize(this.buffer); + } + catch (Exception e) + { + Log.getLogger().error("Failed to load compatibility manager", e); + } this.buffer.release(); } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyListMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyListMessage.java new file mode 100644 index 00000000000..dc97442942d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyListMessage.java @@ -0,0 +1,125 @@ +package com.minecolonies.coremod.network.messages.client.colony; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.client.gui.map.WindowColonyMap; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Add or Update a AbstractBuilding.View to a ColonyView on the client. + */ +public class ColonyListMessage implements IMessage +{ + /** + * List of colonies + */ + List colonies = new ArrayList<>(); + List colonyInfo = new ArrayList<>(); + + /** + * Empty constructor used when registering the + */ + public ColonyListMessage() + { + super(); + } + + /** + * Creates a message to handle colony views. + */ + public ColonyListMessage(final List colonies) + { + super(); + this.colonies = colonies; + } + + @Override + public void fromBytes(@NotNull final FriendlyByteBuf buf) + { + colonyInfo = new ArrayList<>(); + final int count = buf.readInt(); + for (int i = 0; i < count; i++) + { + final ColonyInfo info = new ColonyInfo(buf.readInt()); + info.center = buf.readBlockPos(); + info.name = buf.readUtf(32767); + info.citizencount = buf.readInt(); + info.owner = buf.readUtf(32767); + colonyInfo.add(info); + } + } + + @Override + public void toBytes(@NotNull final FriendlyByteBuf buf) + { + buf.writeInt(colonies.size()); + for (final IColony colony : colonies) + { + buf.writeInt(colony.getID()); + buf.writeBlockPos(colony.getCenter()); + buf.writeUtf(colony.getName()); + buf.writeInt(colony.getCitizenManager().getCurrentCitizenCount()); + buf.writeUtf(colony.getPermissions().getOwnerName()); + } + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + if (!isLogicalServer) + { + WindowColonyMap.setColonies(colonyInfo); + } + else if (ctxIn.getSender() != null) + { + Network.getNetwork().sendToPlayer(new ColonyListMessage(IColonyManager.getInstance().getColonies(ctxIn.getSender().getLevel())), ctxIn.getSender()); + } + } + + public static class ColonyInfo + { + private final int id; + private BlockPos center; + private String name; + private int citizencount; + private String owner; + + public ColonyInfo(final int id) + { + this.id = id; + } + + public int getId() + { + return id; + } + + public BlockPos getCenter() + { + return center; + } + + public String getName() + { + return name; + } + + public int getCitizencount() + { + return citizencount; + } + + public String getOwner() + { + return owner; + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewBuildingViewMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewBuildingViewMessage.java index c919234d1ab..8def614869d 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewBuildingViewMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewBuildingViewMessage.java @@ -4,11 +4,11 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.network.IMessage; import io.netty.buffer.Unpooled; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; import net.minecraft.world.level.Level; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; @@ -65,6 +65,7 @@ public void fromBytes(@NotNull final FriendlyByteBuf buf) @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + buildingData.resetReaderIndex(); buf.writeInt(colonyId); buf.writeBlockPos(buildingId); buf.writeUtf(dimension.location().toString()); diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewCitizenViewMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewCitizenViewMessage.java index 14faff94472..7f897ea4bd2 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewCitizenViewMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewCitizenViewMessage.java @@ -5,10 +5,10 @@ import com.minecolonies.api.network.IMessage; import com.minecolonies.coremod.colony.Colony; import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import net.minecraft.world.level.Level; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; @@ -65,6 +65,7 @@ public void fromBytes(@NotNull final FriendlyByteBuf buf) @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + citizenBuffer.resetReaderIndex(); buf.writeInt(colonyId); buf.writeInt(citizenId); buf.writeUtf(dimension.location().toString()); diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewFieldsUpdateMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewFieldsUpdateMessage.java new file mode 100644 index 00000000000..15b5897c155 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewFieldsUpdateMessage.java @@ -0,0 +1,132 @@ +package com.minecolonies.coremod.network.messages.client.colony; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.fields.registry.FieldDataManager; +import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Update message for auto syncing the entire field list. + */ +public class ColonyViewFieldsUpdateMessage implements IMessage +{ + /** + * The colony this field belongs to. + */ + private int colonyId; + + /** + * Dimension of the colony. + */ + private ResourceKey dimension; + + /** + * The list of field items. + */ + private Map fields; + + /** + * Empty constructor used when registering the + */ + public ColonyViewFieldsUpdateMessage() + { + super(); + } + + /** + * Creates a message to handle colony all field views. + * + * @param colony the colony this field is in. + * @param fields the complete list of fields of this colony. + */ + public ColonyViewFieldsUpdateMessage(@NotNull final IColony colony, @NotNull final Set fields) + { + super(); + this.colonyId = colony.getID(); + this.dimension = colony.getDimension(); + this.fields = new HashMap<>(); + fields.forEach(field -> this.fields.put(field, field)); + } + + @Override + public void toBytes(@NotNull final FriendlyByteBuf buf) + { + buf.writeInt(colonyId); + buf.writeUtf(dimension.location().toString()); + buf.writeInt(fields.size()); + for (IField field : fields.keySet()) + { + FriendlyByteBuf fieldBuffer = FieldDataManager.fieldToBuffer(field); + buf.writeInt(fieldBuffer.readableBytes()); + buf.writeBytes(fieldBuffer); + } + } + + @Override + public void fromBytes(@NotNull final FriendlyByteBuf buf) + { + colonyId = buf.readInt(); + dimension = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(buf.readUtf(32767))); + fields = new HashMap<>(); + int fieldCount = buf.readInt(); + for (int i = 0; i < fieldCount; i++) + { + int readableBytes = buf.readInt(); + FriendlyByteBuf fieldData = new FriendlyByteBuf(Unpooled.buffer(readableBytes)); + buf.readBytes(fieldData, readableBytes); + IField parsedField = FieldDataManager.bufferToField(fieldData); + fields.put(parsedField, parsedField); + } + } + + @Nullable + @Override + public LogicalSide getExecutionSide() + { + return LogicalSide.CLIENT; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + final IColonyView view = IColonyManager.getInstance().getColonyView(colonyId, dimension); + if (view != null) + { + Set updatedFields = new HashSet<>(); + view.getFields(field -> true).forEach(existingField -> { + if (this.fields.containsKey(existingField)) + { + final FriendlyByteBuf copyBuffer = new FriendlyByteBuf(Unpooled.buffer()); + this.fields.get(existingField).serialize(copyBuffer); + existingField.deserialize(copyBuffer); + updatedFields.add(existingField); + } + }); + updatedFields.addAll(this.fields.keySet()); + + view.handleColonyFieldViewUpdateMessage(updatedFields); + } + else + { + Log.getLogger().error("Colony view does not exist for ID #{}", colonyId); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewMessage.java index 6ff78caee0f..37484820715 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewMessage.java @@ -4,10 +4,10 @@ import com.minecolonies.api.network.IMessage; import com.minecolonies.coremod.colony.Colony; import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -52,18 +52,26 @@ public ColonyViewMessage() /** * Add or Update a ColonyView on the client. * - * @param colony Colony of the view to update. - * @param buf the bytebuffer. - * @param isNewSubscription Boolean whether or not this is a new subscription. + * @param colony Colony of the view to update. + * @param buf the bytebuffer. */ - public ColonyViewMessage(@NotNull final Colony colony, final FriendlyByteBuf buf, final boolean isNewSubscription) + public ColonyViewMessage(@NotNull final Colony colony, final FriendlyByteBuf buf) { this.colonyId = colony.getID(); - this.isNewSubscription = isNewSubscription; this.dim = colony.getDimension(); this.colonyBuffer = new FriendlyByteBuf(buf.copy()); } + /** + * Set whether the message is a new subscription(full view) + * + * @param newSubscription + */ + public void setIsNewSubscription(boolean newSubscription) + { + isNewSubscription = newSubscription; + } + @Override public void fromBytes(@NotNull final FriendlyByteBuf buf) { @@ -77,6 +85,7 @@ public void fromBytes(@NotNull final FriendlyByteBuf buf) @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + colonyBuffer.resetReaderIndex(); buf.writeInt(colonyId); buf.writeBoolean(isNewSubscription); buf.writeUtf(dim.location().toString()); diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewResearchManagerViewMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewResearchManagerViewMessage.java new file mode 100755 index 00000000000..d31ff94364a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewResearchManagerViewMessage.java @@ -0,0 +1,93 @@ +package com.minecolonies.coremod.network.messages.client.colony; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.api.research.IResearchManager; +import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Message to synch research manager to colony. + */ +public class ColonyViewResearchManagerViewMessage implements IMessage +{ + private int colonyId; + private FriendlyByteBuf researchManagerData; + + /** + * Dimension of the colony. + */ + private ResourceKey dimension; + + /** + * Empty constructor used when registering the + */ + public ColonyViewResearchManagerViewMessage() + { + super(); + } + + /** + * Creates a message to send the research manager to the client. + * @param colony the colony. + * @param researchManager the research manager. + */ + public ColonyViewResearchManagerViewMessage(final IColony colony, @NotNull final IResearchManager researchManager) + { + super(); + this.colonyId = colony.getID(); + this.dimension = colony.getDimension(); + + this.researchManagerData = new FriendlyByteBuf(Unpooled.buffer()); + + final CompoundTag researchCompound = new CompoundTag(); + researchManager.writeToNBT(researchCompound); + this.researchManagerData.writeNbt(researchCompound); + } + + @Override + public void fromBytes(@NotNull final FriendlyByteBuf buf) + { + colonyId = buf.readInt(); + dimension = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(buf.readUtf(32767))); + researchManagerData = new FriendlyByteBuf(Unpooled.buffer(buf.readableBytes())); + buf.readBytes(researchManagerData, buf.readableBytes()); + } + + @Override + public void toBytes(@NotNull final FriendlyByteBuf buf) + { + researchManagerData.resetReaderIndex(); + buf.writeInt(colonyId); + buf.writeUtf(dimension.location().toString()); + buf.writeBytes(researchManagerData); + } + + @Nullable + @Override + public LogicalSide getExecutionSide() + { + return LogicalSide.CLIENT; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + final IColonyView colonyView = IColonyManager.getInstance().getColonyView(colonyId, dimension); + if (colonyView != null) + { + colonyView.handleColonyViewResearchManagerUpdate(researchManagerData.readNbt()); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewWorkOrderMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewWorkOrderMessage.java index a91e6fa5c4f..b34d6a784f2 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewWorkOrderMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyViewWorkOrderMessage.java @@ -6,10 +6,10 @@ import com.minecolonies.coremod.colony.Colony; import com.minecolonies.coremod.colony.workorders.view.AbstractWorkOrderView; import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import net.minecraft.world.level.Level; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; @@ -66,6 +66,7 @@ public void fromBytes(@NotNull final FriendlyByteBuf buf) @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + workOrderBuffer.resetReaderIndex(); buf.writeInt(colonyId); buf.writeUtf(dimension.location().toString()); buf.writeBytes(workOrderBuffer); diff --git a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyVisitorViewDataMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyVisitorViewDataMessage.java index 3c5c69b878e..c12ca239559 100644 --- a/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyVisitorViewDataMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/client/colony/ColonyVisitorViewDataMessage.java @@ -1,12 +1,16 @@ package com.minecolonies.coremod.network.messages.client.colony; -import com.minecolonies.api.colony.*; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.IVisitorData; import com.minecolonies.api.network.IMessage; import com.minecolonies.api.util.Log; +import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import net.minecraft.world.level.Level; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; @@ -65,6 +69,13 @@ public ColonyVisitorViewDataMessage(@NotNull final IColony colony, @NotNull fina this.dimension = colony.getDimension(); this.visitors = visitors; this.refresh = refresh; + + visitorBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (final IVisitorData data : visitors) + { + visitorBuf.writeInt(data.getId()); + data.serializeViewNetworkData(visitorBuf); + } } @Override @@ -87,16 +98,12 @@ public void fromBytes(@NotNull final FriendlyByteBuf buf) @Override public void toBytes(@NotNull final FriendlyByteBuf buf) { + visitorBuf.resetReaderIndex(); buf.writeInt(colonyId); buf.writeUtf(dimension.location().toString()); buf.writeBoolean(refresh); buf.writeInt(visitors.size()); - - for (final IVisitorData data : visitors) - { - buf.writeInt(data.getId()); - data.serializeViewNetworkData(buf); - } + buf.writeBytes(visitorBuf); } @Nullable diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/FieldPlotResizeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/FieldPlotResizeMessage.java deleted file mode 100644 index b64c81f7ea6..00000000000 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/FieldPlotResizeMessage.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.minecolonies.coremod.network.messages.server; - -import com.minecolonies.api.network.IMessage; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.Direction; -import net.minecraft.core.BlockPos; -import net.minecraftforge.fml.LogicalSide; -import net.minecraftforge.network.NetworkEvent; -import org.jetbrains.annotations.Nullable; - -public class FieldPlotResizeMessage implements IMessage -{ - /** - * The new radius of the field plot - */ - public int size; - - /** - * The specified direction for the new radius - */ - public Direction direction; - - /** - * The position of the scarecrow tile entity - */ - public BlockPos pos; - - /** - * Forge default constructor - */ - public FieldPlotResizeMessage () { super(); } - - /** - * @param size the new radius of the field plot - * @param direction the specified direction for the new radius - * @param pos the position of the scarecrow tile entity - */ - public FieldPlotResizeMessage (int size, Direction direction, BlockPos pos) - { - this.size = size; - this.direction = direction; - this.pos = pos; - } - - @Override - public void toBytes(FriendlyByteBuf buf) - { - buf.writeInt(this.size); - buf.writeInt(this.direction.get2DDataValue()); - buf.writeBlockPos(this.pos); - } - - @Override - public void fromBytes(FriendlyByteBuf buf) - { - this.size = buf.readInt(); - this.direction = Direction.from2DDataValue(buf.readInt()); - this.pos = buf.readBlockPos(); - } - - @Nullable - @Override - public LogicalSide getExecutionSide() { return LogicalSide.SERVER; } - - @Override - public void onExecute(NetworkEvent.Context ctxIn, boolean isLogicalServer) - { - final BlockEntity te = ctxIn.getSender().getCommandSenderWorld().getBlockEntity(this.pos); - if (te instanceof AbstractScarecrowTileEntity) - { - ((AbstractScarecrowTileEntity) te).setRadius(this.direction, this.size); - } - } -} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/PlantationFieldBuildRequestMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/PlantationFieldBuildRequestMessage.java new file mode 100644 index 00000000000..1af06d3e530 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/PlantationFieldBuildRequestMessage.java @@ -0,0 +1,213 @@ +package com.minecolonies.coremod.network.messages.server; + +import com.ldtteam.structurize.storage.ServerFutureProcessor; +import com.ldtteam.structurize.storage.StructurePacks; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.permissions.Action; +import com.minecolonies.api.colony.workorders.IWorkOrder; +import com.minecolonies.api.colony.workorders.WorkOrderType; +import com.minecolonies.api.network.IMessage; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.blocks.BlockPlantationField; +import com.minecolonies.coremod.colony.buildings.AbstractBuildingStructureBuilder; +import com.minecolonies.coremod.colony.workorders.WorkOrderPlantationField; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.network.NetworkEvent; +import org.apache.commons.lang3.text.WordUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Optional; + +/** + * Message to request a work order for a plantation field. + */ +public class PlantationFieldBuildRequestMessage implements IMessage +{ + /** + * The id of the building. + */ + private BlockPos pos; + + /** + * The display name of the decoration. + */ + private String packName; + + /** + * The name of the decoration. + */ + private String path; + + /** + * The rotation. + */ + private Rotation rotation; + + /** + * If mirrored. + */ + private boolean mirror; + + /** + * The dimension. + */ + private ResourceKey dimension; + + /** + * Type of workorder. + */ + private WorkOrderType workOrderType; + + /** + * The builder, or ZERO to auto-assign. + */ + private BlockPos builder; + + /** + * Empty constructor used when registering the + */ + public PlantationFieldBuildRequestMessage() + { + super(); + } + + /** + * Creates a build request for a plantation field. + * + * @param pos the position of it. + * @param packName pack name. + * @param path blueprint path. + * @param dimension the dimension we're executing on. + */ + public PlantationFieldBuildRequestMessage( + final WorkOrderType workOrderType, + @NotNull final BlockPos pos, + final String packName, + final String path, + final ResourceKey dimension, + final Rotation rotation, + final boolean mirror, + final BlockPos builder) + { + super(); + this.workOrderType = workOrderType; + this.pos = pos; + this.packName = packName; + this.path = path; + this.dimension = dimension; + this.rotation = rotation; + this.mirror = mirror; + this.builder = builder; + } + + @Override + public void toBytes(@NotNull final FriendlyByteBuf buf) + { + buf.writeInt(this.workOrderType.ordinal()); + buf.writeBlockPos(this.pos); + buf.writeUtf(this.packName); + buf.writeUtf(this.path); + buf.writeUtf(this.dimension.location().toString()); + buf.writeBoolean(this.mirror); + buf.writeInt(this.rotation.ordinal()); + buf.writeBlockPos(this.builder); + } + + @Override + public void fromBytes(@NotNull final FriendlyByteBuf buf) + { + this.workOrderType = WorkOrderType.values()[buf.readInt()]; + this.pos = buf.readBlockPos(); + this.packName = buf.readUtf(32767); + this.path = buf.readUtf(32767); + this.dimension = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(buf.readUtf(32767))); + this.mirror = buf.readBoolean(); + this.rotation = Rotation.values()[buf.readInt()]; + this.builder = buf.readBlockPos(); + } + + @Nullable + @Override + public LogicalSide getExecutionSide() + { + return LogicalSide.SERVER; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) + { + final IColony colony = IColonyManager.getInstance().getColonyByPosFromDim(dimension, pos); + if (colony == null) + { + return; + } + final Player player = ctxIn.getSender(); + + //Verify player has permission to change this hut its settings + if (!colony.getPermissions().hasPermission(player, Action.MANAGE_HUTS)) + { + return; + } + + final Optional> wo = colony.getWorkManager().getWorkOrders().entrySet().stream() + .filter(entry -> entry.getValue() instanceof WorkOrderPlantationField) + .filter(entry -> entry.getValue().getLocation().equals(pos)).findFirst(); + + if (wo.isPresent()) + { + colony.getWorkManager().removeWorkOrder(wo.get().getKey()); + return; + } + + ServerFutureProcessor.queueBlueprint(new ServerFutureProcessor.BlueprintProcessingData(StructurePacks.getBlueprintFuture(packName, path), + player.level, + (blueprint -> { + if (blueprint == null) + { + Log.getLogger().error(String.format("Schematic %s doesn't exist on the server.", path)); + return; + } + + final String[] split = path.split("/"); + final String displayName = split[split.length - 1].replace(".blueprint", ""); + + final BlockState structureState = blueprint.getBlockInfoAsMap().get(blueprint.getPrimaryBlockOffset()).getState(); + final WorkOrderType type = structureState != null && !(structureState.getBlock() instanceof BlockPlantationField) + ? WorkOrderType.BUILD : workOrderType; + + final WorkOrderPlantationField order = WorkOrderPlantationField.create( + type, + packName, + path, + WordUtils.capitalizeFully(displayName), + pos, + rotation.ordinal(), + mirror, + 0); + + if (!builder.equals(BlockPos.ZERO)) + { + final IBuilding building = colony.getBuildingManager().getBuilding(builder); + if (building instanceof AbstractBuildingStructureBuilder) + { + order.setClaimedBy(builder); + } + } + + colony.getWorkManager().addWorkOrder(order, false); + }))); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyDeleteOwnMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyDeleteOwnMessage.java index 3ea56b08bf3..aa36570701c 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyDeleteOwnMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyDeleteOwnMessage.java @@ -2,15 +2,18 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.event.ColonyDeletedEvent; import com.minecolonies.api.network.IMessage; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.network.FriendlyByteBuf; import com.minecolonies.api.util.MessageUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import org.jetbrains.annotations.Nullable; -import static com.minecolonies.api.util.constant.TranslationConstants.*; +import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INFO_COLONY_DELETE_SUCCESS; +import static com.minecolonies.api.util.constant.TranslationConstants.MESSAGE_INFO_COLONY_NOT_FOUND; /** * Message for deleting an owned colony @@ -50,6 +53,11 @@ public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalS { IColonyManager.getInstance().deleteColonyByDimension(colony.getID(), false, colony.getDimension()); MessageUtils.format(MESSAGE_INFO_COLONY_DELETE_SUCCESS).sendTo(player); + + if (isLogicalServer) + { + MinecraftForge.EVENT_BUS.post(new ColonyDeletedEvent(colony)); + } } else { diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyFlagChangeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyFlagChangeMessage.java index 35fe65e13ef..14278915b41 100644 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyFlagChangeMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyFlagChangeMessage.java @@ -1,11 +1,13 @@ package com.minecolonies.coremod.network.messages.server.colony; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.event.ColonyInformationChangedEvent; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_BANNER_PATTERNS; @@ -37,6 +39,11 @@ public ColonyFlagChangeMessage (IColony colony, ListTag patternList) protected void onExecute(NetworkEvent.Context ctxIn, boolean isLogicalServer, IColony colony) { colony.setColonyFlag(patterns); + + if (isLogicalServer) + { + MinecraftForge.EVENT_BUS.post(new ColonyInformationChangedEvent(colony, ColonyInformationChangedEvent.Type.FLAG)); + } } @Override diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyStructureStyleMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyStructureStyleMessage.java new file mode 100644 index 00000000000..6aaee6c6143 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/ColonyStructureStyleMessage.java @@ -0,0 +1,56 @@ +package com.minecolonies.coremod.network.messages.server.colony; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +/** + * Message to set the colony default structure style. + */ +public class ColonyStructureStyleMessage extends AbstractColonyServerMessage +{ + /** + * The chosen pack. + */ + private String pack; + + /** + * Default constructor + **/ + public ColonyStructureStyleMessage() + { + super(); + } + + /** + * Change the colony default pack from the client to the serverside. + * + * @param colony the colony the player changed the pack in. + * @param pack the pack name, + */ + public ColonyStructureStyleMessage(final IColony colony, final String pack) + { + super(colony); + this.pack = pack; + } + + @Override + protected void onExecute(NetworkEvent.Context ctxIn, boolean isLogicalServer, IColony colony) + { + colony.setStructurePack(pack); + } + + @Override + protected void toBytesOverride(FriendlyByteBuf buf) + { + buf.writeUtf(pack); + } + + @Override + protected void fromBytesOverride(FriendlyByteBuf buf) + { + this.pack = buf.readUtf(32767); + } +} + diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionClose.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionClose.java new file mode 100755 index 00000000000..ba4952b2f60 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionClose.java @@ -0,0 +1,95 @@ +package com.minecolonies.coremod.network.messages.server.colony; + +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Message to trigger a response handler close on the server side. + */ +public class InteractionClose extends AbstractColonyServerMessage +{ + /** + * Id of the citizen. + */ + private int citizenId; + + /** + * The key of the handler to trigger. + */ + private Component key; + + /** + * Empty public constructor. + */ + public InteractionClose() + { + super(); + } + + /** + * Trigger the server response handler. + * + * @param colonyId the colony id. + * @param citizenId the citizen id. + * @param dimension the dimension the colony and citizen are in. + * @param key the key of the handler. + */ + public InteractionClose( + final int colonyId, + final int citizenId, + final ResourceKey dimension, + @NotNull final Component key) + { + super(dimension, colonyId); + this.citizenId = citizenId; + this.key = key; + } + + /** + * Transformation from a byteStream to the variables. + * + * @param buf the used byteBuffer. + */ + @Override + public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) + { + this.citizenId = buf.readInt(); + this.key = buf.readComponent(); + } + + /** + * Transformation to a byteStream. + * + * @param buf the used byteBuffer. + */ + @Override + public void toBytesOverride(@NotNull final FriendlyByteBuf buf) + { + buf.writeInt(this.citizenId); + buf.writeComponent(key); + } + + @Override + protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony) + { + ICitizenData citizenData = colony.getCitizenManager().getCivilian(citizenId); + if (citizenData == null) + { + citizenData = colony.getVisitorManager().getVisitor(citizenId); + } + + if (citizenData != null && ctxIn.getSender() != null) + { + citizenData.onInteractionClosed(key, ctxIn.getSender()); + } + } +} + + diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionResponse.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionResponse.java index 3d6ddf35c55..2ea0759ae37 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionResponse.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/InteractionResponse.java @@ -28,7 +28,7 @@ public class InteractionResponse extends AbstractColonyServerMessage /** * The chosen response. */ - private Component response; + private int responseId; /** * Empty public constructor. @@ -41,23 +41,23 @@ public InteractionResponse() /** * Trigger the server response handler. * - * @param colonyId the colony id. - * @param citizenId the citizen id. - * @param dimension the dimension the colony and citizen are in. - * @param key the key of the handler. - * @param response the response to trigger. + * @param colonyId the colony id. + * @param citizenId the citizen id. + * @param dimension the dimension the colony and citizen are in. + * @param key the key of the handler. + * @param responseId the response to trigger. */ public InteractionResponse( final int colonyId, final int citizenId, final ResourceKey dimension, @NotNull final Component key, - @NotNull final Component response) + final int responseId) { super(dimension, colonyId); this.citizenId = citizenId; this.key = key; - this.response = response; + this.responseId = responseId; } /** @@ -70,7 +70,7 @@ public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) { this.citizenId = buf.readInt(); this.key = buf.readComponent(); - this.response = buf.readComponent(); + this.responseId = buf.readInt(); } /** @@ -83,7 +83,7 @@ public void toBytesOverride(@NotNull final FriendlyByteBuf buf) { buf.writeInt(this.citizenId); buf.writeComponent(key); - buf.writeComponent(response); + buf.writeInt(responseId); } @Override @@ -97,7 +97,7 @@ protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogic if (citizenData != null && ctxIn.getSender() != null) { - citizenData.onResponseTriggered(key, response, ctxIn.getSender()); + citizenData.onResponseTriggered(key, responseId, ctxIn.getSender()); } } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/OpenInventoryMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/OpenInventoryMessage.java index b82a16fc1d1..a53a8a3c859 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/OpenInventoryMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/OpenInventoryMessage.java @@ -9,13 +9,12 @@ import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.CompatibilityUtils; import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; -import com.minecolonies.coremod.tileentities.ScarecrowTileEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.StringUtil; import net.minecraft.world.MenuProvider; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.util.StringUtil; -import net.minecraft.core.BlockPos; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; @@ -94,7 +93,6 @@ public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) entityID = buf.readInt(); break; case INVENTORY_CHEST: - case INVENTORY_FIELD: tePos = buf.readBlockPos(); break; } @@ -112,7 +110,6 @@ public void toBytesOverride(@NotNull final FriendlyByteBuf buf) buf.writeInt(entityID); break; case INVENTORY_CHEST: - case INVENTORY_FIELD: buf.writeBlockPos(tePos); break; } @@ -134,9 +131,6 @@ protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogic case INVENTORY_CHEST: doHutInventory(player, colony); break; - case INVENTORY_FIELD: - doFieldInventory(player); - break; default: break; } @@ -166,19 +160,12 @@ private void doHutInventory(final ServerPlayer player, final IColony colony) } } - private void doFieldInventory(final ServerPlayer player) - { - @NotNull final ScarecrowTileEntity scarecrowTileEntity = (ScarecrowTileEntity) BlockPosUtil.getTileEntity(CompatibilityUtils.getWorldFromEntity(player), tePos); - NetworkHooks.openScreen(player, scarecrowTileEntity); - } - /** * Type of inventory. */ private enum InventoryType { INVENTORY_CITIZEN, - INVENTORY_CHEST, - INVENTORY_FIELD, + INVENTORY_CHEST } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TeamColonyColorChangeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TeamColonyColorChangeMessage.java index 079098a8531..17d34259dd3 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TeamColonyColorChangeMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TeamColonyColorChangeMessage.java @@ -2,9 +2,11 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.event.ColonyInformationChangedEvent; import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; import org.jetbrains.annotations.NotNull; @@ -65,5 +67,10 @@ public void toBytesOverride(@NotNull final FriendlyByteBuf buf) protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony) { colony.setColonyColor(ChatFormatting.values()[colorOrdinal]); + + if (isLogicalServer) + { + MinecraftForge.EVENT_BUS.post(new ColonyInformationChangedEvent(colony, ColonyInformationChangedEvent.Type.TEAM_COLOR)); + } } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TownHallRenameMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TownHallRenameMessage.java index 25f8a914e1d..c5d27c78fc4 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TownHallRenameMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/TownHallRenameMessage.java @@ -2,9 +2,11 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyView; +import com.minecolonies.api.colony.event.ColonyInformationChangedEvent; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; import org.jetbrains.annotations.NotNull; @@ -59,5 +61,10 @@ protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogic { Network.getNetwork().sendToEveryone(this); } + + if (isLogicalServer) + { + MinecraftForge.EVENT_BUS.post(new ColonyInformationChangedEvent(colony, ColonyInformationChangedEvent.Type.NAME)); + } } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/BuildingSetStyleMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/BuildingSetStyleMessage.java index a87ac0f4e3c..b5e09cb4bba 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/BuildingSetStyleMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/BuildingSetStyleMessage.java @@ -3,7 +3,6 @@ import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.views.IBuildingView; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingTownHall; import com.minecolonies.coremod.network.messages.server.AbstractBuildingServerMessage; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; @@ -59,13 +58,6 @@ public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalS return; } - if (building instanceof BuildingTownHall) - { - colony.setStructurePack(structurePack); - } - else - { - building.setStructurePack(structurePack); - } + building.setStructurePack(structurePack); } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/TransferItemsRequestMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/TransferItemsRequestMessage.java index 6ec874faaee..c9a575d9fa2 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/TransferItemsRequestMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/TransferItemsRequestMessage.java @@ -7,13 +7,16 @@ import com.minecolonies.api.util.InventoryUtils; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.MessageUtils; import com.minecolonies.coremod.MineColonies; import com.minecolonies.coremod.network.messages.server.AbstractBuildingServerMessage; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.network.NetworkEvent; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -131,6 +134,11 @@ protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogic } } + if (!ItemStackUtils.isEmpty(remainingItemStack)) + { + MessageUtils.format(Component.translatable("entity.builder.inventoryfull", remainingItemStack.getDisplayName()).withStyle(ChatFormatting.RED)).sendTo(player); + } + if (ItemStackUtils.isEmpty(remainingItemStack) || ItemStackUtils.getSize(remainingItemStack) != amountToTake) { //Only doing this at the moment as the additional chest do not detect new content diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignFieldMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignFieldMessage.java deleted file mode 100755 index b699a8a09bd..00000000000 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignFieldMessage.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.minecolonies.coremod.network.messages.server.colony.building.farmer; - -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.buildings.views.IBuildingView; -import com.minecolonies.coremod.colony.buildings.modules.FarmerFieldModule; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingFarmer; -import com.minecolonies.coremod.network.messages.server.AbstractBuildingServerMessage; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.core.BlockPos; -import net.minecraftforge.network.NetworkEvent; -import org.jetbrains.annotations.NotNull; - -/** - * Message which handles the assignment of fields to farmers. - */ -public class AssignFieldMessage extends AbstractBuildingServerMessage -{ - private boolean assign; - private BlockPos field; - - /** - * Empty standard constructor. - */ - public AssignFieldMessage() - { - super(); - } - - /** - * Creates the message to assign a field. - * - * @param assign assign if true, free if false. - * @param field the field to assign or release. - * @param building the building we're executing on. - */ - public AssignFieldMessage(final IBuildingView building, final boolean assign, final BlockPos field) - { - super(building); - this.assign = assign; - this.field = field; - } - - @Override - public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) - { - - assign = buf.readBoolean(); - field = buf.readBlockPos(); - } - - @Override - public void toBytesOverride(@NotNull final FriendlyByteBuf buf) - { - - buf.writeBoolean(assign); - buf.writeBlockPos(field); - } - - @Override - public void onExecute( - final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony, final BuildingFarmer building) - { - if (assign) - { - building.getFirstOptionalModuleOccurance(FarmerFieldModule.class).ifPresent(m -> m.assignField(field)); - } - else - { - building.getFirstOptionalModuleOccurance(FarmerFieldModule.class).ifPresent(m -> m.freeField(field)); - } - } -} - diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignFieldMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignFieldMessage.java new file mode 100644 index 00000000000..27e1e39aada --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignFieldMessage.java @@ -0,0 +1,85 @@ +package com.minecolonies.coremod.network.messages.server.colony.building.fields; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.views.IBuildingView; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; +import com.minecolonies.coremod.colony.fields.registry.FieldDataManager; +import com.minecolonies.coremod.network.messages.server.AbstractBuildingServerMessage; +import io.netty.buffer.Unpooled; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Message which handles the assignment of fields to farmers. + */ +public class AssignFieldMessage extends AbstractBuildingServerMessage +{ + /** + * The field to (un)assign. + */ + private FriendlyByteBuf fieldData; + + /** + * Whether to assign or un-assign this field. + */ + private boolean assign; + + /** + * Empty standard constructor. + */ + public AssignFieldMessage() + { + super(); + } + + /** + * Creates the message to assign a field. + * + * @param assign assign if true, free if false. + * @param field the field. + * @param building the building we're executing on. + */ + public AssignFieldMessage(final IBuildingView building, final IField field, final boolean assign) + { + super(building); + this.assign = assign; + this.fieldData = FieldDataManager.fieldToBuffer(field); + } + + @Override + public void toBytesOverride(@NotNull final FriendlyByteBuf buf) + { + fieldData.resetReaderIndex(); + buf.writeBoolean(assign); + buf.writeBytes(fieldData); + } + + @Override + public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) + { + assign = buf.readBoolean(); + fieldData = new FriendlyByteBuf(Unpooled.buffer(buf.readableBytes())); + buf.readBytes(fieldData, buf.readableBytes()); + } + + @Override + public void onExecute( + final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony, final IBuilding building) + { + final IField parsedField = FieldDataManager.bufferToField(fieldData); + colony.getBuildingManager().getField(otherField -> otherField.equals(parsedField)).ifPresent(field -> { + if (assign) + { + building.getFirstOptionalModuleOccurance(FieldsModule.class).ifPresent(m -> m.assignField(field)); + } + else + { + building.getFirstOptionalModuleOccurance(FieldsModule.class).ifPresent(m -> m.freeField(field)); + } + }); + } +} + diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignmentModeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignmentModeMessage.java old mode 100755 new mode 100644 similarity index 78% rename from src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignmentModeMessage.java rename to src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignmentModeMessage.java index 92fb7ed0162..03cc5193a96 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/farmer/AssignmentModeMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/AssignmentModeMessage.java @@ -1,9 +1,9 @@ -package com.minecolonies.coremod.network.messages.server.colony.building.farmer; +package com.minecolonies.coremod.network.messages.server.colony.building.fields; import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.views.IBuildingView; -import com.minecolonies.coremod.colony.buildings.modules.FarmerFieldModule; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingFarmer; +import com.minecolonies.coremod.colony.buildings.modules.FieldsModule; import com.minecolonies.coremod.network.messages.server.AbstractBuildingServerMessage; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; @@ -12,7 +12,7 @@ /** * Message to change the assignmentMode of the fields of the farmer. */ -public class AssignmentModeMessage extends AbstractBuildingServerMessage +public class AssignmentModeMessage extends AbstractBuildingServerMessage { private boolean assignmentMode; @@ -37,22 +37,22 @@ public AssignmentModeMessage(@NotNull final IBuildingView building, final boolea } @Override - public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) + public void toBytesOverride(@NotNull final FriendlyByteBuf buf) { - assignmentMode = buf.readBoolean(); + buf.writeBoolean(assignmentMode); } @Override - public void toBytesOverride(@NotNull final FriendlyByteBuf buf) + public void fromBytesOverride(@NotNull final FriendlyByteBuf buf) { - buf.writeBoolean(assignmentMode); + assignmentMode = buf.readBoolean(); } @Override - public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony, final BuildingFarmer building) + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony, final IBuilding building) { - building.getFirstOptionalModuleOccurance(FarmerFieldModule.class).ifPresent(m -> m.setAssignManually(assignmentMode)); + building.getFirstOptionalModuleOccurance(FieldsModule.class).ifPresent(m -> m.setAssignManually(assignmentMode)); } } diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldPlotResizeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldPlotResizeMessage.java new file mode 100644 index 00000000000..a06fcca7828 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldPlotResizeMessage.java @@ -0,0 +1,82 @@ +package com.minecolonies.coremod.network.messages.server.colony.building.fields; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +/** + * Message to change the farmer field plot size. + */ +public class FarmFieldPlotResizeMessage extends AbstractColonyServerMessage +{ + /** + * The new radius of the field plot. + */ + private int size; + + /** + * The specified direction for the new radius. + */ + private Direction direction; + + /** + * The field position. + */ + private BlockPos position; + + /** + * Forge default constructor + */ + public FarmFieldPlotResizeMessage() + { + super(); + } + + /** + * @param size the new radius of the field plot + * @param direction the specified direction for the new radius + * @param position the field position. + */ + public FarmFieldPlotResizeMessage(IColony colony, int size, Direction direction, BlockPos position) + { + super(colony); + this.size = size; + this.direction = direction; + this.position = position; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony) + { + if (!isLogicalServer || ctxIn.getSender() == null) + { + return; + } + + colony.getBuildingManager() + .getField(f -> f.getFieldType().equals(FieldRegistries.farmField.get()) && f.getPosition().equals(position)) + .map(m -> (FarmField) m) + .ifPresent(field -> field.setRadius(direction, size)); + } + + @Override + public void toBytesOverride(final FriendlyByteBuf buf) + { + buf.writeInt(size); + buf.writeInt(direction.get2DDataValue()); + buf.writeBlockPos(position); + } + + @Override + public void fromBytesOverride(final FriendlyByteBuf buf) + { + size = buf.readInt(); + direction = Direction.from2DDataValue(buf.readInt()); + position = buf.readBlockPos(); + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldRegistrationMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldRegistrationMessage.java new file mode 100644 index 00000000000..79e4e5fead5 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldRegistrationMessage.java @@ -0,0 +1,71 @@ +package com.minecolonies.coremod.network.messages.server.colony.building.fields; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.IField; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.util.Optional; + +/** + * TODO: Remove in 1.20.2 + */ +public class FarmFieldRegistrationMessage extends AbstractColonyServerMessage +{ + /** + * The field position. + */ + private BlockPos position; + + /** + * Forge default constructor + */ + public FarmFieldRegistrationMessage() + { + super(); + } + + /** + * @param position the field position. + */ + public FarmFieldRegistrationMessage(IColony colony, BlockPos position) + { + super(colony); + this.position = position; + } + + @Override + public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony) + { + if (!isLogicalServer || ctxIn.getSender() == null) + { + return; + } + + final Optional field = colony.getBuildingManager() + .getField(f -> f.getFieldType().equals(FieldRegistries.farmField.get()) && f.getPosition().equals(position)) + .stream() + .findFirst(); + + if (field.isEmpty()) + { + colony.getBuildingManager().addField(FarmField.create(position)); + } + } + + @Override + public void toBytesOverride(final FriendlyByteBuf buf) + { + buf.writeBlockPos(position); + } + + @Override + public void fromBytesOverride(final FriendlyByteBuf buf) + { + position = buf.readBlockPos(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldUpdateSeedMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldUpdateSeedMessage.java new file mode 100644 index 00000000000..979f1112621 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/fields/FarmFieldUpdateSeedMessage.java @@ -0,0 +1,77 @@ +package com.minecolonies.coremod.network.messages.server.colony.building.fields; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.coremod.colony.fields.FarmField; +import com.minecolonies.coremod.network.messages.server.AbstractColonyServerMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Message to change the farm field current plant. + */ +public class FarmFieldUpdateSeedMessage extends AbstractColonyServerMessage +{ + /** + * The new seed to assign to the field. + */ + private ItemStack newSeed; + + /** + * The field position. + */ + private BlockPos position; + + /** + * Forge default constructor + */ + public FarmFieldUpdateSeedMessage() + { + super(); + } + + /** + * Default constructor. + * + * @param colony the colony where the field is in. + * @param newSeed the new seed to assign to the field. + * @param position the field position. + */ + public FarmFieldUpdateSeedMessage(@NotNull IColony colony, ItemStack newSeed, BlockPos position) + { + super(colony); + this.newSeed = newSeed; + this.position = position; + } + + @Override + protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer, final IColony colony) + { + if (!isLogicalServer || ctxIn.getSender() == null) + { + return; + } + + colony.getBuildingManager() + .getField(f -> f.getFieldType().equals(FieldRegistries.farmField.get()) && f.getPosition().equals(position)) + .map(m -> (FarmField) m) + .ifPresent(field -> field.setSeed(newSeed)); + } + + @Override + public void toBytesOverride(final FriendlyByteBuf buf) + { + buf.writeItem(newSeed); + buf.writeBlockPos(position); + } + + @Override + public void fromBytesOverride(final FriendlyByteBuf buf) + { + newSeed = buf.readItem(); + position = buf.readBlockPos(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/worker/BuildingHiringModeMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/worker/BuildingHiringModeMessage.java index 89e69700efa..1cb5ff79832 100755 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/worker/BuildingHiringModeMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/building/worker/BuildingHiringModeMessage.java @@ -86,6 +86,7 @@ public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalS if (isLivingBuildingModule) { building.getFirstModuleOccurance(LivingBuildingModule.class).setHiringMode(mode); + building.getColony().getCitizenManager().calculateMaxCitizens(); } else { diff --git a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/citizen/AdjustSkillCitizenMessage.java b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/citizen/AdjustSkillCitizenMessage.java index 97928641253..17f71795ac9 100644 --- a/src/main/java/com/minecolonies/coremod/network/messages/server/colony/citizen/AdjustSkillCitizenMessage.java +++ b/src/main/java/com/minecolonies/coremod/network/messages/server/colony/citizen/AdjustSkillCitizenMessage.java @@ -105,6 +105,6 @@ protected void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogic } citizenData.getCitizenSkillHandler().incrementLevel(skill, quantity); - citizenData.markDirty(); + citizenData.markDirty(0); } } diff --git a/src/main/java/com/minecolonies/coremod/permissions/package-info.java b/src/main/java/com/minecolonies/coremod/permissions/package-info.java deleted file mode 100755 index 39ea1eef9cd..00000000000 --- a/src/main/java/com/minecolonies/coremod/permissions/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Manages Permissions of the world. - */ -package com.minecolonies.coremod.permissions; diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/BuilderIgnorePlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/BuilderIgnorePlacementHandler.java new file mode 100644 index 00000000000..0c38701e40d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/BuilderIgnorePlacementHandler.java @@ -0,0 +1,75 @@ +package com.minecolonies.coremod.placementhandlers; + +import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler; +import com.ldtteam.structurize.util.BlockUtils; +import com.ldtteam.structurize.util.PlacementSettings; +import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.WorldUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.StructureBlock; +import net.minecraft.world.level.block.StructureVoidBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +import static com.ldtteam.structurize.placement.handlers.placement.PlacementHandlers.handleTileEntityPlacement; + +/** + * Handler for some specific blocks that we want only to paste/cost in the complete mode. + */ +public class BuilderIgnorePlacementHandler implements IPlacementHandler +{ + @Override + public boolean canHandle(@NotNull final Level world, @NotNull final BlockPos pos, @NotNull final BlockState blockState) + { + return blockState.getBlock() instanceof StructureBlock || blockState.getBlock() instanceof StructureVoidBlock; + } + + @Override + public ActionProcessingResult handle( + @NotNull final Level world, + @NotNull final BlockPos pos, + @NotNull final BlockState blockState, + @Nullable final CompoundTag tileEntityData, + final boolean complete, + final BlockPos centerPos, + final PlacementSettings settings) + { + if (complete) + { + WorldUtil.setBlockState(world, pos, blockState, com.ldtteam.structurize.api.util.constant.Constants.UPDATE_FLAG); + if (tileEntityData != null) + { + try + { + handleTileEntityPlacement(tileEntityData, world, pos, settings); + blockState.getBlock().setPlacedBy(world, pos, blockState, null, BlockUtils.getItemStackFromBlockState(blockState)); + } + catch (final Exception ex) + { + Log.getLogger().warn("Unable to place TileEntity"); + } + } + return ActionProcessingResult.SUCCESS; + } + + return ActionProcessingResult.SUCCESS; + } + + @Override + public List getRequiredItems( + @NotNull final Level world, + @NotNull final BlockPos pos, + @NotNull final BlockState blockState, + @Nullable final CompoundTag tileEntityData, + final boolean complete) + { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/DoBlockPlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/DoBlockPlacementHandler.java index 249de9f0dca..4da9a7799fe 100644 --- a/src/main/java/com/minecolonies/coremod/placementhandlers/DoBlockPlacementHandler.java +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/DoBlockPlacementHandler.java @@ -11,6 +11,7 @@ import com.ldtteam.structurize.api.util.ItemStackUtils; import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler; import com.ldtteam.structurize.util.PlacementSettings; +import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.util.Log; import com.minecolonies.api.util.WorldUtil; import net.minecraft.core.BlockPos; @@ -35,7 +36,7 @@ public class DoBlockPlacementHandler implements IPlacementHandler @Override public boolean canHandle(@NotNull final Level world, @NotNull final BlockPos pos, @NotNull final BlockState blockState) { - return blockState.getBlock() instanceof IMateriallyTexturedBlock; + return blockState.getBlock() instanceof IMateriallyTexturedBlock && blockState.getBlock() != ModBlocks.blockRack; } @Override diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/FieldPlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/FieldPlacementHandler.java index 5a1a9922d06..65c0141108e 100644 --- a/src/main/java/com/minecolonies/coremod/placementhandlers/FieldPlacementHandler.java +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/FieldPlacementHandler.java @@ -2,22 +2,24 @@ import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler; import com.ldtteam.structurize.util.BlockUtils; +import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.blocks.ModBlocks; +import com.minecolonies.api.util.Log; import com.minecolonies.coremod.blocks.BlockScarecrow; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.DoorBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler.ActionProcessingResult; +import static com.ldtteam.structurize.placement.handlers.placement.PlacementHandlers.handleTileEntityPlacement; public class FieldPlacementHandler implements IPlacementHandler { @@ -34,7 +36,8 @@ public ActionProcessingResult handle( @NotNull BlockState blockState, @Nullable CompoundTag tileEntityData, boolean complete, - BlockPos centerPos) + BlockPos centerPos, + final PlacementSettings settings) { if (world.getBlockState(pos).getBlock() == ModBlocks.blockScarecrow) { @@ -47,6 +50,19 @@ public ActionProcessingResult handle( world.setBlock(pos.above(), blockState.setValue(DoorBlock.HALF, DoubleBlockHalf.UPPER), 3); } + if (tileEntityData != null) + { + try + { + handleTileEntityPlacement(tileEntityData, world, pos, settings); + blockState.getBlock().setPlacedBy(world, pos, blockState, null, BlockUtils.getItemStackFromBlockState(blockState)); + } + catch (final Exception ex) + { + Log.getLogger().warn("Unable to place TileEntity"); + } + } + return ActionProcessingResult.SUCCESS; } diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/InfestedBlocksPlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/InfestedBlocksPlacementHandler.java new file mode 100644 index 00000000000..81f28dbe8c2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/InfestedBlocksPlacementHandler.java @@ -0,0 +1,89 @@ +package com.minecolonies.coremod.placementhandlers; + +import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler; +import com.ldtteam.structurize.util.BlockUtils; +import com.ldtteam.structurize.util.PlacementSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.InfestedBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.ldtteam.structurize.api.util.constant.Constants.UPDATE_FLAG; + +/** + * Placement handler for replacing infested blocks with their non-infested variants. + */ +public class InfestedBlocksPlacementHandler implements IPlacementHandler +{ + @Override + public boolean canHandle(final Level world, final BlockPos pos, final BlockState blockState) + { + return blockState.getBlock() instanceof InfestedBlock; + } + + @Override + public ActionProcessingResult handle( + final Level world, + final BlockPos pos, + final BlockState blockState, + @Nullable final CompoundTag tileEntityData, + final boolean complete, + final BlockPos centerPos, + final PlacementSettings settings) + { + final BlockState expectedBlockState = getExpectedBlockState(blockState, complete); + if (expectedBlockState == null) + { + return ActionProcessingResult.PASS; + } + + if (world.getBlockState(pos).equals(expectedBlockState)) + { + return ActionProcessingResult.PASS; + } + + if (!world.setBlock(pos, expectedBlockState, UPDATE_FLAG)) + { + return ActionProcessingResult.DENY; + } + + return ActionProcessingResult.SUCCESS; + } + + /** + * Generates the correct block state for the placement. + * + * @param blockState the input block state. + * @param complete place it complete (with or without substitution blocks etc.). + * @return the new block state. + */ + @Nullable + private static BlockState getExpectedBlockState(final BlockState blockState, final boolean complete) + { + if (blockState.getBlock() instanceof InfestedBlock infestedBlock) + { + if (complete) + { + return blockState; + } + else + { + return infestedBlock.hostStateByInfested(blockState); + } + } + + return null; + } + + @Override + public List getRequiredItems(final Level world, final BlockPos pos, final BlockState blockState, @Nullable final CompoundTag tileEntityData, final boolean complete) + { + final BlockState expectedBlockState = getExpectedBlockState(blockState, complete); + return expectedBlockState != null ? List.of(BlockUtils.getItemStackFromBlockState(expectedBlockState)) : List.of(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/JigsawPlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/JigsawPlacementHandler.java new file mode 100644 index 00000000000..1a873f533cb --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/JigsawPlacementHandler.java @@ -0,0 +1,135 @@ +package com.minecolonies.coremod.placementhandlers; + +import com.google.common.collect.ImmutableList; +import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler; +import com.ldtteam.structurize.util.BlockUtils; +import com.ldtteam.structurize.util.PlacementSettings; +import com.minecolonies.api.util.Log; +import com.minecolonies.api.util.WorldUtil; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.arguments.blocks.BlockStateParser; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.JigsawBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +import static com.ldtteam.structurize.placement.handlers.placement.PlacementHandlers.handleTileEntityPlacement; + +/** + * Handler for some specific blocks that we want only to paste/cost in the complete mode. + */ +public class JigsawPlacementHandler implements IPlacementHandler +{ + @Override + public boolean canHandle(@NotNull final Level world, @NotNull final BlockPos pos, @NotNull final BlockState blockState) + { + return blockState.getBlock() instanceof JigsawBlock; + } + + @Override + public ActionProcessingResult handle( + @NotNull final Level world, + @NotNull final BlockPos pos, + @NotNull final BlockState blockState, + @Nullable final CompoundTag tileEntityData, + final boolean complete, + final BlockPos centerPos, + final PlacementSettings settings) + { + if (complete) + { + WorldUtil.setBlockState(world, pos, blockState, com.ldtteam.structurize.api.util.constant.Constants.UPDATE_FLAG); + if (tileEntityData != null) + { + try + { + handleTileEntityPlacement(tileEntityData, world, pos, settings); + blockState.getBlock().setPlacedBy(world, pos, blockState, null, BlockUtils.getItemStackFromBlockState(blockState)); + } + catch (final Exception ex) + { + Log.getLogger().warn("Unable to place TileEntity"); + } + } + return ActionProcessingResult.SUCCESS; + } + + if (tileEntityData != null && tileEntityData.contains("final_state")) + { + final String stateString = tileEntityData.getString("final_state"); + + BlockState finalState = Blocks.AIR.defaultBlockState(); + + try + { + BlockStateParser.BlockResult stateParser = BlockStateParser.parseForBlock(Registry.BLOCK, stateString, false); + BlockState resultState = stateParser.blockState(); + if (resultState != null) + { + finalState = resultState; + } + } + catch (CommandSyntaxException commandsyntaxexception) + { + Log.getLogger().warn("Unable to place Jigsaw"); + } + + if (finalState.getBlock() == Blocks.STRUCTURE_VOID) + { + return ActionProcessingResult.SUCCESS; + } + + WorldUtil.setBlockState(world, pos, finalState, com.ldtteam.structurize.api.util.constant.Constants.UPDATE_FLAG); + } + + return ActionProcessingResult.SUCCESS; + } + + @Override + public List getRequiredItems( + @NotNull final Level world, + @NotNull final BlockPos pos, + @NotNull final BlockState blockState, + @Nullable final CompoundTag tileEntityData, + final boolean complete) + { + if (complete) + { + return ImmutableList.of(new ItemStack(Blocks.JIGSAW)); + } + + final String stateString = tileEntityData.getString("final_state"); + + BlockState finalState = Blocks.AIR.defaultBlockState(); + + try + { + BlockStateParser.BlockResult stateParser = BlockStateParser.parseForBlock(Registry.BLOCK, stateString, true); + BlockState resultState = stateParser.blockState(); + if (resultState != null) + { + finalState = resultState; + } + } + catch (CommandSyntaxException commandsyntaxexception) + { + Log.getLogger().warn("Unable to place Jigsaw"); + } + + if (finalState.getBlock() == Blocks.AIR || finalState.getBlock() == Blocks.STRUCTURE_VOID) + { + return Collections.emptyList(); + } + + return ImmutableList.of(BlockUtils.getItemStackFromBlockState(finalState)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/PlacementHandlerInitializer.java b/src/main/java/com/minecolonies/coremod/placementhandlers/PlacementHandlerInitializer.java index 81d8fefc137..5a7801587f6 100644 --- a/src/main/java/com/minecolonies/coremod/placementhandlers/PlacementHandlerInitializer.java +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/PlacementHandlerInitializer.java @@ -20,6 +20,8 @@ private PlacementHandlerInitializer() public static void initHandlers() { PlacementHandlers.add(new GeneralBlockPlacementHandler(), PlacementHandlers.GeneralBlockPlacementHandler.class); + PlacementHandlers.add(new JigsawPlacementHandler()); + PlacementHandlers.add(new BuilderIgnorePlacementHandler()); PlacementHandlers.add(new DoBlockPlacementHandler()); PlacementHandlers.add(new DoDoorBlockPlacementHandler()); PlacementHandlers.add(new BarracksTowerHandler()); @@ -33,5 +35,6 @@ public static void initHandlers() PlacementHandlers.add(new NetherrackPlacementHandler()); PlacementHandlers.add(new LecternPlacementHandler()); PlacementHandlers.add(new HutPlacementHandler()); + PlacementHandlers.add(new InfestedBlocksPlacementHandler()); } } diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/RackPlacementHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/RackPlacementHandler.java index 70a993693b1..0e482e57fa4 100644 --- a/src/main/java/com/minecolonies/coremod/placementhandlers/RackPlacementHandler.java +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/RackPlacementHandler.java @@ -6,14 +6,10 @@ import com.ldtteam.structurize.util.BlockUtils; import com.ldtteam.structurize.util.PlacementSettings; import com.minecolonies.api.blocks.ModBlocks; -import com.minecolonies.api.tileentities.TileEntityRack; import com.minecolonies.coremod.blocks.BlockMinecoloniesRack; -import com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingWareHouse; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; @@ -25,7 +21,6 @@ import static com.ldtteam.structurize.placement.handlers.placement.PlacementHandlers.handleTileEntityPlacement; import static com.minecolonies.api.util.constant.Constants.UPDATE_FLAG; -import com.ldtteam.structurize.placement.handlers.placement.IPlacementHandler.ActionProcessingResult; public class RackPlacementHandler implements IPlacementHandler { @@ -55,13 +50,6 @@ public ActionProcessingResult handle( { handleTileEntityPlacement(tileEntityData, world, pos, settings); } - - final BlockEntity entity = world.getBlockEntity(pos); - if (entity instanceof TileEntityRack && !((TileEntityRack) entity).isSingle() && ((TileEntityRack) entity).getOtherChest() != null) - { - ((TileEntityRack) entity).updateBlockState(); - } - return ActionProcessingResult.SUCCESS; } @@ -74,8 +62,12 @@ public List getRequiredItems( final boolean complete) { final List itemList = new ArrayList<>(); - itemList.add(BlockUtils.getItemStackFromBlockState(blockState)); + if (world.getBlockState(pos).getBlock() == ModBlocks.blockRack && !complete) + { + return itemList; + } + itemList.add(BlockUtils.getItemStackFromBlockState(blockState)); for (final ItemStack stack : PlacementHandlers.getItemsFromTileEntity(tileEntityData, blockState)) { if (!ItemStackUtils.isEmpty(stack)) diff --git a/src/main/java/com/minecolonies/coremod/placementhandlers/main/SurvivalHandler.java b/src/main/java/com/minecolonies/coremod/placementhandlers/main/SurvivalHandler.java index 76fdb744aaf..c49807034ff 100644 --- a/src/main/java/com/minecolonies/coremod/placementhandlers/main/SurvivalHandler.java +++ b/src/main/java/com/minecolonies/coremod/placementhandlers/main/SurvivalHandler.java @@ -5,40 +5,55 @@ import com.ldtteam.structurize.storage.ISurvivalBlueprintHandler; import com.ldtteam.structurize.storage.StructurePacks; import com.ldtteam.structurize.util.PlacementSettings; +import com.minecolonies.api.IMinecoloniesAPI; import com.minecolonies.api.advancements.AdvancementTriggers; import com.minecolonies.api.blocks.AbstractBlockHut; +import com.minecolonies.api.blocks.ModBlocks; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.IColonyTagCapability; import com.minecolonies.api.colony.IColonyView; import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.colony.buildings.IRSComponent; import com.minecolonies.api.colony.permissions.Action; +import com.minecolonies.api.colony.workorders.IWorkOrder; import com.minecolonies.api.util.*; import com.minecolonies.api.util.constant.Constants; import com.minecolonies.coremod.Network; import com.minecolonies.coremod.blocks.huts.BlockHutTownHall; +import com.minecolonies.coremod.colony.fields.PlantationField; import com.minecolonies.coremod.entity.ai.citizen.builder.ConstructionTapeHelper; import com.minecolonies.coremod.event.EventHandler; -import com.minecolonies.coremod.network.messages.client.OpenDecoWindowMessage; +import com.minecolonies.coremod.network.messages.client.OpenDecoBuildWindowMessage; +import com.minecolonies.coremod.network.messages.client.OpenPlantationFieldBuildWindowMessage; import com.minecolonies.coremod.util.AdvancementUtils; +import com.minecolonies.coremod.util.ColonyUtils; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Tuple; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.Nullable; +import java.util.HashSet; +import java.util.Set; + +import static com.minecolonies.api.colony.IColony.CLOSE_COLONY_CAP; import static com.minecolonies.api.util.constant.NbtTagConstants.*; -import static com.minecolonies.api.util.constant.TranslationConstants.NO_CUSTOM_BUILDINGS; -import static com.minecolonies.api.util.constant.TranslationConstants.WRONG_COLONY; +import static com.minecolonies.api.util.constant.TranslationConstants.*; /** * Minecolonies survival blueprint handler. @@ -62,23 +77,13 @@ public Component getDisplayName() @OnlyIn(Dist.CLIENT) public boolean canHandle(final Blueprint blueprint, final ClientLevel clientLevel, final Player player, final BlockPos blockPos, final PlacementSettings placementSettings) { - if (blueprint.getBlockState(blueprint.getPrimaryBlockOffset()).getBlock() instanceof BlockHutTownHall) - { - return true; - } - - final IColonyView colonyView = IColonyManager.getInstance().getClosestColonyView(clientLevel, blockPos); - if (colonyView == null) + if (IMinecoloniesAPI.getInstance().getConfig().getServer().blueprintBuildMode.get()) { - return false; + final IColonyView colonyView = IColonyManager.getInstance().getClosestColonyView(clientLevel, blockPos); + return colonyView != null; } - if (!colonyView.getPermissions().hasPermission(player, Action.ACCESS_HUTS)) - { - return false; - } - - return colonyView.isCoordInColony(clientLevel, blockPos); + return true; } @Override @@ -92,19 +97,65 @@ public void handle( final BlockPos blockPos, final PlacementSettings placementSettings) { + if (blueprint == null) + { + // This can happen if the file didnt finish synching with the server from the client, or something went wrong when synching (package dropped, etc). + MessageUtils.format(NO_CUSTOM_BUILDINGS).sendTo(player); + SoundUtils.playErrorSound(player, player.blockPosition()); + return; + } + blueprint.rotateWithMirror(placementSettings.rotation, placementSettings.mirror == Mirror.NONE ? Mirror.NONE : Mirror.FRONT_BACK, world); final BlockState anchor = blueprint.getBlockState(blueprint.getPrimaryBlockOffset()); + + final IColony tempColony = IColonyManager.getInstance().getClosestColony(world, blockPos); + final boolean isInColony = tempColony != null && tempColony.isCoordInColony(world, blockPos); + if (isInColony && !tempColony.getPermissions().hasPermission(player, Action.MANAGE_HUTS)) + { + MessageUtils.format(BP_NO_PERM).sendTo(player); + SoundUtils.playErrorSound(player, player.blockPosition()); + return; + } + + boolean successfulTownHallLocation = false; + if (anchor.getBlock() instanceof BlockHutTownHall) + { + if (isInColony || IColonyManager.getInstance().isFarEnoughFromColonies(world, blockPos)) + { + successfulTownHallLocation = true; + } + else + { + MessageUtils.format(TOWNHALL_TOO_CLOSE).sendTo(player); + SoundUtils.playErrorSound(player, player.blockPosition()); + return; + } + } + + if ((!isInColony || !isBlueprintInColony(blueprint, tempColony, blockPos)) && !successfulTownHallLocation) + { + MessageUtils.format(BP_OUTSIDE_COLONY).sendTo(player); + SoundUtils.playErrorSound(player, player.blockPosition()); + return; + } + + if (anchor.is(ModBlocks.blockPlantationField)) + { + Network.getNetwork() + .sendToPlayer(new OpenPlantationFieldBuildWindowMessage(blockPos, packName, blueprintPath, placementSettings.getRotation(), placementSettings.mirror), + (ServerPlayer) player); + } if (anchor.getBlock() instanceof AbstractBlockHut) { if (clientPack || !StructurePacks.hasPack(packName)) { - MessageUtils.format(NO_CUSTOM_BUILDINGS).sendTo(player); + MessageUtils.format(BUILDING_MISSING).sendTo(player); SoundUtils.playErrorSound(player, player.blockPosition()); return; } final ItemStack stack = new ItemStack(anchor.getBlock()); - if (anchor.getBlock() != null && EventHandler.onBlockHutPlaced(world, player, anchor.getBlock(), blockPos)) + if (EventHandler.onBlockHutPlaced(world, player, anchor.getBlock(), blockPos)) { final int slot = InventoryUtils.findFirstSlotInItemHandlerWith(new InvWrapper(player.getInventory()), anchor.getBlock()); if (slot == -1 && !player.isCreative()) @@ -113,34 +164,15 @@ public void handle( return; } - final IColony tempColony = IColonyManager.getInstance().getClosestColony(world, blockPos); - if (tempColony != null - && (!tempColony.getPermissions().hasPermission(player, Action.MANAGE_HUTS) - && !(anchor.getBlock() instanceof BlockHutTownHall - && IColonyManager.getInstance().isFarEnoughFromColonies(world, blockPos)))) - { - SoundUtils.playErrorSound(player, player.blockPosition()); - return; - } - final ItemStack inventoryStack = slot == -1 ? stack : player.getInventory().getItem(slot); final CompoundTag compound = inventoryStack.getTag(); - if (tempColony != null && compound != null && compound.contains(TAG_COLONY_ID) && tempColony.getID() != compound.getInt(TAG_COLONY_ID)) + if (compound != null && compound.contains(TAG_COLONY_ID) && tempColony != null && tempColony.getID() != compound.getInt(TAG_COLONY_ID)) { MessageUtils.format(WRONG_COLONY, compound.getInt(TAG_COLONY_ID)).sendTo(player); SoundUtils.playErrorSound(player, player.blockPosition()); return; } - if (tempColony != null) - { - AdvancementUtils.TriggerAdvancementPlayersForColony(tempColony, playerMP -> AdvancementTriggers.PLACE_STRUCTURE.trigger(playerMP, ((AbstractBlockHut) anchor.getBlock()).getBlueprintName())); - } - else - { - AdvancementTriggers.PLACE_STRUCTURE.trigger((ServerPlayer) player, ((AbstractBlockHut) anchor.getBlock()).getBlueprintName()); - } - world.destroyBlock(blockPos, true); world.setBlockAndUpdate(blockPos, anchor); ((AbstractBlockHut) anchor.getBlock()).onBlockPlacedByBuildTool(world, @@ -151,16 +183,27 @@ public void handle( placementSettings.getMirror() != Mirror.NONE, packName, blueprintPath); + MinecraftForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, blockPos), world.getBlockState(blockPos.below()), player)); + + if (tempColony == null) + { + // Townhall Placement + SoundUtils.playSuccessSound(player, player.blockPosition()); + return; + } + + AdvancementUtils.TriggerAdvancementPlayersForColony(tempColony, playerMP -> AdvancementTriggers.PLACE_STRUCTURE.trigger(playerMP, ((AbstractBlockHut) anchor.getBlock()).getBlueprintName())); + int level = 0; boolean finishedUpgrade = false; if (compound != null) { - if (compound.getAllKeys().contains(TAG_OTHER_LEVEL)) + if (compound.contains(TAG_OTHER_LEVEL)) { level = compound.getInt(TAG_OTHER_LEVEL); } - if (compound.getAllKeys().contains(TAG_PASTEABLE)) + if (compound.contains(TAG_PASTEABLE)) { String newBlueprintPath = blueprintPath; newBlueprintPath = newBlueprintPath.substring(0, newBlueprintPath.length() - 1); @@ -180,11 +223,11 @@ public void handle( { SoundUtils.playErrorSound(player, player.blockPosition()); Log.getLogger().error("BuildTool: building is null!", new Exception()); + return; } } else { - SoundUtils.playSuccessSound(player, player.blockPosition()); if (building.getTileEntity() != null) { final IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(world, blockPos); @@ -229,19 +272,58 @@ public void handle( int level = Utils.getBlueprintLevel(blueprint.getFileName()); if (level == -1) { - Network.getNetwork().sendToPlayer(new OpenDecoWindowMessage(blockPos, packName, blueprintPath, placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); + Network.getNetwork().sendToPlayer(new OpenDecoBuildWindowMessage(blockPos, packName, blueprintPath, placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); } else { - Network.getNetwork().sendToPlayer(new OpenDecoWindowMessage(blockPos, packName, blueprintPath.replace(level + ".blueprint", "1.blueprint"), placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); + Network.getNetwork().sendToPlayer(new OpenDecoBuildWindowMessage(blockPos, packName, blueprintPath.replace(level + ".blueprint", "1.blueprint"), placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); } } else { - Network.getNetwork().sendToPlayer(new OpenDecoWindowMessage(blockPos, packName, blueprintPath, placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); + Network.getNetwork().sendToPlayer(new OpenDecoBuildWindowMessage(blockPos, packName, blueprintPath, placementSettings.getRotation(), placementSettings.mirror), (ServerPlayer) player); } } Log.getLogger().warn("Handling Survival Placement in Colony"); } + + /** + * Check if the blueprint is fully inside colony boundaries. + * @param blueprint the blueprint to check. + * @param colony the colony to check for. + * @param blockPos the position to check at. + * @return true if so. + */ + private boolean isBlueprintInColony(final Blueprint blueprint, final IColony colony, final BlockPos blockPos) + { + final Level world = colony.getWorld(); + final BlockPos zeroPos = blockPos.subtract(blueprint.getPrimaryBlockOffset()); + + final BlockPos pos1 = new BlockPos(zeroPos.getX(), zeroPos.getY(), zeroPos.getZ()); + final BlockPos pos2 = new BlockPos(zeroPos.getX() + blueprint.getSizeX() - 1, zeroPos.getY() + blueprint.getSizeY() - 1, zeroPos.getZ() + blueprint.getSizeZ() - 1); + + final int minX = Math.min(pos1.getX(), pos2.getX()) + 1; + final int maxX = Math.max(pos1.getX(), pos2.getX()); + + final int minZ = Math.min(pos1.getZ(), pos2.getZ()) + 1; + final int maxZ = Math.max(pos1.getZ(), pos2.getZ()); + + for (int x = minX; x < maxX; x += 16) + { + for (int z = minZ; z < maxZ; z += 16) + { + final int chunkX = x >> 4; + final int chunkZ = z >> 4; + final ChunkPos pos = new ChunkPos(chunkX, chunkZ); + + final IColonyTagCapability colonyCap = world.getChunk(pos.x, pos.z).getCapability(CLOSE_COLONY_CAP, null).orElseGet(null); + if (colonyCap == null || colonyCap.getOwningColony() != colony.getID()) + { + return false; + } + } + } + return true; + } } diff --git a/src/main/java/com/minecolonies/coremod/quests/QuestInstance.java b/src/main/java/com/minecolonies/coremod/quests/QuestInstance.java new file mode 100644 index 00000000000..20da22e1a84 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/QuestInstance.java @@ -0,0 +1,339 @@ +package com.minecolonies.coremod.quests; + +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.*; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static com.minecolonies.api.util.constant.NbtTagConstants.*; + +/** + * Instance of a specific quest type + */ +public class QuestInstance implements IQuestInstance +{ + /** + * Colony reference + */ + private final IColony colony; + + /** + * The id of this quest + */ + private ResourceLocation questTemplateID; + + /** + * Quest giver. + */ + private int questGiver = Integer.MIN_VALUE; + + /** + * Quest giver. + */ + private final List questParticipants = new ArrayList<>(); + + /** + * The day the quest was assigned to the colony. + */ + private int assignmentStart; + + /** + * Current objective progress. + */ + private int objectiveProgress = 0; + + /** + * Tracking data of the currently active objective. + */ + private IObjectiveInstance currentObjectiveInstance = null; + + /** + * The player that accepted this. + */ + private UUID assignedPlayer = null; + + /** + * Create a new colony quest. + * @param questTemplateID the global id of the quest. + * @param colony the colony it belongs to. + * @param triggerReturnData the trigger return data that made this quest available. + */ + protected QuestInstance(final ResourceLocation questTemplateID, final IColony colony, final List> triggerReturnData) + { + this.colony = colony; + this.questTemplateID = questTemplateID; + this.assignmentStart = colony.getDay(); + + for (final ITriggerReturnData data : triggerReturnData) + { + if (data.getContent() instanceof IQuestGiver && questGiver == Integer.MIN_VALUE) + { + questGiver = ((ICitizenData) data.getContent()).getId(); + ((ICitizenData) data.getContent()).assignQuest(this); + } + else if (data.getContent() instanceof IQuestParticipant) + { + questParticipants.add(((ICitizenData) data.getContent()).getId()); + ((ICitizenData) data.getContent()).addQuestParticipation(this); + } + } + IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID).getObjective(this.objectiveProgress).startObjective(this); + } + + /** + * Create an empty colony quest obj to deserialize the data from. + * @param colony the colony it is assigned to. + */ + public QuestInstance(final IColony colony) + { + this.colony = colony; + } + + public IColony getColony() + { + return colony; + } + + @Override + public UUID getAssignedPlayer() + { + return assignedPlayer; + } + + @Override + public void onStart(final Player player, final IColony colony) + { + // Reset quest timeout on acceptance. + assignmentStart = colony.getDay(); + assignedPlayer = player.getUUID(); + colony.getQuestManager().attemptAcceptQuest(this.getId(), player); + // activeEffects.addAll(type.createEffectsFor(this)); + } + + @Override + public IQuestGiver getQuestGiver() + { + return colony.getCitizenManager().getCivilian(questGiver); + } + + @Override + public int getQuestGiverId() + { + return questGiver; + } + + @Override + public boolean isValid(final IColony colony) + { + if (questGiver == Integer.MIN_VALUE || colony.getCitizenManager().getCivilian(questGiver) == null ) + { + return false; + } + + for (final int participant : questParticipants) + { + if (colony.getCitizenManager().getCivilian(participant) == null) + { + return false; + } + } + return colony.getDay() - assignmentStart < IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID).getQuestTimeout(); + } + + @Override + public ResourceLocation getId() + { + return questTemplateID; + } + + @Override + public void onDeletion() + { + if (questGiver != Integer.MIN_VALUE && colony.getCitizenManager().getCivilian(questGiver) != null) + { + colony.getCitizenManager().getCivilian(questGiver).onQuestDeletion(this.getId()); + } + + for (final int participant : questParticipants) + { + if (colony.getCitizenManager().getCivilian(participant) != null) + { + colony.getCitizenManager().getCivilian(participant).onQuestDeletion(this.getId()); + } + } + + final IQuestTemplate instance = IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID); + if (instance != null && instance.getObjective(this.objectiveProgress) != null) + { + instance.getObjective(this.objectiveProgress).onCancellation(this); + } + colony.getQuestManager().deleteQuest(this.questTemplateID); + } + + @Override + public void advanceObjective(final Player player) + { + this.advanceObjective(player, this.objectiveProgress + 1); + } + + @Override + public void onWorldLoad() + { + if (currentObjectiveInstance != null) + { + IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID).getObjective(this.objectiveProgress).onWorldLoad(this); + } + } + + @Override + public IObjectiveInstance advanceObjective(final Player player, final int nextObjective) + { + final IQuestTemplate questData = IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID); + final IQuestObjectiveTemplate questObjectiveTemplate = questData.getObjective(this.objectiveProgress); + + // Always when advancing an objective, get the rewards from the current objective. + final List rewards = questObjectiveTemplate.getRewardUnlocks(); + if(!rewards.isEmpty()) + { + questData.unlockQuestRewards(colony, player, this, rewards); + } + + colony.markDirty(); + if (nextObjective == -1) + { + this.onCompletion(); + return null; + } + + if (this.objectiveProgress == 0) + { + this.onStart(player, getColony()); + } + this.objectiveProgress = nextObjective; + if (this.objectiveProgress >= questData.getObjectiveCount()) + { + this.onCompletion(); + return null; + } + currentObjectiveInstance = questData.getObjective(this.objectiveProgress).startObjective(this); + return currentObjectiveInstance; + } + + @Override + public void onCompletion() + { + colony.getQuestManager().completeQuest(this.getId()); + final ICitizenData questGiverData = colony.getCitizenManager().getCivilian(questGiver); + if (questGiverData != null) + { + questGiverData.onQuestCompletion(this.questTemplateID); + } + + for (final int partId : questParticipants) + { + final ICitizenData partData = colony.getCitizenManager().getCivilian(partId); + if (partData != null) + { + partData.onQuestCompletion(this.questTemplateID); + } + } + + final Player player = colony.getWorld().getPlayerByUUID(assignedPlayer); + if (player != null) + { + final IQuestTemplate questData = IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID); + player.sendSystemMessage(Component.translatable("com.minecolonies.coremod.quest.completed", questData.getName())); + } + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundNBT = new CompoundTag(); + compoundNBT.putString(TAG_ID, questTemplateID.toString()); + compoundNBT.putInt(TAG_ASSIGN_START, assignmentStart); + compoundNBT.putInt(TAG_PROGRESS, objectiveProgress); + compoundNBT.putInt(TAG_QUEST_GIVER, questGiver); + final ListTag participantList = new ListTag(); + for (final int citizenData : this.questParticipants) + { + participantList.add(IntTag.valueOf(citizenData)); + } + compoundNBT.put(TAG_PARTICIPANTS, participantList); + + if (currentObjectiveInstance != null) + { + compoundNBT.put(TAG_OBJECTIVE, this.currentObjectiveInstance.serializeNBT()); + } + + if (assignedPlayer != null) + { + compoundNBT.putUUID(TAG_PLAYER, assignedPlayer); + } + + return compoundNBT; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + questTemplateID = new ResourceLocation(nbt.getString(TAG_ID)); + assignmentStart = nbt.getInt(TAG_ASSIGN_START); + objectiveProgress = nbt.getInt(TAG_PROGRESS); + questGiver = nbt.getInt(TAG_QUEST_GIVER); + + final ListTag participantList = nbt.getList(TAG_PARTICIPANTS, Tag.TAG_INT); + for (final Tag tag : participantList) + { + questParticipants.add(((IntTag) tag).getAsInt()); + } + + if (nbt.contains(TAG_OBJECTIVE)) + { + final IObjectiveInstance data = IQuestManager.GLOBAL_SERVER_QUESTS.get(questTemplateID).getObjective(objectiveProgress).createObjectiveInstance(); + data.deserializeNBT(nbt.getCompound(TAG_OBJECTIVE)); + this.currentObjectiveInstance = data; + } + + if (nbt.contains(TAG_PLAYER)) + { + assignedPlayer = nbt.getUUID(TAG_PLAYER); + } + } + + @Override + public int getObjectiveIndex() + { + return objectiveProgress; + } + + @Override + public IQuestParticipant getParticipant(final int target) + { + return colony.getCitizenManager().getCivilian(questParticipants.get(target-1)); + } + + @Override + public List getParticipants() + { + return questParticipants; + } + + @Override + @Nullable + public IObjectiveInstance getCurrentObjectiveInstance() + { + return currentObjectiveInstance; + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/QuestManager.java b/src/main/java/com/minecolonies/coremod/quests/QuestManager.java new file mode 100644 index 00000000000..97331cdcc4d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/QuestManager.java @@ -0,0 +1,309 @@ +package com.minecolonies.coremod.quests; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.FinishedQuest; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestTemplate; +import com.minecolonies.api.quests.IQuestManager; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.*; + +import static com.minecolonies.api.util.constant.NbtTagConstants.*; + +/** + * Quest manager of each colony. + */ +public class QuestManager implements IQuestManager +{ + /** + * All quests that have been unlocked. + */ + private final Map availableQuests = new HashMap<>(); + + /** + * All quests that have been finished. And how often. + */ + private final Map finishedQuests = new HashMap<>(); + + /** + * All quests in progress. + */ + private final Map inProgressQuests = new HashMap<>(); + + /** + * Unlocked quest requirements. + */ + private final List unlockedQuests = new ArrayList<>(); + + /** + * Cached mapped results for the finished quests. + */ + private List finishedQuestsCache = null; + + /** + * Quest reputation. + */ + private double questReputation = 0; + + /** + * This manager's colony + */ + private final IColony colony; + + public QuestManager(final IColony colony) + { + this.colony = colony; + } + + @Override + public boolean attemptAcceptQuest(final ResourceLocation questID, final Player player) + { + final IQuestInstance quest = availableQuests.getOrDefault(questID, null); + if (quest == null || !quest.isValid(colony)) + { + return false; + } + this.inProgressQuests.put(questID, quest); + this.availableQuests.remove(questID); + return true; + } + + @Override + public void alterReputation(final double difference) + { + this.questReputation += difference; + } + + @Override + public double getReputation() + { + return this.questReputation; + } + + @Override + public void completeQuest(final ResourceLocation questId) + { + if (inProgressQuests.containsKey(questId)) + { + inProgressQuests.remove(questId); + finishedQuests.put(questId, finishedQuests.getOrDefault(questId, 0) + 1); + } + else if (availableQuests.containsKey(questId)) + { + // When a player short-cut quits a job without accepting it. (E.g. been there, done that options). + availableQuests.remove(questId); + finishedQuests.put(questId, finishedQuests.getOrDefault(questId, 0) + 1); + } + + finishedQuestsCache = null; + } + + @Override + public void onColonyTick() + { + for (final Map.Entry quest : GLOBAL_SERVER_QUESTS.entrySet()) + { + if (availableQuests.containsKey(quest.getKey()) + || inProgressQuests.containsKey(quest.getKey()) + || finishedQuests.getOrDefault(quest.getKey(), 0) >= quest.getValue().getMaxOccurrence()) + { + continue; + } + + boolean missingParent = false; + for (final ResourceLocation parent: quest.getValue().getParents()) + { + if (!finishedQuests.containsKey(parent)) + { + missingParent = true; + break; + } + } + + if (missingParent) + { + continue; + } + + final IQuestInstance colonyQuest = quest.getValue().attemptStart(colony); + if (colonyQuest != null) + { + this.availableQuests.put(quest.getKey(), colonyQuest); + } + } + + for (final Map.Entry availableQuest : new ArrayList<>(availableQuests.entrySet())) + { + if (!GLOBAL_SERVER_QUESTS.containsKey(availableQuest.getKey()) || !availableQuest.getValue().isValid(colony)) + { + availableQuest.getValue().onDeletion(); + this.availableQuests.remove(availableQuest.getKey()); + } + } + + for (final Map.Entry inProgressQuest : new ArrayList<>(inProgressQuests.entrySet())) + { + if (!GLOBAL_SERVER_QUESTS.containsKey(inProgressQuest.getKey()) || !inProgressQuest.getValue().isValid(colony)) + { + inProgressQuest.getValue().onDeletion(); + this.inProgressQuests.remove(inProgressQuest.getKey()); + } + } + } + + @Override + public void deleteQuest(final ResourceLocation questID) + { + this.availableQuests.remove(questID); + this.inProgressQuests.remove(questID); + } + + @Override + public IQuestInstance getAvailableOrInProgressQuest(final ResourceLocation questId) + { + return availableQuests.containsKey(questId) ? availableQuests.get(questId) : inProgressQuests.get(questId); + } + + @Override + public void onWorldLoad() + { + for (final IQuestInstance colonyQuest : inProgressQuests.values()) + { + colonyQuest.onWorldLoad(); + } + } + + @Override + public void unlockQuest(final ResourceLocation questId) + { + this.unlockedQuests.add(questId); + } + + @Override + public boolean isUnlocked(final ResourceLocation questId) + { + return this.unlockedQuests.contains(questId); + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag managerCompound = new CompoundTag(); + + final ListTag availableListTag = new ListTag(); + for (final Map.Entry available : availableQuests.entrySet()) + { + availableListTag.add(available.getValue().serializeNBT()); + } + managerCompound.put(TAG_AVAILABLE, availableListTag); + + final ListTag inProgressListTag = new ListTag(); + for (final Map.Entry inProgress : inProgressQuests.entrySet()) + { + inProgressListTag.add(inProgress.getValue().serializeNBT()); + } + managerCompound.put(TAG_IN_PROGRESS, inProgressListTag); + + final ListTag finishedListTag = new ListTag(); + for (final Map.Entry finished : finishedQuests.entrySet()) + { + final CompoundTag finishedTag = new CompoundTag(); + finishedTag.putString(TAG_ID, finished.getKey().toString()); + finishedTag.putInt(TAG_QUANTITY, finished.getValue()); + finishedListTag.add(finishedTag); + } + managerCompound.put(TAG_FINISHED, finishedListTag); + + final ListTag unlockedListTag = new ListTag(); + for (final ResourceLocation unlocked : unlockedQuests) + { + final CompoundTag unlockedTag = new CompoundTag(); + unlockedTag.putString(TAG_ID, unlocked.toString()); + unlockedListTag.add(unlockedTag); + } + managerCompound.put(TAG_UNLOCKED, unlockedListTag); + managerCompound.putDouble(TAG_REPUTATION, questReputation); + + return managerCompound; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + final Map localAvailableQuests = new HashMap<>(); + final ListTag availableListTag = nbt.getList(TAG_AVAILABLE, Tag.TAG_COMPOUND); + for (final Tag element : availableListTag) + { + final ResourceLocation key = new ResourceLocation(((CompoundTag) element).getString(TAG_ID)); + final IQuestInstance colonyQuest = availableQuests.containsKey(key) ? availableQuests.get(key) : new QuestInstance(colony); + colonyQuest.deserializeNBT((CompoundTag) element); + localAvailableQuests.put(colonyQuest.getId(), colonyQuest); + } + + this.availableQuests.clear(); + this.availableQuests.putAll(localAvailableQuests); + + final Map localInProgressQuests = new HashMap<>(); + final ListTag inProgressListTag = nbt.getList(TAG_IN_PROGRESS, Tag.TAG_COMPOUND); + for (final Tag element : inProgressListTag) + { + final ResourceLocation key = new ResourceLocation(((CompoundTag) element).getString(TAG_ID)); + final IQuestInstance colonyQuest = this.inProgressQuests.containsKey(key) ? this.inProgressQuests.get(key) : new QuestInstance(colony); + colonyQuest.deserializeNBT((CompoundTag) element); + localInProgressQuests.put(colonyQuest.getId(), colonyQuest); + } + + this.inProgressQuests.clear(); + this.inProgressQuests.putAll(localInProgressQuests); + + + this.finishedQuests.clear(); + final ListTag finishedListTag = nbt.getList(TAG_FINISHED, Tag.TAG_COMPOUND); + for (final Tag element : finishedListTag) + { + this.finishedQuests.put(new ResourceLocation(((CompoundTag) element).getString(TAG_ID)), ((CompoundTag) element).getInt(TAG_QUANTITY)); + } + finishedQuestsCache = null; + + this.unlockedQuests.clear(); + final ListTag unlockedListTag = nbt.getList(TAG_UNLOCKED, Tag.TAG_COMPOUND); + for (final Tag element : unlockedListTag) + { + this.unlockedQuests.add(new ResourceLocation(((CompoundTag) element).getString(TAG_ID))); + } + this.questReputation = nbt.getDouble(TAG_REPUTATION); + } + + @Override + public List getAvailableQuests() + { + return new ArrayList<>(availableQuests.values()); + } + + @Override + public List getInProgressQuests() + { + return new ArrayList<>(inProgressQuests.values()); + } + + @Override + public List getFinishedQuests() + { + if (finishedQuestsCache == null) + { + List data = new ArrayList<>(); + for (Map.Entry entry : finishedQuests.entrySet()) + { + IQuestTemplate template = GLOBAL_SERVER_QUESTS.get(entry.getKey()); + data.add(new FinishedQuest(template, entry.getValue())); + } + finishedQuestsCache = Collections.unmodifiableList(data); + } + return finishedQuestsCache; + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/QuestParsingConstants.java b/src/main/java/com/minecolonies/coremod/quests/QuestParsingConstants.java new file mode 100644 index 00000000000..d03d460d48f --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/QuestParsingConstants.java @@ -0,0 +1,29 @@ +package com.minecolonies.coremod.quests; + +/** + * Constants used for json parsing + */ +public class QuestParsingConstants +{ + public static final String QUEST_EFFECTS = "side-effects"; + public static final String QUEST_REWARDS = "rewards"; + public static final String QUEST_TRIGGERS = "triggers"; + public static final String QUEST_OBJECTIVES = "objectives"; + public static final String TRIGGER_ORDER = "triggerOrder"; + public static final String MAX_OCC = "max-occurrences"; + public static final String TYPE = "type"; + public static final String TIMEOUT = "timeout"; + public static final String NAME = "name"; + + public static final String ID = "id"; + public static final String QUEST_PARENTS = "parents"; + + /** + * Logical symbols for conditions + */ + public final static String OR = "||"; + public final static String AND = "&&"; + public final static String NOT = "!"; + public final static String BRACE_OPEN = "("; + public final static String BRACE_CLOSE = ")"; +} diff --git a/src/main/java/com/minecolonies/coremod/quests/QuestTemplate.java b/src/main/java/com/minecolonies/coremod/quests/QuestTemplate.java new file mode 100644 index 00000000000..898d44c4b3f --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/QuestTemplate.java @@ -0,0 +1,128 @@ +package com.minecolonies.coremod.quests; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.*; +import com.minecolonies.api.quests.IQuestTemplate; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.function.Function; + +/** + * Instance of a specific quest type + */ +public class QuestTemplate implements IQuestTemplate +{ + /** + * The unique id of this quest. + */ + private final ResourceLocation questID; + + /** + * List of parents to fulfill before this can start. + */ + private final List parents; + + /** + * List of quest triggers assigned to this quest data including the trigger order. + */ + private final Function>> questTriggerList; + + private final List objectives; + + private final List questRewards; + + + private final int maxOccurrence; + + private final Component name; + + /** + * How long the quest stays active/available. + */ + private final int questTimeout; + + /** + * Create new quest data. + * @param questID the id of the quest. + * @param name the name of the quest. + * @param parents the parent quests. + * @param maxOccurrence the max num of occurrences. + * @param questTriggerList the list of triggers. + * @param questObjectives the quest objectives. + * @param questTimeout the time until it times out. + * @param questRewards its rewards + */ + public QuestTemplate(final ResourceLocation questID, final Component name, + final List parents, + final int maxOccurrence, final Function>> questTriggerList, final List questObjectives, final int questTimeout, final List questRewards) + { + this.questID = questID; + this.name = name; + this.parents = parents; + this.questTriggerList = questTriggerList; + this.maxOccurrence = maxOccurrence; + this.objectives = questObjectives; + this.questTimeout = questTimeout; + this.questRewards = questRewards; + } + + @Override + public IQuestInstance attemptStart(final IColony colony) + { + final List> triggerReturnData = questTriggerList.apply(colony); + return (triggerReturnData == null || triggerReturnData.isEmpty()) ? null : new QuestInstance(questID, colony, triggerReturnData); + } + + @Override + public int getQuestTimeout() + { + return questTimeout; + } + + @Override + public int getMaxOccurrence() + { + return maxOccurrence; + } + + @Override + public void unlockQuestRewards(final IColony colony, final Player player, final IQuestInstance colonyQuest, final List unlockedRewards) + { + int index = 0; + for (final IQuestRewardTemplate questReward : questRewards) + { + if (unlockedRewards.contains(index)) + { + questReward.applyReward(colony, player, colonyQuest); + } + index+=1; + } + } + + @Override + public IQuestObjectiveTemplate getObjective(final int index) + { + return objectives.get(index); + } + + @Override + public int getObjectiveCount() + { + return objectives.size(); + } + + @Override + public Component getName() + { + return this.name; + } + + @Override + public List getParents() + { + return this.parents; + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/BreakBlockObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/BreakBlockObjectiveTemplate.java new file mode 100644 index 00000000000..82327cce38e --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/BreakBlockObjectiveTemplate.java @@ -0,0 +1,210 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.gson.JsonObject; +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.coremod.colony.Colony; +import com.minecolonies.coremod.event.QuestObjectiveEventHandler; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_QUANTITY; + +/** + * Objective type tracking block mining. + */ +public class BreakBlockObjectiveTemplate extends DialogueObjectiveTemplateTemplate implements IBreakBlockObjectiveTemplate +{ + /** + * Amount of blocks to mine. + */ + private final int blocksToMine; + + /** + * The block to mine. + */ + private final Block blockToMine; + + /** + * Next objective to go to, on fulfillment. -1 if final objective. + */ + private final int nextObjective; + + /** + * Create a new objective of this type. + * + * @param target the target citizen. + * @param blocksToMine the number of blocks to mine. + * @param blockToMine the block to mine. + * @param rewards the rewards this unlocks. + */ + public BreakBlockObjectiveTemplate(final int target, final int blocksToMine, final Block blockToMine, final int nextObjective, final List rewards) + { + super(target, buildDialogueTree(blockToMine), rewards); + this.blocksToMine = blocksToMine; + this.nextObjective = nextObjective; + this.blockToMine = blockToMine; + } + + @NotNull + private static DialogueElement buildDialogueTree(final Block blockToMine) + { + final Component text = Component.translatable("com.minecolonies.coremod.questobjectives.breakblock", blockToMine.getName()); + final AnswerElement answer1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + final AnswerElement answer2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.cancel"), + new IQuestDialogueAnswer.QuestCancellationDialogueAnswer()); + return new DialogueElement(text, List.of(answer1, answer2)); + } + + /** + * Parse the mine block objective from json. + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final Block block = ForgeRegistries.BLOCKS.getHolder(new ResourceLocation(details.get(BLOCK_KEY).getAsString())).get().get(); + final int nextObj = details.has(NEXT_OBJ_KEY) ? details.get(NEXT_OBJ_KEY).getAsInt() : -1; + + return new BreakBlockObjectiveTemplate(target, quantity, block, nextObj, parseRewards(jsonObject)); + } + + @Override + public IObjectiveInstance startObjective(final IQuestInstance colonyQuest) + { + super.startObjective(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addQuestMineObjectiveListener(this.blockToMine, colonyQuest.getAssignedPlayer(), colonyQuest); + } + return createObjectiveInstance(); + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + if (quest.getCurrentObjectiveInstance() instanceof BlockMiningProgressInstance progress) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.breakblock.progress", + progress.currentProgress, + blocksToMine, + blockToMine.getName().setStyle(style)); + } + return Component.empty(); + } + + @Override + public @NotNull IObjectiveInstance createObjectiveInstance() + { + return new BlockMiningProgressInstance(this); + } + + @Override + public void onCancellation(final IQuestInstance colonyQuest) + { + cleanupListener(colonyQuest); + } + + /** + * Cleanup the listener of this objective, + * @param colonyQuest the listener. + */ + private void cleanupListener(final IQuestInstance colonyQuest) + { + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.removeQuestMineObjectiveListener(this.blockToMine, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + @Override + public void onBlockBreak(final IObjectiveInstance blockMiningProgressData, final IQuestInstance colonyQuest, final Player player) + { + if (blockMiningProgressData.isFulfilled()) + { + return; + } + + ((BlockMiningProgressInstance) blockMiningProgressData).currentProgress++; + if (blockMiningProgressData.isFulfilled()) + { + cleanupListener(colonyQuest); + colonyQuest.advanceObjective(player, nextObjective); + } + } + + @Override + public void onWorldLoad(final IQuestInstance colonyQuest) + { + super.onWorldLoad(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addQuestMineObjectiveListener(this.blockToMine, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + /** + * Progress data of this objective. + */ + private static class BlockMiningProgressInstance implements IObjectiveInstance + { + private int currentProgress = 0; + + /** + * The template belonging to this progress instance. + */ + private final BreakBlockObjectiveTemplate template; + + /** + * Default constructor. + */ + public BlockMiningProgressInstance(final IQuestObjectiveTemplate template) + { + this.template = (BreakBlockObjectiveTemplate) template; + } + + @Override + public boolean isFulfilled() + { + return currentProgress >= template.blocksToMine; + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putInt(TAG_QUANTITY, currentProgress); + return compoundTag; + } + + @Override + public int getMissingQuantity() + { + return template.blocksToMine > currentProgress ? template.blocksToMine - currentProgress : 0; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.currentProgress = nbt.getInt(TAG_QUANTITY); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/BuildBuildingObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/BuildBuildingObjectiveTemplate.java new file mode 100644 index 00000000000..1e97b9cd723 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/BuildBuildingObjectiveTemplate.java @@ -0,0 +1,343 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.gson.JsonObject; +import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.buildings.IBuilding; +import com.minecolonies.api.colony.buildings.registry.BuildingEntry; +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.coremod.colony.Colony; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_QUANTITY; + +/** + * Objective type tracking build building. + */ +public class BuildBuildingObjectiveTemplate extends DialogueObjectiveTemplateTemplate implements IBuildingUpgradeObjectiveTemplate +{ + /** + * The building to level. + */ + private final BuildingEntry buildingEntry; + + /** + * Next objective to go to, on fulfillment. -1 if final objective. + */ + private final int nextObjective; + + /** + * Whether to consider existing buildings. + */ + private final boolean countExisting; + + /** + * Whether to consider existing buildings. The building level to reach. + */ + private final int lvl; + + /** + * The number of buildings to reach a level for. If 0, count cumulative. + */ + private final int qty; + + /** + * Create a new objective of this type. + * + * @param target the target citizen. + * @param qty the number of levels. + * @param buildingEntry the building to level. + * @param rewards the rewards this unlocks. + */ + public BuildBuildingObjectiveTemplate( + final int target, + final BuildingEntry buildingEntry, + final int lvl, + final int qty, + final boolean countExisting, + final int nextObjective, + final List rewards) + { + super(target, buildDialogueTree(buildingEntry, qty, lvl, countExisting), rewards); + this.lvl = lvl; + this.qty = qty; + this.countExisting = countExisting; + this.nextObjective = nextObjective; + this.buildingEntry = buildingEntry; + } + + @NotNull + private static DialogueElement buildDialogueTree(final BuildingEntry buildingEntry, final int qty, final int lvl, final boolean countExisting) + { + final Component text; + if (countExisting) + { + if (qty > 0) + { + text = + Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding.existing", lvl, qty, Component.translatable(buildingEntry.getTranslationKey())); + } + else + { + text = Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding.cumulative.existing", + lvl, + Component.translatable(buildingEntry.getTranslationKey())); + } + } + else + { + if (qty > 0) + { + text = Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding", qty, lvl, Component.translatable(buildingEntry.getTranslationKey())); + } + else + { + text = Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding.cumulative", lvl, Component.translatable(buildingEntry.getTranslationKey())); + } + } + + final AnswerElement answer1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + final AnswerElement answer2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.cancel"), + new IQuestDialogueAnswer.QuestCancellationDialogueAnswer()); + return new DialogueElement(text, List.of(answer1, answer2)); + } + + /** + * Parse the build building objective from json. + * + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + + final int target = details.get(TARGET_KEY).getAsInt(); + final BuildingEntry buildingEntry = IMinecoloniesAPI.getInstance().getBuildingRegistry().getValue(new ResourceLocation(details.get(BUILDING_KEY).getAsString())); + + final int level = details.get(LEVEL_KEY).getAsInt(); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final boolean countExisting = details.get(COUNT_EXIST_KEY).getAsBoolean(); + + final int nextObj = details.has(NEXT_OBJ_KEY) ? details.get(NEXT_OBJ_KEY).getAsInt() : -1; + + return new BuildBuildingObjectiveTemplate(target, buildingEntry, level, quantity, countExisting, nextObj, parseRewards(jsonObject)); + } + + @Override + public IObjectiveInstance startObjective(final IQuestInstance colonyQuest) + { + super.startObjective(colonyQuest); + + if (countExisting) + { + checkInitialObjectiveProgress(colonyQuest); + final IObjectiveInstance progressToNext = advanceIfFinished(colonyQuest); + if (progressToNext != null) + { + return progressToNext; + } + } + + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + colonyQuest.getColony().getBuildingManager().trackBuildingLevelUp(this.buildingEntry, colonyQuest); + } + return createObjectiveInstance(); + } + + /** + * Upon start, we want to check if the necessary buildings already exist. + * + * @param colonyQuest the quest instance. + */ + private void checkInitialObjectiveProgress(final IQuestInstance colonyQuest) + { + if (colonyQuest.getCurrentObjectiveInstance() instanceof BuildingProgressInstance progressInstance) + { + if (qty > 0) + { + for (final IBuilding building : colonyQuest.getColony().getBuildingManager().getBuildings().values()) + { + if (building.getBuildingType() == buildingEntry && building.getBuildingLevel() >= lvl) + { + progressInstance.currentProgress++; + } + } + } + else + { + for (final IBuilding building : colonyQuest.getColony().getBuildingManager().getBuildings().values()) + { + if (building.getBuildingType() == buildingEntry) + { + progressInstance.currentProgress += building.getBuildingLevel(); + } + } + } + } + } + + /** + * Advances the quest if finished, does the necessary cleanup as well. + * + * @param colonyQuest the quest instance. + * @return the next quest or null if not finished. + */ + private IObjectiveInstance advanceIfFinished(final IQuestInstance colonyQuest) + { + final IObjectiveInstance objective = colonyQuest.getCurrentObjectiveInstance(); + if (objective instanceof BuildingProgressInstance progressInstance && progressInstance.isFulfilled()) + { + cleanupListener(colonyQuest); + return colonyQuest.advanceObjective(colonyQuest.getColony().getWorld().getPlayerByUUID(colonyQuest.getAssignedPlayer()), nextObjective); + } + return null; + } + + /** + * Cleanup the listener of this objective, + * + * @param colonyQuest the listener. + */ + private void cleanupListener(final IQuestInstance colonyQuest) + { + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + colonyQuest.getColony().getBuildingManager().stopTrackingBuildingLevelUp(this.buildingEntry, colonyQuest); + } + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + if (quest.getCurrentObjectiveInstance() instanceof BuildingProgressInstance progress) + { + if (qty > 0) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding.progress", + Math.min(progress.currentProgress, qty), + qty, + Component.translatable(buildingEntry.getTranslationKey()).setStyle(style)); + } + else + { + return Component.translatable("com.minecolonies.coremod.questobjectives.buildbuilding.progress.cumulative", + Math.min(progress.currentProgress, lvl), + lvl, + Component.translatable(buildingEntry.getTranslationKey()).setStyle(style)); + } + } + return Component.empty(); + } + + @Override + public void onCancellation(final IQuestInstance colonyQuest) + { + cleanupListener(colonyQuest); + } + + @Override + public void onWorldLoad(final IQuestInstance colonyQuest) + { + super.onWorldLoad(colonyQuest); + if (colonyQuest.getColony() instanceof Colony colony && advanceIfFinished(colonyQuest) == null) + { + colony.getBuildingManager().trackBuildingLevelUp(this.buildingEntry, colonyQuest); + } + } + + @Override + public @NotNull IObjectiveInstance createObjectiveInstance() + { + return new BuildingProgressInstance(this, 0); + } + + @Override + public void onBuildingUpgrade(final IObjectiveInstance progressData, final IQuestInstance colonyQuest, final int level) + { + if (progressData.isFulfilled()) + { + return; + } + + if (!(progressData instanceof BuildingProgressInstance buildingProgressInstance)) + { + return; + } + + if (qty > 0) + { + if (level >= lvl) + { + buildingProgressInstance.currentProgress++; + } + } + else + { + buildingProgressInstance.currentProgress++; + } + + advanceIfFinished(colonyQuest); + } + + /** + * Progress data of this objective. + */ + private static class BuildingProgressInstance implements IObjectiveInstance + { + /** + * The template belonging to this progress instance. + */ + private final BuildBuildingObjectiveTemplate template; + + /** + * The current progress towards the objective. + */ + private int currentProgress; + + public BuildingProgressInstance(final BuildBuildingObjectiveTemplate template, final int currentProgress) + { + this.template = template; + this.currentProgress = currentProgress; + } + + @Override + public boolean isFulfilled() + { + return template.qty > 0 ? currentProgress >= template.qty : currentProgress >= template.lvl; + } + + @Override + public int getMissingQuantity() + { + return 0; + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putInt(TAG_QUANTITY, currentProgress); + return compoundTag; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.currentProgress = nbt.getInt(TAG_QUANTITY); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/DeliveryObjectiveTemplateTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/DeliveryObjectiveTemplateTemplate.java new file mode 100644 index 00000000000..d4637bcc933 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/DeliveryObjectiveTemplateTemplate.java @@ -0,0 +1,152 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.gson.JsonObject; +import com.minecolonies.api.quests.IQuestDeliveryObjective; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.api.util.InventoryUtils; +import com.minecolonies.api.util.ItemStackUtils; +import com.minecolonies.api.util.Log; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.nbt.TagParser; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Delivery type objective. + */ +public class DeliveryObjectiveTemplateTemplate extends DialogueObjectiveTemplateTemplate implements IQuestDeliveryObjective +{ + /** + * The stack to be delivered. + */ + private final ItemStack item; + + /** + * The quantity to be delivered. + */ + private final int quantity; + + /** + * Next objective to go to, on fulfillment. -1 if final objective. + */ + private final int nextObjective; + + /** + * Nbt mode. + */ + private final String nbtMode; + + /** + * The two dialogue options. + */ + private DialogueElement readyDialogueElement; + private DialogueElement waitingDialogueElement; + + /** + * Create a new delivery objective, + * + * @param target the target to receive the delivery. + * @param item the item to be delivered. + * @param quantity the quantity to be delivered. + * @param rewards the rewards this unlocks. + */ + public DeliveryObjectiveTemplateTemplate(final int target, final ItemStack item, final int quantity, final int nextObjective, final List rewards, final String nbtMode) + { + super(target, null, rewards); + this.item = item; + this.quantity = quantity; + this.nextObjective = nextObjective; + this.nbtMode = nbtMode; + this.buildDialogueTrees(); + } + + private void buildDialogueTrees() + { + final Component ready = Component.translatable("com.minecolonies.coremod.questobjectives.delivery.ready", item.getDisplayName()); + final AnswerElement ready1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.delivery.ready.give"), + new IQuestDialogueAnswer.NextObjectiveDialogueAnswer(this.nextObjective)); + final AnswerElement ready2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.delivery.ready.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + this.readyDialogueElement = new DialogueElement(ready, List.of(ready1, ready2)); + + final Component waiting = Component.translatable("com.minecolonies.coremod.questobjectives.delivery.waiting", item.getDisplayName()); + final AnswerElement waiting1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + final AnswerElement waiting2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.delivery.waiting.cancel"), + new IQuestDialogueAnswer.QuestCancellationDialogueAnswer()); + this.waitingDialogueElement = new DialogueElement(waiting, List.of(waiting1, waiting2)); + } + + /** + * Parse the dialogue objective from json. + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final ItemStack item = new ItemStack(ForgeRegistries.ITEMS.getHolder(new ResourceLocation(details.get(ITEM_KEY).getAsString())).get().get()); + if (details.has(NBT_KEY)) + { + try + { + item.setTag(TagParser.parseTag(GsonHelper.getAsString(details, NBT_KEY))); + } + catch (CommandSyntaxException e) + { + Log.getLogger().error("Unable to load itemstack nbt from json!"); + throw new RuntimeException(e); + } + } + final int nextObj = details.has(NEXT_OBJ_KEY) ? details.get(NEXT_OBJ_KEY).getAsInt() : -1; + final String nbtMode = details.has(NBT_MODE_KEY) ? details.get(NBT_MODE_KEY).getAsString() : ""; + return new DeliveryObjectiveTemplateTemplate(target, item, quantity, nextObj, parseRewards(jsonObject), nbtMode); + } + + @Override + public boolean hasItem(final Player player, final IQuestInstance colonyQuest) + { + return InventoryUtils.getItemCountInItemHandler(new InvWrapper(player.getInventory()), itemStack -> ItemStackUtils.compareItemStacksIgnoreStackSize(itemStack, item, !nbtMode.equals("any"), !nbtMode.equals("any"))) >= quantity; + } + + @Override + public boolean tryDiscountItem(final Player player, final IQuestInstance colonyQuest) + { + return InventoryUtils.attemptReduceStackInItemHandler(new InvWrapper(player.getInventory()), this.item, this.quantity, nbtMode.equals("any"), nbtMode.equals("any")); + } + + @Override + public DialogueElement getDialogueTree() + { + return waitingDialogueElement; + } + + @Override + public DialogueElement getReadyDialogueTree() + { + return readyDialogueElement; + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.delivery.progress", + 0, + quantity, + item.getDisplayName().plainCopy().setStyle(style)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/DialogueObjectiveTemplateTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/DialogueObjectiveTemplateTemplate.java new file mode 100644 index 00000000000..0a61463e954 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/DialogueObjectiveTemplateTemplate.java @@ -0,0 +1,129 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.ICitizen; +import com.minecolonies.api.quests.IDialogueObjectiveTemplate; +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.TARGET_KEY; +import static com.minecolonies.api.quests.QuestParseConstant.UNLOCKS_REWARDS_KEY; + +/** + * Dialogue type of objective. + */ +public class DialogueObjectiveTemplateTemplate implements IDialogueObjectiveTemplate +{ + /** + * The quest participant target of this dialogue (0 if questgiver). + */ + private final int target; + + /** + * The dialogue tree. + */ + private final DialogueElement dialogueTree; + + /** + * Reward unlocks from the objective. + */ + private final List rewardUnlocks; + + /** + * Create a new dialogue objective. + * @param target the target of the dialogue. + * @param dialogueTree the dialogue tree. + */ + public DialogueObjectiveTemplateTemplate(final int target, final DialogueElement dialogueTree, final List rewards) + { + this.target = target; + this.dialogueTree = dialogueTree; + this.rewardUnlocks = ImmutableList.copyOf(rewards); + } + + /** + * Getter for the dialogue tree. + * @return the tree. + */ + public DialogueElement getDialogueTree() + { + return dialogueTree; + } + + @Override + public List getRewardUnlocks() + { + return this.rewardUnlocks; + } + + /** + * Parse the dialogue objective from json. + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + return new DialogueObjectiveTemplateTemplate(jsonObject.get(TARGET_KEY).getAsInt(), + DialogueElement.parse(jsonObject), + parseRewards(jsonObject)); + } + + /** + * Parse the specific reward array from the objective. + * @param jsonObject the object to get it from. + * @return the unlocked rewards. + */ + public static List parseRewards(final JsonObject jsonObject) + { + if (!jsonObject.has(UNLOCKS_REWARDS_KEY)) + { + return Collections.emptyList(); + } + + final List rewardList = new ArrayList<>(); + final JsonArray jsonArray = jsonObject.get(UNLOCKS_REWARDS_KEY).getAsJsonArray(); + for (int i = 0; i < jsonArray.size(); i++) + { + rewardList.add(jsonArray.get(i).getAsInt()); + } + + return rewardList; + } + + @Override + public IObjectiveInstance startObjective(final IQuestInstance colonyQuest) + { + if (target == 0) + { + colonyQuest.getQuestGiver().openDialogue(colonyQuest, colonyQuest.getObjectiveIndex()); + } + else + { + colonyQuest.getParticipant(target).openDialogue(colonyQuest, colonyQuest.getObjectiveIndex()); + } + return null; + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + final ICitizen citizen = quest.getColony().getCitizen(target == 0 ? quest.getQuestGiverId() : target - 1); + if (citizen != null) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.answer.progress", citizen.getName()).setStyle(style); + } + else + { + return Component.empty(); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/IBreakBlockObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/IBreakBlockObjectiveTemplate.java new file mode 100644 index 00000000000..4c1119b818e --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/IBreakBlockObjectiveTemplate.java @@ -0,0 +1,19 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IObjectiveInstance; +import net.minecraft.world.entity.player.Player; + +/** + * Specific objective for block breaking. + */ +public interface IBreakBlockObjectiveTemplate +{ + /** + * Callback for block break event + * + * @param blockMiningProgressData the objective data. + * @param player the involved player. + */ + void onBlockBreak(IObjectiveInstance blockMiningProgressData, final IQuestInstance colonyQuest, final Player player); +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/IBuildingUpgradeObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/IBuildingUpgradeObjectiveTemplate.java new file mode 100644 index 00000000000..4c83cf3d494 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/IBuildingUpgradeObjectiveTemplate.java @@ -0,0 +1,19 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestInstance; + +/** + * Specific objective for building upgrade. + */ +public interface IBuildingUpgradeObjectiveTemplate +{ + /** + * Callback for block upgrade event + * + * @param progressData the objective data. + * @param colonyQuest the quest. + * @param level reached lvl. + */ + void onBuildingUpgrade(IObjectiveInstance progressData, final IQuestInstance colonyQuest, final int level); +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/IKillEntityObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/IKillEntityObjectiveTemplate.java new file mode 100644 index 00000000000..2d4f063048a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/IKillEntityObjectiveTemplate.java @@ -0,0 +1,19 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IObjectiveInstance; +import net.minecraft.world.entity.player.Player; + +/** + * Specific objective for entity killing. + */ +public interface IKillEntityObjectiveTemplate +{ + /** + * Callback for entity kill event + * + * @param progressData the objective data. + * @param player the involved player. + */ + void onEntityKill(IObjectiveInstance progressData, final IQuestInstance colonyQuest, final Player player); +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/IPlaceBlockObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/IPlaceBlockObjectiveTemplate.java new file mode 100644 index 00000000000..d6c6bcb0c8f --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/IPlaceBlockObjectiveTemplate.java @@ -0,0 +1,19 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestInstance; +import net.minecraft.world.entity.player.Player; + +/** + * Specific objective for block placing. + */ +public interface IPlaceBlockObjectiveTemplate +{ + /** + * Callback for block place event + * + * @param blockPlacementProgressData the objective data. + * @param player the involved player. + */ + void onBlockPlace(IObjectiveInstance blockPlacementProgressData, final IQuestInstance colonyQuest, final Player player); +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/KillEntityObjectiveTemplateTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/KillEntityObjectiveTemplateTemplate.java new file mode 100644 index 00000000000..b6c702f20b2 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/KillEntityObjectiveTemplateTemplate.java @@ -0,0 +1,206 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.gson.JsonObject; +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.coremod.colony.Colony; +import com.minecolonies.coremod.event.QuestObjectiveEventHandler; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_QUANTITY; + +/** + * Objective type entity killing mining. + */ +public class KillEntityObjectiveTemplateTemplate extends DialogueObjectiveTemplateTemplate implements IKillEntityObjectiveTemplate +{ + /** + * Amount of entities to kill. + */ + private final int entitiesToKill; + + /** + * The block to mine. + */ + private final EntityType entityToKill; + + /** + * Next objective to go to, on fulfillment. -1 if final objective. + */ + private final int nextObjective; + + /** + * Create a new objective of this type. + * @param target the target citizen. + * @param entitiesToKill the number of entities to kill. + * @param entityToKill the entity to kill. + */ + public KillEntityObjectiveTemplateTemplate(final int target, final int entitiesToKill, final EntityType entityToKill, final int nextObjective, final List rewards) + { + super(target, buildDialogueTree(entityToKill), rewards); + this.entitiesToKill = entitiesToKill; + this.nextObjective = nextObjective; + this.entityToKill = entityToKill; + } + + @NotNull + private static DialogueElement buildDialogueTree(final EntityType entityToKill) + { + final Component text = Component.translatable("com.minecolonies.coremod.questobjectives.kill", entityToKill.getDescription()); + final AnswerElement answer1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + final AnswerElement answer2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.cancel"), + new IQuestDialogueAnswer.QuestCancellationDialogueAnswer()); + return new DialogueElement(text, List.of(answer1, answer2)); + } + + /** + * Parse the mine block objective from json. + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final EntityType entityType = ForgeRegistries.ENTITY_TYPES.getHolder(new ResourceLocation(details.get(ENTITY_TYPE_KEY).getAsString())).get().get(); + final int nextObj = details.has(NEXT_OBJ_KEY) ? details.get(NEXT_OBJ_KEY).getAsInt() : -1; + + return new KillEntityObjectiveTemplateTemplate(target, quantity, entityType, nextObj, parseRewards(jsonObject)); + } + + @Override + public IObjectiveInstance startObjective(final IQuestInstance colonyQuest) + { + super.startObjective(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addKillQuestObjectiveListener(this.entityToKill, colonyQuest.getAssignedPlayer(), colonyQuest); + } + return createObjectiveInstance(); + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + if (quest.getCurrentObjectiveInstance() instanceof EntityKillProgressInstance progress) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.kill.progress", + progress.currentProgress, + entitiesToKill, + entityToKill.getDescription().plainCopy().setStyle(style)); + } + return Component.empty(); + } + + @Override + public @Nullable IObjectiveInstance createObjectiveInstance() + { + return new EntityKillProgressInstance(this); + } + + @Override + public void onCancellation(final IQuestInstance colonyQuest) + { + cleanupListener(colonyQuest); + } + + /** + * Cleanup the listener of this event. + * @param colonyQuest the quest instance it belongs to. + */ + private void cleanupListener(final IQuestInstance colonyQuest) + { + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.removeKillQuestObjectiveListener(this.entityToKill, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + @Override + public void onEntityKill(final IObjectiveInstance killProgressData, final IQuestInstance colonyQuest, final Player player) + { + if (killProgressData.isFulfilled()) + { + return; + } + + ((EntityKillProgressInstance) killProgressData).currentProgress++; + if (killProgressData.isFulfilled()) + { + cleanupListener(colonyQuest); + colonyQuest.advanceObjective(player, nextObjective); + } + } + + @Override + public void onWorldLoad(final IQuestInstance colonyQuest) + { + super.onWorldLoad(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addKillQuestObjectiveListener(this.entityToKill, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + /** + * Progress data of this objective. + */ + private static class EntityKillProgressInstance implements IObjectiveInstance + { + /** + * The template belonging to this progress instance. + */ + private final KillEntityObjectiveTemplateTemplate template; + + private int currentProgress = 0; + + public EntityKillProgressInstance(final KillEntityObjectiveTemplateTemplate template) + { + this.template = template; + } + + @Override + public boolean isFulfilled() + { + return currentProgress >= template.entitiesToKill; + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putInt(TAG_QUANTITY, currentProgress); + return compoundTag; + } + + @Override + public int getMissingQuantity() + { + return template.entitiesToKill > currentProgress ? template.entitiesToKill - currentProgress : 0; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.currentProgress = nbt.getInt(TAG_QUANTITY); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/objectives/PlaceBlockObjectiveTemplate.java b/src/main/java/com/minecolonies/coremod/quests/objectives/PlaceBlockObjectiveTemplate.java new file mode 100644 index 00000000000..80344455a3c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/objectives/PlaceBlockObjectiveTemplate.java @@ -0,0 +1,208 @@ +package com.minecolonies.coremod.quests.objectives; + +import com.google.gson.JsonObject; +import com.minecolonies.api.quests.IObjectiveInstance; +import com.minecolonies.api.quests.IQuestDialogueAnswer; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestObjectiveTemplate; +import com.minecolonies.coremod.colony.Colony; +import com.minecolonies.coremod.event.QuestObjectiveEventHandler; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; +import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_QUANTITY; + +/** + * Objective type tracking block placing. + */ +public class PlaceBlockObjectiveTemplate extends DialogueObjectiveTemplateTemplate implements IPlaceBlockObjectiveTemplate +{ + /** + * Amount of blocks to place. + */ + private final int qty; + + /** + * The block to place. + */ + private final Block blockToPlace; + + /** + * Next objective to go to, on fulfillment. -1 if final objective. + */ + private final int nextObjective; + + /** + * Create a new objective of this type. + * + * @param target the target citizen. + * @param qty the number of blocks to place. + * @param blockToPlace the block to place. + * @param rewards the rewards this unlocks. + */ + public PlaceBlockObjectiveTemplate(final int target, final int qty, final Block blockToPlace, final int nextObjective, final List rewards) + { + super(target, buildDialogueTree(blockToPlace), rewards); + this.qty = qty; + this.nextObjective = nextObjective; + this.blockToPlace = blockToPlace; + } + + @NotNull + private static DialogueElement buildDialogueTree(final Block blockToMine) + { + final Component text = Component.translatable("com.minecolonies.coremod.questobjectives.placeblock", blockToMine.getName()); + final AnswerElement answer1 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.later"), + new IQuestDialogueAnswer.CloseUIDialogueAnswer()); + final AnswerElement answer2 = new AnswerElement(Component.translatable("com.minecolonies.coremod.questobjectives.answer.cancel"), + new IQuestDialogueAnswer.QuestCancellationDialogueAnswer()); + return new DialogueElement(text, List.of(answer1, answer2)); + } + + /** + * Parse the mine block objective from json. + * @param jsonObject the json to parse it from. + * @return a new objective object. + */ + public static IQuestObjectiveTemplate createObjective(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final Block block = ForgeRegistries.BLOCKS.getHolder(new ResourceLocation(details.get(BLOCK_KEY).getAsString())).get().get(); + final int nextObj = details.has(NEXT_OBJ_KEY) ? details.get(NEXT_OBJ_KEY).getAsInt() : -1; + + return new PlaceBlockObjectiveTemplate(target, quantity, block, nextObj, parseRewards(jsonObject)); + } + + @Override + public IObjectiveInstance startObjective(final IQuestInstance colonyQuest) + { + super.startObjective(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addQuestPlaceObjectiveListener(this.blockToPlace, colonyQuest.getAssignedPlayer(), colonyQuest); + } + return createObjectiveInstance(); + } + + @Override + public Component getProgressText(final IQuestInstance quest, final Style style) + { + if (quest.getCurrentObjectiveInstance() instanceof BlockPlacementProgressInstance progress) + { + return Component.translatable("com.minecolonies.coremod.questobjectives.placeblock.progress", + progress.currentProgress, + blockToPlace, + blockToPlace.getName().setStyle(style)); + } + return Component.empty(); + } + + @Override + public @Nullable IObjectiveInstance createObjectiveInstance() + { + return new BlockPlacementProgressInstance(this); + } + + @Override + public void onCancellation(final IQuestInstance colonyQuest) + { + cleanupListener(colonyQuest); + } + + /** + * Cleanup the listener of this objective, + * @param colonyQuest the listener. + */ + private void cleanupListener(final IQuestInstance colonyQuest) + { + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.removeQuestPlaceBlockObjectiveListener(this.blockToPlace, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + @Override + public void onBlockPlace(final IObjectiveInstance blockPlacementProgressData, final IQuestInstance colonyQuest, final Player player) + { + if (blockPlacementProgressData.isFulfilled()) + { + return; + } + + ((BlockPlacementProgressInstance) blockPlacementProgressData).currentProgress++; + if (blockPlacementProgressData.isFulfilled()) + { + cleanupListener(colonyQuest); + colonyQuest.advanceObjective(player, nextObjective); + } + } + + @Override + public void onWorldLoad(final IQuestInstance colonyQuest) + { + super.onWorldLoad(colonyQuest); + if (colonyQuest.getColony() instanceof Colony) + { + // Only serverside cleanup. + QuestObjectiveEventHandler.addQuestPlaceObjectiveListener(this.blockToPlace, colonyQuest.getAssignedPlayer(), colonyQuest); + } + } + + /** + * Progress data of this objective. + */ + private static class BlockPlacementProgressInstance implements IObjectiveInstance + { + /** + * The template belonging to this progress instance. + */ + private final PlaceBlockObjectiveTemplate template; + + private int currentProgress = 0; + + public BlockPlacementProgressInstance(final PlaceBlockObjectiveTemplate template) + { + this.template = template; + } + + @Override + public boolean isFulfilled() + { + return currentProgress >= template.qty; + } + + @Override + public CompoundTag serializeNBT() + { + final CompoundTag compoundTag = new CompoundTag(); + compoundTag.putInt(TAG_QUANTITY, currentProgress); + return compoundTag; + } + + @Override + public int getMissingQuantity() + { + return template.qty > currentProgress ? template.qty - currentProgress : 0; + } + + @Override + public void deserializeNBT(final CompoundTag nbt) + { + this.currentProgress = nbt.getInt(TAG_QUANTITY); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/HappinessRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/HappinessRewardTemplate.java new file mode 100644 index 00000000000..49589cf95e9 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/HappinessRewardTemplate.java @@ -0,0 +1,72 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.entity.citizen.happiness.ExpirationBasedHappinessModifier; +import com.minecolonies.api.entity.citizen.happiness.StaticHappinessSupplier; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import com.minecolonies.coremod.colony.CitizenData; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.util.constant.HappinessConstants.QUEST; +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Happiness inducing reward. + */ +public class HappinessRewardTemplate implements IQuestRewardTemplate +{ + /** + * Happiness boost. + */ + private final int qty; + + /** + * Days to hold. + */ + private final int days; + + /** + * Target to affect. + */ + private final int target; + + /** + * Setup the research reward. + */ + public HappinessRewardTemplate(final int target, final int qty, final int days) + { + this.target = target; + this.qty = qty; + this.days = days; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int qty = details.get(QUANTITY_KEY).getAsInt(); + final int days = details.get(DAYS_KEY).getAsInt(); + + return new HappinessRewardTemplate(target, qty, days); + } + + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + if (this.target == 0) + { + ((CitizenData) colonyQuest.getQuestGiver()).getCitizenHappinessHandler().addModifier(new ExpirationBasedHappinessModifier(QUEST, 2.0, new StaticHappinessSupplier(qty), days)); + } + else + { + ((CitizenData) colonyQuest.getParticipant(this.target)).getCitizenHappinessHandler().addModifier(new ExpirationBasedHappinessModifier(QUEST, 2.0, new StaticHappinessSupplier(qty), days)); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/ItemRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/ItemRewardTemplate.java new file mode 100644 index 00000000000..2d461c9edb1 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/ItemRewardTemplate.java @@ -0,0 +1,67 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import com.minecolonies.api.util.Log; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.nbt.TagParser; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Item based quest reward. + */ +public class ItemRewardTemplate implements IQuestRewardTemplate +{ + /** + * The stack to give to the player. + */ + private final ItemStack item; + + /** + * Setup the item reward. + * @param item the item. + */ + public ItemRewardTemplate(final ItemStack item) + { + this.item = item; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int quantity = details.get(QUANTITY_KEY).getAsInt(); + final ItemStack item = new ItemStack(ForgeRegistries.ITEMS.getHolder(new ResourceLocation(details.get(ITEM_KEY).getAsString())).get().get()); + if (details.has(NBT_KEY)) + { + try + { + item.setTag(TagParser.parseTag(GsonHelper.getAsString(details, NBT_KEY))); + } + catch (CommandSyntaxException e) + { + Log.getLogger().error("Unable to load itemstack nbt from json!"); + throw new RuntimeException(e); + } + } + item.setCount(quantity); + return new ItemRewardTemplate(item); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + player.getInventory().add(item); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/QuestReputationRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/QuestReputationRewardTemplate.java new file mode 100644 index 00000000000..37c9ac82ea5 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/QuestReputationRewardTemplate.java @@ -0,0 +1,46 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Quest reputation reward template. + */ +public class QuestReputationRewardTemplate implements IQuestRewardTemplate +{ + /** + * The reputation quantity. + */ + private final double quantity; + + /** + * Setup the quest reputation reward. + */ + public QuestReputationRewardTemplate(final double quantity) + { + this.quantity = quantity; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final double qty = details.get(QUANTITY_KEY).getAsDouble(); + return new QuestReputationRewardTemplate(qty); + } + + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + colony.getQuestManager().alterReputation(this.quantity); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/RaidAdjustmentRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/RaidAdjustmentRewardTemplate.java new file mode 100644 index 00000000000..4578fb65015 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/RaidAdjustmentRewardTemplate.java @@ -0,0 +1,47 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.CHANGE_KEY; +import static com.minecolonies.api.quests.QuestParseConstant.DETAILS_KEY; + +/** + * Raid adjustment reward. + */ +public class RaidAdjustmentRewardTemplate implements IQuestRewardTemplate +{ + /** + * The raid adjustment quantity (can be negative). + */ + private final int qty; + + /** + * Setup the research reward. + * @param qty the research. + */ + public RaidAdjustmentRewardTemplate(final int qty) + { + this.qty = qty; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + final JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int change = details.get(CHANGE_KEY).getAsInt(); + return new RaidAdjustmentRewardTemplate(change); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + colony.getRaiderManager().setNightsSinceLastRaid(colony.getRaiderManager().getNightsSinceLastRaid() + qty); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/RelationshipRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/RelationshipRewardTemplate.java new file mode 100644 index 00000000000..d6b2d8f51c9 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/RelationshipRewardTemplate.java @@ -0,0 +1,110 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import com.minecolonies.api.util.Log; +import com.minecolonies.coremod.colony.CitizenData; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Relationship adjustment quest reward. + */ +public class RelationshipRewardTemplate implements IQuestRewardTemplate +{ + /** + * The first target citizen to apply things to. + */ + private final int target1; + + /** + * The second target citizen to apply things to. + */ + private final int target2; + + /** + * The relationship adjustment. + */ + private final String type; + + /** + * Setup the item reward. + */ + public RelationshipRewardTemplate(final int target1, final int target2, final String type) + { + this.target1 = target1; + this.target2 = target2; + this.type = type; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target1 = details.get(TARGET1_KEY).getAsInt(); + final int target2 = details.get(TARGET2_KEY).getAsInt(); + final String type = jsonObject.get(TYPE_KEY).getAsString(); + + return new RelationshipRewardTemplate(target1, target2, type); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + try + { + final ICitizenData citTarget1; + if (this.target1 == 0) + { + citTarget1 = ((CitizenData) colonyQuest.getQuestGiver()); + } + else + { + citTarget1 = ((CitizenData) colonyQuest.getParticipant(target1)); + } + + final ICitizenData citTarget2; + if (this.target2 == 0) + { + citTarget2 = ((CitizenData) colonyQuest.getQuestGiver()); + } + else + { + citTarget2 = ((CitizenData) colonyQuest.getParticipant(target2)); + } + + if (citTarget1 != null && citTarget2 != null) + { + if (type.equals("couple")) + { + if (citTarget1.getPartner() == null && citTarget2.getPartner() == null) + { + citTarget1.setPartner(citTarget2.getId()); + citTarget2.setPartner(citTarget1.getId()); + } + } + else + { + if (citTarget1.getPartner() != null && citTarget2.getPartner() != null + && citTarget1.getPartner().getId() == citTarget2.getId() + && citTarget2.getPartner().getId() == citTarget1.getId()) + { + citTarget1.setPartner(0); + citTarget2.setPartner(0); + } + } + } + } + catch (final Exception ex) + { + Log.getLogger().warn("Couldn't apply relationship quest reward. Probably one of the citizens is missing."); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/ResearchCompleteRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/ResearchCompleteRewardTemplate.java new file mode 100644 index 00000000000..5cdc8efe19c --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/ResearchCompleteRewardTemplate.java @@ -0,0 +1,49 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.DETAILS_KEY; +import static com.minecolonies.api.quests.QuestParseConstant.ID_KEY; + +/** + * Research complete based reward. + */ +public class ResearchCompleteRewardTemplate implements IQuestRewardTemplate +{ + /** + * The research to complete + */ + private final ResourceLocation research; + + /** + * Setup the research reward. + * @param research the research. + */ + public ResearchCompleteRewardTemplate(final ResourceLocation research) + { + this.research = research; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final ResourceLocation research = new ResourceLocation(details.get(ID_KEY).getAsString()); + return new ResearchCompleteRewardTemplate(research); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + colony.getResearchManager().getResearchTree().finishResearch(research); + colony.getResearchManager().markDirty(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/SkillRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/SkillRewardTemplate.java new file mode 100644 index 00000000000..d1919be4f26 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/SkillRewardTemplate.java @@ -0,0 +1,69 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.entity.citizen.Skill; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import com.minecolonies.coremod.colony.CitizenData; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Skill addition quest reward. + */ +public class SkillRewardTemplate implements IQuestRewardTemplate +{ + /** + * The skill to assign to a target citizen. + */ + private final Skill skill; + + /** + * The target citizen to apply things to. + */ + private final int target; + + /** + * The number of levels to apply. + */ + private final int qty; + + /** + * Setup the item reward. + */ + public SkillRewardTemplate(final Skill skill, final int target, final int qty) + { + this.skill = skill; + this.target = target; + this.qty = qty; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final int target = details.get(TARGET_KEY).getAsInt(); + final int qty = details.get(QUANTITY_KEY).getAsInt(); + final Skill skill = Skill.valueOf(details.get(SKILL_KEY).getAsString()); + + return new SkillRewardTemplate(skill, target, qty); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + if (target == 0) + { + ((CitizenData) colonyQuest.getQuestGiver()).getCitizenSkillHandler().incrementLevel(skill, qty); + } + else + { + ((CitizenData) colonyQuest.getParticipant(target)).getCitizenSkillHandler().incrementLevel(skill, qty); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/rewards/UnlockQuestRewardTemplate.java b/src/main/java/com/minecolonies/coremod/quests/rewards/UnlockQuestRewardTemplate.java new file mode 100644 index 00000000000..0a4737cdcef --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/rewards/UnlockQuestRewardTemplate.java @@ -0,0 +1,47 @@ +package com.minecolonies.coremod.quests.rewards; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.quests.IQuestRewardTemplate; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Quest unlock reward template. + */ +public class UnlockQuestRewardTemplate implements IQuestRewardTemplate +{ + /** + * The quest to unlock + */ + private final ResourceLocation questId; + + /** + * Setup the quest unlock reward. + */ + public UnlockQuestRewardTemplate(final ResourceLocation questId) + { + this.questId = questId; + } + + /** + * Create the reward. + * @param jsonObject the json to read from. + * @return the reward object. + */ + public static IQuestRewardTemplate createReward(final JsonObject jsonObject) + { + JsonObject details = jsonObject.getAsJsonObject(DETAILS_KEY); + final String id = details.get(ID_KEY).getAsString(); + + return new UnlockQuestRewardTemplate(new ResourceLocation(id)); + } + @Override + public void applyReward(final IColony colony, final Player player, final IQuestInstance colonyQuest) + { + colony.getQuestManager().unlockQuest(this.questId); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/sideeffects/ICitizenQuestSideEffect.java b/src/main/java/com/minecolonies/coremod/quests/sideeffects/ICitizenQuestSideEffect.java new file mode 100644 index 00000000000..f3dc856ac8f --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/sideeffects/ICitizenQuestSideEffect.java @@ -0,0 +1,23 @@ +package com.minecolonies.coremod.quests.sideeffects; + +import com.minecolonies.api.colony.ICitizenData; + +/** + * Citizen related quest effect + */ +public interface ICitizenQuestSideEffect extends IQuestSideEffect +{ + /** + * Gets the citizen data + * + * @return the affected citizen. + */ + ICitizenData getCitizenData(); + + /** + * Applies the effect to the given citizen + * + * @param data the citizen to apply it to. + */ + void applyToCitizen(final ICitizenData data); +} diff --git a/src/main/java/com/minecolonies/coremod/quests/sideeffects/IQuestSideEffect.java b/src/main/java/com/minecolonies/coremod/quests/sideeffects/IQuestSideEffect.java new file mode 100644 index 00000000000..2f271681278 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/sideeffects/IQuestSideEffect.java @@ -0,0 +1,48 @@ +package com.minecolonies.coremod.quests.sideeffects; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.util.INBTSerializable; + +public interface IQuestSideEffect extends INBTSerializable +{ + /** + * Gets the quest effects ID + * + * @return res location id + */ + ResourceLocation getID(); + + /** + * Called on quest start + */ + default void onStart() {} + + /** + * Called on quest completion + */ + default void onFinish() {} + + /** + * Called on quest cancellation + */ + default void onCancel() {} + + /** + * Deserialize the quest side effect. + * @param nbt the nbt to deserialize it from. + */ + default void deserializeNBT(final CompoundTag nbt) + { + // noop + } + + /** + * Serialize the side effect to nbt. + * @return the nbt to serialize it to. + */ + default CompoundTag serializeNBT() + { + return new CompoundTag(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/sideeffects/WorkerIdleSideEffect.java b/src/main/java/com/minecolonies/coremod/quests/sideeffects/WorkerIdleSideEffect.java new file mode 100644 index 00000000000..b5952f1f932 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/sideeffects/WorkerIdleSideEffect.java @@ -0,0 +1,70 @@ +package com.minecolonies.coremod.quests.sideeffects; + +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.quests.IQuestInstance; +import com.minecolonies.api.util.constant.Constants; +import net.minecraft.resources.ResourceLocation; + +/** + * Quest effect which sets the worker idle + */ +public class WorkerIdleSideEffect implements IQuestSideEffect, ICitizenQuestSideEffect +{ + public static final ResourceLocation ID = new ResourceLocation(Constants.MOD_ID, "workeridle"); + + /** + * Citizen data we applied to + */ + private ICitizenData citizenData; + + /** + * Quest this effect is in + */ + private final IQuestInstance quest; + + public WorkerIdleSideEffect(final IQuestInstance quest) + { + this.quest = quest; + } + + @Override + public ResourceLocation getID() + { + return ID; + } + + @Override + public void onStart() + { + //applyToCitizen(quest.getQuestGiver()); + } + + @Override + public void onFinish() + { + citizenData.setIdleDays(0); + } + + @Override + public void onCancel() + { + citizenData.setIdleDays(0); + } + + @Override + public ICitizenData getCitizenData() + { + return citizenData; + } + + @Override + public void applyToCitizen(final ICitizenData data) + { + citizenData = data; + /** + * The amount of idle days to set + */ + int idleDays = 1; + data.setIdleDays(idleDays); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/BooleanTriggerReturnData.java b/src/main/java/com/minecolonies/coremod/quests/triggers/BooleanTriggerReturnData.java new file mode 100644 index 00000000000..fa7ecd60db0 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/BooleanTriggerReturnData.java @@ -0,0 +1,35 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.minecolonies.api.quests.ITriggerReturnData; + +/** + * Wrapper around boolean for return data. + */ +public class BooleanTriggerReturnData implements ITriggerReturnData +{ + /** + * If positive match. + */ + private final boolean match; + + /** + * Create a new return data obj. + * @param match the match to return. + */ + public BooleanTriggerReturnData(final boolean match) + { + this.match = match; + } + + @Override + public boolean isPositive() + { + return this.match; + } + + @Override + public Boolean getContent() + { + return this.match; + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenQuestTriggerTemplate.java b/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenQuestTriggerTemplate.java new file mode 100644 index 00000000000..6432d5912a7 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenQuestTriggerTemplate.java @@ -0,0 +1,59 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; + +import java.util.Collections; +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.MATCH_ID; +import static com.minecolonies.api.quests.QuestParseConstant.STATE_ID; + +/** + * Random quest trigger. + */ +public class CitizenQuestTriggerTemplate implements IQuestTriggerTemplate +{ + /** + * The tag we are trying to match. + */ + public final JsonElement matchTag; + + /** + * Create a new state quest trigger. + * @param match the state to match. + */ + public CitizenQuestTriggerTemplate(final JsonElement match) + { + this.matchTag = match; + } + + /** + * Create a new trigger directly from json. + * @param questTriggerJson the json associated to this trigger. + */ + public static CitizenQuestTriggerTemplate createStateTrigger(final JsonObject questTriggerJson) + { + final JsonObject subObj = questTriggerJson.get(STATE_ID).getAsJsonObject(); + return new CitizenQuestTriggerTemplate(subObj.get(MATCH_ID)); + } + + @Override + public ITriggerReturnData canTriggerQuest(final IColony colony) + { + final List citizenDataList = colony.getCitizenManager().getCitizens(); + Collections.shuffle(citizenDataList); + for (final ICitizenData data : citizenDataList) + { + if (IQuestTriggerTemplate.matchNbt(data.serializeNBT(), matchTag)) + { + return new CitizenTriggerReturnData(data); + } + } + return new CitizenTriggerReturnData(null); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenTriggerReturnData.java b/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenTriggerReturnData.java new file mode 100644 index 00000000000..772d1992f49 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/CitizenTriggerReturnData.java @@ -0,0 +1,36 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.minecolonies.api.colony.ICitizenData; +import com.minecolonies.api.quests.ITriggerReturnData; + +/** + * Wrapper around a citizen id. + */ +public class CitizenTriggerReturnData implements ITriggerReturnData +{ + /** + * The citizen id or - max int if negative. + */ + private final ICitizenData match; + + /** + * Create a new return data obj. + * @param match citizen id. + */ + public CitizenTriggerReturnData(final ICitizenData match) + { + this.match = match; + } + + @Override + public boolean isPositive() + { + return this.match != null; + } + + @Override + public ICitizenData getContent() + { + return match; + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/QuestReputationTriggerTemplate.java b/src/main/java/com/minecolonies/coremod/quests/triggers/QuestReputationTriggerTemplate.java new file mode 100644 index 00000000000..2886e45f260 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/QuestReputationTriggerTemplate.java @@ -0,0 +1,43 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; + +import static com.minecolonies.api.quests.QuestParseConstant.QUANTITY_KEY; +import static com.minecolonies.api.quests.QuestParseConstant.REPUTATION_ID; + +/** + * Quest reputation quest trigger. + */ +public class QuestReputationTriggerTemplate implements IQuestTriggerTemplate +{ + /** + * Min quantity. + */ + private final double minQuantity; + + /** + * Create a new instance of this trigger. + */ + public QuestReputationTriggerTemplate(final double minQuantity) + { + this.minQuantity = minQuantity; + } + + /** + * Create a new trigger directly from json. + * @param jsonObj the json associated to this trigger. + */ + public static QuestReputationTriggerTemplate createQuestReputationTrigger(final JsonObject jsonObj) + { + return new QuestReputationTriggerTemplate(jsonObj.get(QUANTITY_KEY).getAsDouble()); + } + + @Override + public ITriggerReturnData canTriggerQuest(final IColony colony) + { + return new BooleanTriggerReturnData(colony.getQuestManager().getReputation() >= minQuantity); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/RandomQuestTriggerTemplate.java b/src/main/java/com/minecolonies/coremod/quests/triggers/RandomQuestTriggerTemplate.java new file mode 100644 index 00000000000..1faa6389783 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/RandomQuestTriggerTemplate.java @@ -0,0 +1,43 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; + +import static com.minecolonies.api.quests.QuestParseConstant.RARITY_ID; + +/** + * Random quest trigger. + */ +public class RandomQuestTriggerTemplate implements IQuestTriggerTemplate +{ + /** + * There is a 1 in oneInChance, chance of this quest to be triggered. + */ + private final int oneInChance; + + /** + * Create a new instance of this trigger. + * @param oneInChance the chance for this. + */ + public RandomQuestTriggerTemplate(final int oneInChance) + { + this.oneInChance = oneInChance; + } + + /** + * Create a new trigger directly from json. + * @param randomQuestTriggerJson the json associated to this trigger. + */ + public static RandomQuestTriggerTemplate createStateTrigger(final JsonObject randomQuestTriggerJson) + { + return new RandomQuestTriggerTemplate(randomQuestTriggerJson.get(RARITY_ID).getAsInt()); + } + + @Override + public ITriggerReturnData canTriggerQuest(final IColony colony) + { + return new BooleanTriggerReturnData(oneInChance > 0 && colony.getWorld().random.nextInt(oneInChance) < 1); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/StateQuestTriggerTemplate.java b/src/main/java/com/minecolonies/coremod/quests/triggers/StateQuestTriggerTemplate.java new file mode 100644 index 00000000000..7d198b6dc34 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/StateQuestTriggerTemplate.java @@ -0,0 +1,84 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; +import net.minecraft.nbt.*; + +import java.util.List; + +import static com.minecolonies.api.quests.QuestParseConstant.*; + +/** + * Random quest trigger. + */ +public class StateQuestTriggerTemplate implements IQuestTriggerTemplate +{ + /** + * Path of keys to the nbt we are trying to match, + */ + public final List nbtPath; + + /** + * The tag we are trying to match. + */ + public final JsonElement matchTag; + + /** + * How often we have to match. + */ + public final int matchCount; + + /** + * Create a new state quest trigger. + * @param paths the path to the state to match. + * @param match the state to match. + * @param count the number of matches we have to find. + */ + public StateQuestTriggerTemplate(final String[] paths, final JsonElement match, final int count) + { + this.nbtPath = List.of(paths); + this.matchTag = match; + this.matchCount = count; + } + + /** + * Create a new trigger directly from json. + * @param questTriggerJson the json associated to this trigger. + */ + public static StateQuestTriggerTemplate createStateTrigger(final JsonObject questTriggerJson) + { + final JsonObject subObj = questTriggerJson.get(STATE_ID).getAsJsonObject(); + return new StateQuestTriggerTemplate(subObj.get(PATH_ID).getAsString().split("/"), + subObj.get(MATCH_ID), + subObj.has(COUNT_ID) ? subObj.get(COUNT_ID).getAsInt() : 1); + + } + + @Override + public ITriggerReturnData canTriggerQuest(final IColony colony) + { + Tag subPathCompound = colony.getColonyTag(); + for (final String subPath : nbtPath) + { + if (subPathCompound instanceof CompoundTag && ((CompoundTag) subPathCompound).contains(subPath)) + { + subPathCompound = ((CompoundTag) subPathCompound).get(subPath); + } + else + { + return new BooleanTriggerReturnData(false); + } + } + + if (subPathCompound == null) + { + return new BooleanTriggerReturnData(false); + } + + + return new BooleanTriggerReturnData(IQuestTriggerTemplate.matchNbt(subPathCompound, matchTag, matchCount)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/quests/triggers/UnlockQuestTriggerTemplate.java b/src/main/java/com/minecolonies/coremod/quests/triggers/UnlockQuestTriggerTemplate.java new file mode 100644 index 00000000000..32c3c32000d --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/quests/triggers/UnlockQuestTriggerTemplate.java @@ -0,0 +1,42 @@ +package com.minecolonies.coremod.quests.triggers; + +import com.google.gson.JsonObject; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.quests.IQuestTriggerTemplate; +import com.minecolonies.api.quests.ITriggerReturnData; +import net.minecraft.resources.ResourceLocation; + +/** + * Unlock quest trigger. + */ +public class UnlockQuestTriggerTemplate implements IQuestTriggerTemplate +{ + /** + * Create a new instance of this trigger. + */ + public UnlockQuestTriggerTemplate() + { + + } + + /** + * Create a new trigger directly from json. + * @param ignoreJson the json associated to this trigger. + */ + public static UnlockQuestTriggerTemplate createUnlockTrigger(final JsonObject ignoreJson) + { + return new UnlockQuestTriggerTemplate(); + } + + @Override + public ITriggerReturnData canTriggerQuest(final IColony colony) + { + return new BooleanTriggerReturnData(false); + } + + @Override + public ITriggerReturnData canTriggerQuest(final ResourceLocation questId, final IColony colony) + { + return new BooleanTriggerReturnData(colony.getQuestManager().isUnlocked(questId)); + } +} diff --git a/src/main/java/com/minecolonies/coremod/recipes/FoodIngredient.java b/src/main/java/com/minecolonies/coremod/recipes/FoodIngredient.java index 876056ff100..a2e4c83472e 100644 --- a/src/main/java/com/minecolonies/coremod/recipes/FoodIngredient.java +++ b/src/main/java/com/minecolonies/coremod/recipes/FoodIngredient.java @@ -116,7 +116,7 @@ public FoodIngredient build() private boolean matchesFood(@NotNull final ItemStack stack) { - @NotNull final FoodProperties food = Objects.requireNonNull(stack.getItem().getFoodProperties()); + @NotNull final FoodProperties food = Objects.requireNonNull(stack.getItem().getFoodProperties(stack, null)); return minHealing.map(healing -> food.getNutrition() >= healing).orElse(true) && maxHealing.map(healing -> food.getNutrition() < healing).orElse(true) && minSaturation.map(saturation -> food.getSaturationModifier() >= saturation).orElse(true) && diff --git a/src/main/java/com/minecolonies/coremod/research/GlobalResearch.java b/src/main/java/com/minecolonies/coremod/research/GlobalResearch.java index 1634c530200..098a8600213 100644 --- a/src/main/java/com/minecolonies/coremod/research/GlobalResearch.java +++ b/src/main/java/com/minecolonies/coremod/research/GlobalResearch.java @@ -12,16 +12,13 @@ import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; import com.minecolonies.coremod.MineColonies; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.nbt.TagParser; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -305,10 +302,6 @@ public GlobalResearch(final ResourceLocation id, final ResourceLocation branch, this.textureIcon = iconTexture; } this.itemIcon = iconItemStack; - if (MinecoloniesAPIProxy.getInstance().getConfig().getServer().researchDebugLog.get()) - { - Log.getLogger().info("Statically assigned recipe [" + branch + "/" + id + "]"); - } } /** @@ -802,8 +795,8 @@ private void parseRequirements(final JsonObject researchJson) if(reqArrayElement.isJsonObject() && reqArrayElement.getAsJsonObject().has(RESEARCH_ITEM_NAME_PROP) && reqArrayElement.getAsJsonObject().get(RESEARCH_ITEM_NAME_PROP).isJsonPrimitive() && reqArrayElement.getAsJsonObject().get(RESEARCH_ITEM_NAME_PROP).getAsJsonPrimitive().isString()) { - final ItemStack itemStack = idToItemStack(reqArrayElement.getAsJsonObject().get(RESEARCH_ITEM_NAME_PROP).getAsString()); - final ItemStorage itemStorage = new ItemStorage(itemStack, false, !itemStack.hasTag()); + final ItemStack itemStack = ItemStackUtils.idToItemStack(reqArrayElement.getAsJsonObject().get(RESEARCH_ITEM_NAME_PROP).getAsString()); + final ItemStorage itemStorage = new ItemStorage(itemStack, false, !ItemStackUtils.hasTag(itemStack)); if(reqArrayElement.getAsJsonObject().has(RESEARCH_QUANTITY_PROP) && reqArrayElement.getAsJsonObject().get(RESEARCH_QUANTITY_PROP).isJsonPrimitive() && reqArrayElement.getAsJsonObject().get(RESEARCH_QUANTITY_PROP).getAsJsonPrimitive().isNumber()) { @@ -870,51 +863,6 @@ else if(reqArrayElement.isJsonObject() && reqArrayElement.getAsJsonObject().has( } } - /** - * Convert an Item string with NBT to an ItemStack - * @param itemData ie: minecraft:potion{Potion=minecraft:water} - * @return stack with any defined NBT - */ - private static ItemStack idToItemStack(final String itemData) - { - String itemId = itemData; - final int tagIndex = itemId.indexOf("{"); - final String tag = tagIndex > 0 ? itemId.substring(tagIndex) : null; - itemId = tagIndex > 0 ? itemId.substring(0, tagIndex) : itemId; - String[] split = itemId.split(":"); - if(split.length != 2) - { - if(split.length == 1) - { - final String[] tempArray ={"minecraft", split[0]}; - split = tempArray; - } - else - { - Log.getLogger().error("Unable to parse item definition: " + itemData); - } - } - final Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(split[0], split[1])); - final ItemStack stack = new ItemStack(item); - if (tag != null) - { - try - { - stack.setTag(TagParser.parseTag(tag)); - } - catch (CommandSyntaxException e1) - { - //Unable to parse tags, drop them. - Log.getLogger().error("Unable to parse item definition: " + itemData); - } - } - if (stack.isEmpty()) - { - Log.getLogger().warn("Parsed item definition returned empty: " + itemData); - } - return stack; - } - /** * Parses a JSON object for Research Alternate Building Requirements, and adds them to the requirements list. * @param requirementJson A validated JSON Object containing a RESEARCH_ALTERNATE_BUILDING_PROP diff --git a/src/main/java/com/minecolonies/coremod/research/GlobalResearchBranch.java b/src/main/java/com/minecolonies/coremod/research/GlobalResearchBranch.java index 891540da89d..30363fb2156 100644 --- a/src/main/java/com/minecolonies/coremod/research/GlobalResearchBranch.java +++ b/src/main/java/com/minecolonies/coremod/research/GlobalResearchBranch.java @@ -4,10 +4,8 @@ import com.minecolonies.api.research.IGlobalResearchBranch; import com.minecolonies.api.research.ResearchBranchType; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; import static com.minecolonies.api.research.util.ResearchConstants.BASE_RESEARCH_TIME; @@ -82,10 +80,16 @@ public class GlobalResearchBranch implements IGlobalResearchBranch public TranslatableContents getSubtitle(){return this.subtitle;} @Override - public int getBaseTime(final int depth){return (int)(BASE_RESEARCH_TIME * this.baseTime * Math.pow(2, depth - 1));} + public int getBaseTime(final int depth) + { + return (int)(BASE_RESEARCH_TIME * this.baseTime * Math.pow(2, depth - 1)); + } @Override - public double getHoursTime(final int depth){return (BASE_RESEARCH_TIME * this.baseTime * Math.pow(2, depth - 1)) / (BASE_RESEARCH_TIME * 2);} + public double getHoursTime(final int depth) + { + return (getBaseTime(depth) * 25.0) / 60 / 60; + } @Override public int getSortOrder(){return this.sortOrder;} diff --git a/src/main/java/com/minecolonies/coremod/research/GlobalResearchFactory.java b/src/main/java/com/minecolonies/coremod/research/GlobalResearchFactory.java index 1586294f69f..16a946ab6ae 100755 --- a/src/main/java/com/minecolonies/coremod/research/GlobalResearchFactory.java +++ b/src/main/java/com/minecolonies/coremod/research/GlobalResearchFactory.java @@ -10,6 +10,7 @@ import com.minecolonies.api.research.effects.registry.IResearchEffectRegistry; import com.minecolonies.api.research.factories.IGlobalResearchFactory; import com.minecolonies.api.research.registry.IResearchRequirementRegistry; +import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.NBTUtils; import com.minecolonies.api.util.constant.SerializationIdentifierConstants; import com.minecolonies.api.util.constant.TypeConstants; @@ -144,11 +145,11 @@ public IGlobalResearch deserialize(@NotNull final IFactoryController controller, { final ItemStack is = new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation(costParts[0], costParts[1]))); is.setCount(Integer.parseInt(costParts[2])); - if (compound.hasUUID(TAG_COST_NBT)) + if (compound.contains(TAG_COST_NBT)) { is.setTag(compound.getCompound(TAG_COST_NBT)); } - research.addCost(new ItemStorage(is, false, !is.hasTag())); + research.addCost(new ItemStorage(is, false, !ItemStackUtils.hasTag(is))); } }); NBTUtils.streamCompound(nbt.getList(TAG_REQS, Tag.TAG_COMPOUND)). diff --git a/src/main/java/com/minecolonies/coremod/research/LocalResearchTree.java b/src/main/java/com/minecolonies/coremod/research/LocalResearchTree.java index e4c6a33fce6..3cd23cbf00d 100644 --- a/src/main/java/com/minecolonies/coremod/research/LocalResearchTree.java +++ b/src/main/java/com/minecolonies/coremod/research/LocalResearchTree.java @@ -17,7 +17,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraftforge.items.wrapper.InvWrapper; -import org.jetbrains.annotations.NotNull; import java.util.*; @@ -137,7 +136,9 @@ public void attemptBeginResearch(final Player player, final IColony colony, fina .getResearch(research.getBranch(), research.getId()) .setProgress(IGlobalResearchTree.getInstance().getBranchData(research.getBranch()).getBaseTime(research.getDepth())); } + colony.getResearchManager().markDirty(); SoundUtils.playSuccessSound(player, player.blockPosition()); + colony.getResearchManager().markDirty(); return; } final InvWrapper playerInv = new InvWrapper(player.getInventory()); @@ -176,6 +177,7 @@ public void attemptBeginResearch(final Player player, final IColony colony, fina } MessageUtils.format(MESSAGE_RESEARCH_STARTED, MutableComponent.create(research.getName())).sendTo(player); research.startResearch(colony.getResearchManager().getResearchTree()); + colony.getResearchManager().markDirty(); SoundUtils.playSuccessSound(player, player.blockPosition()); } else @@ -188,6 +190,7 @@ public void attemptBeginResearch(final Player player, final IColony colony, fina .getResearchTree() .getResearch(research.getBranch(), research.getId()) .setProgress(IGlobalResearchTree.getInstance().getBranchData(research.getBranch()).getBaseTime(research.getDepth())); + colony.getResearchManager().markDirty(); } } else @@ -210,6 +213,7 @@ public void attemptResetResearch(final Player player, final IColony colony, fina .sendTo(player); SoundUtils.playSuccessSound(player, player.blockPosition()); removeResearch(research.getBranch(), research.getId()); + colony.getResearchManager().markDirty(); } // If complete, it's a request to undo the research. else if (research.getState() == ResearchState.FINISHED) @@ -261,6 +265,7 @@ else if (research.getState() == ResearchState.FINISHED) SoundUtils.playSuccessSound(player, player.blockPosition()); removeResearch(research.getBranch(), research.getId()); resetEffects(colony); + colony.getResearchManager().markDirty(); } colony.markDirty(); } @@ -308,6 +313,7 @@ private void resetEffects(IColony colony) for (final IResearchEffect effect : IGlobalResearchTree.getInstance().getResearch(branch.getKey(), research.getValue().getId()).getEffects()) { colony.getResearchManager().getResearchEffects().applyEffect(effect); + colony.getResearchManager().markDirty(); } } } @@ -388,4 +394,14 @@ public void readFromNBT(final CompoundTag compound, final IResearchEffectManager addResearch(research.getBranch(), research); }); } + + /** + * Get the list of all finished researches + * + * @return + */ + public List getCompletedList() + { + return new ArrayList<>(isComplete); + } } diff --git a/src/main/java/com/minecolonies/coremod/structures/EmptyColonyStructure.java b/src/main/java/com/minecolonies/coremod/structures/EmptyColonyStructure.java index 3f3a5c63910..cd1b5c72fcf 100644 --- a/src/main/java/com/minecolonies/coremod/structures/EmptyColonyStructure.java +++ b/src/main/java/com/minecolonies/coremod/structures/EmptyColonyStructure.java @@ -11,11 +11,8 @@ import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.heightproviders.HeightProvider; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; diff --git a/src/main/java/com/minecolonies/coremod/structures/EmptyNetherColonyStructure.java b/src/main/java/com/minecolonies/coremod/structures/EmptyNetherColonyStructure.java new file mode 100644 index 00000000000..258ad08bf68 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/structures/EmptyNetherColonyStructure.java @@ -0,0 +1,133 @@ +package com.minecolonies.coremod.structures; + +import com.minecolonies.api.util.Log; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.heightproviders.HeightProvider; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; + +import java.util.Optional; + +/** + * Class defining our configured feature - the empty colony that is spawning. + */ +public class EmptyNetherColonyStructure extends Structure +{ + + // A custom codec that changes the size limit for our code_structure_sky_fan.json's config to not be capped at 7. + // With this, we can have a structure with a size limit up to 30 if we want to have extremely long branches of pieces in the structure. + public static final Codec NETHER_COLONY_CODEC = RecordCodecBuilder.mapCodec(instance -> + instance.group(EmptyNetherColonyStructure.settingsCodec(instance), + StructureTemplatePool.CODEC.fieldOf("start_pool").forGetter(structure -> structure.startPool), + ResourceLocation.CODEC.optionalFieldOf("start_jigsaw_name").forGetter(structure -> structure.startJigsawName), + Codec.intRange(0, 10).fieldOf("size").forGetter(structure -> structure.size), + HeightProvider.CODEC.fieldOf("start_height").forGetter(structure -> structure.startHeight), + Heightmap.Types.CODEC.optionalFieldOf("project_start_to_heightmap").forGetter(structure -> structure.projectStartToHeightmap), + Codec.intRange(1, 128).fieldOf("max_distance_from_center").forGetter(structure -> structure.maxDistanceFromCenter) + ).apply(instance, EmptyNetherColonyStructure::new)).codec(); + + private final Holder startPool; + private final Optional startJigsawName; + private final int size; + private final HeightProvider startHeight; + private final Optional projectStartToHeightmap; + private final int maxDistanceFromCenter; + + public EmptyNetherColonyStructure( + StructureSettings config, + Holder startPool, + Optional startJigsawName, + int size, + HeightProvider startHeight, + Optional projectStartToHeightmap, + int maxDistanceFromCenter) + { + super(config); + this.startPool = startPool; + this.startJigsawName = startJigsawName; + this.size = size; + this.startHeight = startHeight; + this.projectStartToHeightmap = projectStartToHeightmap; + this.maxDistanceFromCenter = maxDistanceFromCenter; + } + + @Override + public StructureType type() { + return MineColoniesStructures.EMPTY_NETHER_COLONY.get(); // Helps the game know how to turn this structure back to json to save to chunks + } + + @Override + public GenerationStep.Decoration step() + { + return GenerationStep.Decoration.SURFACE_STRUCTURES; + } + + private static BlockPos.MutableBlockPos isFeatureChunk(GenerationContext context) + { + BlockPos blockPos = context.chunkPos().getWorldPosition(); + ChunkPos chunkPos = new ChunkPos(blockPos); + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + for (int curChunkX = chunkPos.x - 1; curChunkX <= chunkPos.x + 1; curChunkX++) + { + for (int curChunkZ = chunkPos.z - 1; curChunkZ <= chunkPos.z + 1; curChunkZ++) + { + mutable.set(curChunkX << 4, context.chunkGenerator().getSeaLevel() + 10, curChunkZ << 4); + NoiseColumn blockView = context.chunkGenerator().getBaseColumn(mutable.getX(), mutable.getZ(), context.heightAccessor(), context.randomState()); + int minValidSpace = 65; + int maxHeight = Math.min(context.chunkGenerator().getMinY() + context.chunkGenerator().getGenDepth(), context.chunkGenerator().getSeaLevel() + minValidSpace); + + while (mutable.getY() < maxHeight) + { + BlockState state = blockView.getBlock(mutable.getY()); + if (!state.isAir()) + { + return null; + } + mutable.move(Direction.UP); + } + } + } + + return mutable; + } + + @Override + public Optional findGenerationPoint(GenerationContext context) + { + final BlockPos.MutableBlockPos result = isFeatureChunk(context); + if (result == null) + { + return Optional.empty(); + } + + Optional structurePiecesGenerator = + JigsawPlacement.addPieces( + context, + this.startPool, + this.startJigsawName, + this.size, + result, + false, + this.projectStartToHeightmap, + this.maxDistanceFromCenter + ); + + if (structurePiecesGenerator.isPresent()) + { + Log.getLogger().debug("New Empty colony at" + result); + } + return structurePiecesGenerator; + } +} diff --git a/src/main/java/com/minecolonies/coremod/structures/MineColoniesStructures.java b/src/main/java/com/minecolonies/coremod/structures/MineColoniesStructures.java index d901e90fa09..7a3a2c51410 100644 --- a/src/main/java/com/minecolonies/coremod/structures/MineColoniesStructures.java +++ b/src/main/java/com/minecolonies/coremod/structures/MineColoniesStructures.java @@ -7,6 +7,7 @@ import net.minecraftforge.registries.RegistryObject; import static com.minecolonies.coremod.structures.EmptyColonyStructure.COLONY_CODEC; +import static com.minecolonies.coremod.structures.EmptyNetherColonyStructure.NETHER_COLONY_CODEC; /** * Thanks to: https://github.com/TelepathicGrunt/StructureTutorialMod/tree/1.18.x-Forge-Jigsaw @@ -24,4 +25,6 @@ public class MineColoniesStructures * this base structure will have the resourcelocation of structure_tutorial:sky_structures. */ public static final RegistryObject> EMPTY_COLONY = DEFERRED_REGISTRY_STRUCTURE.register("empty_colony", () -> () -> COLONY_CODEC); + public static final RegistryObject> EMPTY_NETHER_COLONY = DEFERRED_REGISTRY_STRUCTURE.register("empty_nether_colony", () -> () -> NETHER_COLONY_CODEC); + } diff --git a/src/main/java/com/minecolonies/coremod/tileentities/ScarecrowTileEntity.java b/src/main/java/com/minecolonies/coremod/tileentities/ScarecrowTileEntity.java index 69912654af5..e69de29bb2d 100755 --- a/src/main/java/com/minecolonies/coremod/tileentities/ScarecrowTileEntity.java +++ b/src/main/java/com/minecolonies/coremod/tileentities/ScarecrowTileEntity.java @@ -1,511 +0,0 @@ -package com.minecolonies.coremod.tileentities; - -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IColonyManager; -import com.minecolonies.api.colony.IColonyView; -import com.minecolonies.api.inventory.container.ContainerField; -import com.minecolonies.api.tileentities.AbstractScarecrowTileEntity; -import com.minecolonies.api.tileentities.ScareCrowType; -import com.minecolonies.api.tileentities.ScarecrowFieldStage; -import com.minecolonies.api.util.ItemStackUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.network.Connection; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.core.Direction; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemStackHandler; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.annotation.Nonnull; -import java.util.Random; - -import static com.minecolonies.api.util.constant.NbtTagConstants.*; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.CropBlock; -import net.minecraft.world.level.block.FenceBlock; -import net.minecraft.world.level.block.FenceGateBlock; -import net.minecraft.world.level.block.WallBlock; -import net.minecraft.world.level.block.state.BlockState; - -/** - * The scarecrow tile entity to store extra data. - */ -@SuppressWarnings("PMD.ExcessiveImports") -public class ScarecrowTileEntity extends AbstractScarecrowTileEntity -{ - /** - * The max width/length of a field. - */ - private static final int MAX_RANGE = 5; - - /** - * Has the field be taken by any worker? - */ - private boolean taken = false; - - /** - * Checks if the field doesNeedWork (Hoeig, Seedings, Farming etc). - */ - private boolean doesNeedWork = true; - - /** - * Has the field been planted? - */ - private ScarecrowFieldStage fieldStage = ScarecrowFieldStage.EMPTY; - - /** - * Citizen Id of the citizen owning the field. - */ - private int ownerId; - - /** - * Name of the citizen claiming the field. - */ - @NotNull - private String owner = ""; - - /** - * Random generator. - */ - private final Random random = new Random(); - - /** - * The type of the scarecrow. - */ - private ScareCrowType type; - - /** - * The colony of the field. - */ - @Nullable - private IColony colony; - - /** - * Inventory of the field. - */ - private final ItemStackHandler inventory; - - /** - * Creates an instance of the tileEntity. - */ - public ScarecrowTileEntity(final BlockPos pos, final BlockState state) - { - super(pos, state); - this.inventory = new ItemStackHandler() - { - @Override - public int getSlotLimit(int slot) { return 1; } - - @Override - public boolean isItemValid(int slot, @Nonnull ItemStack stack) - { - return stack.is(Tags.Items.SEEDS) || (stack.getItem() instanceof BlockItem && ((BlockItem) stack.getItem()).getBlock() instanceof CropBlock); - } - }; - } - - /** - * Getter for MAX_RANGE. - * - * @return the max range. - */ - public static int getMaxRange() - { - return MAX_RANGE; - } - - /** - * The size of the field in all four directions - * in the same order as {@link Direction}: - * S, W, N, E - */ - protected int[] radii = {MAX_RANGE, MAX_RANGE, MAX_RANGE, MAX_RANGE}; - - /** - * @param direction the direction for the radius - * @param radius the number of blocks from the scarecrow that the farmer will work with - */ - public void setRadius(Direction direction, int radius) - { - this.radii[direction.get2DDataValue()] = radius; - setChanged(); - level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 2); - } - - /** - * @param direction the direction to get the range for - * @return the radius - */ - public int getRadius(Direction direction) - { - return radii[direction.get2DDataValue()]; - } - - /** - * Checks if a certain position is part of the field. Complies with the definition of field block. - * - * @param world the world object. - * @param position the position. - * @return true if it is. - */ - @Override - public boolean isNoPartOfField(@NotNull final Level world, @NotNull final BlockPos position) - { - return world.isEmptyBlock(position) || isValidDelimiter(world.getBlockState(position.above()).getBlock()); - } - - /** - * Check if a block is a valid delimiter of the field. - * - * @param block the block to analyze. - * @return true if so. - */ - private static boolean isValidDelimiter(final Block block) - { - return block instanceof FenceBlock || block instanceof FenceGateBlock - || block instanceof WallBlock; - } - - /** - * Returns the {@link BlockPos} of the current object, also used as ID. - * - * @return {@link BlockPos} of the current object. - */ - @Override - public BlockPos getID() - { - // Location doubles as ID - return this.getPosition(); - } - - /** - * Has the field been taken? - * - * @return true if the field is not free to use, false after releasing it. - */ - @Override - public boolean isTaken() - { - return this.taken; - } - - /** - * Sets the field taken. - * - * @param taken is field free or not - */ - @Override - public void setTaken(final boolean taken) - { - this.taken = taken; - setChanged(); - } - - @Override - public void nextState() - { - if (getFieldStage().ordinal() + 1 >= ScarecrowFieldStage.values().length) - { - doesNeedWork = false; - setFieldStage(ScarecrowFieldStage.values()[0]); - return; - } - setFieldStage(ScarecrowFieldStage.values()[getFieldStage().ordinal() + 1]); - } - - /** - * Checks if the field has been planted. - * - * @return true if there are crops planted. - */ - @Override - public ScarecrowFieldStage getFieldStage() - { - return this.fieldStage; - } - - /** - * Sets if there are any crops planted. - * - * @param fieldStage true after planting, false after harvesting. - */ - @Override - public void setFieldStage(final ScarecrowFieldStage fieldStage) - { - this.fieldStage = fieldStage; - setChanged(); - } - - /** - * Checks if the field needs work (planting, hoeing). - * - * @return true if so. - */ - @Override - public boolean needsWork() - { - return this.doesNeedWork; - } - - /** - * Sets that the field needs work. - * - * @param needsWork true if work needed, false after completing the job. - */ - @Override - public void setNeedsWork(final boolean needsWork) - { - this.doesNeedWork = needsWork; - setChanged(); - } - - /** - * Getter of the seed of the field. - * - * @return the ItemSeed - */ - @Override - @Nullable - public ItemStack getSeed() - { - if (inventory.getStackInSlot(0) != ItemStackUtils.EMPTY) - { - return inventory.getStackInSlot(0); - } - return null; - } - - @Override - public BlockPos getPosition() - { - return getBlockPos(); - } - - /** - * Getter of the owner of the field. - * - * @return the string description of the citizen. - */ - @Override - @NotNull - public String getOwner() - { - return owner; - } - - /** - * Getter for the ownerId of the field. - * - * @return the int id. - */ - @Override - public int getOwnerId() - { - return ownerId; - } - - /** - * Sets the owner of the field. - * - * @param ownerId the id of the citizen. - */ - @Override - public void setOwner(final int ownerId) - { - this.ownerId = ownerId; - if (colony != null) - { - if (colony.getCitizenManager().getCivilian(ownerId) == null) - { - owner = ""; - } - else - { - owner = colony.getCitizenManager().getCivilian(ownerId).getName(); - } - } - setChanged(); - } - - /** - * Sets the owner of the field. - * - * @param ownerId the name of the citizen. - * @param tempColony the colony view. - */ - @Override - public void setOwner(final int ownerId, final IColonyView tempColony) - { - this.ownerId = ownerId; - if (tempColony != null) - { - if (tempColony.getCitizen(ownerId) == null) - { - owner = ""; - } - else - { - owner = tempColony.getCitizen(ownerId).getName(); - } - } - setChanged(); - } - - /** - * Get the inventory of the scarecrow. - * - * @return the IItemHandler. - */ - @Override - public IItemHandler getInventory() - { - return inventory; - } - - ///////////---- Following methods are used to update the tileEntity between client and server ----/////////// - - @Override - public ClientboundBlockEntityDataPacket getUpdatePacket() - { - return ClientboundBlockEntityDataPacket.create(this); - } - - @NotNull - @Override - public CompoundTag getUpdateTag() - { - return saveWithId(); - } - - @Override - public void onDataPacket(final Connection net, final ClientboundBlockEntityDataPacket packet) - { - final CompoundTag compound = packet.getTag(); - this.load(compound); - if (compound.getAllKeys().contains(TAG_COLONY_ID)) - { - setOwner(ownerId, IColonyManager.getInstance().getColonyView(compound.getInt(TAG_COLONY_ID), level.dimension())); - } - } - - /////////////--------------------------- End Synchronization-area ---------------------------- ///////////// - - @Override - public void load(final CompoundTag compound) - { - final ListTag inventoryTagList = compound.getList(TAG_INVENTORY, Tag.TAG_COMPOUND); - for (int i = 0; i < inventoryTagList.size(); ++i) - { - final CompoundTag inventoryCompound = inventoryTagList.getCompound(i); - final ItemStack stack = ItemStack.of(inventoryCompound); - if (ItemStackUtils.getSize(stack) <= 0) - { - inventory.setStackInSlot(i, ItemStackUtils.EMPTY); - } - else - { - inventory.setStackInSlot(i, stack); - } - } - - taken = compound.getBoolean(TAG_TAKEN); - fieldStage = ScarecrowFieldStage.values()[compound.getInt(TAG_STAGE)]; - radii[3] = compound.contains(TAG_FIELD_EAST) ? compound.getInt(TAG_FIELD_EAST) : MAX_RANGE; - radii[2] = compound.contains(TAG_FIELD_NORTH) ? compound.getInt(TAG_FIELD_NORTH) : MAX_RANGE; - radii[1] = compound.contains(TAG_FIELD_WEST) ? compound.getInt(TAG_FIELD_WEST) : MAX_RANGE; - radii[0] = compound.contains(TAG_FIELD_SOUTH) ? compound.getInt(TAG_FIELD_SOUTH) : MAX_RANGE; - ownerId = compound.getInt(TAG_OWNER); - setOwner(ownerId); - - super.load(compound); - } - - @NotNull - @Override - public void saveAdditional(final CompoundTag compound) - { - @NotNull final ListTag inventoryTagList = new ListTag(); - for (int slot = 0; slot < inventory.getSlots(); slot++) - { - @NotNull final CompoundTag inventoryCompound = new CompoundTag(); - final ItemStack stack = inventory.getStackInSlot(slot); - if (stack == ItemStackUtils.EMPTY) - { - new ItemStack(Blocks.AIR, 0).save(inventoryCompound); - } - else - { - stack.save(inventoryCompound); - } - inventoryTagList.add(inventoryCompound); - } - compound.put(TAG_INVENTORY, inventoryTagList); - - compound.putBoolean(TAG_TAKEN, taken); - compound.putInt(TAG_STAGE, fieldStage.ordinal()); - compound.putInt(TAG_FIELD_EAST, radii[3]); - compound.putInt(TAG_FIELD_NORTH, radii[2]); - compound.putInt(TAG_FIELD_WEST, radii[1]); - compound.putInt(TAG_FIELD_SOUTH, radii[0]); - compound.putInt(TAG_OWNER, ownerId); - if (colony != null) - { - compound.putInt(TAG_COLONY_ID, colony.getID()); - } - } - - /** - * Set the colony of the field. - * - * @param colony the colony to set. - */ - public void setColony(final IColony colony) - { - this.colony = colony; - } - - //----------------------- Type Specific parameters -----------------------// - - /** - * Returns the type of the scarecrow (Important for the rendering). - * - * @return the enum type. - */ - @Override - public ScareCrowType getScarecrowType() - { - if (this.type == null) - { - this.type = ScareCrowType.values()[this.random.nextInt(2)]; - } - return this.type; - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(final int id, @NotNull final Inventory inv, @NotNull final Player player) - { - return new ContainerField(id, inv, getBlockPos()); - } - - @NotNull - @Override - public Component getDisplayName() - { - return Component.literal(owner); - } -} diff --git a/src/main/java/com/minecolonies/coremod/tileentities/TileEntityDecorationController.java b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityDecorationController.java index 0c1e5c7e99a..2e9aef76d6b 100755 --- a/src/main/java/com/minecolonies/coremod/tileentities/TileEntityDecorationController.java +++ b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityDecorationController.java @@ -70,21 +70,7 @@ public TileEntityDecorationController(final BlockPos pos, final BlockState state super(MinecoloniesTileEntities.DECO_CONTROLLER.get(), pos, state); } - /** - * Getter for the name stored in this. - * - * @return String name. - */ - public String getSchematicPath() - { - return schematicPath; - } - - /** - * Getter for the pack. - * - * @return String name. - */ + @Override public String getPackName() { return packName; diff --git a/src/main/java/com/minecolonies/coremod/tileentities/TileEntityPlantationField.java b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityPlantationField.java new file mode 100644 index 00000000000..161b1315c4f --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityPlantationField.java @@ -0,0 +1,415 @@ +package com.minecolonies.coremod.tileentities; + +import com.ldtteam.structurize.storage.StructurePacks; +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.fields.plantation.IPlantationModule; +import com.minecolonies.api.colony.fields.registry.FieldRegistries; +import com.minecolonies.api.compatibility.newstruct.BlueprintMapping; +import com.minecolonies.api.tileentities.AbstractTileEntityPlantationField; +import com.minecolonies.api.tileentities.MinecoloniesTileEntities; +import com.minecolonies.api.util.Utils; +import com.minecolonies.api.util.WorldUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.Tuple; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +import static com.minecolonies.api.util.constant.Constants.DEFAULT_STYLE; +import static com.minecolonies.api.util.constant.NbtTagConstants.*; + +/** + * Implementation for plantation field tile entities. + */ +public class TileEntityPlantationField extends AbstractTileEntityPlantationField +{ + /** + * Cached result for {@link TileEntityPlantationField#getWorkingPositions(String)} ()}. + */ + private final Map> workingPositions = new HashMap<>(); + + /** + * The schematic name of the placeholder block. + */ + private String schematicName = ""; + + /** + * The schematic path of the placeholder block. + */ + private String schematicPath = ""; + + /** + * The packName it is included in. + */ + private String packName = ""; + + /** + * Corner positions of schematic, relative to te pos. + */ + private BlockPos corner1 = BlockPos.ZERO; + private BlockPos corner2 = BlockPos.ZERO; + + /** + * The used rotation. + */ + private Rotation rotation = Rotation.NONE; + + /** + * The used mirror. + */ + private boolean mirror; + + /** + * Map of block positions relative to TE pos and string tags + */ + private Map> tagPosMap = new HashMap<>(); + + /** + * The colony this plantation field is located in. + */ + private IColony currentColony; + + /** + * Cached result for {@link TileEntityPlantationField#getPlantationFieldTypes()}. + */ + private Set plantationFieldTypes; + + /** + * Default constructor. + * + * @param pos The positions this tile entity is at. + * @param state The state the entity is in. + */ + public TileEntityPlantationField(final BlockPos pos, final BlockState state) + { + super(MinecoloniesTileEntities.PLANTATION_FIELD.get(), pos, state); + } + + @Override + public Set getPlantationFieldTypes() + { + if (plantationFieldTypes == null) + { + plantationFieldTypes = tagPosMap.values().stream() + .flatMap(Collection::stream) + .map(this::getPlantationFieldEntryFromFieldTag) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + return plantationFieldTypes; + } + + @Override + public List getWorkingPositions(final String tag) + { + workingPositions.computeIfAbsent(tag, newTag -> tagPosMap.entrySet().stream() + .filter(f -> f.getValue().contains(newTag)) + .distinct() + .map(Map.Entry::getKey) + .map(worldPosition::offset) + .toList()); + return workingPositions.get(tag); + } + + @Override + public IColony getCurrentColony() + { + if (currentColony == null && level != null) + { + this.currentColony = IColonyManager.getInstance().getIColony(level, worldPosition); + } + return currentColony; + } + + @Override + @Nullable + public ResourceKey getDimension() + { + IColony colony = getCurrentColony(); + if (colony != null) + { + return colony.getDimension(); + } + return null; + } + + @Nullable + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() + { + return ClientboundBlockEntityDataPacket.create(this); + } + + /** + * Get the rotation of the controller. + * + * @return the placed rotation. + */ + public Rotation getRotation() + { + return rotation; + } + + /** + * Get the mirroring setting of the controller. + * + * @return true if mirrored. + */ + public boolean getMirror() + { + return this.mirror; + } + + private FieldRegistries.FieldEntry getPlantationFieldEntryFromFieldTag(String fieldTag) + { + return FieldRegistries.getFieldRegistry().getValues().stream() + .filter(fieldEntry -> { + List modules = fieldEntry.getFieldModuleProducers().stream().map(m -> m.apply(null)) + .filter(IPlantationModule.class::isInstance) + .map(m -> (IPlantationModule) m) + .toList(); + + return modules.stream().anyMatch(module -> module.getFieldTag().equals(fieldTag)); + }) + .findFirst() + .orElse(null); + } + + @Override + public String getSchematicName() + { + return schematicName; + } + + @Override + public void setSchematicName(final String s) + { + this.schematicName = s; + setChanged(); + } + + @Override + public Map> getPositionedTags() + { + return tagPosMap; + } + + @Override + public void setPositionedTags(final Map> positionedTags) + { + tagPosMap = positionedTags; + setChanged(); + } + + @Override + public Tuple getSchematicCorners() + { + if (corner1 == BlockPos.ZERO || corner2 == BlockPos.ZERO) + { + return new Tuple<>(worldPosition, worldPosition); + } + + return new Tuple<>(corner1, corner2); + } + + @Override + public void setSchematicCorners(final BlockPos pos1, final BlockPos pos2) + { + corner1 = pos1; + corner2 = pos2; + setChanged(); + } + + @Override + public void readSchematicDataFromNBT(final CompoundTag compound) + { + super.readSchematicDataFromNBT(compound); + final CompoundTag blueprintDataProvider = compound.getCompound(TAG_BLUEPRINTDATA); + if (compound.contains(TAG_PACK)) // New structure + { + // path is the folder containing the schematic + final String path = blueprintDataProvider.getString(TAG_NAME); + this.schematicPath = path + File.separator + this.schematicName + ".blueprint"; + } + else + { + // This is only recovery handling for old structures, it shouldn't be called otherwise. + if (compound.contains(TAG_NAME)) + { + this.schematicPath = compound.getString(TAG_NAME); + final String[] split = Utils.splitPath(this.schematicPath); + this.schematicName = split[split.length - 1].replace(".blueprint", ""); + } + + final String[] split = Utils.splitPath(this.schematicPath); + if (split.length >= 4) + { + this.packName = BlueprintMapping.getStyleMapping(split[2]); + } + + if (this.packName == null || this.packName.isEmpty()) + { + this.packName = DEFAULT_STYLE; + } + + if (this.schematicName.contains("/") || this.schematicName.contains("\\")) + { + final String[] splitName = Utils.splitPath(this.schematicPath); + this.schematicName = splitName[splitName.length - 1].replace(".blueprint", ""); + } + + if (StructurePacks.hasPack(this.packName)) + { + this.schematicPath = StructurePacks.getStructurePack(this.packName).getSubPath(StructurePacks.findBlueprint(this.packName, schematicName)); + } + else + { + this.schematicPath = this.schematicName; + } + + if (!this.schematicPath.endsWith(".blueprint")) + { + this.schematicPath = this.schematicPath + ".blueprint"; + } + } + + if (blueprintDataProvider.contains(TAG_PACK)) + { + this.packName = blueprintDataProvider.getString(TAG_PACK); + } + + if (this.packName == null) + { + this.packName = DEFAULT_STYLE; + } + } + + @Override + public BlockPos getTilePos() + { + return worldPosition; + } + + @Override + public void rotate(final Rotation rotationIn) + { + this.rotation = rotationIn; + } + + @Override + public void mirror(final Mirror mirror) + { + this.mirror = mirror != Mirror.NONE; + } + + @Override + public void onDataPacket(final Connection net, final ClientboundBlockEntityDataPacket packet) + { + final CompoundTag compound = packet.getTag(); + this.load(compound); + } + + @Override + public void load(final CompoundTag compound) + { + super.load(compound); + super.readSchematicDataFromNBT(compound); + this.rotation = Rotation.values()[compound.getInt(TAG_ROTATION)]; + this.mirror = compound.getBoolean(TAG_MIRROR); + if (compound.contains(TAG_PATH)) + { + this.schematicPath = compound.getString(TAG_PATH); + } + + if (compound.contains(TAG_NAME)) + { + this.schematicName = compound.getString(TAG_NAME); + if (this.schematicPath == null || this.schematicPath.isEmpty()) + { + //Setup for recovery + this.schematicPath = this.schematicName; + this.schematicName = ""; + } + } + this.packName = compound.getString(TAG_PACK); + + if (!this.schematicPath.endsWith(".blueprint")) + { + this.schematicPath = this.schematicPath + ".blueprint"; + } + } + + @Override + public void saveAdditional(final CompoundTag compound) + { + super.saveAdditional(compound); + writeSchematicDataToNBT(compound); + compound.putInt(TAG_ROTATION, this.rotation.ordinal()); + compound.putBoolean(TAG_MIRROR, this.mirror); + compound.putString(TAG_NAME, schematicName == null ? "" : schematicName); + compound.putString(TAG_PATH, schematicPath == null ? "" : schematicPath); + compound.putString(TAG_PACK, (packName == null || packName.isEmpty()) ? "" : packName); + } + + @Override + public void setChanged() + { + if (level != null) + { + WorldUtil.markChunkDirty(level, worldPosition); + } + } + + @NotNull + @Override + public CompoundTag getUpdateTag() + { + return this.saveWithId(); + } + + @Override + public void setBlueprintPath(final String filePath) + { + this.schematicPath = filePath; + if (!this.schematicPath.endsWith(".blueprint")) + { + this.schematicPath = this.schematicPath + ".blueprint"; + } + setChanged(); + } + + @Override + public void setPackName(final String packName) + { + this.packName = packName; + setChanged(); + } + + @Override + public String getBlueprintPath() + { + return schematicPath; + } + + /** + * Getter for the pack. + * + * @return String name. + */ + public String getPackName() + { + return packName; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/tileentities/TileEntityScarecrow.java b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityScarecrow.java new file mode 100644 index 00000000000..eeb592f4a2a --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/tileentities/TileEntityScarecrow.java @@ -0,0 +1,84 @@ +package com.minecolonies.coremod.tileentities; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.tileentities.AbstractTileEntityScarecrow; +import com.minecolonies.api.tileentities.ScareCrowType; +import com.minecolonies.coremod.Network; +import com.minecolonies.coremod.network.messages.server.colony.building.fields.FarmFieldRegistrationMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +/** + * The scarecrow tile entity to store extra data. + */ +@SuppressWarnings("PMD.ExcessiveImports") +public class TileEntityScarecrow extends AbstractTileEntityScarecrow +{ + /** + * Random generator. + */ + private final Random random = new Random(); + + /** + * The colony this field is located in. + */ + private IColony currentColony; + + /** + * The type of the scarecrow. + */ + private ScareCrowType type; + + /** + * Creates an instance of the tileEntity. + */ + public TileEntityScarecrow(final BlockPos pos, final BlockState state) + { + super(pos, state); + } + + @Override + public ScareCrowType getScarecrowType() + { + if (this.type == null) + { + final ScareCrowType[] values = ScareCrowType.values(); + this.type = values[this.random.nextInt(values.length)]; + } + return this.type; + } + + @Override + public IColony getCurrentColony() + { + if (currentColony == null && level != null) + { + this.currentColony = IColonyManager.getInstance().getIColony(level, worldPosition); + // TODO: Remove in 1.20.2 + if (this.currentColony != null) + { + Network.getNetwork().sendToServer(new FarmFieldRegistrationMessage(currentColony, worldPosition)); + } + } + return currentColony; + } + + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() + { + return ClientboundBlockEntityDataPacket.create(this); + } + + @NotNull + @Override + public CompoundTag getUpdateTag() + { + return saveWithId(); + } +} diff --git a/src/main/java/com/minecolonies/coremod/util/ChunkDataHelper.java b/src/main/java/com/minecolonies/coremod/util/ChunkDataHelper.java index 787e4b46058..f6b7bb654ff 100755 --- a/src/main/java/com/minecolonies/coremod/util/ChunkDataHelper.java +++ b/src/main/java/com/minecolonies/coremod/util/ChunkDataHelper.java @@ -113,6 +113,11 @@ public static void unloadChunk(final LevelChunk chunk, final Level world) */ public static void addStorageToChunk(final LevelChunk chunk, final ChunkLoadStorage storage) { + if (chunk.getPos().equals(ChunkPos.ZERO)) + { + Log.getLogger().warn("Trying to claim zero chunk!", new Exception()); + } + final IColonyTagCapability cap = chunk.getCapability(CLOSE_COLONY_CAP, null).resolve().orElse(null); storage.applyToCap(cap, chunk); @@ -147,8 +152,9 @@ public static void claimColonyChunks(final Level world, final boolean add, final * @param range the range to claim. * @param corners also (un)claim all chunks intersecting this box (if not null) */ - public static void claimBuildingChunks(final IColony colony, final boolean add, final BlockPos center, final int range, - @Nullable final Tuple corners) + public static void claimBuildingChunks( + final IColony colony, final boolean add, final BlockPos center, final int range, + @Nullable final Tuple corners) { buildingClaimInRange(colony, add, range, center, false); @@ -271,10 +277,10 @@ private static void buildingClaimInRange( * @param corners the box. */ private static void buildingClaimBox( - final IColony colony, - final BlockPos anchor, - final boolean add, - final Tuple corners) + final IColony colony, + final BlockPos anchor, + final boolean add, + final Tuple corners) { final Level world = colony.getWorld(); final IChunkmanagerCapability chunkManager = world.getCapability(CHUNK_STORAGE_UPDATE_CAP, null).resolve().orElse(null); @@ -293,9 +299,9 @@ private static void buildingClaimBox( if (maxColonySize != 0 && pos.distSqr(colonyCenterCompare) > Math.pow(maxColonySize * BLOCKS_PER_CHUNK, 2)) { Log.getLogger() - .debug( - "Tried to claim chunk at pos X:" + pos.getX() + " Z:" + pos.getZ() + " too far away from the colony:" + colony.getID() + " center:" + colony.getCenter() - + " max is config workingRangeTownHall ^2"); + .debug( + "Tried to claim chunk at pos X:" + pos.getX() + " Z:" + pos.getZ() + " too far away from the colony:" + colony.getID() + " center:" + colony.getCenter() + + " max is config workingRangeTownHall ^2"); continue; } @@ -437,6 +443,11 @@ public static boolean tryClaimBuilding( return false; } + if (chunk.getPos().equals(ChunkPos.ZERO)) + { + Log.getLogger().warn("Trying to claim at zero chunk pos!:", new Exception()); + } + // Before directly adding cap data, apply data from our cache. final ChunkLoadStorage chunkLoadStorage = chunkManager.getChunkStorage(chunk.getPos().x, chunk.getPos().z); if (chunkLoadStorage != null) diff --git a/src/main/java/com/minecolonies/coremod/util/CollectorUtils.java b/src/main/java/com/minecolonies/coremod/util/CollectorUtils.java new file mode 100644 index 00000000000..3c78027901b --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/util/CollectorUtils.java @@ -0,0 +1,31 @@ +package com.minecolonies.coremod.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +/** + * Class to introduce custom stream collectors. + */ +public class CollectorUtils +{ + private static final Collector SHUFFLER = Collectors.collectingAndThen( + Collectors.toCollection(ArrayList::new), + list -> { + Collections.shuffle(list); + return list; + } + ); + + private CollectorUtils() + { + } + + @SuppressWarnings("unchecked") + public static Collector> toShuffledList() + { + return (Collector>) SHUFFLER; + } +} \ No newline at end of file diff --git a/src/main/java/com/minecolonies/coremod/util/DomumOrnamentumUtils.java b/src/main/java/com/minecolonies/coremod/util/DomumOrnamentumUtils.java index dfe41627b16..783d5cdf777 100644 --- a/src/main/java/com/minecolonies/coremod/util/DomumOrnamentumUtils.java +++ b/src/main/java/com/minecolonies/coremod/util/DomumOrnamentumUtils.java @@ -1,68 +1,114 @@ -package com.minecolonies.coremod.util; - -import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlock; -import com.ldtteam.domumornamentum.client.model.data.MaterialTextureData; -import com.minecolonies.api.colony.requestsystem.request.IRequest; -import com.minecolonies.api.colony.requestsystem.requestable.IConcreteDeliverable; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Utility methods for interacting with Domum Ornamentum - */ -public class DomumOrnamentumUtils -{ - /** - * Extracts the Domum Ornamentum block type from the stack. - * @param stack the stack to inspect. - * @return the {@link IMateriallyTexturedBlock}, or null if the stack doesn't have one. - */ - @Nullable - public static IMateriallyTexturedBlock getBlock(@NotNull final ItemStack stack) - { - return stack.getItem() instanceof BlockItem bi && - bi.getBlock() instanceof IMateriallyTexturedBlock doBlock ? doBlock : null; - } - - /** - * Extracts the first acceptable Domum Ornamentum stack from the given request. - * @param request the request to inspect. - * @return the first acceptable DO stack, or empty if this isn't a request for a DO block. - */ - @NotNull - public static ItemStack getRequestedStack(@NotNull final IRequest request) - { - if (request.getRequest() instanceof IConcreteDeliverable deliverable) - { - for (final ItemStack stack : deliverable.getRequestedItems()) - { - if (getBlock(stack) != null) - { - return stack; - } - } - } - return ItemStack.EMPTY; - } - - /** - * Gets the specific texture data from the given DO stack. - * @param stack the stack to inspect. - * @return the texture data, or {@link MaterialTextureData#EMPTY} if not a DO stack or otherwise unset. - */ - @NotNull - public static MaterialTextureData getTextureData(@NotNull final ItemStack stack) - { - if (!stack.hasTag()) return MaterialTextureData.EMPTY; - final CompoundTag tag = stack.getOrCreateTag().getCompound("textureData"); - return MaterialTextureData.deserializeFromNBT(tag); - } - - private DomumOrnamentumUtils() - { - // there are no instances here, only Zuul - } -} +package com.minecolonies.coremod.util; + +import com.ldtteam.domumornamentum.block.IMateriallyTexturedBlock; +import com.ldtteam.domumornamentum.block.interfaces.IDOBlock; +import com.ldtteam.domumornamentum.client.model.data.MaterialTextureData; +import com.minecolonies.api.colony.requestsystem.request.IRequest; +import com.minecolonies.api.colony.requestsystem.requestable.IConcreteDeliverable; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Utility methods for interacting with Domum Ornamentum + */ +public class DomumOrnamentumUtils +{ + /** + * Nbt identifier for DO's texture data + */ + public static String DO_NBT_TEXTURE_DATA = "textureData"; + + /** + * Extracts the Domum Ornamentum block type from the stack. + * + * @param stack the stack to inspect. + * @return the {@link IMateriallyTexturedBlock}, or null if the stack doesn't have one. + */ + @Nullable + public static IMateriallyTexturedBlock getBlock(@NotNull final ItemStack stack) + { + return stack.getItem() instanceof BlockItem bi && + bi.getBlock() instanceof IMateriallyTexturedBlock doBlock ? doBlock : null; + } + + /** + * Extracts the first acceptable Domum Ornamentum stack from the given request. + * + * @param request the request to inspect. + * @return the first acceptable DO stack, or empty if this isn't a request for a DO block. + */ + @NotNull + public static ItemStack getRequestedStack(@NotNull final IRequest request) + { + if (request.getRequest() instanceof IConcreteDeliverable deliverable) + { + for (final ItemStack stack : deliverable.getRequestedItems()) + { + if (getBlock(stack) != null) + { + return stack; + } + } + } + return ItemStack.EMPTY; + } + + /** + * Gets the specific texture data from the given DO stack. + * + * @param stack the stack to inspect. + * @return the texture data, or {@link MaterialTextureData#EMPTY} if not a DO stack or otherwise unset. + */ + @NotNull + public static MaterialTextureData getTextureData(@NotNull final ItemStack stack) + { + if (!stack.hasTag()) + { + return MaterialTextureData.EMPTY; + } + final CompoundTag tag = stack.getOrCreateTag().getCompound(DO_NBT_TEXTURE_DATA); + return MaterialTextureData.deserializeFromNBT(tag); + } + + /** + * Checks if the given block belongs to DO + * + * @param block + * @return + */ + public static boolean isDoBlock(final Block block) + { + return block instanceof IDOBlock; + } + + /** + * Get the texture data from nbt + * + * @param nbt + * @return + */ + public static MaterialTextureData getTextureDataFromNBT(final CompoundTag nbt) + { + if (nbt == null || !nbt.contains(DO_NBT_TEXTURE_DATA)) + { + return null; + } + + if (nbt.contains(DO_NBT_TEXTURE_DATA, Tag.TAG_COMPOUND)) + { + return MaterialTextureData.deserializeFromNBT(nbt.getCompound(DO_NBT_TEXTURE_DATA)); + } + + return null; + } + + private DomumOrnamentumUtils() + { + // there are no instances here, only Zuul + } +} diff --git a/src/main/java/com/minecolonies/coremod/util/NamedDamageSource.java b/src/main/java/com/minecolonies/coremod/util/NamedDamageSource.java index 5cba32acd02..daa78e77a73 100755 --- a/src/main/java/com/minecolonies/coremod/util/NamedDamageSource.java +++ b/src/main/java/com/minecolonies/coremod/util/NamedDamageSource.java @@ -28,7 +28,7 @@ public NamedDamageSource(final String damageTypeIn, @Nullable final Entity damag @Override public Component getLocalizedDeathMessage(LivingEntity entityLivingBaseIn) { - return Component.translatable(this.msgId, entityLivingBaseIn.getName()); + return Component.translatable("death.attack." + this.msgId, entityLivingBaseIn.getName()); } /** diff --git a/src/main/java/com/minecolonies/coremod/util/SchemAnalyzerUtil.java b/src/main/java/com/minecolonies/coremod/util/SchemAnalyzerUtil.java new file mode 100644 index 00000000000..76890405c81 --- /dev/null +++ b/src/main/java/com/minecolonies/coremod/util/SchemAnalyzerUtil.java @@ -0,0 +1,248 @@ +package com.minecolonies.coremod.util; + +import com.ldtteam.domumornamentum.client.model.data.MaterialTextureData; +import com.ldtteam.structurize.api.util.ItemStorage; +import com.ldtteam.structurize.blocks.schematic.BlockSolidSubstitution; +import com.ldtteam.structurize.blocks.schematic.BlockSubstitution; +import com.ldtteam.structurize.blueprints.v1.Blueprint; +import com.ldtteam.structurize.util.BlockInfo; +import com.minecolonies.api.blocks.AbstractBlockHut; +import com.minecolonies.api.items.ModTags; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.Tags; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static com.minecolonies.coremod.util.DomumOrnamentumUtils.DO_NBT_TEXTURE_DATA; + +public class SchemAnalyzerUtil +{ + /** + * Gets the tier for a given block + * + * @param block the block to analyze. + * @return true if is so. + */ + public static int getBlockTier(final Block block) + { + if (block == null) + { + return -1; + } + + if (block.defaultBlockState().is(ModTags.tier6blocks)) + { + return 6; + } + else if (block.defaultBlockState().is(ModTags.tier5blocks)) + { + return 5; + } + else if (block.defaultBlockState().is(ModTags.tier4blocks)) + { + return 4; + } + else if (block.defaultBlockState().is(ModTags.tier3blocks)) + { + return 3; + } + else if (block.defaultBlockState().is(ModTags.tier2blocks)) + { + return 2; + } + else if (block.defaultBlockState().is(ModTags.tier1blocks)) + { + return 1; + } + + return 0; + } + + /** + * Block cost calculation + * + * @param block + * @return + */ + public static double getScoreFor(final Block block) + { + double score = Math.pow(getBlockTier(block) + 1, 3); + + final BlockState state = block.defaultBlockState(); + + if (state.is(BlockTags.LOGS)) + { + score = Math.min(27, score); + } + else if (state.is(BlockTags.WOODEN_STAIRS) || state.is(BlockTags.WOODEN_BUTTONS) || state.is(BlockTags.WOODEN_DOORS) || state.is(BlockTags.WOODEN_SLABS) || state.is( + BlockTags.WOODEN_FENCES) || state.is(BlockTags.WOODEN_TRAPDOORS) || state.is(BlockTags.WOODEN_PRESSURE_PLATES)) + { + score = Math.min(27, score); + score *= 1.0 / 4; + } + else if (state.is(BlockTags.PLANKS)) + { + score = Math.min(27, score); + score *= 1.0 / 4; + } + else if (state.is(BlockTags.SLABS)) + { + score *= 1.0 / 2; + } + else if (state.is(BlockTags.BANNERS)) + { + score *= 6; + } + else if (state.is(Tags.Blocks.STORAGE_BLOCKS)) + { + score *= 9; + } + else if (state.is(BlockTags.ANVIL)) + { + score *= 31; + } + else if (state.is(Tags.Blocks.BOOKSHELVES)) + { + score *= 3; + } + else if (state.is(BlockTags.BASE_STONE_NETHER)) + { + score = 8; + } + + return score; + } + + /** + * Analyzes the given blueprint, calculating statistics like block cost, included buildings etc. + * + * @param blueprint + * @return + */ + public static SchematicAnalyzationResult analyzeSchematic(final Blueprint blueprint) + { + double complexityScore = 0; + int containedBuildings = 0; + Map blocks = new HashMap<>(); + + for (final BlockInfo blockInfo : blueprint.getBlockInfoAsList()) + { + if (isExcludedBlock(blockInfo.getState())) + { + continue; + } + + final Block block = blockInfo.getState().getBlock(); + final ItemStorage storage; + double blockComplexity = 0; + + if (DomumOrnamentumUtils.isDoBlock(block) && blockInfo.hasTileEntityData()) + { + final MaterialTextureData textureData = DomumOrnamentumUtils.getTextureDataFromNBT(blockInfo.getTileEntityData()); + final ItemStack result = new ItemStack(block); + if (textureData != null) + { + double doComplexity = 0; + for (final Block doBlockPart : textureData.getTexturedComponents().values()) + { + doComplexity += getScoreFor(doBlockPart); + } + + // Estimate for do recipes giving higher output per block usually, increased minimum of 2 due to added complexity for crafting + blockComplexity = Math.max(2, doComplexity / 3); + + result.getOrCreateTag().put(DO_NBT_TEXTURE_DATA, blockInfo.getTileEntityData().getCompound(DO_NBT_TEXTURE_DATA)); + } + + storage = new ItemStorage(result); + } + else + { + blockComplexity = getScoreFor(block); + storage = new ItemStorage(block.asItem().getDefaultInstance()); + } + + complexityScore += blockComplexity; + + storage.setAmount(0); + storage.getItemStack().setCount((int) Math.max(1, blockComplexity)); + ItemStorage contained = blocks.get(storage); + if (contained == null) + { + contained = storage; + blocks.put(contained, contained); + } + contained.setAmount(contained.getAmount() + 1); + + if (block instanceof AbstractBlockHut) + { + containedBuildings++; + } + } + + // Complexity for each building block, more building blocks = more complex + complexityScore += containedBuildings * 500; + + // Complexity added for amount of unique blocks, more block variance = more complex + complexityScore += blocks.keySet().size() * 40; + + // Complexity added for schematic size, volume / 10 + complexityScore += (blueprint.getSizeX() * blueprint.getSizeY() * blueprint.getSizeZ()) / 10.0; + + return new SchematicAnalyzationResult((int) complexityScore, blocks.keySet(), containedBuildings, blueprint); + } + + /** + * Excludes certain blocks + * + * @param blockState + * @return + */ + private static boolean isExcludedBlock(final BlockState blockState) + { + return blockState == null || blockState.isAir() || blockState.getBlock() instanceof BlockSubstitution || blockState.getBlock() instanceof BlockSolidSubstitution; + } + + public static class SchematicAnalyzationResult + { + public final int costScore; + public final Set differentBlocks; + public final int containedBuildings; + public final Blueprint blueprint; + + public SchematicAnalyzationResult(final int costScore, final Set differentBlocks, final int containedBuildings, final Blueprint blueprint) + { + this.costScore = costScore; + this.differentBlocks = differentBlocks; + this.containedBuildings = containedBuildings; + this.blueprint = blueprint; + } + + @Override + public boolean equals(final Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + final SchematicAnalyzationResult that = (SchematicAnalyzationResult) o; + return Objects.equals(blueprint, that.blueprint); + } + + @Override + public int hashCode() + { + return Objects.hash(blueprint); + } + } +} diff --git a/src/main/java/com/minecolonies/coremod/util/SortingUtils.java b/src/main/java/com/minecolonies/coremod/util/SortingUtils.java index 557d4185bf7..dc751fcb759 100755 --- a/src/main/java/com/minecolonies/coremod/util/SortingUtils.java +++ b/src/main/java/com/minecolonies/coremod/util/SortingUtils.java @@ -1,6 +1,7 @@ package com.minecolonies.coremod.util; -import com.minecolonies.api.crafting.ItemStorage; +import com.minecolonies.api.crafting.ExactMatchItemStorage; +import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.inventory.api.CombinedItemHandler; import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Log; @@ -42,7 +43,7 @@ public static void sort(final CombinedItemHandler inv) try { - final Map map = new HashMap<>(); + final Map map = new HashMap<>(); if (inv != null) { for (int i = 0; i < inv.getSlots(); i++) @@ -51,7 +52,7 @@ public static void sort(final CombinedItemHandler inv) { continue; } - final ItemStorage storage = new ItemStorage(inv.getStackInSlot(i)); + final ExactMatchItemStorage storage = new ExactMatchItemStorage(inv.getStackInSlot(i)); inv.setStackInSlot(i, ItemStack.EMPTY); int amount = storage.getAmount(); if (map.containsKey(storage)) @@ -88,7 +89,7 @@ public static void sort(final CombinedItemHandler inv) */ private static void pushIntoInv( final AtomicInteger currentSlot, - final Map.Entry entry, + final Map.Entry entry, final CombinedItemHandler inv, final AtomicInteger requiredSlots, final double totalSlots, final double totalRequirement, final Map creativeTabs) @@ -139,7 +140,7 @@ private static void pushIntoInv( * @param t2 the second itemStorage entry. * @return an integer which describes the difference. */ - private static int compare(final Map.Entry t1, final Map.Entry t2) + private static int compare(final Map.Entry t1, final Map.Entry t2) { final int creativeTabId1 = t1.getKey().getPrimaryCreativeTabIndex(); final int creativeTabId2 = t2.getKey().getPrimaryCreativeTabIndex(); @@ -176,11 +177,11 @@ private static int getId(final Item item) * @param map the map of itemStorages with amount. * @return a tuple containing the required information. */ - private static Tuple> calcRequiredSlots(final Map map) + private static Tuple> calcRequiredSlots(final Map map) { final Map creativeTabs = new HashMap<>(); int sum = 0; - for (final Map.Entry entry : map.entrySet()) + for (final Map.Entry entry : map.entrySet()) { sum += Math.ceil((double) entry.getValue() / entry.getKey().getItemStack().getMaxStackSize()); final int index = entry.getKey().getPrimaryCreativeTabIndex(); diff --git a/src/main/java/com/minecolonies/coremod/util/WorkerUtil.java b/src/main/java/com/minecolonies/coremod/util/WorkerUtil.java index d9e7c4f1ed5..2afea1a3b3f 100755 --- a/src/main/java/com/minecolonies/coremod/util/WorkerUtil.java +++ b/src/main/java/com/minecolonies/coremod/util/WorkerUtil.java @@ -2,10 +2,13 @@ import com.ldtteam.structurize.blueprints.v1.Blueprint; import com.ldtteam.structurize.util.BlockInfo; -import com.minecolonies.api.entity.ai.Status; +import com.minecolonies.api.crafting.IRecipeStorage; +import com.minecolonies.api.crafting.ItemStorage; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.inventory.InventoryCitizen; import com.minecolonies.api.items.ModTags; import com.minecolonies.api.util.EntityUtils; +import com.minecolonies.api.util.ItemStackUtils; import com.minecolonies.api.util.Tuple; import com.minecolonies.api.util.WorldUtil; import com.minecolonies.api.util.constant.IToolType; @@ -16,27 +19,25 @@ import com.minecolonies.coremod.entity.ai.citizen.miner.MinerLevel; import com.minecolonies.coremod.entity.citizen.EntityCitizen; import com.minecolonies.coremod.tileentities.TileEntityCompostedDirt; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.Tier; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.GlazedTerracottaBlock; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.entity.MoverType; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.DiggerItem; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.Vec3; -import net.minecraft.ChatFormatting; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.common.TierSortingRegistry; -import net.minecraftforge.common.ToolActions; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -132,9 +133,9 @@ public static boolean isWorkerAtSiteWithMove(@NotNull final AbstractEntityCitize if (!EntityUtils.isLivingAtSiteWithMove(worker, x, y, z, range)) { //If not moving the try setting the point where the entity should move to - if (worker.getNavigation().isDone() && !EntityUtils.tryMoveLivingToXYZ(worker, x, y, z)) + if (worker.getNavigation().isDone()) { - worker.getCitizenStatusHandler().setStatus(Status.PATHFINDING_ERROR); + EntityUtils.tryMoveLivingToXYZ(worker, x, y, z); } return false; } @@ -181,20 +182,20 @@ public static IToolType getBestToolForBlock(final BlockState state, float blockH String toolName = ""; - if (blockHardness > 0f) + if (blockHardness > 0f) + { + for (final Tuple tool : getOrInitTestTools()) { - for (final Tuple tool : getOrInitTestTools()) + if (tool.getB() != null && tool.getB().getItem() instanceof DiggerItem) { - if (tool.getB() != null && tool.getB().getItem() instanceof DiggerItem) + if (tool.getB().isCorrectToolForDrops(state)) { - if (tool.getB().isCorrectToolForDrops(state)) - { - toolName = tool.getA().getName(); - break; - } + toolName = tool.getA().getName(); + break; } } } + } final IToolType toolType = ToolType.getToolType(toolName); return toolType; @@ -369,4 +370,61 @@ public static int getLastLadder(@NotNull final BlockPos pos, final Level world) return pos.getY() + 1; } } + + + /** + * Check if there are too many items (i.e. more than 3) unrelated to the current recipe. + * + * @param currentRecipeStorage the reciep to compare it to. + * @param inv the inventory to check in. + * @return true if so. + */ + public static boolean hasTooManyExternalItemsInInv(final IRecipeStorage currentRecipeStorage, final @NotNull InventoryCitizen inv) + { + int count = 0; + for (int i = 0; i < inv.getSlots(); i++) + { + final ItemStack stack = inv.getStackInSlot(i); + if (!stack.isEmpty() && !isPartOfRecipe(stack, currentRecipeStorage)) + { + count++; + if (count > 3) + { + return true; + } + } + } + return false; + } + + /** + * Check if stack is part of the recipe. + * @param stack the stack to check. + * @param currentRecipeStorage the recipe to compare. + * @return true if so. + */ + public static boolean isPartOfRecipe(final ItemStack stack, final IRecipeStorage currentRecipeStorage) + { + if (ItemStackUtils.compareItemStacksIgnoreStackSize(stack, currentRecipeStorage.getPrimaryOutput())) + { + return true; + } + + for (final ItemStack input : currentRecipeStorage.getCraftingToolsAndSecondaryOutputs()) + { + if (ItemStackUtils.compareItemStacksIgnoreStackSize(input, stack)) + { + return true; + } + } + + for (final ItemStorage input : currentRecipeStorage.getCleanedInput()) + { + if (input.equals(new ItemStorage(stack))) + { + return true; + } + } + return false; + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d4b629789f6..3e6a82f1640 100755 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -92,4 +92,23 @@ public net.minecraft.data.recipes.RecipeProvider m_206406_(Lnet/minecraft/tags/T public net.minecraft.world.level.block.entity.BrewingStandBlockEntity f_58976_ # brewTime public net.minecraft.world.level.block.state.BlockBehaviour f_60439_ # properties -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60884_ # hasCollision \ No newline at end of file +public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60884_ # hasCollision + +public net.minecraft.client.gui.MapRenderer f_93255_ # textureManager + +public net.minecraft.server.level.DistanceManager f_140761_ # tickets +public net.minecraft.world.entity.projectile.AbstractArrow m_36798_()Z # shouldFall + +public net.minecraft.world.damagesource.CombatTracker m_19298_()Lnet/minecraft/world/damagesource/CombatEntry; # getMostSignificantFall + +public net.minecraft.world.entity.LivingEntity m_21334_()Z # checkBedExists +public net.minecraft.world.entity.Entity m_20323_()V # updateFluidOnEyes +public net.minecraft.world.entity.LivingEntity m_21323_()V # updateFallFlying + + +public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer m_117128_(Lnet/minecraft/world/entity/EquipmentSlot;)Z # usesInnerModel +public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer m_117078_(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/client/model/HumanoidModel; # getArmorModel +public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer f_266073_ # armorTrimAtlas + +public net.minecraft.world.entity.LivingEntity m_21333_()V # updateSwimAmount + diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index e7447730cbe..aa1301e4a76 100755 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -25,7 +25,7 @@ displayName="MineColonies" #mandatory # A URL for the "homepage" for this mod, displayed in the mod UI displayURL="https://minecolonies.com" #optional # A file name (in the root of the mod JAR) containing a logo for display -logoFile="minecolonies.png" #optional +logoFile="minecolonies_logo.png" #optional # A text field displayed in the mod UI credits="All the coffees!" #optional # A text field displayed in the mod UI @@ -83,3 +83,9 @@ MineColonies is a colony simulator within Minecraft! There are numerous types of versionRange="[${project.jmapVersion},)" ordering="NONE" side="BOTH" +[[dependencies.minecolonies]] + modId="dynamictrees" + mandatory=false + versionRange="[${project.minecraftVersion}-${project.dynamicTreesVersion},)" + ordering="NONE" + side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/minecolonies/blockstates/blockhutplantationfield.json b/src/main/resources/assets/minecolonies/blockstates/blockhutplantationfield.json new file mode 100644 index 00000000000..0b299e8366e --- /dev/null +++ b/src/main/resources/assets/minecolonies/blockstates/blockhutplantationfield.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=north": { + "model": "minecolonies:block/blockhutplantationfield", + "y": 0 + }, + "facing=east": { + "model": "minecolonies:block/blockhutplantationfield", + "y": 90 + }, + "facing=south": { + "model": "minecolonies:block/blockhutplantationfield", + "y": 180 + }, + "facing=west": { + "model": "minecolonies:block/blockhutplantationfield", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecolonies/blockstates/decorationcontroller.json b/src/main/resources/assets/minecolonies/blockstates/decorationcontroller.json index b3900360560..ca83f04e1af 100755 --- a/src/main/resources/assets/minecolonies/blockstates/decorationcontroller.json +++ b/src/main/resources/assets/minecolonies/blockstates/decorationcontroller.json @@ -31,6 +31,22 @@ "facing=north,mirror=false": { "model": "minecolonies:block/decorationcontroller", "y": 180 + }, + "facing=up,mirror=false": { + "model": "minecolonies:block/decorationcontroller", + "x": 90 + }, + "facing=up,mirror=true": { + "model": "minecolonies:block/decorationcontroller", + "x": 90 + }, + "facing=down,mirror=false": { + "model": "minecolonies:block/decorationcontroller", + "x": 270 + }, + "facing=down,mirror=true": { + "model": "minecolonies:block/decorationcontroller", + "x": 270 } } } diff --git a/src/main/resources/assets/minecolonies/gui/analyzer/analyzedisplay.xml b/src/main/resources/assets/minecolonies/gui/analyzer/analyzedisplay.xml new file mode 100644 index 00000000000..5bd77d213ca --- /dev/null +++ b/src/main/resources/assets/minecolonies/gui/analyzer/analyzedisplay.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/src/main/resources/assets/minecolonies/gui/analyzer/windowanalyze.xml b/src/main/resources/assets/minecolonies/gui/analyzer/windowanalyze.xml new file mode 100644 index 00000000000..0f841a9f4a2 --- /dev/null +++ b/src/main/resources/assets/minecolonies/gui/analyzer/windowanalyze.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/src/main/resources/assets/minecolonies/gui/citizen/requests.xml b/src/main/resources/assets/minecolonies/gui/citizen/requests.xml index 2012f0c7958..f7445039d46 100755 --- a/src/main/resources/assets/minecolonies/gui/citizen/requests.xml +++ b/src/main/resources/assets/minecolonies/gui/citizen/requests.xml @@ -5,22 +5,7 @@ label="$(com.minecolonies.coremod.gui.citizen.requests)"/> - - - - - - - diff --git a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutblocksetting.xml b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutblocksetting.xml index b1dde232bdd..9969af1fe88 100644 --- a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutblocksetting.xml +++ b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutblocksetting.xml @@ -1,6 +1,7 @@ - - - + + + + diff --git a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutboolsetting.xml b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutboolsetting.xml index af09138089b..6bdc96621ff 100644 --- a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutboolsetting.xml +++ b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutboolsetting.xml @@ -1,5 +1,6 @@ - - + + + diff --git a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutcraftingsetting.xml b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutcraftingsetting.xml index 169aa6ba4fe..fca0de2c571 100644 --- a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutcraftingsetting.xml +++ b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutcraftingsetting.xml @@ -1,7 +1,8 @@ - - + - + + + diff --git a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutdocrafting.xml b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutdocrafting.xml index 6e31513e533..b8d6473b5cc 100644 --- a/src/main/resources/assets/minecolonies/gui/layouthuts/layoutdocrafting.xml +++ b/src/main/resources/assets/minecolonies/gui/layouthuts/layoutdocrafting.xml @@ -3,25 +3,17 @@