JackOUT

Untitled

Apr 1st, 2023
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.60 KB | None | 0 0
  1. package games.coob.laserturrets.model;
  2.  
  3. import games.coob.laserturrets.settings.TurretSettings;
  4. import games.coob.laserturrets.util.Hologram;
  5. import lombok.AccessLevel;
  6. import lombok.Getter;
  7. import lombok.RequiredArgsConstructor;
  8. import lombok.ToString;
  9. import org.bukkit.Location;
  10. import org.bukkit.entity.EntityType;
  11. import org.bukkit.inventory.ItemStack;
  12. import org.mineacademy.fo.SerializeUtil;
  13. import org.mineacademy.fo.Valid;
  14. import org.mineacademy.fo.collection.SerializedMap;
  15. import org.mineacademy.fo.model.ConfigSerializable;
  16. import org.mineacademy.fo.model.Tuple;
  17. import org.mineacademy.fo.remain.CompMaterial;
  18.  
  19. import javax.annotation.Nullable;
  20. import java.util.*;
  21.  
  22. @Getter
  23. @ToString
  24. public class TurretData implements ConfigSerializable { // TODO create ammo
  25.  
  26.     private Location location;
  27.  
  28.     private CompMaterial material;
  29.  
  30.     private String id;
  31.  
  32.     private String type;
  33.  
  34.     private UUID owner;
  35.  
  36.     private boolean broken;
  37.  
  38.     private List<ItemStack> currentLoot;
  39.  
  40.     private Set<UUID> playerBlacklist = new HashSet<>();
  41.  
  42.     private Set<EntityType> mobBlacklist = new HashSet<>();
  43.  
  44.     private boolean mobWhitelistEnabled;
  45.  
  46.     private boolean playerWhitelistEnabled;
  47.  
  48.     private List<TurretData.TurretLevel> turretLevels = new ArrayList<>();
  49.  
  50.     private double currentHealth;
  51.  
  52.     private int currentLevel;
  53.  
  54.     private Hologram hologram;
  55.  
  56.     public void setLocation(final Location location) {
  57.         this.location = location;
  58.     }
  59.  
  60.     public void setMaterial(final CompMaterial material) {
  61.         this.material = material;
  62.     }
  63.  
  64.     public void setType(final String type) {
  65.         this.type = type;
  66.     }
  67.  
  68.     public void setId(final String id) {
  69.         this.id = id;
  70.     }
  71.  
  72.     public void setOwner(final UUID uuid) {
  73.         this.owner = uuid;
  74.     }
  75.  
  76.     public void setBroken(final boolean broken) {
  77.         this.broken = broken;
  78.     }
  79.  
  80.     public void setBrokenAndFill(final boolean broken) {
  81.         this.broken = broken;
  82.  
  83.         if (this.isBroken()) {
  84.             final List<Tuple<ItemStack, Double>> lootChances = this.turretLevels.get(this.currentLevel - 1).getLootChances();
  85.             this.currentLoot = randomItemPercentageList(lootChances);
  86.         }
  87.     }
  88.  
  89.     private List<ItemStack> randomItemPercentageList(final List<Tuple<ItemStack, Double>> lootChanceList) {
  90.         final List<ItemStack> items = new ArrayList<>();
  91.  
  92.         for (final Tuple<ItemStack, Double> lootChance : lootChanceList) {
  93.             if (lootChance != null) {
  94.                 final Random random = new Random();
  95.                 final double randomPercentage = random.nextDouble();
  96.  
  97.                 if (lootChance.getValue() >= randomPercentage)
  98.                     items.add(lootChance.getKey());
  99.             }
  100.         }
  101.  
  102.         return items;
  103.     }
  104.  
  105.     public void setHologram(final Hologram hologram) {
  106.         this.hologram = hologram;
  107.     }
  108.  
  109.     public void setCurrentLevel(final int level) {
  110.         this.currentLevel = level;
  111.     }
  112.  
  113.     public void setCurrentLoot(final @Nullable List<ItemStack> items) {
  114.         this.currentLoot = items;
  115.     }
  116.  
  117.     public void removeCurrentLoot(final ItemStack itemStack) {
  118.         this.getCurrentLoot().remove(itemStack);
  119.     }
  120.  
  121.     public void addPlayerToBlacklist(final UUID uuid) {
  122.         this.playerBlacklist.add(uuid);
  123.     }
  124.  
  125.     public void removePlayerFromBlacklist(final UUID uuid) {
  126.         if (this.playerBlacklist != null)
  127.             this.playerBlacklist.remove(uuid);
  128.     }
  129.  
  130.     public boolean isPlayerListedAsAlly(final UUID uuid) {
  131.         if (this.playerBlacklist != null)
  132.             return this.playerBlacklist.contains(uuid);
  133.         else return false;
  134.     }
  135.  
  136.     public void setPlayerBlacklist(final Set<UUID> playerBlacklist) {
  137.         this.playerBlacklist = playerBlacklist;
  138.     }
  139.  
  140.     public void setMobWhitelistEnabled(final boolean whitelist) {
  141.         this.mobWhitelistEnabled = whitelist;
  142.     }
  143.  
  144.     public void setPlayerWhitelistEnabled(final boolean whitelist) {
  145.         this.playerWhitelistEnabled = whitelist;
  146.     }
  147.  
  148.     public void setCurrentHealth(final double health) {
  149.         this.currentHealth = health;
  150.     }
  151.  
  152.     public void addMobToBlacklist(final EntityType entityType) {
  153.         this.mobBlacklist.add(entityType);
  154.     }
  155.  
  156.     public void removeMobFromBlacklist(final EntityType entityType) {
  157.         this.mobBlacklist.remove(entityType);
  158.     }
  159.  
  160.     public boolean isMobListedAsAlly(final EntityType entityType) {
  161.         return this.mobBlacklist.contains(entityType);
  162.     }
  163.  
  164.     public void setMobBlacklist(final @Nullable Set<EntityType> entityTypes) {
  165.         this.mobBlacklist = entityTypes;
  166.     }
  167.  
  168.     public TurretLevel getLevel(final int level) {
  169.         final boolean outOfBounds = level <= 0 || level >= this.turretLevels.size() + 1;
  170.  
  171.         if (!outOfBounds)
  172.             return this.turretLevels.get(level - 1);
  173.  
  174.         return null;
  175.     }
  176.  
  177.     public TurretLevel addLevel() {
  178.         final TurretData.TurretLevel level = new TurretData.TurretLevel(this);
  179.  
  180.         turretLevels.add(level);
  181.  
  182.         return this.turretLevels.get(this.turretLevels.size() - 1);
  183.     }
  184.  
  185.     public void createLevel(final String turretType) {
  186.         final TurretData.TurretLevel level = addLevel();
  187.         final List<TurretSettings.LevelData> levels = TurretSettings.findByName(turretType).getLevels();
  188.  
  189.         levels.get(levels.size() - 1).setLevelData(level);
  190.     }
  191.  
  192.     public void removeLevel(final int level) {
  193.         Valid.checkBoolean(getLevels() >= level, "Cannot remove level " + level + " because the turret only has " + getLevels() + " levels.");
  194.         this.turretLevels.remove(level - 1);
  195.     }
  196.  
  197.     public void setTurretLevels(final List<TurretData.TurretLevel> levels) {
  198.         this.turretLevels = levels;
  199.     }
  200.  
  201.     public int getLevels() {
  202.         return this.turretLevels.size();
  203.     }
  204.  
  205.     private String toHash(final Location location, final CompMaterial material) {
  206.         return SerializeUtil.serializeLoc(location) + " | " + material;
  207.     }
  208.  
  209.     @Override
  210.     public SerializedMap serialize() {
  211.         final SerializedMap map = new SerializedMap();
  212.  
  213.         map.put("Block", toHash(this.location, this.material));
  214.         map.put("Id", this.id);
  215.         map.put("Type", this.type);
  216.         map.put("Owner", this.owner);
  217.         map.putIf("Player_Blacklist", this.playerBlacklist);
  218.         map.putIf("Mob_Blacklist", this.mobBlacklist);
  219.         map.putIf("Current_Loot", this.currentLoot);
  220.         map.put("Use_Player_Whitelist", this.playerWhitelistEnabled);
  221.         map.put("Use_Mob_Whitelist", this.mobWhitelistEnabled);
  222.         map.put("Current_Health", this.currentHealth);
  223.         map.put("Current_Level", this.currentLevel);
  224.         map.put("Broken", this.broken);
  225.         map.putIf("Hologram", this.hologram);
  226.         map.put("Levels", this.turretLevels);
  227.  
  228.         return map;
  229.     }
  230.  
  231.     public static TurretData deserialize(final SerializedMap map) {
  232.         final TurretData turretData = new TurretData();
  233.  
  234.         final String hash = map.getString("Block");
  235.         final String id = map.getString("Id");
  236.         final String type = map.getString("Type");
  237.         final UUID owner = map.getUUID("Owner");
  238.         final Set<UUID> blacklist = map.getSet("Player_Blacklist", UUID.class);
  239.         final Set<EntityType> entityTypes = map.getSet("Mob_Blacklist", EntityType.class);
  240.         final List<ItemStack> currentLoot = map.getList("Current_Loot", ItemStack.class);
  241.         final boolean playerWhitelist = map.getBoolean("Use_Player_Whitelist", false);
  242.         final boolean mobWhitelist = map.getBoolean("Use_Mob_Whitelist", false); // Add default value to load it if the key doesn't exist
  243.         final double currentHealth = map.getDouble("Current_Health");
  244.         final Integer level = map.getInteger("Current_Level");
  245.         final boolean broken = map.getBoolean("Broken", false);
  246.  
  247.         final String[] split = hash.split(" \\| ");
  248.         final Location location = SerializeUtil.deserializeLocation(split[0]);
  249.         final CompMaterial material = CompMaterial.valueOf(split[1]);
  250.         //final List<String> lore = Lang.ofList("Turret_Display.Hologram", "{turretType}", TurretUtil.capitalizeWord(turretData.getType()), "{owner}", Remain.getOfflinePlayerByUUID(turretData.getOwner()).getName(), "{level}", MathUtil.toRoman(turretData.getCurrentLevel()), "{health}", turretData.getCurrentHealth());
  251.  
  252.         final Hologram hologram = map.get("Hologram", Hologram.class, new Hologram(location.clone().add(0.5, 0.5, 0.5)));
  253.         final List<TurretLevel> levels = map.getList("Levels", TurretLevel.class, turretData);
  254.  
  255.         turretData.setMaterial(material);
  256.         turretData.setLocation(location);
  257.         turretData.setId(id);
  258.         turretData.setType(type);
  259.         turretData.setOwner(owner);
  260.         turretData.setPlayerBlacklist(blacklist);
  261.         turretData.setMobBlacklist(entityTypes);
  262.         turretData.setCurrentLoot(currentLoot);
  263.         turretData.setPlayerWhitelistEnabled(playerWhitelist);
  264.         turretData.setMobWhitelistEnabled(mobWhitelist);
  265.         turretData.setCurrentLevel(level);
  266.         turretData.setCurrentHealth(currentHealth);
  267.         turretData.setBroken(broken);
  268.         turretData.setHologram(hologram);
  269.         turretData.setTurretLevels(levels);
  270.  
  271.         return turretData;
  272.     }
  273.  
  274.     @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
  275.     public final static class TurretLevel implements ConfigSerializable {
  276.  
  277.         private final TurretData turretData;
  278.  
  279.         @Getter
  280.         private double price;
  281.  
  282.         @Getter
  283.         private List<Tuple<ItemStack, Double>> lootChances = new ArrayList<>();
  284.  
  285.         @Getter
  286.         private int range;
  287.  
  288.         @Getter
  289.         private boolean laserEnabled;
  290.  
  291.         @Getter
  292.         private double laserDamage;
  293.  
  294.         @Getter
  295.         private double maxHealth;
  296.  
  297.         public void setPrice(final double price) {
  298.             this.price = price;
  299.         }
  300.  
  301.         public void setRange(final int range) {
  302.             this.range = range;
  303.         }
  304.  
  305.         public void setLaserEnabled(final boolean laserEnabled) {
  306.             this.laserEnabled = laserEnabled;
  307.         }
  308.  
  309.         public void setLaserDamage(final double laserDamage) {
  310.             this.laserDamage = laserDamage;
  311.         }
  312.  
  313.         public void setLootChances(final @Nullable List<Tuple<ItemStack, Double>> lootChances) {
  314.             this.lootChances = lootChances;
  315.         }
  316.  
  317.         public void setMaxHealth(final double health) {
  318.             this.maxHealth = health;
  319.         }
  320.  
  321.         public static TurretLevel deserialize(final SerializedMap map, final TurretData turretData) {
  322.             final double price = map.getDouble("Price");
  323.             final List<Tuple<ItemStack, Double>> lootChances = map.getTupleList("Loot_Chances", ItemStack.class, Double.class);
  324.             final int range = map.getInteger("Range");
  325.             final boolean laserEnabled = map.getBoolean("Laser_Enabled");
  326.             final double laserDamage = map.getDouble("Laser_Damage");
  327.             final double maxHealth = map.getDouble("Max_Health");
  328.  
  329.             final TurretLevel level = new TurretLevel(turretData);
  330.  
  331.             level.setPrice(price);
  332.             level.setLootChances(lootChances);
  333.             level.setRange(range);
  334.             level.setLaserEnabled(laserEnabled);
  335.             level.setLaserDamage(laserDamage);
  336.             level.setMaxHealth(maxHealth);
  337.  
  338.             return level;
  339.         }
  340.  
  341.         @Override
  342.         public SerializedMap serialize() {
  343.             final SerializedMap map = new SerializedMap();
  344.  
  345.             map.put("Price", this.price);
  346.             map.put("Range", this.range);
  347.             map.put("Max_Health", this.maxHealth);
  348.             map.put("Laser_Enabled", this.laserEnabled);
  349.             map.put("Laser_Damage", this.laserDamage);
  350.             map.putIf("Loot_Chances", this.lootChances);
  351.  
  352.             return map;
  353.         }
  354.     }
  355. }
Add Comment
Please, Sign In to add comment