Adds recipe option to make command

Completes missing block check.

https://github.com/BentoBoxWorld/Greenhouses/issues/25
This commit is contained in:
tastybento 2019-10-12 09:31:51 -07:00
parent 6e13cbf999
commit 31bc36c470
4 changed files with 86 additions and 13 deletions

View File

@ -57,7 +57,7 @@ public class BiomeRecipe implements Comparable<BiomeRecipe> {
private String permission = "";
private final Random random = new Random();
public BiomeRecipe() {}
@ -154,7 +154,6 @@ public class BiomeRecipe implements Comparable<BiomeRecipe> {
}
}
}
blockCount.forEach((k,v) -> System.out.println(k + " " + v));
// Calculate % water, ice and lava ratios
double waterRatio = (double)blockCount.getOrDefault(Material.WATER, 0)/area * 100;
double lavaRatio = (double)blockCount.getOrDefault(Material.LAVA, 0)/area * 100;
@ -181,17 +180,12 @@ public class BiomeRecipe implements Comparable<BiomeRecipe> {
result.add(GreenhouseResult.FAIL_INSUFFICIENT_LAVA);
}
if (iceCoverage > 0 && iceRatio < iceCoverage) {
System.out.println("Ice coverage = " + iceCoverage + " and ice ratio = " + iceRatio);
result.add(GreenhouseResult.FAIL_INSUFFICIENT_ICE);
}
requiredBlocks.forEach((k,v) -> System.out.println("Req " + k + " " + v));
// Compare to the required blocks
Map<Material, Integer> missingBlocks = requiredBlocks.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() - blockCount.getOrDefault(e.getKey(), 0)));
missingBlocks.forEach((k,v) -> System.out.println("Missing " + k + " " + v));
// Remove any entries that are 0 or less
missingBlocks.values().removeIf(v -> v <= 0);
missingBlocks.forEach((k,v) -> System.out.println("Missing after " + k + " " + v));
if (!missingBlocks.isEmpty()) {
result.add(GreenhouseResult.FAIL_INSUFFICIENT_BLOCKS);
gh.setMissingBlocks(missingBlocks);
@ -352,7 +346,7 @@ public class BiomeRecipe implements Comparable<BiomeRecipe> {
bl.getRelative(BlockFace.UP).setBlockData(dataTop, false);
}
} else {
bl.setBlockData(dataBottom, false);
bl.setBlockData(dataBottom, false);
}
bl.getWorld().spawnParticle(Particle.SNOWBALL, bl.getLocation(), 10, 2, 2, 2);
return true;

View File

@ -1,6 +1,10 @@
package world.bentobox.greenhouses.ui.user;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -8,7 +12,9 @@ import org.bukkit.Material;
import org.bukkit.util.Vector;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util;
import world.bentobox.greenhouses.Greenhouses;
import world.bentobox.greenhouses.greenhouse.BiomeRecipe;
import world.bentobox.greenhouses.managers.GreenhouseManager.GhResult;
@ -49,7 +55,35 @@ class MakeCommand extends CompositeCommand {
new Panel((Greenhouses)this.getAddon()).ShowPanel(user);
return true;
}
return makeGreenhouse(user, null);
// Check recipe given matches
BiomeRecipe br = getRecipe(user, args.get(0));
if (br == null) {
user.sendMessage("greenhouses.commands.user.make.unknown-recipe");
user.sendMessage("greenhouses.commands.user.make.try-these");
getRecipes(user).forEach((k,v) -> user.sendMessage("greenhouses.commands.user.make.recipe-format", TextVariables.NAME, v.getName()));
return false;
}
return makeGreenhouse(user, br);
}
/**
* Get a recipe for user
* @param user - user
* @param arg - given string
* @return recipe or null if unknown
*/
private BiomeRecipe getRecipe(User user, String arg) {
return getRecipes(user).get(arg);
}
/**
* Get a string list of recipies the player has permission to use
* @param user - user
* @return list
*/
private Map<String, BiomeRecipe> getRecipes(User user) {
return ((Greenhouses)getAddon()).getRecipes().getBiomeRecipes().stream()
.filter(br -> user.hasPermission(br.getPermission()))
.collect(Collectors.toMap(br -> br.getName(), br -> br));
}
private boolean makeGreenhouse(User user, BiomeRecipe br) {
@ -77,7 +111,15 @@ class MakeCommand extends CompositeCommand {
result.getFinder().getRedGlass().forEach(rg -> user.getPlayer().sendBlockChange(rg, Material.RED_STAINED_GLASS.createBlockData()));
Bukkit.getScheduler().runTaskLater(getPlugin(), () -> result.getFinder().getRedGlass().forEach(rg -> user.getPlayer().sendBlockChange(rg, rg.getBlock().getBlockData())), 120L);
}
if (br != null && result.getResults().contains(GreenhouseResult.FAIL_INSUFFICIENT_BLOCKS)) {
result.getFinder().getGh().getMissingBlocks().forEach((k,v) -> user.sendMessage("greenhouses.commands.user.make.missing-blocks", "[material]", Util.prettifyText(k.toString()), TextVariables.NUMBER, String.valueOf(v)));
}
return true;
}
@Override
public Optional<List<String>> tabComplete(User user, String alias, List<String> args) {
return Optional.of(new ArrayList<String>(this.getRecipes(user).keySet()));
}
}

