!API stuff for loot chests

This commit is contained in:
Jules 2020-04-11 12:39:55 +02:00
parent 9105a8744a
commit 6ae069f651
4 changed files with 201 additions and 0 deletions

View File

@ -0,0 +1,48 @@
package net.Indyuce.mmocore.api.loot;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.api.util.math.particle.ChestParticleEffect;
public class ChestTier {
private final TierEffect effect;
private final int weight;
public ChestTier(ConfigurationSection config) {
effect = config.isConfigurationSection("effect") ? new TierEffect(config.getConfigurationSection("effect"))
: null;
weight = config.getInt("weight", 1);
}
public int getWeight() {
return weight;
}
public boolean hasEffect() {
return effect != null;
}
public TierEffect getEffect() {
return effect;
}
public class TierEffect {
private final ChestParticleEffect type;
private final Particle particle;
public TierEffect(ConfigurationSection config) {
Validate.notNull(config, "Could not load tier config");
type = ChestParticleEffect
.valueOf(config.getString("type", "OFFSET").toUpperCase().replace("-", "_").replace(" ", "_"));
particle = Particle
.valueOf(config.getString("particle", "FLAME").toUpperCase().replace("-", "_").replace(" ", "_"));
}
public void play(Location loc) {
type.play(loc, particle);
}
}
}

View File

@ -0,0 +1,45 @@
package net.Indyuce.mmocore.api.loot;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
public class LootChest {
private final LootChestRegion region;
/*
* saves data of block replaced
*/
private final ReplacedBlock block;
public LootChest(LootChestRegion region, Block block) {
this.region = region;
this.block = new ReplacedBlock(block);
}
public ReplacedBlock getBlock() {
return block;
}
public LootChestRegion getRegion() {
return region;
}
public class ReplacedBlock {
private final Material material;
private final BlockData data;
private final Location loc;
public ReplacedBlock(Block block) {
this.material = block.getType();
this.data = block.getBlockData();
loc = block.getLocation();
}
public void restore() {
loc.getBlock().setType(material);
loc.getBlock().setBlockData(data);
}
}
}

View File

@ -0,0 +1,55 @@
package net.Indyuce.mmocore.api.loot;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.MMOCore;
public class LootChestRegion {
private final String id;
private final long chestSpawnPeriod;
private final RegionBounds bounds;
private final Set<ChestTier> tiers = new HashSet<>();
/*
* last time
*/
public LootChestRegion(ConfigurationSection config) {
Validate.notNull(config, "Could not load config");
id = config.getName();
bounds = new RegionBounds(config.getConfigurationSection("bounds"));
chestSpawnPeriod = config.getInt("spawn-period");
Validate.isTrue(config.isConfigurationSection("tiers"), "Could not find chest tiers");
for (String key : config.getConfigurationSection("tiers").getKeys(false))
try {
tiers.add(new ChestTier(config.getConfigurationSection("tiers." + key)));
} catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not load tier '" + key + "' from chest region '" + id + "': " + exception.getMessage());
}
}
public String getId() {
return id;
}
public Set<ChestTier> getTiers() {
return tiers;
}
public RegionBounds getBounds() {
return bounds;
}
public long getChestSpawnPeriod() {
return chestSpawnPeriod;
}
}

View File

@ -0,0 +1,53 @@
package net.Indyuce.mmocore.api.loot;
import java.util.Optional;
import java.util.Random;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class RegionBounds {
private final World world;
private final int x1, z1, x2, z2;
private static final Random random = new Random();
public RegionBounds(ConfigurationSection config) {
Validate.notNull(config, "Could not load config");
Validate.notNull(world = Bukkit.getWorld(config.getString("world")),
"Could not find world " + config.getString("world"));
x1 = config.getInt("x1");
z1 = config.getInt("z1");
x2 = config.getInt("x2");
z2 = config.getInt("z2");
}
public RegionBounds(Location loc1, Location loc2) {
Validate.isTrue(loc1.getWorld().equals(loc2.getWorld()), "Locations must be in the same world");
world = loc1.getWorld();
x1 = loc1.getBlockX();
z1 = loc1.getBlockZ();
x2 = loc2.getBlockX();
z2 = loc2.getBlockZ();
}
public boolean isInRegion(Player player) {
int x = player.getLocation().getBlockX();
int z = player.getLocation().getBlockZ();
return player.getWorld().equals(world) && x1 <= x && x2 >= x && z1 <= z && z2 >= z;
}
public Location findChestLocation() {
Optional<Player> player = world.getPlayers().stream().filter(check -> isInRegion(check)).findAny();
// TODO
return null;
}
}