From 024b311180adf453d7ffb72731223140e8ed6aab Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 26 Sep 2021 13:01:01 -0700 Subject: [PATCH 01/22] Version 1.6.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 805c0b9..cf76a38 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ ${build.version}-SNAPSHOT - 1.6.0 + 1.6.1 -LOCAL BentoBoxWorld_Greenhouses bentobox-world From 61e1db5f4326657509962f0ba7140484f698fc29 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Sun, 31 Oct 2021 11:14:13 +0100 Subject: [PATCH 02/22] Version 1.6.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 805c0b9..79910ae 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ ${build.version}-SNAPSHOT - 1.6.0 + 1.6.1 -LOCAL BentoBoxWorld_Greenhouses bentobox-world @@ -277,4 +277,4 @@ - \ No newline at end of file + From 925e50eb462e6099a13f093c68fde30fdd48b832 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Sun, 31 Oct 2021 11:16:06 +0100 Subject: [PATCH 03/22] Added Blue Orchids spawning in the Swamp biome --- src/main/resources/biomes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index 9572e17..a426a35 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -280,6 +280,7 @@ biomes: plants: RED_MUSHROOM: 20:GRASS_BLOCK BROWN_MUSHROOM: 20:GRASS_BLOCK + BLUE_ORCHID: 10:GRASS_BLOCK LILY_PAD: 5:WATER mobs: SLIME: 5:WATER From b7c30cb608dd444d64f64d1b9de36e6604a077e7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 21 Dec 2021 14:28:31 -0800 Subject: [PATCH 04/22] Version 1.7.0 1.18.1 update --- pom.xml | 6 +++--- src/main/resources/biomes.yml | 2 +- .../bentobox/greenhouses/greenhouse/BiomeRecipeTest.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index cf76a38..2ccccb1 100644 --- a/pom.xml +++ b/pom.xml @@ -46,12 +46,12 @@ 16 2.0.9 - 1.17.1-R0.1-SNAPSHOT - 1.16.0 + 1.18.1-R0.1-SNAPSHOT + 1.18.1 ${build.version}-SNAPSHOT - 1.6.1 + 1.7.0 -LOCAL BentoBoxWorld_Greenhouses bentobox-world diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index 9572e17..4b31be7 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -67,7 +67,7 @@ biomes: moblimit: 9 Cold_Rabbit: friendlyname: "Cold Taiga Forest" - biome: TAIGA_HILLS + biome: OLD_GROWTH_SPRUCE_TAIGA icon: SPRUCE_SAPLING priority: 20 contents: diff --git a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java index 113ed97..aea2889 100644 --- a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java +++ b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java @@ -765,8 +765,8 @@ public class BiomeRecipeTest { */ @Test public void testSetType() { - br.setType(Biome.BADLANDS_PLATEAU); - assertEquals(Biome.BADLANDS_PLATEAU, br.getBiome()); + br.setType(Biome.BADLANDS); + assertEquals(Biome.BADLANDS, br.getBiome()); } /** From df60720e75fa7f28a71f6175ad4d497875819f27 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Fri, 31 Dec 2021 09:18:46 -0800 Subject: [PATCH 05/22] German translation (#86) * Translate de.yml via GitLocalize * Translate de.yml via GitLocalize Co-authored-by: mt-gitlocalize Co-authored-by: xXjojojXx --- src/main/resources/locales/de.yml | 163 ++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/main/resources/locales/de.yml diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml new file mode 100644 index 0000000..5172f65 --- /dev/null +++ b/src/main/resources/locales/de.yml @@ -0,0 +1,163 @@ +--- +protection: + flags: + GREENHOUSE: + name: Gewächshäuser + description: |- + &bUmschalten, wer + &bdie Gewächshäuser kontrollieren kann +greenhouses: + general: + greenhouses: Gewächshäuser + errors: + move: Gehe zuerst in ein Gewächshaus, das dir gehört. + no-rank: "& cDu hast keinen Rang, um das zu tun." + notyours: Das ist nicht dein Gewächshaus! + not-inside: "& cDu bist nicht in einem Gewächshaus!" + tooexpensive: Du kannst dir das nicht leisten [price] + alreadyexists: Gewächshaus existiert bereits! + norecipe: Kann kein Gewächshaus bauen! + event: + broke: Du hast das Gewächshaus kaputt gemacht! Biome auf [biome] umstellen! + entering: Betreten des Gewächshauses [biome] + leaving: Das Gewächshaus verlassen [biome] + recipe: + blockscolor: "&f" + title: "[[biome] recipe]" + watermustbe: Wasser > [coverage]% der Bodenfläche. + icemustbe: Eisblöcke > [coverage]% der Bodenfläche. + lavamustbe: Lava > [coverage]% der Bodenfläche. + minimumblockstitle: "[Minimum blocks required]" + nootherblocks: Keine weiteren Blöcke erforderlich. + missing: Gewächshaus fehlt + commands: + user: + remove: + description: Entfernt ein Gewächshaus, in dem Sie stehen, wenn Sie der Eigentümer + sind + make: + description: Versuche ein Gewächshaus zu bauen + parameters: "" + error: + already: "&cEs gibt hier schon ein Gewächshaus!" + FAIL_BAD_ROOF_BLOCKS: "&cDach enthält unzulässige Blöcke!" + FAIL_BAD_WALL_BLOCKS: "&cWand enthält unzulässige Blöcke!" + FAIL_BELOW: "&cDu musst im Gewächshaus sein, um es zu versuchen." + FAIL_BLOCKS_ABOVE: "&cEs dürfen keine Blöcke über dem Gewächshaus sein! + Rote Glasblöcke sollten die Problemblöcke anzeigen." + FAIL_HOLE_IN_ROOF: "&cIn dem Dach ist ein Loch oder es ist nicht flach! + Rote Glasblöcke sollten das Problem anzeigen." + FAIL_HOLE_IN_WALL: "&cIn der Wand ist ein Loch!" + FAIL_NO_ROOF: "&cEs scheint kein Dach zu geben!" + FAIL_TOO_MANY_DOORS: "&cEs dürfen nicht mehr als 4 Türen im Gewächshaus + sein!" + FAIL_TOO_MANY_HOPPERS: "&cIn den Wänden oder im Dach ist nur ein Trichter + zulässig." + FAIL_UNEVEN_WALLS: "&cDie Wände sind uneben. Rote Glasblöcke sollten die + Problemblöcke anzeigen." + FAIL_INSUFFICIENT_ICE: "&cZu wenig Eis für dieses Rezept" + FAIL_INSUFFICIENT_LAVA: "&cZu wenig Lava für dieses Rezept" + FAIL_INSUFFICIENT_WATER: "&cZu wenig Wasser für dieses Rezept" + FAIL_NO_ICE: "&cFür dieses Rezept wird Eis benötigt" + FAIL_NO_LAVA: "&cFür dieses Rezept wird Lava benötigt" + FAIL_NO_WATER: "&cFür dieses Rezept wird Wasser benötigt" + FAIL_NO_RECIPE_FOUND: "&c Zu diesem Gewächshaus konnte kein passendes Rezept + gefunden werden" + FAIL_INSUFFICIENT_BLOCKS: "&cWeitere Blöcke sind erforderlich, um dieses + Rezept zu erstellen!" + FAIL_OVERLAPPING: "&cGewächshäuser können sich keine Wände teilen, sorry." + success: "&2Du hast erfolgreich ein [biome] Biom Gewächshaus gebaut! Beim + nächsten Teleport oder Login wird Biom synchronisiert." + missing-blocks: "[material] x [number] &cFehlt" + unknown-recipe: "&Unbekanntes Rezept" + try-these: "&cVersuche einen von diesen:" + recipe-format: "&3[name]" + info: + title: "&A[Wie man ein Gewächshaus baut]" + instructions: "&EStelle einen Kasten aus Glas mit 4 Wänden und einem flachen + &EGlasdach her und füge bis zu &F4 Türen &Ein den Wänden hinzu. &EPlatziere + &F1 Trichter &Ein eine Wand oder ein Dach und füge Wassereimer hinzu. &EUm + Schnee und/oder Knochenmehl herzustellen, um Pflanzen automatisch wachsen + zu lassen. &EPrüfe die Biom-Rezepte, welche Blöcke in einem Gewächshaus + sein müssen, um ein &EGewächshaus erfolgreich zu machen." +help: + help: Hilfe + make: Versucht ein Gewächshaus zu bauen + remove: Entfernt ein Gewächshaus, in dem du stehst, wenn du der Besitzer bist + info: Wie man ein Gewächshaus baut + list: Listet alle Gewächshausbiome auf, die hergestellt werden können + recipe: Erklärt dir, wie man das Gewächshaus biome macht + opengui: Öffnet die Gewächshaus-GUI +list: + title: "[Gewächshaus-Biom-Rezepte]" + info: Benutze /greenhouse recipe um Details über die Herstellung jedes + Gewächshauses zu sehen +error: + greenhouseProtected: Gewächshaus geschützt + move: Gehe zuerst in ein Gewächshaus, das dir gehört. + notowner: Du musst der Besitzer dieses Gewächshauses sein, um das zu tun. + removing: Gewächshaus entfernen! + notyours: Das ist nicht dein Gewächshaus! + notinside: Du bist nicht in einem Gewächshaus! + tooexpensive: du kannst dir das nicht leisten [price] + alreadyexists: Gewächshaus existiert bereits! + norecipe: Kann kein Gewächshaus bauen! +messages: + enter: Betreten des [biome] Gewächshauses von [owner]! + leave: Verlässt jetzt das Gewächshaus von [owner]. + youarein: Du bist jetzt in [owner]'s [biome] Gewächshaus! + removed: Dieses Gewächshaus ist nicht mehr ... + removedmessage: Ein [biome] Gewächshaus von dir ist nicht mehr! + ecolost: Dein Gewächshaus in [location] hat sein Ökosystem verloren und wurde entfernt. +info: + title: "&A [Gewächshaus bauen]" + instructions: "&EStelle einen Kasten aus Glas mit 4 Wänden und einem flachen &EGlasdach + her und füge bis zu &F4 Türen &Ein den Wänden hinzu. &EPlatziere &F1 Trichter + &Ein eine Wand oder ein Dach und füge Wassereimer hinzu. &EUm Schnee und/oder + Knochenmehl herzustellen, um Pflanzen automatisch wachsen zu lassen. &EPrüfe die + \ Biom-Rezepte, welche Blöcke in einem Gewächshaus sein müssen, um ein &EGewächshaus + erfolgreich zu machen." + info: "[Gewächshaus Info]" + none: Keiner + nomore: "&4Du kannst keine Gewächshäuser mehr bauen!" + onemore: "&6Du kannst noch ein weiteres Gewächshaus bauen." + youcanbuild: "&ADu kannst bis zu [number] mehr Gewächshäuser bauen!" + unlimited: "&ADu kannst eine unbegrenzte Anzahl von Gewächshäusern bauen!" + welcome: "&BHerzlich willkommen! Klicken Sie hier für Anweisungen" +recipe: + blockscolor: "&f" + hint: benutze /greenhouse list, um eine Liste von Rezeptnummern zu sehen! + wrongnumber: Die Rezeptnummer muss zwischen 1 und [size] liegen + title: "[[biome] recipe]" + nowater: Kein Wasser erlaubt. + noice: Kein Eis erlaubt. + nolava: Keine Lava erlaubt. + watermustbe: Wasser > [coverage]% der Bodenfläche. + icemustbe: Eisblöcke > [coverage]% der Bodenfläche. + lavamustbe: Lava > [coverage]% der Bodenfläche. + minimumblockstitle: "[Minimum blocks required]" + nootherblocks: Keine weiteren Blöcke erforderlich. + missing: Gewächshaus fehlt +event: + broke: Du hast das Gewächshaus kaputt gemacht! Biome auf [biome] umstellen! + fix: repariere das Gewächshaus und baue es dann wieder auf + cannotplace: Blöcke können nicht über einem Gewächshaus platziert werden! + pistonerror: Kolben können keine Blöcke über ein Gewächshaus schieben! +limits: + noneallowed: Die Berechtigungen erlauben dir keine Gewächshäuser, deshalb wurden + [nummer] entfernt. + limitedto: Die Berechtigungen beschränken dich auf [limit] Gewächshäuser, so dass + [number] entfernt wurden. +adminHelp: + reload: Konfiguration aus Datei neu laden. + info: Liefert Informationen über das Gewächshaus, in dem du dich befindest +reload: + configReloaded: Konfiguration aus Datei neu geladen. +admininfo: + error: Gewächshaus-Info nur im Spiel verfügbar + error2: Versetzt dich in ein Gewächshaus, um Infos zu sehen. + flags: "[Greenhouse Flags]" +news: + headline: "[Greenhouse News]" +controlpanel: + title: "&AGewächshäuser" From b90559122be388ad98d9f48bc2888b221b68602a Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Fri, 31 Dec 2021 09:20:45 -0800 Subject: [PATCH 06/22] Translate hu.yml via GitLocalize (#87) Co-authored-by: driverdakid --- src/main/resources/locales/hu.yml | 242 +++++++++++++----------------- 1 file changed, 103 insertions(+), 139 deletions(-) diff --git a/src/main/resources/locales/hu.yml b/src/main/resources/locales/hu.yml index c86604e..d4da237 100644 --- a/src/main/resources/locales/hu.yml +++ b/src/main/resources/locales/hu.yml @@ -1,189 +1,153 @@ -########################################################################################### -# This is a YML file. Be careful when editing. Check your edits in a YAML checker like # -# the one at http://yaml-online-parser.appspot.com # -# If this file is deleted, then it will be recreate at the next reload. # -########################################################################################### +--- protection: flags: GREENHOUSE: name: Greenhouses - description: | - &bÁllítsd be, hogy ki - &bkezelheti az üvegházat - + description: "&bÁllítsd be, hogy ki\n&bkezelheti az üvegházat \n" greenhouses: general: - greenhouses: "Üvegházak" - + greenhouses: Üvegházak errors: - move: "Menj a saját üvegházadhoz." + move: Menj a saját üvegházadhoz. no-rank: "&cNincs rangod ehhez." - notyours: "Ez nem a te üvegházad!" + notyours: Ez nem a te üvegházad! not-inside: "&cNem vagy üvegházban!" - tooexpensive: "Ehhez nincs elég pénzed, ennyi szükséges: [price]" - alreadyexists: "Az üvegház már létezik!" - norecipe: "Nem tudsz üvegházat csinálni!" - + tooexpensive: 'Ehhez nincs elég pénzed, ennyi szükséges: [price]' + alreadyexists: Az üvegház már létezik! + norecipe: Nem tudsz üvegházat csinálni! event: - broke: "Összetörted az üvegházad! Visszaállítjuk a biome-ot [biome]-ra/re!" - entering: "Belépés a(z) [biome] üvegházba." - leaving: "Kilépés a(z) [biome] üvegházból." - + broke: Összetörted az üvegházad! Visszaállítjuk a biome-ot [biome]-ra/re! + entering: Belépés a(z) [biome] üvegházba. + leaving: Kilépés a(z) [biome] üvegházból. recipe: - blockscolor: "&f" - title: "[[biome] recept]" - watermustbe: "Víz > [coverage]% kell, hogy legyen az alapterületen." - icemustbe: "Jég blokk > [coverage]% kell, hogy legyen az alapterületen." - lavamustbe: "Láva > [coverage]% kell, hogy legyen az alapterületen." - minimumblockstitle: "[Minimum blokkmennyiség]" - nootherblocks: "Nem szükséges több blokk." - missing: "Hiányzó üvegház." - + blockscolor: "&f" + title: "[[biome] recept]" + watermustbe: Víz > [coverage]% kell, hogy legyen az alapterületen. + icemustbe: Jég blokk > [coverage]% kell, hogy legyen az alapterületen. + lavamustbe: Láva > [coverage]% kell, hogy legyen az alapterületen. + minimumblockstitle: "[Minimum blokkmennyiség]" + nootherblocks: Nem szükséges több blokk. + missing: Hiányzó üvegház. commands: user: remove: - description: "Ha az üvegházadban állsz és te vagy a tulaja, akkor törli azt." + description: Ha az üvegházadban állsz és te vagy a tulaja, akkor törli azt. make: - description: "Megpróbál készíteni egy üvegházat." + description: Megpróbál készíteni egy üvegházat. parameters: "" error: - already: "Az üvegház már létezik!" + already: Az üvegház már létezik! FAIL_BAD_ROOF_BLOCKS: "&cA tető nem engedélyezett blokkokat tartalmaz!" FAIL_BAD_WALL_BLOCKS: "&cA fal nem engedélyezett blokkokat tartalmaz!" FAIL_BELOW: "&cAz üvegházban kell lenned, hogy megpróbáld elkészíteni" - FAIL_BLOCKS_ABOVE: "&cAz üvegház felett nem lehetnek blokkok! A piros üvegblokkoknak meg kell mutatniuk a problémás blokkokat." - FAIL_HOLE_IN_ROOF: "&cVan egy lyuk a tetőn, vagy nem sík! A piros üvegblokkoknak meg kell mutatniuk a problémát." + FAIL_BLOCKS_ABOVE: "&cAz üvegház felett nem lehetnek blokkok! A piros üvegblokkoknak + meg kell mutatniuk a problémás blokkokat." + FAIL_HOLE_IN_ROOF: "&cVan egy lyuk a tetőn, vagy nem sík! A piros üvegblokkoknak + meg kell mutatniuk a problémát." FAIL_HOLE_IN_WALL: "&cVan egy lyuk a falban!" FAIL_NO_ROOF: "&cÚgy tűnik, nincs tető!" FAIL_TOO_MANY_DOORS: "&cAz üvegházban nem lehet négynél több ajtó!" - FAIL_TOO_MANY_HOPPERS: "&cCsak egy tölcsér megengedett a falakban vagy a tetőben." - FAIL_UNEVEN_WALLS: "&cA falak egyenetlenek. A piros üvegblokkoknak meg kell mutatniuk a problémás blokkokat." + FAIL_TOO_MANY_HOPPERS: "&cCsak egy tölcsér megengedett a falakban vagy a + tetőben." + FAIL_UNEVEN_WALLS: "&cA falak egyenetlenek. A piros üvegblokkoknak meg kell + mutatniuk a problémás blokkokat." FAIL_INSUFFICIENT_ICE: "&cNem elegendő a jég ehhez a recept elkészítéséhez." FAIL_INSUFFICIENT_LAVA: "&cNem elegendő a láva ehhez a recept elkészítéséhez." FAIL_INSUFFICIENT_WATER: "&cNem elegendő a víz ehhez a recept elkészítéséhez." FAIL_NO_ICE: "&cA jég szükséges ehhez a recepthez." FAIL_NO_LAVA: "&cA láva szükséges ehhez a recepthez." FAIL_NO_WATER: "&cA víz szükséges ehhez a recepthez." + FAIL_NO_RECIPE_FOUND: "&c Nem található ilyen recept ebben a melegházban." FAIL_INSUFFICIENT_BLOCKS: "&cTovábbi blokkokra van szükség a recept elkészítéséhez!" FAIL_OVERLAPPING: "&cAz üvegházak nem oszthatják meg a falakat, bocs." - success: "Sikeresen elkészítettél egy [biome] üvegházat! Az éghajlat szinkronizálódik a következő teleportálásnál, vagy belépésnél." + success: Sikeresen elkészítettél egy [biome] üvegházat! Az éghajlat szinkronizálódik + a következő teleportálásnál, vagy belépésnél. missing-blocks: "&cHiányzik [material] x [number]" unknown-recipe: "&cIsmeretlen recept" try-these: "&cPróbálj meg egyet az alábbiak közül:" recipe-format: "&3[name]" info: title: "&A[Hogyan Készíts Üvegházat]" - instructions: | - &EKészíts egy üvegdobozt 4 fallal, egy üvegtetővel, - &Eés akár 4 ajtót is tehetsz a falba. - &ERakj a falba vagy a tetőbe &F1 tölcsért, &Eés helyezz bele vizes vödröket, - &Ehogy havat és/vagy csontlisztet készíts, mellyel automatikusan tudod növeszteni a növényeidet. - &ENézd meg az éghajlatokhoz tartozó recepteket, hogy megtudd milyen blokkok legyenek feltétlenül - &Eaz üvegházban ahhoz, hogy sikeresen elkészítsd. - - -######### Old locale for reference + instructions: "&EKészíts egy üvegdobozt 4 fallal, egy üvegtetővel,\n&Eés akár + 4 ajtót is tehetsz a falba.\n&ERakj a falba vagy a tetőbe &F1 tölcsért, + &Eés helyezz bele vizes vödröket,\n&Ehogy havat és/vagy csontlisztet készíts, + mellyel automatikusan tudod növeszteni a növényeidet.\n&ENézd meg az éghajlatokhoz + tartozó recepteket, hogy megtudd milyen blokkok legyenek feltétlenül\n&Eaz + üvegházban ahhoz, hogy sikeresen elkészítsd. \n" help: - help: "help" - make: "Tries to make a greenhouse" - remove: "Removes a greenhouse that you are standing in if you are the owner" - info: "How to make a greenhouse" - list: "Lists all the greenhouse biomes that can be made" - recipe: "Tells you how to make greenhouse biome" - opengui: "Opens the Greenhouse GUI" - + help: help + make: Tries to make a greenhouse + remove: Removes a greenhouse that you are standing in if you are the owner + info: How to make a greenhouse + list: Lists all the greenhouse biomes that can be made + recipe: Tells you how to make greenhouse biome + opengui: Opens the Greenhouse GUI list: - title: "[Greenhouse Biome Recipes]" - info: "Use /greenhouse recipe to see details on how to make each greenhouse" - - -################ -#General Errors# -################ + title: "[Greenhouse Biome Recipes]" + info: Use /greenhouse recipe to see details on how to make each greenhouse error: - greenhouseProtected: "Greenhouse protected" - move: "Move to a greenhouse you own first." - notowner: "You must be the owner of this greenhouse to do that." - removing: "Removing greenhouse!" - notyours: "This is not your greenhouse!" - notinside: "You are not in a greenhouse!" - tooexpensive: "You cannot afford [price]" - alreadyexists: "Greenhouse already exists!" - norecipe: "Cannot make a greenhouse!" - + greenhouseProtected: Greenhouse protected + move: Move to a greenhouse you own first. + notowner: You must be the owner of this greenhouse to do that. + removing: Removing greenhouse! + notyours: This is not your greenhouse! + notinside: You are not in a greenhouse! + tooexpensive: You cannot afford [price] + alreadyexists: Greenhouse already exists! + norecipe: Cannot make a greenhouse! messages: - enter: "Entering [owner]'s [biome] greenhouse!" - leave: "Now leaving [owner]'s greenhouse." - youarein: "You are now in [owner]'s [biome] greenhouse!" - removed: "This greenhouse is no more..." - removedmessage: "A [biome] greenhouse of yours is no more!" - ecolost: "Your greenhouse at [location] lost its eco system and was removed." - + enter: Entering [owner]'s [biome] greenhouse! + leave: Now leaving [owner]'s greenhouse. + youarein: You are now in [owner]'s [biome] greenhouse! + removed: This greenhouse is no more... + removedmessage: A [biome] greenhouse of yours is no more! + ecolost: Your greenhouse at [location] lost its eco system and was removed. info: - title: "&A[How To Build A Greenhouse]" - instructions: | - &EMake a box out of out of glass with 4 walls and a flat glass - &Eroof and add up to &F4 doors &Ein the walls. - &EPlace &F1 hopper &Ein a wall or roof and add water buckets. - &Eto make snow and/or bonemeal to grow plants automatically. - &ECheck the biome recipes for what blocks must be inside a - &Egreenhouse to make one successfully. - info: "[Greenhouse Info]" - none: "None" - nomore: "&4You cannot build any more greenhouses!" - onemore: "&6You can build one more greenhouse." - youcanbuild: "&AYou can build up to [number] more greenhouses!" - unlimited: "&AYou can build an unlimited number of greenhouses!" - welcome: "&BWelcome! Click here for instructions" - + title: "&A[How To Build A Greenhouse]" + instructions: "&EMake a box out of out of glass with 4 walls and a flat glass\n&Eroof + and add up to &F4 doors &Ein the walls.\n&EPlace &F1 hopper &Ein a wall or roof + and add water buckets.\n&Eto make snow and/or bonemeal to grow plants automatically.\n&ECheck + the biome recipes for what blocks must be inside a\n&Egreenhouse to make one successfully. + \n" + info: "[Greenhouse Info]" + none: None + nomore: "&4You cannot build any more greenhouses!" + onemore: "&6You can build one more greenhouse." + youcanbuild: "&AYou can build up to [number] more greenhouses!" + unlimited: "&AYou can build an unlimited number of greenhouses!" + welcome: "&BWelcome! Click here for instructions" recipe: - blockscolor: "&f" - hint: "Use /greenhouse list to see a list of recipe numbers!" - wrongnumber: "Recipe number must be between 1 and [size]" - title: "[[biome] recipe]" - nowater: "No water allowed." - noice: "No ice allowed." - nolava: "No lava allowed." - watermustbe: "Water > [coverage]% of floor area." - icemustbe: "Ice blocks > [coverage]% of floor area." - lavamustbe: "Lava > [coverage]% of floor area." - minimumblockstitle: "[Minimum blocks required]" - nootherblocks: "No other blocks required." - missing: "Greenhouse is missing" - + blockscolor: "&f" + hint: Use /greenhouse list to see a list of recipe numbers! + wrongnumber: Recipe number must be between 1 and [size] + title: "[[biome] recipe]" + nowater: No water allowed. + noice: No ice allowed. + nolava: No lava allowed. + watermustbe: Water > [coverage]% of floor area. + icemustbe: Ice blocks > [coverage]% of floor area. + lavamustbe: Lava > [coverage]% of floor area. + minimumblockstitle: "[Minimum blocks required]" + nootherblocks: No other blocks required. + missing: Greenhouse is missing event: - broke: "You broke this greenhouse! Reverting biome to [biome]!" - fix: "Fix the greenhouse and then make it again." - cannotplace: "Blocks cannot be placed above a greenhouse!" - pistonerror: "Pistons cannot push blocks over a greenhouse!" - - + broke: You broke this greenhouse! Reverting biome to [biome]! + fix: Fix the greenhouse and then make it again. + cannotplace: Blocks cannot be placed above a greenhouse! + pistonerror: Pistons cannot push blocks over a greenhouse! limits: - noneallowed: "Permissions do not allow you any greenhouses so [number] were removed." - limitedto: "Permissions limit you to [limit] greenhouses so [number] were removed." - - -################################## -#Admin commands that use /gadmin # -################################## - -#Help + noneallowed: Permissions do not allow you any greenhouses so [number] were removed. + limitedto: Permissions limit you to [limit] greenhouses so [number] were removed. adminHelp: - reload: "reload configuration from file." - info: "provides info on the greenhouse you are in" - -#reload + reload: reload configuration from file. + info: provides info on the greenhouse you are in reload: - configReloaded: "Configuration reloaded from file." - + configReloaded: Configuration reloaded from file. admininfo: - error: "Greenhouse info only available in-game" - error2: "Put yourself in a greenhouse to see info." - flags: "[Greenhouse Flags]" - + error: Greenhouse info only available in-game + error2: Put yourself in a greenhouse to see info. + flags: "[Greenhouse Flags]" news: - headline: "[Greenhouse News]" - + headline: "[Greenhouse News]" controlpanel: - title: "&AGreenhouses" - + title: "&AGreenhouses" From c5b80b2f4a5c9e4d87573595117e27e8e3bfb3b0 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Fri, 31 Dec 2021 09:24:08 -0800 Subject: [PATCH 07/22] Translate ja.yml via GitLocalize (#88) Co-authored-by: tastybento --- src/main/resources/locales/ja.yml | 191 ++++++++++++++++-------------- 1 file changed, 99 insertions(+), 92 deletions(-) diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index c63fc17..e34b444 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -1,37 +1,42 @@ --- -adminHelp: - info: あなたがいる温室に関する情報を提供します - reload: ファイルから設定をリロードします。 -admininfo: - error: ゲーム内でのみ利用可能な温室情報 - error2: 温室で情報を確認してください。 - flags: "[温室旗]" -controlpanel: - title: "&A温室" -error: - alreadyexists: 温室はすでに存在します! - greenhouseProtected: 温室保護 - move: 最初に所有する温室に移動します。 - norecipe: 温室を作ることができません! - notinside: あなたは温室の中にいません! - notowner: それを行うには、この温室の所有者でなければなりません。 - notyours: これはあなたの温室ではありません! - removing: 温室を撤去! - tooexpensive: あなたは余裕がない[price] -event: - broke: あなたはこの温室を壊しました!バイオームを[biome]に戻しています! - cannotplace: ブロックを温室の上に置くことはできません! - fix: 温室を修理してから、もう一度作ります。 - pistonerror: ピストンは温室の上でブロックを押すことができません! +protection: + flags: + GREENHOUSE: + name: 温室 + description: |- + &b誰が温室を制御できるかを + &b設定する greenhouses: + general: + greenhouses: 温室 + errors: + move: 最初に所有する温室に移動します。 + no-rank: "&cあなたにはそれをするランクがありません。" + notyours: これはあなたの温室ではありません! + not-inside: "&cあなたは温室の中にいません!" + tooexpensive: あなたは余裕がない[price] + alreadyexists: 温室はすでに存在します! + norecipe: 温室を作ることができません! + event: + broke: "&c温室を壊しました!バイオームを [biome]に戻しています!" + entering: "[biome]の温室に入る" + leaving: "[biome]の温室を離れる" + recipe: + blockscolor: "&f" + title: "[[biome]レシピ]" + watermustbe: 水>[coverage]床面積の%。 + icemustbe: 氷のブロック>床面積の[coverage]%。 + lavamustbe: 溶岩> [coverage]床面積の%。 + minimumblockstitle: "[必要な最小ブロック]" + nootherblocks: 他のブロックは必要ありません。 + missing: 温室がありません commands: user: - info: - title: "&A [温室の作り方]" - instructions: 4つの壁と平らなガラス屋根でガラスから箱を作り、壁に最大4つのドアを追加します。 1つのホッパーを壁または屋根に置き、水バケツを追加します。 - 雪や骨粉を作り、植物を自動的に育てます。 バイオームレシピを確認して、温室内で正常にブロックするために必要なブロックを確認してください。 + remove: + description: あなたが所有者である場合、あなたが立っている温室を取り除きます make: description: 温室を作ってみる + parameters: "<レシピ>" error: already: "&cここには温室がすでにあります!" FAIL_BAD_ROOF_BLOCKS: "&c屋根には許可されていないブロックが含まれています!" @@ -40,97 +45,99 @@ greenhouses: FAIL_BLOCKS_ABOVE: "&c温室の上にブロックを置くことはできません!赤いガラスブロックに問題のあるブロックが表示されます。" FAIL_HOLE_IN_ROOF: "&c屋根に穴があるか、平らではありません!赤いガラスブロックが問題を示しているはずです。" FAIL_HOLE_IN_WALL: "&c壁に穴が開いています!" - FAIL_INSUFFICIENT_ICE: "&cこのレシピを作成するには氷が足りません" - FAIL_INSUFFICIENT_LAVA: "&cこのレシピを作るには溶岩が足りません" - FAIL_INSUFFICIENT_WATER: "&cこのレシピを作るのに水が足りません" FAIL_NO_ROOF: "&c屋根がないようです!" FAIL_TOO_MANY_DOORS: "&c温室には4つ以上のドアを置くことはできません!" FAIL_TOO_MANY_HOPPERS: "&c壁または屋根に使用できるホッパーは1つだけです。" FAIL_UNEVEN_WALLS: "&c壁が不均一です。赤いガラスブロックに問題のあるブロックが表示されます。" + FAIL_INSUFFICIENT_ICE: "&cこのレシピを作成するには氷が足りません" + FAIL_INSUFFICIENT_LAVA: "&cこのレシピを作るには溶岩が足りません" + FAIL_INSUFFICIENT_WATER: "&cこのレシピを作るのに水が足りません" FAIL_NO_ICE: このレシピを作成するには&c氷が必要です FAIL_NO_LAVA: このレシピを作成するには&c溶岩が必要です FAIL_NO_WATER: このレシピを作成するには&c水が必要です - parameters: "<レシピ>" + FAIL_NO_RECIPE_FOUND: "&cこの温室に一致するレシピが見つかりませんでした" + FAIL_INSUFFICIENT_BLOCKS: "&cこのレシピを作成するには、さらに多くのブロックが必要です。" + FAIL_OVERLAPPING: "&c温室は壁を共有できません。申し訳ありません。" success: "&2あなたは[biome]バイオーム温室を無事に作成しました!バイオームは次のテレポートまたはログインで同期します。" - remove: - description: あなたが所有者である場合、あなたが立っている温室を取り除きます - errors: - alreadyexists: 温室はすでに存在します! - move: 最初に所有する温室に移動します。 - no-rank: "&cあなたにはそれをするランクがありません。" - norecipe: 温室を作ることができません! - not-inside: "&cあなたは温室の中にいません!" - notyours: これはあなたの温室ではありません! - tooexpensive: あなたは余裕がない[price] - general: - greenhouses: 温室 - recipe: - blockscolor: "&f" - minimumblockstitle: "[必要な最小ブロック]" - missing: 温室がありません - nootherblocks: 他のブロックは必要ありません。 - title: "[[biome]レシピ]" - watermustbe: 水>[coverage]床面積の%。 - icemustbe: 氷のブロック>床面積の[coverage]%。 - lavamustbe: 溶岩> [coverage]床面積の%。 - event: - broke: "&c温室を壊しました!バイオームを [biome]に戻しています!" - entering: "[biome]の温室に入る" - leaving: "[biome]の温室を離れる" + missing-blocks: "&c欠落[material] x [number]" + unknown-recipe: "&c不明なレシピ" + try-these: "&c次のいずれかを試してください。" + recipe-format: "&3[name]" + info: + title: "&A [温室の作り方]" + instructions: 4つの壁と平らなガラス屋根でガラスから箱を作り、壁に最大4つのドアを追加します。 1つのホッパーを壁または屋根に置き、水バケツを追加します。 + 雪や骨粉を作り、植物を自動的に育てます。 バイオームレシピを確認して、温室内で正常にブロックするために必要なブロックを確認してください。 help: help: 手助け + make: 温室を作ろうとする + remove: あなたが所有者である場合、あなたが立っている温室を取り除きます info: 温室の作り方 list: 作成可能なすべての温室バイオームをリストします - make: 温室を作ろうとする recipe: 温室バイオームの作り方を説明します - remove: あなたが所有者である場合、あなたが立っている温室を取り除きます opengui: 温室のGUI -info: - info: "[温室情報]" - instructions: "&E 4つの壁と平らなガラスの&E屋根でガラスから箱を作り、壁に&F 4のドア&Eを追加します。 &E壁と屋根に&F 1ホッパー&Eを配置し、ウォーターバケツ&Eを追加して雪や骨粉を作り、植物を自動的に成長させます。 - &Eバイオームレシピを確認して、&E温室内で正常にブロックを作成するために必要なブロックを確認します。" - nomore: "&4これ以上温室を建設することはできません!" - none: 無し - onemore: "&6温室をもう1つ構築できます。" - title: "&A [温室の作り方]" - unlimited: "&A温室を無制限に構築できます!" - welcome: "&B ようこそ!手順についてはここをクリックしてください" - youcanbuild: "&A温室を最大[number]個まで構築できます!" -limits: - limitedto: 許可により温室が[limit]に制限されるため、[number]が削除されました。 - noneallowed: 許可により温室が許可されないため、[number]は削除されました。 list: title: "[温室効果バイオームのレシピ]" info: "/greenhouse recipe <番号>を使用する各温室の作り方の詳細を見る" +error: + greenhouseProtected: 温室保護 + move: 最初に所有する温室に移動します。 + notowner: それを行うには、この温室の所有者でなければなりません。 + removing: 温室を撤去! + notyours: これはあなたの温室ではありません! + notinside: あなたは温室の中にいません! + tooexpensive: あなたは余裕がない[price] + alreadyexists: 温室はすでに存在します! + norecipe: 温室を作ることができません! messages: - ecolost: "[location]の温室はエコシステムを失い、撤去されました。" - leave: "[owner]の温室を離れます。" - removed: この温室はもうありません... enter: "[owner]の[biome]の温室に入る!" + leave: "[owner]の温室を離れます。" youarein: あなたは今[owner]の[biome]の温室にいます! + removed: この温室はもうありません... removedmessage: あなたの[biome]の温室はもうありません! -news: - headline: "[温室ニュース]" -protection: - flags: - GREENHOUSE: - name: 温室 - description: |- - &b誰が温室を制御できるかを - &b設定する + ecolost: "[location]の温室はエコシステムを失い、撤去されました。" +info: + title: "&A [温室の作り方]" + instructions: "&E 4つの壁と平らなガラスの&E屋根でガラスから箱を作り、壁に&F 4のドア&Eを追加します。 &E壁と屋根に&F 1ホッパー&Eを配置し、ウォーターバケツ&Eを追加して雪や骨粉を作り、植物を自動的に成長させます。 + &Eバイオームレシピを確認して、&E温室内で正常にブロックを作成するために必要なブロックを確認します。" + info: "[温室情報]" + none: 無し + nomore: "&4これ以上温室を建設することはできません!" + onemore: "&6温室をもう1つ構築できます。" + youcanbuild: "&A温室を最大[number]個まで構築できます!" + unlimited: "&A温室を無制限に構築できます!" + welcome: "&B ようこそ!手順についてはここをクリックしてください" recipe: blockscolor: "&f" hint: "/ greenhouse listを使用して、レシピ番号のリストを表示します!" + wrongnumber: レシピ番号は1から[size]の間でなければなりません + title: "[[biome]レシピ]" + nowater: 水は許可されません。 + noice: 氷は許可されていません。 + nolava: 溶岩は許可されていません。 + watermustbe: 水> [coverage]床面積の%。 icemustbe: 氷のブロック>床面積の[coverage]%。 lavamustbe: 溶岩> [coverage]床面積の%。 minimumblockstitle: "[必要な最小ブロック]" - missing: 温室がありません - noice: 氷は許可されていません。 - nolava: 溶岩は許可されていません。 nootherblocks: 他のブロックは必要ありません。 - nowater: 水は許可されません。 - title: "[[biome]レシピ]" - watermustbe: 水> [coverage]床面積の%。 - wrongnumber: レシピ番号は1から[size]の間でなければなりません + missing: 温室がありません +event: + broke: あなたはこの温室を壊しました!バイオームを[biome]に戻しています! + fix: 温室を修理してから、もう一度作ります。 + cannotplace: ブロックを温室の上に置くことはできません! + pistonerror: ピストンは温室の上でブロックを押すことができません! +limits: + noneallowed: 許可により温室が許可されないため、[number]は削除されました。 + limitedto: 許可により温室が[limit]に制限されるため、[number]が削除されました。 +adminHelp: + reload: ファイルから設定をリロードします。 + info: あなたがいる温室に関する情報を提供します reload: configReloaded: ファイルから構成が再ロードされました。 +admininfo: + error: ゲーム内でのみ利用可能な温室情報 + error2: 温室で情報を確認してください。 + flags: "[温室旗]" +news: + headline: "[温室ニュース]" +controlpanel: + title: "&A温室" From cf7b1c7164ade1f67c100bc83c6564c3451b3ace Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Fri, 31 Dec 2021 09:25:28 -0800 Subject: [PATCH 08/22] Translate zh-CN.yml via GitLocalize (#89) Co-authored-by: tastybento --- src/main/resources/locales/zh-CN.yml | 110 +++++++++++++-------------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index 9a2c7f7..e3e4b8d 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -1,7 +1,4 @@ -# -# This is a YML file. Be careful when editing. Check your edits in a YAML checker like # -# the one at http://yaml-online-parser.appspot.com # -# If this file is deleted, then it will be recreate at the next reload. # +--- protection: flags: GREENHOUSE: @@ -12,9 +9,9 @@ greenhouses: greenhouses: 温室 errors: move: 移动到你拥有的第一个温室. - no-rank: '&c你没有足够的阶级去做这个.' + no-rank: "&c你没有足够的阶级去做这个." notyours: 这不是你的温室! - not-inside: '&c你并不处于一个温室之中!' + not-inside: "&c你并不处于一个温室之中!" tooexpensive: 你的钱不足以支付 [price] alreadyexists: 温室已经存在! norecipe: 无法创建一个温室! @@ -23,12 +20,12 @@ greenhouses: entering: 你进入一个 [biome] 温室 leaving: 你离开了 [biome] 温室 recipe: - blockscolor: '&f' - title: '[[biome] 配方]' + blockscolor: "&f" + title: "[[biome] 配方]" watermustbe: 水在地面上的占比需要大于[coverage]%. icemustbe: 冰在地面上的占比需要大于[coverage]%. lavamustbe: 岩浆在地面上的占比需要大于[coverage]%. - minimumblockstitle: '[最少所需的方块数目]' + minimumblockstitle: "[最少所需的方块数目]" nootherblocks: 没有其它需要的方块了. missing: 温室缺失了 commands: @@ -37,39 +34,37 @@ greenhouses: description: 如果你是你现在所处的温室的主人则移除这个温室 make: description: 尝试建造一个温室 - parameters: + parameters: "" error: - already: '&c这已经有一个温室了!' - FAIL_BAD_ROOF_BLOCKS: '&c屋顶包含了不被允许的方块!' - FAIL_BAD_WALL_BLOCKS: '&c墙壁包含了不被允许的方块!' - FAIL_BELOW: '&c你必须处于温室结构内才能尝试建造它' - FAIL_BLOCKS_ABOVE: '&c温室的上方不能有方块,违规方块已被标红.' - FAIL_HOLE_IN_ROOF: '&c屋顶上有一个洞或者屋顶并不平整,违规方块已被标红.' - FAIL_HOLE_IN_WALL: '&c墙上有一个洞!' - FAIL_NO_ROOF: '&c这儿看起来没有屋顶!' - FAIL_TOO_MANY_DOORS: '&c你的温室最多只能有四个门!' - FAIL_TOO_MANY_HOPPERS: '&c墙或屋顶上至多有一个漏斗.' - FAIL_UNEVEN_WALLS: '&c墙壁不平坦,违规方块已被标红.' - FAIL_INSUFFICIENT_ICE: '&c冰的数目不足以建造这个温室' - FAIL_INSUFFICIENT_LAVA: '&c岩浆的数目不足以建造这个温室' - FAIL_INSUFFICIENT_WATER: '&c水的数目不足以建造这个温室' - FAIL_NO_ICE: '&c对于这个温室来说冰是必须的' - FAIL_NO_LAVA: '&c对于这个温室来说岩浆是必须的' - FAIL_NO_WATER: '&c对于这个温室来说水是必须的' - FAIL_INSUFFICIENT_BLOCKS: '&c你所用的方块数目不足!' - FAIL_OVERLAPPING: '&c温室间不能共享墙壁.' - success: '&2你成功的建造了一个 [biome] 群系温室! 在你下次登陆时生物群系将会刷新.' - missing-blocks: '&c缺少了 [material] x [number]' - unknown-recipe: '&c未知的温室配方' - try-these: '&c尝试以下操作:' - recipe-format: '&3[name]' + already: "&c这已经有一个温室了!" + FAIL_BAD_ROOF_BLOCKS: "&c屋顶包含了不被允许的方块!" + FAIL_BAD_WALL_BLOCKS: "&c墙壁包含了不被允许的方块!" + FAIL_BELOW: "&c你必须处于温室结构内才能尝试建造它" + FAIL_BLOCKS_ABOVE: "&c温室的上方不能有方块,违规方块已被标红." + FAIL_HOLE_IN_ROOF: "&c屋顶上有一个洞或者屋顶并不平整,违规方块已被标红." + FAIL_HOLE_IN_WALL: "&c墙上有一个洞!" + FAIL_NO_ROOF: "&c这儿看起来没有屋顶!" + FAIL_TOO_MANY_DOORS: "&c你的温室最多只能有四个门!" + FAIL_TOO_MANY_HOPPERS: "&c墙或屋顶上至多有一个漏斗." + FAIL_UNEVEN_WALLS: "&c墙壁不平坦,违规方块已被标红." + FAIL_INSUFFICIENT_ICE: "&c冰的数目不足以建造这个温室" + FAIL_INSUFFICIENT_LAVA: "&c岩浆的数目不足以建造这个温室" + FAIL_INSUFFICIENT_WATER: "&c水的数目不足以建造这个温室" + FAIL_NO_ICE: "&c对于这个温室来说冰是必须的" + FAIL_NO_LAVA: "&c对于这个温室来说岩浆是必须的" + FAIL_NO_WATER: "&c对于这个温室来说水是必须的" + FAIL_NO_RECIPE_FOUND: "&c 找不到与此温室相匹配的配方" + FAIL_INSUFFICIENT_BLOCKS: "&c你所用的方块数目不足!" + FAIL_OVERLAPPING: "&c温室间不能共享墙壁." + success: "&2你成功的建造了一个 [biome] 群系温室! 在你下次登陆时生物群系将会刷新." + missing-blocks: "&c缺少了 [material] x [number]" + unknown-recipe: "&c未知的温室配方" + try-these: "&c尝试以下操作:" + recipe-format: "&3[name]" info: - title: '&A[温室建造指南]' - instructions: "&E用玻璃建造一个有四面墙和屋顶的平整的立方体\n\ - &E最多只能有 &F4 扇门. &E\n在墙壁或屋顶内&E放置 &F一个漏斗\ - \ \n&E来放置骨粉或雪\ - \ 来让作物自动生长.\n&E检查温室配方确保\ - \ 你的温室包含足够的必要方块\n&E温室就顺利建造了. \n" + title: "&A[温室建造指南]" + instructions: "&E用玻璃建造一个有四面墙和屋顶的平整的立方体\n&E最多只能有 &F4 扇门. &E\n在墙壁或屋顶内&E放置 &F一个漏斗 + \n&E来放置骨粉或雪 来让作物自动生长.\n&E检查温室配方确保 你的温室包含足够的必要方块\n&E温室就顺利建造了. \n" help: help: 帮助 make: 尝试建造一个温室 @@ -79,7 +74,7 @@ help: recipe: 告知你如何制造一个温室 opengui: 打开温室GUI list: - title: '[温室建造指南]' + title: "[温室建造指南]" info: 使用指令 /greenhouse recipe 来查看建造每一个温室的细节 error: greenhouseProtected: 温室已被保护 @@ -99,31 +94,28 @@ messages: removedmessage: 你的 [biome] 温室已经被移除! ecolost: 你位于 [location] 的温室生态环境遭到破坏,它已经不再是温室了. info: - title: '&A[如何建造一个温室]' - instructions: "&E用玻璃建造一个有四面墙和屋顶的平整的立方体\n\ - &E最多只能有 &F4 扇门. &E\n在墙壁或屋顶内&E放置 &F一个漏斗\ - \ \n&E来放置骨粉或雪\ - \ 来让作物自动生长.\n&E检查温室配方确保\ - \ 你的温室包含足够的必要方块\n&E温室就顺利建造了. \n" - info: '[温室信息]' + title: "&A[如何建造一个温室]" + instructions: "&E用玻璃建造一个有四面墙和屋顶的平整的立方体\n&E最多只能有 &F4 扇门. &E\n在墙壁或屋顶内&E放置 &F一个漏斗 \n&E来放置骨粉或雪 + 来让作物自动生长.\n&E检查温室配方确保 你的温室包含足够的必要方块\n&E温室就顺利建造了. \n" + info: "[温室信息]" none: 无 - nomore: '&4你无法建造更多的温室了!' - onemore: '&6你可以再建造一个温室.' - youcanbuild: '&A你最多能建造 [number] 个温室!' - unlimited: '&A你能建造无限多个温室!' - welcome: '&B你好! 点击这里获得更多提示' + nomore: "&4你无法建造更多的温室了!" + onemore: "&6你可以再建造一个温室." + youcanbuild: "&A你最多能建造 [number] 个温室!" + unlimited: "&A你能建造无限多个温室!" + welcome: "&B你好! 点击这里获得更多提示" recipe: - blockscolor: '&f' + blockscolor: "&f" hint: 使用 /greenhouse list 来看见所有温室配方的编号! wrongnumber: 温室配方编号必须位于 1 与 [size] 之间 - title: '[[biome] 配方]' + title: "[[biome] 配方]" nowater: 不允许有水. noice: 不允许有冰. nolava: 不允许有岩浆. watermustbe: 水在地面上的占比需要大于 [coverage]%. icemustbe: 冰在地面上的占比需要大于 [coverage]%. lavamustbe: 岩浆在地面上的占比需要大于 [coverage]%. - minimumblockstitle: '[最少所需的方块]' + minimumblockstitle: "[最少所需的方块]" nootherblocks: 没有其它必要的方块了. missing: 温室缺失了 event: @@ -142,8 +134,8 @@ reload: admininfo: error: 查看温室信息功能仅能在游戏中使用 error2: 进入一个温室才能查看其信息. - flags: '[Greenhouse Flags]' + flags: "[Greenhouse Flags]" news: - headline: '[温室新闻]' + headline: "[温室新闻]" controlpanel: - title: '&A温室' + title: "&A温室" From 5808c5933a08bd98afc6ec0ce6936c95857fb708 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 31 Dec 2021 13:32:03 -0800 Subject: [PATCH 09/22] Code refactoring around BoundingBox --- .../bentobox/greenhouses/data/Greenhouse.java | 15 +++++--- .../greenhouses/greenhouse/BiomeRecipe.java | 5 +-- .../greenhouses/listeners/SnowTracker.java | 8 ++-- .../managers/EcoSystemManager.java | 37 +++++++++++-------- .../managers/GreenhouseManager.java | 33 +++++++++-------- 5 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java index 27501af..3d052b3 100644 --- a/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java +++ b/src/main/java/world/bentobox/greenhouses/data/Greenhouse.java @@ -171,7 +171,7 @@ public class Greenhouse implements DataObject { */ @NonNull public BoundingBox getBoundingBox() { - return Objects.requireNonNullElseGet(boundingBox, BoundingBox::new); + return Objects.requireNonNull(boundingBox); } /** @@ -220,7 +220,9 @@ public class Greenhouse implements DataObject { * @return true if inside the greenhouse */ public boolean contains(Location location2) { - return location.getWorld() != null && location.getWorld().equals(location2.getWorld()) && boundingBox.contains(location2.toVector()); + return getLocation().getWorld() != null + && getLocation().getWorld().equals(location2.getWorld()) + && getBoundingBox().contains(location2.toVector()); } /** @@ -262,12 +264,13 @@ public class Greenhouse implements DataObject { * @return true if wall or roof block */ public boolean isRoofOrWallBlock(Location l) { + final BoundingBox bb = getBoundingBox(); return (l.getBlockY() > this.getFloorHeight() && ((l.getBlockY() == getCeilingHeight() - 1) - || l.getBlockX() == (int)getBoundingBox().getMinX() - || l.getBlockX() == (int)getBoundingBox().getMaxX() - 1 - || l.getBlockZ() == (int)getBoundingBox().getMinZ() - || l.getBlockZ() == (int)getBoundingBox().getMaxZ() - 1 + || l.getBlockX() == (int)bb.getMinX() + || l.getBlockX() == (int)bb.getMaxX() - 1 + || l.getBlockZ() == (int)bb.getMinZ() + || l.getBlockZ() == (int)bb.getMaxZ() - 1 )); } } diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java index fb7abb3..10e632e 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java @@ -28,7 +28,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Hoglin; import org.bukkit.entity.Piglin; -import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import com.google.common.base.Enums; @@ -367,9 +366,7 @@ public class BiomeRecipe implements Comparable { .getManager() .getMap() .getGreenhouse(b.getLocation()).map(gh -> { - BoundingBox interior = gh.getBoundingBox().clone(); - interior.expand(-1, -1, -1); - if (!interior.contains(entity.getBoundingBox())) { + if (!gh.getInternalBoundingBox().contains(entity.getBoundingBox())) { entity.remove(); return false; } diff --git a/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java b/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java index 8fcc8a8..196f7b1 100644 --- a/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java +++ b/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java @@ -21,6 +21,7 @@ import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.weather.WeatherChangeEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.BoundingBox; import com.google.common.base.Enums; import com.google.common.base.Optional; @@ -58,9 +59,10 @@ public class SnowTracker implements Listener { } boolean createdSnow = false; List waterBlocks = new ArrayList<>(); - for (int x = (int)gh.getBoundingBox().getMinX() + 1; x < (int)gh.getBoundingBox().getMaxX() -1; x++) { - for (int z = (int)gh.getBoundingBox().getMinZ() + 1; z < (int)gh.getBoundingBox().getMaxZ() - 1; z++) { - for (int y = (int)gh.getBoundingBox().getMaxY() - 2; y >= (int)gh.getBoundingBox().getMinY(); y--) { + final BoundingBox bb = gh.getBoundingBox(); + for (int x = (int)bb.getMinX() + 1; x < (int)bb.getMaxX() -1; x++) { + for (int z = (int)bb.getMinZ() + 1; z < (int)bb.getMaxZ() - 1; z++) { + for (int y = (int)bb.getMaxY() - 2; y >= (int)bb.getMinY(); y--) { Block b = Objects.requireNonNull(gh.getLocation().getWorld()).getBlockAt(x, y, z); Material type = b.getType(); if (type.equals(Material.AIR) || type.equals(Material.SNOW)) { diff --git a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java index cd5941e..d7ee49a 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java @@ -15,6 +15,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Hopper; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.BoundingBox; import org.bukkit.util.NumberConversions; import world.bentobox.greenhouses.Greenhouses; @@ -85,18 +86,20 @@ public class EcoSystemManager { } private void convertBlocks(Greenhouse gh) { - World world = gh.getWorld(); + final World world = gh.getWorld(); + final BoundingBox bb = gh.getBoundingBox(); if(world == null || gh.getLocation() == null || gh.getLocation().getWorld() == null - || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) - || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){ + || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMaxX()) >> 4, ((int) bb.getMaxZ()) >> 4) + || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMinX()) >> 4, ((int) bb.getMinZ()) >> 4)){ return; } - int gh_min_x = NumberConversions.floor(gh.getInternalBoundingBox().getMinX()); - int gh_max_x = NumberConversions.floor(gh.getInternalBoundingBox().getMaxX()); + final BoundingBox ibb = gh.getInternalBoundingBox(); + int gh_min_x = NumberConversions.floor(ibb.getMinX()); + int gh_max_x = NumberConversions.floor(ibb.getMaxX()); int gh_min_y = NumberConversions.floor(gh.getBoundingBox().getMinY()); // Note: this gets the floor - int gh_max_y = NumberConversions.floor(gh.getInternalBoundingBox().getMaxY()); - int gh_min_z = NumberConversions.floor(gh.getInternalBoundingBox().getMinZ()); - int gh_max_z = NumberConversions.floor(gh.getInternalBoundingBox().getMaxZ()); + int gh_max_y = NumberConversions.floor(ibb.getMaxY()); + int gh_min_z = NumberConversions.floor(ibb.getMinZ()); + int gh_max_z = NumberConversions.floor(ibb.getMaxZ()); BiomeRecipe biomeRecipe = gh.getBiomeRecipe(); for (int x = gh_min_x; x < gh_max_x; x++) { @@ -129,8 +132,9 @@ public class EcoSystemManager { } private void addMobs(Greenhouse gh) { + final BoundingBox bb = gh.getBoundingBox(); if(gh.getLocation() == null || gh.getLocation().getWorld() == null || gh.getWorld() == null - || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){ + || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMaxX()) >> 4, ((int) bb.getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMinX()) >> 4, ((int) bb.getMinZ()) >> 4)){ // Skipping addmobs for unloaded greenhouse return; } @@ -138,8 +142,8 @@ public class EcoSystemManager { return; } // Check greenhouse chunks are loaded - for (double blockX = gh.getBoundingBox().getMinX(); blockX < gh.getBoundingBox().getMaxX(); blockX+=16) { - for (double blockZ = gh.getBoundingBox().getMinZ(); blockZ < gh.getBoundingBox().getMaxZ(); blockZ+=16) { + for (double blockX = bb.getMinX(); blockX < bb.getMaxX(); blockX+=16) { + for (double blockZ = bb.getMinZ(); blockZ < bb.getMaxZ(); blockZ+=16) { int chunkX = (int)(blockX / 16); int chunkZ = (int)(blockZ / 16); if (!gh.getWorld().isChunkLoaded(chunkX, chunkZ)) { @@ -170,8 +174,9 @@ public class EcoSystemManager { * @param gh - greenhouse */ private void growPlants(Greenhouse gh) { + final BoundingBox bb = gh.getBoundingBox(); if (gh.getLocation() == null || gh.getLocation().getWorld() == null - || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){ + || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMaxX()) >> 4, ((int) bb.getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) bb.getMinX()) >> 4, ((int) bb.getMinZ()) >> 4)){ //Skipping growplants for unloaded greenhouse return; } @@ -212,11 +217,13 @@ public class EcoSystemManager { * @return List of blocks */ protected List getAvailableBlocks(Greenhouse gh, boolean ignoreLiquid) { + final BoundingBox bb = gh.getBoundingBox(); + final BoundingBox ibb = gh.getInternalBoundingBox(); List result = new ArrayList<>(); if (gh.getWorld() == null) return result; - for (double x = gh.getInternalBoundingBox().getMinX(); x < gh.getInternalBoundingBox().getMaxX(); x++) { - for (double z = gh.getInternalBoundingBox().getMinZ(); z < gh.getInternalBoundingBox().getMaxZ(); z++) { - for (double y = gh.getInternalBoundingBox().getMaxY() - 1; y >= gh.getBoundingBox().getMinY(); y--) { + for (double x = ibb.getMinX(); x < ibb.getMaxX(); x++) { + for (double z = ibb.getMinZ(); z < ibb.getMaxZ(); z++) { + for (double y = ibb.getMaxY() - 1; y >= bb.getMinY(); y--) { Block b = gh.getWorld().getBlockAt(NumberConversions.floor(x), NumberConversions.floor(y), NumberConversions.floor(z)); // Check ceiling blocks if (b.isEmpty() && !b.getRelative(BlockFace.UP).isEmpty()) { diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index f9d6bcf..bbdd5fb 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java @@ -12,6 +12,7 @@ import org.bukkit.Location; import org.bukkit.block.Biome; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.util.BoundingBox; import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; import world.bentobox.bentobox.database.Database; @@ -135,25 +136,26 @@ public class GreenhouseManager implements Listener { /** * Removes the greenhouse from the world and resets biomes - * @param g - greenhouse + * @param gh - greenhouse */ - public void removeGreenhouse(Greenhouse g) { - handler.deleteObject(g); - map.removeGreenhouse(g); - if (g.getOriginalBiome() == null) { - addon.logError("Greenhouse had no original biome: " + g.getLocation()); + public void removeGreenhouse(Greenhouse gh) { + handler.deleteObject(gh); + map.removeGreenhouse(gh); + if (gh.getOriginalBiome() == null) { + addon.logError("Greenhouse had no original biome: " + gh.getLocation()); return; } - if (g.getLocation() == null || g.getLocation().getWorld() == null) { + if (gh.getLocation() == null || gh.getLocation().getWorld() == null) { // Greenhouse is messed up. It's being deleted anyway. return; } - addon.log("Returning biome to original state: " + g.getOriginalBiome().toString()); - for (int x = (int)g.getBoundingBox().getMinX(); x<= (int)g.getBoundingBox().getMaxX(); x+=4) { - for (int z = (int)g.getBoundingBox().getMinZ(); z<= (int)g.getBoundingBox().getMaxZ(); z+=4) { - for (int y = (int)g.getBoundingBox().getMinY(); y<= (int)g.getBoundingBox().getMaxY(); y+=4) { + addon.log("Returning biome to original state: " + gh.getOriginalBiome().toString()); + final BoundingBox bb = gh.getBoundingBox(); + for (int x = (int)bb.getMinX(); x<= (int)bb.getMaxX(); x+=4) { + for (int z = (int)bb.getMinZ(); z<= (int)bb.getMaxZ(); z+=4) { + for (int y = (int)bb.getMinY(); y<= (int)bb.getMaxY(); y+=4) { // Set back to the original biome - g.getLocation().getWorld().setBiome(x, y, z, g.getOriginalBiome()); + gh.getLocation().getWorld().setBiome(x, y, z, gh.getOriginalBiome()); } } } @@ -250,9 +252,10 @@ public class GreenhouseManager implements Listener { addon.logError("Biome recipe error - no such biome for " + gh.getBiomeRecipe().getName()); return; } - for (int x = (int)gh.getBoundingBox().getMinX(); x < gh.getBoundingBox().getMaxX(); x+=4) { - for (int z = (int)gh.getBoundingBox().getMinZ(); z < gh.getBoundingBox().getMaxZ(); z+=4) { - for (int y = (int)gh.getBoundingBox().getMinY(); y < gh.getBoundingBox().getMaxY(); y+=4) { + final BoundingBox bb = gh.getBoundingBox(); + for (int x = (int)bb.getMinX(); x < bb.getMaxX(); x+=4) { + for (int z = (int)bb.getMinZ(); z < bb.getMaxZ(); z+=4) { + for (int y = (int)bb.getMinY(); y < bb.getMaxY(); y+=4) { Objects.requireNonNull(gh.getWorld()).setBiome(x, y, z, ghBiome); } } From 0e7683872109b4dc9c1a46366a29b204db26a9a7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 31 Dec 2021 15:38:19 -0800 Subject: [PATCH 10/22] Fix test. --- .../world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java index aea2889..8df65c1 100644 --- a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java +++ b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java @@ -96,6 +96,8 @@ public class BiomeRecipeTest { when(gh.getCeilingHeight()).thenReturn(120); bb = new BoundingBox(10, 100, 10, 20, 120, 20); when(gh.getBoundingBox()).thenReturn(bb); + BoundingBox ibb = bb.clone().expand(-1); + when(gh.getInternalBoundingBox()).thenReturn(ibb); when(gh.getWorld()).thenReturn(world); when(gh.contains(any())).thenReturn(true); when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(block); From 06230e49577a62753d36e2bba7e1c75bbe36e48e Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 1 Jan 2022 16:03:04 -0800 Subject: [PATCH 11/22] Remove saving of greenhouses on exit. https://github.com/BentoBoxWorld/Greenhouses/issues/85 --- src/main/java/world/bentobox/greenhouses/Greenhouses.java | 1 - .../bentobox/greenhouses/managers/GreenhouseManager.java | 8 -------- 2 files changed, 9 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/Greenhouses.java b/src/main/java/world/bentobox/greenhouses/Greenhouses.java index ccfc8ec..68bef85 100644 --- a/src/main/java/world/bentobox/greenhouses/Greenhouses.java +++ b/src/main/java/world/bentobox/greenhouses/Greenhouses.java @@ -93,7 +93,6 @@ public class Greenhouses extends Addon { @Override public void onDisable() { if (manager != null) { - manager.saveGreenhouses(); if (manager.getEcoMgr() != null) manager.getEcoMgr().cancel(); } } diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index bbdd5fb..b540608 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java @@ -126,14 +126,6 @@ public class GreenhouseManager implements Listener { toBeRemoved.forEach(handler::deleteObject); } - /** - * Saves all the greenhouses to database - */ - public void saveGreenhouses() { - addon.log("Saving greenhouses..."); - map.getGreenhouses().forEach(handler::saveObjectAsync); - } - /** * Removes the greenhouse from the world and resets biomes * @param gh - greenhouse From e2b779a9cbc7ea9223f67e2111b5189fa90eb2fe Mon Sep 17 00:00:00 2001 From: BONNe Date: Sat, 19 Feb 2022 21:17:08 +0200 Subject: [PATCH 12/22] Add Pladdon Class (#90) * Add Pladdon Class Add Greenhouses Pladdon class. * Add Spigot Annotations API --- pom.xml | 6 +++++ .../greenhouses/GreenhousesPladdon.java | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/world/bentobox/greenhouses/GreenhousesPladdon.java diff --git a/pom.xml b/pom.xml index 6c21a71..31147e7 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,12 @@ ${spigot.version} provided + + org.spigotmc + plugin-annotations + 1.2.3-SNAPSHOT + provided + world.bentobox bentobox diff --git a/src/main/java/world/bentobox/greenhouses/GreenhousesPladdon.java b/src/main/java/world/bentobox/greenhouses/GreenhousesPladdon.java new file mode 100644 index 0000000..f5531e0 --- /dev/null +++ b/src/main/java/world/bentobox/greenhouses/GreenhousesPladdon.java @@ -0,0 +1,25 @@ +package world.bentobox.greenhouses; + + +import org.bukkit.plugin.java.annotation.dependency.Dependency; +import org.bukkit.plugin.java.annotation.plugin.ApiVersion; +import org.bukkit.plugin.java.annotation.plugin.Plugin; + +import world.bentobox.bentobox.api.addons.Addon; +import world.bentobox.bentobox.api.addons.Pladdon; + + +/** + * @author tastybento + */ +@Plugin(name = "Pladdon", version = "1.0") +@ApiVersion(ApiVersion.Target.v1_18) +@Dependency(value = "BentoBox") +public class GreenhousesPladdon extends Pladdon +{ + @Override + public Addon getAddon() + { + return new Greenhouses(); + } +} From d64be1c518cf92cd563aa99629dc9f86274f70a6 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 19 Feb 2022 11:34:27 -0800 Subject: [PATCH 13/22] Fix test. Avoid ambiguity. --- .../bentobox/greenhouses/listeners/GreenhouseEventsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/world/bentobox/greenhouses/listeners/GreenhouseEventsTest.java b/src/test/java/world/bentobox/greenhouses/listeners/GreenhouseEventsTest.java index 1b55509..27093f7 100644 --- a/src/test/java/world/bentobox/greenhouses/listeners/GreenhouseEventsTest.java +++ b/src/test/java/world/bentobox/greenhouses/listeners/GreenhouseEventsTest.java @@ -296,7 +296,7 @@ public class GreenhouseEventsTest { ghe.onIceBreak(e); verify(block).setType(Material.AIR); assertTrue(e.isCancelled()); - verify(world).playSound(any(), eq(Sound.BLOCK_GLASS_BREAK), eq(1F), eq(1F)); + verify(world).playSound(any(Location.class), eq(Sound.BLOCK_GLASS_BREAK), eq(1F), eq(1F)); } From 0a016c2eaad5666e8131cc03f46bbaedb1172bd4 Mon Sep 17 00:00:00 2001 From: BONNe Date: Sun, 27 Feb 2022 21:33:21 +0200 Subject: [PATCH 14/22] Add natural spawn protection listener. Fixes #84 --- .../greenhouses/listeners/GreenhouseGuard.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/world/bentobox/greenhouses/listeners/GreenhouseGuard.java b/src/main/java/world/bentobox/greenhouses/listeners/GreenhouseGuard.java index 2b0a051..377f593 100644 --- a/src/main/java/world/bentobox/greenhouses/listeners/GreenhouseGuard.java +++ b/src/main/java/world/bentobox/greenhouses/listeners/GreenhouseGuard.java @@ -10,6 +10,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; @@ -78,6 +79,23 @@ public class GreenhouseGuard implements Listener { .anyMatch(this::inGreenhouse)); } + + /** + * Guard Greenhouse from natural entity spawning. + * + * @param spawnEvent the spawn event + */ + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onCreatureSpawn(CreatureSpawnEvent spawnEvent) + { + if (CreatureSpawnEvent.SpawnReason.NATURAL == spawnEvent.getSpawnReason()) + { + // Natural spawn events should be cancelled. Greenhouse spawns its own mobs. + spawnEvent.setCancelled(this.inGreenhouse(spawnEvent.getLocation())); + } + } + + private boolean inGreenhouse(Location l) { return addon.getManager().getMap().getGreenhouse(l).map(g -> g.isRoofOrWallBlock(l)).orElse(false); } From 6f6745e8490618e485d0694c77334c929ad4bd1c Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 20 Mar 2022 15:01:53 +0000 Subject: [PATCH 15/22] Update gitignore for Eclipse --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..525681c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target/ +/.classpath +/.project From 8af2b2057dc32868f18c50e454f19c65dd71392f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 20 Mar 2022 15:09:45 +0000 Subject: [PATCH 16/22] Remove some code smells. --- src/main/java/world/bentobox/greenhouses/Greenhouses.java | 4 ++-- .../world/bentobox/greenhouses/greenhouse/BiomeRecipe.java | 6 +++--- .../world/bentobox/greenhouses/listeners/SnowTracker.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/Greenhouses.java b/src/main/java/world/bentobox/greenhouses/Greenhouses.java index 68bef85..d3ed568 100644 --- a/src/main/java/world/bentobox/greenhouses/Greenhouses.java +++ b/src/main/java/world/bentobox/greenhouses/Greenhouses.java @@ -92,8 +92,8 @@ public class Greenhouses extends Addon { */ @Override public void onDisable() { - if (manager != null) { - if (manager.getEcoMgr() != null) manager.getEcoMgr().cancel(); + if (manager != null && manager.getEcoMgr() != null) { + manager.getEcoMgr().cancel(); } } diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java index 10e632e..f51f67a 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java @@ -419,7 +419,7 @@ public class BiomeRecipe implements Comparable { * @return a list of blocks that are required for this recipe */ public List getRecipeBlocks() { - return requiredBlocks.entrySet().stream().map(en -> Util.prettifyText(en.getKey().toString()) + " x " + en.getValue()).collect(Collectors.toList()); + return requiredBlocks.entrySet().stream().map(en -> Util.prettifyText(en.getKey().toString()) + " x " + en.getValue()).toList(); } /** @@ -471,10 +471,10 @@ public class BiomeRecipe implements Comparable { private boolean canGrowOn(GrowthBlock block, GreenhousePlant p) { // Ceiling plants can only grow on ceiling blocks - if (CEILING_PLANTS.contains(p.plantMaterial()) && block.floor()) { + if (CEILING_PLANTS.contains(p.plantMaterial()) && Boolean.TRUE.equals(block.floor())) { return false; } - return p.plantGrownOn().equals(block.block().getRelative(block.floor() ? BlockFace.DOWN : BlockFace.UP).getType()); + return p.plantGrownOn().equals(block.block().getRelative(Boolean.TRUE.equals(block.floor()) ? BlockFace.DOWN : BlockFace.UP).getType()); } /** diff --git a/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java b/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java index 196f7b1..2bf05c3 100644 --- a/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java +++ b/src/main/java/world/bentobox/greenhouses/listeners/SnowTracker.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -24,7 +25,6 @@ import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.BoundingBox; import com.google.common.base.Enums; -import com.google.common.base.Optional; import world.bentobox.bentobox.util.Util; import world.bentobox.greenhouses.Greenhouses; @@ -100,7 +100,7 @@ public class SnowTracker implements Listener { } private boolean placeSnow(Block b) { - Optional snowCauldron = Enums.getIfPresent(Material.class, "POWDER_SNOW_CAULDRON"); + Optional snowCauldron = Enums.getIfPresent(Material.class, "POWDER_SNOW_CAULDRON").toJavaUtil(); if (snowCauldron.isPresent()) { if (b.getType().equals(Material.CAULDRON)) { b.setType(snowCauldron.get()); From 61478ff4d5019fa60114799daff69c374e74a4d6 Mon Sep 17 00:00:00 2001 From: Zorua162 <55893520+Zorua162@users.noreply.github.com> Date: Sun, 30 Oct 2022 16:50:40 +0000 Subject: [PATCH 17/22] Fixed issue where greenhouses could not be created below y=0 (#95) * Fixed issue where greenhouses could not be greated below y=0 * Made the world floor change work with different lower world limits by using World#getMinHeight() --- .../java/world/bentobox/greenhouses/greenhouse/Walls.java | 8 ++++---- .../world/bentobox/greenhouses/greenhouse/WallsTest.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java b/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java index d371272..d4a0890 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/Walls.java @@ -69,7 +69,7 @@ public class Walls extends MinMaxXZ { // The player is under the roof // Assume the player is inside the greenhouse they are trying to create final Location loc = roof.getLocation(); - floor = getFloorY(roof.getHeight(), roof.getMinX(), roof.getMaxX(), roof.getMinZ(), roof.getMaxZ()); + floor = getFloorY(roof.getHeight(), roof.getMinX(), roof.getMaxX(), roof.getMinZ(), roof.getMaxZ(), loc.getWorld().getMinHeight()); // Now start with the player's x and z location WallFinder wf = new WallFinder(); minX = loc.getBlockX(); @@ -85,7 +85,7 @@ public class Walls extends MinMaxXZ { minZ--; maxZ++; // Find the floor again, only looking within the walls - floor = getFloorY(roof.getHeight(), minX, maxX, minZ,maxZ); + floor = getFloorY(roof.getHeight(), minX, maxX, minZ,maxZ,loc.getWorld().getMinHeight()); // Complete on main thread Bukkit.getScheduler().runTask(BentoBox.getInstance(), () -> r.complete(this)); return this; @@ -159,7 +159,7 @@ public class Walls extends MinMaxXZ { } } - int getFloorY(int y, int minX, int maxX, int minZ, int maxZ) { + int getFloorY(int y, int minX, int maxX, int minZ, int maxZ, int minY) { // Find the floor - defined as the last y under the roof where there are no wall blocks int wallBlockCount; do { @@ -172,7 +172,7 @@ public class Walls extends MinMaxXZ { } } - } while( y-- > 0 && wallBlockCount > 0); + } while( y-- > minY && wallBlockCount > 0); return y + 1; } diff --git a/src/test/java/world/bentobox/greenhouses/greenhouse/WallsTest.java b/src/test/java/world/bentobox/greenhouses/greenhouse/WallsTest.java index 29821e1..7231f34 100644 --- a/src/test/java/world/bentobox/greenhouses/greenhouse/WallsTest.java +++ b/src/test/java/world/bentobox/greenhouses/greenhouse/WallsTest.java @@ -177,15 +177,15 @@ public class WallsTest { } /** - * Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(int, int, int, int, int)}. + * Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(int, int, int, int, int, int)}. */ @Test public void testGetFloorYZeroY() { - assertEquals(0, walls.getFloorY(10, 0, 1, 0, 1)); + assertEquals(-64, walls.getFloorY(10, 0, 1, 0, 1, -64)); } /** - * Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(int, int, int, int, int)}. + * Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(int, int, int, int, int, int)}. */ @Test public void testGetFloorY() { @@ -193,7 +193,7 @@ public class WallsTest { Material.GLASS, Material.GLASS, Material.GLASS, Material.GLASS, Material.AIR); - assertEquals(8, walls.getFloorY(10, 0, 1, 0, 1)); + assertEquals(8, walls.getFloorY(10, 0, 1, 0, 1, -64)); } /** From 717903e346dbf535ee7974ab6d050759174f9e44 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 29 Dec 2022 09:56:49 -0800 Subject: [PATCH 18/22] Version 1.17.1 Java 17 update --- .github/workflows/build.yml | 4 ++-- .gitignore | 3 +++ pom.xml | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9cf60c..c771fd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,10 +14,10 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 16 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: 16 + java-version: 17 - name: Cache SonarCloud packages uses: actions/cache@v1 with: diff --git a/.gitignore b/.gitignore index 525681c..03804dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ /target/ /.classpath /.project +/.DS_Store +/Greenhouses-addon.iml +/.idea/ diff --git a/pom.xml b/pom.xml index 31147e7..c81cfbb 100644 --- a/pom.xml +++ b/pom.xml @@ -43,15 +43,15 @@ UTF-8 UTF-8 - 16 + 17 2.0.9 - 1.18.1-R0.1-SNAPSHOT - 1.18.1 + 1.19.3-R0.1-SNAPSHOT + 1.21.0 ${build.version}-SNAPSHOT - 1.7.0 + 1.7.1 -LOCAL BentoBoxWorld_Greenhouses bentobox-world From 02490d3b8573a0cd4542477062da8c49e3b92935 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 29 Dec 2022 09:57:21 -0800 Subject: [PATCH 19/22] Fix for glow lichen growing Fixes https://github.com/BentoBoxWorld/Greenhouses/issues/96 --- .../greenhouses/greenhouse/BiomeRecipe.java | 63 ++++++++++++++++++- src/main/resources/biomes.yml | 19 ++++++ 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java index f51f67a..07c6571 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java @@ -24,6 +24,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.GlowLichen; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Hoglin; @@ -441,7 +442,7 @@ public class BiomeRecipe implements Comparable { } return getRandomPlant().map(p -> { if (bl.getY() != 0 && canGrowOn(block, p)) { - if (!isBisected(bl, p)) { + if (!plantIt(bl, p)) { return false; } bl.getWorld().spawnParticle(Particle.SNOWBALL, bl.getLocation(), 10, 2, 2, 2); @@ -451,9 +452,17 @@ public class BiomeRecipe implements Comparable { }).orElse(false); } - private boolean isBisected(Block bl, GreenhousePlant p) { + /** + * Plants the plant + * @param bl - block to turn into a plant + * @param p - the greenhouse plant to be grown + * @return true if successful, false if not + */ + private boolean plantIt(Block bl, GreenhousePlant p) { BlockData dataBottom = p.plantMaterial().createBlockData(); + // Check if this is a double-height plant if (dataBottom instanceof Bisected bi) { + // Double-height plant bi.setHalf(Bisected.Half.BOTTOM); BlockData dataTop = p.plantMaterial().createBlockData(); ((Bisected) dataTop).setHalf(Bisected.Half.TOP); @@ -463,12 +472,62 @@ public class BiomeRecipe implements Comparable { } else { return false; // No room } + } else if (p.plantMaterial().equals(Material.GLOW_LICHEN)) { + return placeLichen(bl); } else { + // Single height plant bl.setBlockData(dataBottom, false); } return true; } + /** + * Handles the placing of Glow Lichen. This needs to stick to a block rather than grow on it. + * If the block is set to Glow Lichen then it appears as an air block with 6 sides of lichen so + * they need to be switched off and only the side next to the block should be set. + * @param bl - block where plants would usually be placed + * @return true if successful, false if not + */ + private boolean placeLichen(Block bl) { + // Get the source block below this one + Block b = bl.getRelative(BlockFace.DOWN); + + // Find a spot for licen + BlockFace d = null; + boolean waterLogged = false; + for (BlockFace adj : ADJ_BLOCKS) { + if (b.getRelative(adj).getType().equals(Material.AIR)) { + d = adj; + break; + } + // Lichen can grow under water too + if (b.getRelative(adj).getType().equals(Material.WATER)) { + d = adj; + waterLogged = true; + break; + } + } + if (d == null) { + return false; + } + Block bb = b.getRelative(d); + bb.setType(Material.GLOW_LICHEN); + BlockFace opp = d.getOppositeFace(); + + if(bb.getBlockData() instanceof GlowLichen v){ + for (BlockFace f : v.getAllowedFaces()) { + v.setFace(f, false); + } + v.setFace(opp, true); + v.setWaterlogged(waterLogged); + bb.setBlockData(v); + bb.getState().setBlockData(v); + bb.getState().update(true); + return true; + } + return false; + } + private boolean canGrowOn(GrowthBlock block, GreenhousePlant p) { // Ceiling plants can only grow on ceiling blocks if (CEILING_PLANTS.contains(p.plantMaterial()) && Boolean.TRUE.equals(block.floor())) { diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index 343be9e..8f69223 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -285,3 +285,22 @@ biomes: mobs: SLIME: 5:WATER moblimit: 3 + DRIPSTONE_CAVES: + friendlyname: "&6Drippy Drops" + biome: dripstone_caves + icon: DRIPSTONE_BLOCK + priority: 15 + contents: + STONE: 8 + CLAY: 8 + # 50% water cove rage required + watercoverage: 25 + conversions: + CLAY: 50:DRIPSTONE_BLOCK:WATER + STONE: 0.005:COPPER_ORE:STONE + plants: + GLOW_LICHEN: 20:STONE + mobs: + skeleton: 5:STONE + glow_squid: 5:WATER + moblimit: 5 \ No newline at end of file From e5c62047ff863e3b15fa27f23aed9052df409041 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 29 Dec 2022 11:33:34 -0800 Subject: [PATCH 20/22] Use new switch statement --- .../managers/GreenhouseManager.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java index b540608..a18e569 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseManager.java @@ -96,29 +96,19 @@ public class GreenhouseManager implements Listener { handler.loadObjects().forEach(g -> { GreenhouseResult result = map.addGreenhouse(g); switch (result) { - case FAIL_NO_ISLAND: - // Delete the failed greenhouse - toBeRemoved.add(g); - break; - case FAIL_OVERLAPPING: - addon.logError("Greenhouse overlaps with another greenhouse. Skipping..."); - break; - case NULL: - addon.logError("Null location of greenhouse. Cannot load. Skipping..."); - break; - case SUCCESS: - activateGreenhouse(g); - break; - case FAIL_NO_WORLD: - addon.logError("Database contains greenhouse for a non-loaded world. Skipping..."); - break; - case FAIL_UNKNOWN_RECIPE: - addon.logError("Greenhouse uses a recipe that does not exist in the biomes.yml. Skipping..."); - addon.logError("Greenhouse Id " + g.getUniqueId()); - break; - default: - break; - + case FAIL_NO_ISLAND -> + // Delete the failed greenhouse + toBeRemoved.add(g); + case FAIL_OVERLAPPING -> addon.logError("Greenhouse overlaps with another greenhouse. Skipping..."); + case NULL -> addon.logError("Null location of greenhouse. Cannot load. Skipping..."); + case SUCCESS -> activateGreenhouse(g); + case FAIL_NO_WORLD -> addon.logError("Database contains greenhouse for a non-loaded world. Skipping..."); + case FAIL_UNKNOWN_RECIPE -> { + addon.logError("Greenhouse uses a recipe that does not exist in the biomes.yml. Skipping..."); + addon.logError("Greenhouse Id " + g.getUniqueId()); + } + default -> { + } } }); addon.log("Loaded " + map.getSize() + " greenhouses."); From 1f0b579d5a0cfbf9174af0149505a47786c19753 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 29 Dec 2022 18:59:50 -0800 Subject: [PATCH 21/22] Enables water plants to be grown under water. Fixes #93 --- .../greenhouses/greenhouse/BiomeRecipe.java | 80 ++++++++++++++----- .../managers/EcoSystemManager.java | 36 ++++++--- .../greenhouses/managers/RecipeManager.java | 8 +- .../greenhouse/BiomeRecipeTest.java | 16 ++-- .../managers/EcoSystemManagerTest.java | 11 +++ 5 files changed, 110 insertions(+), 41 deletions(-) diff --git a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java index 07c6571..b44ae5d 100644 --- a/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java +++ b/src/main/java/world/bentobox/greenhouses/greenhouse/BiomeRecipe.java @@ -2,6 +2,7 @@ package world.bentobox.greenhouses.greenhouse; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.EnumMap; import java.util.HashSet; import java.util.List; @@ -24,6 +25,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.GlowLichen; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -35,6 +37,7 @@ import com.google.common.base.Enums; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; +import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.util.Util; import world.bentobox.greenhouses.Greenhouses; import world.bentobox.greenhouses.data.Greenhouse; @@ -61,12 +64,26 @@ public class BiomeRecipe implements Comparable { } private static final List ADJ_BLOCKS = Arrays.asList( BlockFace.DOWN, BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.UP, BlockFace.WEST); + private static final List UNDERWATER_PLANTS; + static { + List m = new ArrayList<>(); + Arrays.stream(Material.values()).filter(c -> c.name().contains("CORAL")).forEach(m::add); + m.add(Material.SEA_LANTERN); + m.add(Material.SEA_PICKLE); + m.add(Material.SEAGRASS); + m.add(Material.KELP); + m.add(Material.GLOW_LICHEN); + UNDERWATER_PLANTS = Collections.unmodifiableList(m); + } // Content requirements // Material, Type, Qty. There can be more than one type of material required private final Map requiredBlocks = new EnumMap<>(Material.class); - // Plants + /** + * Tree map of plants + */ private final TreeMap plantTree = new TreeMap<>(); + private final TreeMap underwaterPlants = new TreeMap<>(); // Mobs // Entity Type, Material to Spawn on, Probability @@ -149,11 +166,12 @@ public class BiomeRecipe implements Comparable { */ public boolean addPlants(Material plantMaterial, double plantProbability, Material plantGrowOn) { double probability = plantProbability/100; + TreeMap map = UNDERWATER_PLANTS.contains(plantMaterial) ? underwaterPlants : plantTree; // Add up all the probabilities in the list so far - double lastProb = plantTree.isEmpty() ? 0D : plantTree.lastKey(); + double lastProb = map.isEmpty() ? 0D : map.lastKey(); if ((1D - lastProb) >= probability) { // Add to probability tree - plantTree.put(lastProb + probability, new GreenhousePlant(plantMaterial, plantGrowOn)); + map.put(lastProb + probability, new GreenhousePlant(plantMaterial, plantGrowOn)); } else { addon.logError("Plant chances add up to > 100% in " + type.toString() + " biome recipe! Skipping " + plantMaterial.toString()); return false; @@ -358,7 +376,9 @@ public class BiomeRecipe implements Comparable { Location spawnLoc = b.getLocation().clone().add(new Vector(0.5, 0, 0.5)); return getRandomMob() // Check if the spawn on block matches, if it exists - .filter(m -> Optional.of(m.mobSpawnOn()).map(b.getRelative(BlockFace.DOWN).getType()::equals).orElse(true)) + .filter(m -> Optional.of(m.mobSpawnOn()) + .map(b.getRelative(BlockFace.DOWN).getType()::equals) + .orElse(true)) // If spawn occurs, check if it can fit inside greenhouse .map(m -> { Entity entity = b.getWorld().spawnEntity(spawnLoc, m.mobType()); @@ -409,11 +429,11 @@ public class BiomeRecipe implements Comparable { return key == null ? Optional.empty() : Optional.ofNullable(mobTree.get(key)); } - private Optional getRandomPlant() { + private Optional getRandomPlant(boolean underwater) { // Grow a random plant that can grow double r = random.nextDouble(); - Double key = plantTree.ceilingKey(r); - return key == null ? Optional.empty() : Optional.ofNullable(plantTree.get(key)); + Double key = underwater ? underwaterPlants.ceilingKey(r) : plantTree.ceilingKey(r); + return key == null ? Optional.empty() : Optional.ofNullable(underwater ? underwaterPlants.get(key) : plantTree.get(key)); } /** @@ -433,20 +453,17 @@ public class BiomeRecipe implements Comparable { /** * Plants a plant on block bl if it makes sense. * @param block - block that can have growth + * @param underwater - if the block is underwater or not * @return true if successful */ - public boolean growPlant(GrowthBlock block) { + public boolean growPlant(GrowthBlock block, boolean underwater) { Block bl = block.block(); - if (!bl.isEmpty()) { - return false; - } - return getRandomPlant().map(p -> { + return getRandomPlant(underwater).map(p -> { if (bl.getY() != 0 && canGrowOn(block, p)) { - if (!plantIt(bl, p)) { - return false; + if (plantIt(bl, p)) { + bl.getWorld().spawnParticle(Particle.SNOWBALL, bl.getLocation(), 10, 2, 2, 2); + return true; } - bl.getWorld().spawnParticle(Particle.SNOWBALL, bl.getLocation(), 10, 2, 2, 2); - return true; } return false; }).orElse(false); @@ -459,6 +476,7 @@ public class BiomeRecipe implements Comparable { * @return true if successful, false if not */ private boolean plantIt(Block bl, GreenhousePlant p) { + boolean underwater = bl.getType().equals(Material.WATER); BlockData dataBottom = p.plantMaterial().createBlockData(); // Check if this is a double-height plant if (dataBottom instanceof Bisected bi) { @@ -475,8 +493,13 @@ public class BiomeRecipe implements Comparable { } else if (p.plantMaterial().equals(Material.GLOW_LICHEN)) { return placeLichen(bl); } else { - // Single height plant - bl.setBlockData(dataBottom, false); + if (dataBottom instanceof Waterlogged wl) { + wl.setWaterlogged(underwater); + bl.setBlockData(wl, false); + } else { + // Single height plant + bl.setBlockData(dataBottom, false); + } } return true; } @@ -528,12 +551,31 @@ public class BiomeRecipe implements Comparable { return false; } + /** + * Checks if a particular plant can group at the location of a block + * @param block - block being checked + * @param p - greenhouse plant + * @return true if it can be grown otherwise false + */ private boolean canGrowOn(GrowthBlock block, GreenhousePlant p) { // Ceiling plants can only grow on ceiling blocks if (CEILING_PLANTS.contains(p.plantMaterial()) && Boolean.TRUE.equals(block.floor())) { return false; } - return p.plantGrownOn().equals(block.block().getRelative(Boolean.TRUE.equals(block.floor()) ? BlockFace.DOWN : BlockFace.UP).getType()); + // Underwater plants can only be placed in water and regular plants cannot be placed in water + if (block.block().getType().equals(Material.WATER)) { + BentoBox.getInstance().logDebug("Water block"); + if (!UNDERWATER_PLANTS.contains(p.plantMaterial())) { + return false; + } + BentoBox.getInstance().logDebug("Water plant"); + } else if (UNDERWATER_PLANTS.contains(p.plantMaterial())) { + return false; + } + + return p.plantGrownOn().equals(block.block().getRelative(Boolean.TRUE.equals(block.floor()) ? + BlockFace.DOWN : + BlockFace.UP).getType()); } /** diff --git a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java index d7ee49a..f8bd434 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/EcoSystemManager.java @@ -183,9 +183,13 @@ public class EcoSystemManager { int bonemeal = getBoneMeal(gh); if (bonemeal > 0) { // Get a list of all available blocks - List list = getAvailableBlocks(gh, true); + List list = getAvailableBlocks(gh, false); Collections.shuffle(list); - int plantsGrown = list.stream().limit(bonemeal).mapToInt(bl -> gh.getBiomeRecipe().growPlant(bl) ? 1 : 0).sum(); + int plantsGrown = list.stream().limit(bonemeal).mapToInt(bl -> gh.getBiomeRecipe().growPlant(bl, false) ? 1 : 0).sum(); + // Underwater plants + list = getAvailableBlocks(gh, true); + Collections.shuffle(list); + plantsGrown += list.stream().limit(bonemeal).mapToInt(bl -> gh.getBiomeRecipe().growPlant(bl, true) ? 1 : 0).sum(); if (plantsGrown > 0) { setBoneMeal(gh, bonemeal - (int)Math.ceil((double)plantsGrown / PLANTS_PER_BONEMEAL )); } @@ -208,6 +212,7 @@ public class EcoSystemManager { } + public record GrowthBlock(Block block, Boolean floor) {} /** * Get a list of the lowest level blocks inside the greenhouse. May be air, liquid or plants. @@ -225,26 +230,31 @@ public class EcoSystemManager { for (double z = ibb.getMinZ(); z < ibb.getMaxZ(); z++) { for (double y = ibb.getMaxY() - 1; y >= bb.getMinY(); y--) { Block b = gh.getWorld().getBlockAt(NumberConversions.floor(x), NumberConversions.floor(y), NumberConversions.floor(z)); - // Check ceiling blocks - if (b.isEmpty() && !b.getRelative(BlockFace.UP).isEmpty()) { - result.add(new GrowthBlock(b, false)); - } // Check floor blocks - if (!(b.isEmpty() || (ignoreLiquid && b.isLiquid())) - && (b.getRelative(BlockFace.UP).isEmpty() - || (b.getRelative(BlockFace.UP).isPassable() && !b.isLiquid()) - || (ignoreLiquid && b.isLiquid() && b.getRelative(BlockFace.UP).isPassable()))) { - result.add(new GrowthBlock(b.getRelative(BlockFace.UP), true)); - break; + if (!ignoreLiquid) { + // Check ceiling blocks + if (b.isEmpty() && !b.getRelative(BlockFace.UP).isEmpty()) { + result.add(new GrowthBlock(b, false)); + } + if (!b.isEmpty() && (b.getRelative(BlockFace.UP).isEmpty() || b.getRelative(BlockFace.UP).isPassable())) { + result.add(new GrowthBlock(b.getRelative(BlockFace.UP), true)); + break; + } + } else { + if (!b.isEmpty() && !b.isLiquid() && b.getRelative(BlockFace.UP).isLiquid()) { + result.add(new GrowthBlock(b.getRelative(BlockFace.UP), true)); + break; + } } + } } } return result; } - public record GrowthBlock(Block block, Boolean floor) {} + private int getBoneMeal(Greenhouse gh) { Hopper hopper = getHopper(gh); diff --git a/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java b/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java index 7791648..248ba15 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java +++ b/src/main/java/world/bentobox/greenhouses/managers/RecipeManager.java @@ -1,8 +1,14 @@ package world.bentobox.greenhouses.managers; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import org.bukkit.ChatColor; diff --git a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java index 8df65c1..db64690 100644 --- a/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java +++ b/src/test/java/world/bentobox/greenhouses/greenhouse/BiomeRecipeTest.java @@ -611,7 +611,7 @@ public class BiomeRecipeTest { @Test public void testGrowPlantNotAir() { when(block.getType()).thenReturn(Material.SOUL_SAND); - assertFalse(br.growPlant(new GrowthBlock(block, true))); + assertFalse(br.growPlant(new GrowthBlock(block, true), false)); } /** @@ -621,7 +621,7 @@ public class BiomeRecipeTest { public void testGrowPlantNoPlants() { when(block.getType()).thenReturn(Material.AIR); when(block.isEmpty()).thenReturn(true); - assertFalse(br.growPlant(new GrowthBlock(block, true))); + assertFalse(br.growPlant(new GrowthBlock(block, true), false)); } /** @@ -633,7 +633,7 @@ public class BiomeRecipeTest { when(block.getType()).thenReturn(Material.AIR); when(block.isEmpty()).thenReturn(true); assertTrue(br.addPlants(Material.BAMBOO_SAPLING, 100, Material.GRASS_BLOCK)); - assertFalse(br.growPlant(new GrowthBlock(block, true))); + assertFalse(br.growPlant(new GrowthBlock(block, true), false)); } /** @@ -649,7 +649,7 @@ public class BiomeRecipeTest { when(block.getRelative(any())).thenReturn(ob); assertTrue(br.addPlants(Material.BAMBOO_SAPLING, 100, Material.GRASS_BLOCK)); - assertTrue(br.growPlant(new GrowthBlock(block, true))); + assertTrue(br.growPlant(new GrowthBlock(block, true), false)); verify(world).spawnParticle(eq(Particle.SNOWBALL), any(Location.class), anyInt(), anyDouble(), anyDouble(), anyDouble()); verify(block).setBlockData(eq(bd), eq(false)); } @@ -667,7 +667,7 @@ public class BiomeRecipeTest { when(block.getRelative(any())).thenReturn(ob); assertTrue(br.addPlants(Material.SPORE_BLOSSOM, 100, Material.GLASS)); - assertTrue(br.growPlant(new GrowthBlock(block, false))); + assertTrue(br.growPlant(new GrowthBlock(block, false), false)); verify(world).spawnParticle(eq(Particle.SNOWBALL), any(Location.class), anyInt(), anyDouble(), anyDouble(), anyDouble()); verify(block).setBlockData(eq(bd), eq(false)); } @@ -686,7 +686,7 @@ public class BiomeRecipeTest { when(block.getRelative(any())).thenReturn(ob); assertTrue(br.addPlants(Material.SPORE_BLOSSOM, 100, Material.GLASS)); // Not a ceiling block - assertFalse(br.growPlant(new GrowthBlock(block, true))); + assertFalse(br.growPlant(new GrowthBlock(block, true), false)); } /** @@ -704,7 +704,7 @@ public class BiomeRecipeTest { when(block.getRelative(BlockFace.DOWN)).thenReturn(ob); when(block.getRelative(BlockFace.UP)).thenReturn(block); assertTrue(br.addPlants(Material.SUNFLOWER, 100, Material.GRASS_BLOCK)); - assertTrue(br.growPlant(new GrowthBlock(block, true))); + assertTrue(br.growPlant(new GrowthBlock(block, true), false)); verify(world).spawnParticle(eq(Particle.SNOWBALL), any(Location.class), anyInt(), anyDouble(), anyDouble(), anyDouble()); verify(bisected).setHalf(eq(Half.BOTTOM)); verify(bisected).setHalf(eq(Half.TOP)); @@ -725,7 +725,7 @@ public class BiomeRecipeTest { when(block.getRelative(eq(BlockFace.DOWN))).thenReturn(ob); when(block.getRelative(eq(BlockFace.UP))).thenReturn(ob); assertTrue(br.addPlants(Material.SUNFLOWER, 100, Material.GRASS_BLOCK)); - assertFalse(br.growPlant(new GrowthBlock(block, true))); + assertFalse(br.growPlant(new GrowthBlock(block, true), false)); } /** diff --git a/src/test/java/world/bentobox/greenhouses/managers/EcoSystemManagerTest.java b/src/test/java/world/bentobox/greenhouses/managers/EcoSystemManagerTest.java index 9364d72..6111923 100644 --- a/src/test/java/world/bentobox/greenhouses/managers/EcoSystemManagerTest.java +++ b/src/test/java/world/bentobox/greenhouses/managers/EcoSystemManagerTest.java @@ -123,6 +123,17 @@ public class EcoSystemManagerTest { when(liquid.getRelative(eq(BlockFace.UP))).thenReturn(liquid); when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(liquid); List result = eco.getAvailableBlocks(gh, false); + assertEquals(16, result.size()); + } + + /** + * Test method for {@link world.bentobox.greenhouses.managers.EcoSystemManager#getAvailableBlocks(Greenhouse, boolean)}. + */ + @Test + public void testGetAvailableBlocksAllLiquid2() { + when(liquid.getRelative(eq(BlockFace.UP))).thenReturn(liquid); + when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(liquid); + List result = eco.getAvailableBlocks(gh, true); assertEquals(0, result.size()); } From 1975df27322b7293d16caf1ab4f444f5c0646dfe Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 29 Dec 2022 19:33:59 -0800 Subject: [PATCH 22/22] Fixes #92 A world check was not being done in the overlap check. --- .../world/bentobox/greenhouses/managers/GreenhouseMap.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java index 4801c1a..91d2af4 100644 --- a/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java +++ b/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java @@ -107,7 +107,9 @@ public class GreenhouseMap { private boolean isOverlapping(Greenhouse greenhouse) { return greenhouse.getLocation() != null && addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> { greenhouses.putIfAbsent(i, new ArrayList<>()); - return greenhouses.get(i).stream().anyMatch(g -> g.getBoundingBox().overlaps(greenhouse.getBoundingBox())); + return greenhouses.get(i).stream().anyMatch(g -> + g.getLocation().getWorld().equals(greenhouse.getLocation().getWorld()) && + g.getBoundingBox().overlaps(greenhouse.getBoundingBox())); }).orElse(false); }