View File

@ -67,6 +67,9 @@ greenhouses:
FAIL_INSUFFICIENT_BLOCKS: "&cMore blocks are required to make this recipe!"
success: "&2You successfully made a [biome] biome greenhouse! Biome will sync at next teleport or login."
missing-blocks: "&cMissing [material] x [number]"
unknown-recipe: "&cUnknown recipe"
try-these: "&cTry one of these:"
recipe-format: "&3[name]"
info:
title: "&A[How To Build A Greenhouse]"
instructions: |

View File

@ -16,6 +16,7 @@ import org.bukkit.block.Block;
import org.bukkit.util.BoundingBox;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@ -34,7 +35,7 @@ import world.bentobox.greenhouses.managers.GreenhouseManager.GreenhouseResult;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Bukkit.class, BentoBox.class})
public class BiomeRecipeTest {
private BiomeRecipe br;
@Mock
private Greenhouses addon;
@ -60,7 +61,7 @@ public class BiomeRecipeTest {
when(gh.getFloorHeight()).thenReturn(100);
when(gh.getCeilingHeight()).thenReturn(120);
bb = new BoundingBox(10, 100, 10, 20, 120, 20);
when(gh.getBoundingBox()).thenReturn(bb);
when(gh.getBoundingBox()).thenReturn(bb);
when(gh.getWorld()).thenReturn(world);
when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(block);
when(block.getType()).thenReturn(Material.AIR,
@ -87,6 +88,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#addConvBlocks(org.bukkit.Material, org.bukkit.Material, double, org.bukkit.Material)}.
*/
@Ignore
@Test
public void testAddConvBlocks() {
fail("Not yet implemented");
@ -95,6 +97,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#addMobs(org.bukkit.entity.EntityType, int, org.bukkit.Material)}.
*/
@Ignore
@Test
public void testAddMobs() {
fail("Not yet implemented");
@ -103,6 +106,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#addPlants(org.bukkit.Material, int, org.bukkit.Material)}.
*/
@Ignore
@Test
public void testAddPlants() {
fail("Not yet implemented");
@ -111,6 +115,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#addReqBlocks(org.bukkit.Material, int)}.
*/
@Ignore
@Test
public void testAddReqBlocks() {
fail("Not yet implemented");
@ -124,7 +129,7 @@ public class BiomeRecipeTest {
Set<GreenhouseResult> result = br.checkRecipe(gh);
assertTrue(result.isEmpty());
}
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#checkRecipe(world.bentobox.greenhouses.data.Greenhouse)}.
*/
@ -133,12 +138,13 @@ public class BiomeRecipeTest {
br.addReqBlocks(Material.ACACIA_LEAVES, 3);
Set<GreenhouseResult> result = br.checkRecipe(gh);
assertFalse(result.isEmpty());
}
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#convertBlock(org.bukkit.block.Block)}.
*/
@Ignore
@Test
public void testConvertBlock() {
fail("Not yet implemented");
@ -147,6 +153,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getBiome()}.
*/
@Ignore
@Test
public void testGetBiome() {
fail("Not yet implemented");
@ -155,6 +162,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getBlockConvert()}.
*/
@Ignore
@Test
public void testGetBlockConvert() {
fail("Not yet implemented");
@ -163,6 +171,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getFriendlyName()}.
*/
@Ignore
@Test
public void testGetFriendlyName() {
fail("Not yet implemented");
@ -171,6 +180,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getIceCoverage()}.
*/
@Ignore
@Test
public void testGetIceCoverage() {
fail("Not yet implemented");
@ -179,6 +189,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getIcon()}.
*/
@Ignore
@Test
public void testGetIcon() {
fail("Not yet implemented");
@ -187,6 +198,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getLavaCoverage()}.
*/
@Ignore
@Test
public void testGetLavaCoverage() {
fail("Not yet implemented");
@ -195,6 +207,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getMobLimit()}.
*/
@Ignore
@Test
public void testGetMobLimit() {
fail("Not yet implemented");
@ -203,6 +216,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getName()}.
*/
@Ignore
@Test
public void testGetName() {
fail("Not yet implemented");
@ -211,6 +225,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getPermission()}.
*/
@Ignore
@Test
public void testGetPermission() {
fail("Not yet implemented");
@ -219,6 +234,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#spawnMob(org.bukkit.block.Block)}.
*/
@Ignore
@Test
public void testSpawnMob() {
fail("Not yet implemented");
@ -227,6 +243,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getRecipeBlocks()}.
*/
@Ignore
@Test
public void testGetRecipeBlocks() {
fail("Not yet implemented");
@ -235,6 +252,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getWaterCoverage()}.
*/
@Ignore
@Test
public void testGetWaterCoverage() {
fail("Not yet implemented");
@ -243,6 +261,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#growPlant(org.bukkit.block.Block)}.
*/
@Ignore
@Test
public void testGrowPlant() {
fail("Not yet implemented");
@ -251,6 +270,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setFriendlyName(java.lang.String)}.
*/
@Ignore
@Test
public void testSetFriendlyName() {
fail("Not yet implemented");
@ -259,6 +279,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setIcecoverage(int)}.
*/
@Ignore
@Test
public void testSetIcecoverage() {
fail("Not yet implemented");
@ -267,6 +288,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setIcon(org.bukkit.Material)}.
*/
@Ignore
@Test
public void testSetIcon() {
fail("Not yet implemented");
@ -275,6 +297,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setLavacoverage(int)}.
*/
@Ignore
@Test
public void testSetLavacoverage() {
fail("Not yet implemented");
@ -283,6 +306,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setMobLimit(int)}.
*/
@Ignore
@Test
public void testSetMobLimit() {
fail("Not yet implemented");
@ -291,6 +315,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setName(java.lang.String)}.
*/
@Ignore
@Test
public void testSetName() {
fail("Not yet implemented");
@ -299,6 +324,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setPermission(java.lang.String)}.
*/
@Ignore
@Test
public void testSetPermission() {
fail("Not yet implemented");
@ -307,6 +333,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setPriority(int)}.
*/
@Ignore
@Test
public void testSetPriority() {
fail("Not yet implemented");
@ -315,14 +342,17 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setType(org.bukkit.block.Biome)}.
*/
@Ignore
@Test
public void testSetType() {
fail("Not yet implemented");
}
/**
*
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#setWatercoverage(int)}.
*/
@Ignore
@Test
public void testSetWatercoverage() {
fail("Not yet implemented");
@ -331,6 +361,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getMissingBlocks()}.
*/
@Ignore
@Test
public void testGetMissingBlocks() {
fail("Not yet implemented");
@ -339,6 +370,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#compareTo(world.bentobox.greenhouses.greenhouse.BiomeRecipe)}.
*/
@Ignore
@Test
public void testCompareTo() {
fail("Not yet implemented");
@ -347,6 +379,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#noMobs()}.
*/
@Ignore
@Test
public void testNoMobs() {
fail("Not yet implemented");
@ -355,6 +388,7 @@ public class BiomeRecipeTest {
/**
* Test method for {@link world.bentobox.greenhouses.greenhouse.BiomeRecipe#getMobTypes()}.
*/
@Ignore
@Test
public void testGetMobTypes() {
fail("Not yet implemented");