Added details tab

This commit is contained in:
tastybento 2020-07-04 14:36:37 -07:00
parent 3c1cdaafab
commit ee5217519a
3 changed files with 193 additions and 55 deletions

View File

@ -38,6 +38,7 @@ import world.bentobox.level.events.IslandPreLevelEvent;
import world.bentobox.level.objects.LevelsData; import world.bentobox.level.objects.LevelsData;
import world.bentobox.level.objects.TopTenData; import world.bentobox.level.objects.TopTenData;
import world.bentobox.level.panels.DetailsGUITab; import world.bentobox.level.panels.DetailsGUITab;
import world.bentobox.level.panels.DetailsGUITab.DetailsType;
public class LevelsManager { public class LevelsManager {
private static final String INTOPTEN = "intopten"; private static final String INTOPTEN = "intopten";
@ -226,7 +227,10 @@ public class LevelsManager {
new TabbedPanelBuilder() new TabbedPanelBuilder()
.user(user) .user(user)
.world(world) .world(world)
.tab(1, new DetailsGUITab(addon, world, user)) .tab(1, new DetailsGUITab(addon, world, user, DetailsType.ALL_BLOCKS))
.tab(2, new DetailsGUITab(addon, world, user, DetailsType.ABOVE_SEA_LEVEL_BLOCKS))
.tab(3, new DetailsGUITab(addon, world, user, DetailsType.UNDERWATER_BLOCKS))
.tab(4, new DetailsGUITab(addon, world, user, DetailsType.SPAWNERS))
.startingSlot(1) .startingSlot(1)
.size(54) .size(54)
.build().openPanel(); .build().openPanel();
@ -458,11 +462,9 @@ public class LevelsManager {
private void setIslandResults(World world, @Nullable UUID owner, long level, Multiset<Material> uwCount, private void setIslandResults(World world, @Nullable UUID owner, long level, Multiset<Material> uwCount,
Multiset<Material> mdCount) { Multiset<Material> mdCount) {
LevelsData ld = levelsCache.computeIfAbsent(owner, LevelsData::new); LevelsData ld = levelsCache.computeIfAbsent(owner, LevelsData::new);
String worldName = world.getName();
System.out.println("saved world name");
ld.setLevel(world, level); ld.setLevel(world, level);
ld.setUwCount(worldName, uwCount); ld.setUwCount(world, uwCount);
ld.setMdCount(worldName, mdCount); ld.setMdCount(world, mdCount);
levelsCache.put(owner, ld); levelsCache.put(owner, ld);
handler.saveObjectAsync(ld); handler.saveObjectAsync(ld);
// Update TopTen // Update TopTen
@ -480,17 +482,4 @@ public class LevelsManager {
return 0L; return 0L;
} }
/**
* Get the island breakdown of blocks
* @param world - world
* @param user - user
* @return report
*/
public List<PanelItem> getIslandReport(World world, UUID owner) {
LevelsData ld = getLevelsData(owner);
return null;
}
} }

View File

@ -1,5 +1,6 @@
package world.bentobox.level.objects; package world.bentobox.level.objects;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -9,7 +10,6 @@ import java.util.UUID;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset; import com.google.common.collect.Multiset;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
@ -182,28 +182,44 @@ public class LevelsData implements DataObject {
/** /**
* @param uwCount the uwCount to set * @param uwCount the uwCount to set
*/ */
public void setUwCount(String name, Multiset<Material> uwCount) { public void setUwCount(World world, Multiset<Material> uwCount) {
Map<Material, Integer> count = new HashMap<>();
uwCount.forEach(m -> count.put(m, uwCount.count(m)));
if (this.uwCount == null) { if (this.uwCount == null) {
System.out.println("Null");
this.uwCount = new HashMap<>(); this.uwCount = new HashMap<>();
} }
this.uwCount.put(name, count); Map<Material, Integer> count = new HashMap<>();
uwCount.forEach(m -> count.put(m, uwCount.count(m)));
this.uwCount.put(world.getName(), count);
} }
/** /**
* @param mdCount the mdCount to set * @param mdCount the mdCount to set
*/ */
public void setMdCount(String name, Multiset<Material> mdCount) { public void setMdCount(World world, Multiset<Material> mdCount) {
Map<Material, Integer> count = new HashMap<>();
mdCount.forEach(m -> count.put(m, mdCount.count(m)));
if (this.mdCount == null) { if (this.mdCount == null) {
System.out.println("Null");
this.mdCount = new HashMap<>(); this.mdCount = new HashMap<>();
} }
this.mdCount.put(name, count); Map<Material, Integer> count = new HashMap<>();
mdCount.forEach(m -> count.put(m, mdCount.count(m)));
this.mdCount.put(world.getName(), count);
}
/**
* Get the underwater block count for world
* @return the uwCount
*/
public Map<Material, Integer> getUwCount(World world) {
return uwCount.getOrDefault(world.getName(), Collections.emptyMap());
}
/**
* Get the over-water block count for world
* @return the mdCount
*/
public Map<Material, Integer> getMdCount(World world) {
return mdCount.getOrDefault(world.getName(), Collections.emptyMap());
} }

View File

@ -5,20 +5,28 @@ package world.bentobox.level.panels;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import com.google.common.base.Enums;
import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.Panel;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler; import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler;
import world.bentobox.bentobox.api.panels.Tab; import world.bentobox.bentobox.api.panels.Tab;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.util.Util;
import world.bentobox.level.Level; import world.bentobox.level.Level;
import world.bentobox.level.objects.LevelsData;
/** /**
* @author tastybento * @author tastybento
@ -26,14 +34,161 @@ import world.bentobox.level.Level;
*/ */
public class DetailsGUITab implements Tab, ClickHandler { public class DetailsGUITab implements Tab, ClickHandler {
private final Level addon; public enum DetailsType {
private final World world; ABOVE_SEA_LEVEL_BLOCKS,
private final User user; ALL_BLOCKS,
SPAWNERS,
UNDERWATER_BLOCKS
}
public DetailsGUITab(Level addon, World world, User user) { private static final Map<Material, Material> M2I;
static {
Map<Material, Material> m2i = new HashMap<>();
m2i.put(Material.WATER, Material.WATER_BUCKET);
m2i.put(Material.LAVA, Material.LAVA_BUCKET);
m2i.put(Material.AIR, Material.BLACK_STAINED_GLASS_PANE);
m2i.put(Material.VOID_AIR, Material.BLACK_STAINED_GLASS_PANE);
m2i.put(Material.CAVE_AIR, Material.BLACK_STAINED_GLASS_PANE);
m2i.put(Material.WALL_TORCH, Material.TORCH);
m2i.put(Material.REDSTONE_WALL_TORCH, Material.REDSTONE_TORCH);
m2i.put(Material.TALL_SEAGRASS, Material.SEAGRASS);
m2i.put(Material.PISTON_HEAD, Material.PISTON);
m2i.put(Material.MOVING_PISTON, Material.PISTON);
m2i.put(Material.REDSTONE_WIRE, Material.REDSTONE);
m2i.put(Material.NETHER_PORTAL, Material.MAGENTA_STAINED_GLASS_PANE);
m2i.put(Material.END_PORTAL, Material.BLACK_STAINED_GLASS_PANE);
m2i.put(Material.ATTACHED_MELON_STEM, Material.MELON_SEEDS);
m2i.put(Material.ATTACHED_PUMPKIN_STEM, Material.PUMPKIN_SEEDS);
m2i.put(Material.MELON_STEM, Material.MELON_SEEDS);
m2i.put(Material.PUMPKIN_STEM, Material.PUMPKIN_SEEDS);
m2i.put(Material.COCOA, Material.COCOA_BEANS);
m2i.put(Material.TRIPWIRE, Material.STRING);
m2i.put(Material.CARROTS, Material.CARROT);
m2i.put(Material.POTATOES, Material.POTATO);
m2i.put(Material.BEETROOTS, Material.BEETROOT);
m2i.put(Material.END_GATEWAY, Material.BEDROCK);
m2i.put(Material.FROSTED_ICE, Material.ICE);
m2i.put(Material.KELP_PLANT, Material.KELP);
m2i.put(Material.BUBBLE_COLUMN, Material.WATER_BUCKET);
m2i.put(Material.SWEET_BERRY_BUSH, Material.SWEET_BERRIES);
m2i.put(Material.BAMBOO_SAPLING, Material.BAMBOO);
// 1.16.1
if (Enums.getIfPresent(Material.class, "WEEPING_VINES_PLANT").isPresent()) {
m2i.put(Material.WEEPING_VINES_PLANT, Material.WEEPING_VINES);
m2i.put(Material.TWISTING_VINES_PLANT, Material.TWISTING_VINES);
m2i.put(Material.SOUL_WALL_TORCH, Material.SOUL_TORCH);
}
M2I = Collections.unmodifiableMap(m2i);
}
private final Level addon;
private final @Nullable Island island;
private List<PanelItem> items;
private DetailsType type;
private final User user;
private final World world;
public DetailsGUITab(Level addon, World world, User user, DetailsType type) {
this.addon = addon; this.addon = addon;
this.world = world; this.world = world;
this.user = user; this.user = user;
this.island = addon.getIslands().getIsland(world, user);
this.type = type;
// Generate report
generateReport(type);
}
private void createItem(Material m, Integer count) {
if (count == null || count <= 0) return;
// Convert walls
m = Enums.getIfPresent(Material.class, m.name().replace("WALL_", "")).or(m);
// Tags
if (Tag.FIRE.isTagged(m)) {
items.add(new PanelItemBuilder()
.icon(Material.CAMPFIRE)
.name(Util.prettifyText(m.name()) + " x " + count)
.build());
return;
}
if (Tag.FLOWER_POTS.isTagged(m)) {
m = Enums.getIfPresent(Material.class, m.name().replace("POTTED_", "")).or(m);
}
items.add(new PanelItemBuilder()
.icon(M2I.getOrDefault(m, m))
.name(Util.prettifyText(m.name()) + " x " + count)
.build());
}
private void generateReport(DetailsType type) {
items = new ArrayList<>();
LevelsData ld = addon.getManager().getLevelsData(island.getOwner());
// Get the items from the report
Map<Material, Integer> sumTotal = new HashMap<>();
sumTotal.putAll(ld.getMdCount(world));
sumTotal.putAll(ld.getUwCount(world));
switch(type) {
case ABOVE_SEA_LEVEL_BLOCKS:
ld.getMdCount(world).forEach(this::createItem);
break;
case SPAWNERS:
sumTotal.entrySet().stream().filter(m -> m.getKey().equals(Material.SPAWNER)).forEach(e -> createItem(e.getKey(), e.getValue()));
break;
case UNDERWATER_BLOCKS:
ld.getUwCount(world).forEach(this::createItem);
break;
default:
sumTotal.forEach(this::createItem);
break;
}
}
@Override
public PanelItem getIcon() {
switch(type) {
case ABOVE_SEA_LEVEL_BLOCKS:
return new PanelItemBuilder().icon(Material.GRASS_BLOCK).name("Above Sea Level Blocks").build();
case SPAWNERS:
return new PanelItemBuilder().icon(Material.SPAWNER).name("Spawners").build();
case UNDERWATER_BLOCKS:
return new PanelItemBuilder().icon(Material.WATER_BUCKET).name("Underwater Blocks").build();
default:
return new PanelItemBuilder().icon(Material.GRASS_BLOCK).name("All Blocks").build();
}
}
@Override
public String getName() {
String name = "&c No island!";
if (island.getOwner() != null) {
name = island.getName() != null ? island.getName() : addon.getPlayers().getName(island.getOwner()) + "'s island";
}
return name;
}
@Override
public List<@Nullable PanelItem> getPanelItems() {
return items;
}
@Override
public String getPermission() {
switch(type) {
case ABOVE_SEA_LEVEL_BLOCKS:
return "";
case ALL_BLOCKS:
return "";
case SPAWNERS:
return "";
case UNDERWATER_BLOCKS:
return "";
default:
return "";
}
} }
@Override @Override
@ -41,26 +196,4 @@ public class DetailsGUITab implements Tab, ClickHandler {
return true; return true;
} }
@Override
public PanelItem getIcon() {
// TODO Auto-generated method stub
return new PanelItemBuilder().icon(Material.GRASS_BLOCK).name("Blocks").build();
}
@Override
public String getName() {
return "Island Details";
}
@Override
public List<@Nullable PanelItem> getPanelItems() {
// Get the items from the report
return Collections.emptyList();
}
@Override
public String getPermission() {
return "";
}
} }