Search in sources :

Example 16 with StackedEntity

use of dev.rosewood.rosestacker.stack.StackedEntity in project RoseStacker by Rosewood-Development.

the class InteractListener method onInteractEntity.

@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onInteractEntity(PlayerInteractEntityEvent event) {
    if (!(event.getRightClicked() instanceof LivingEntity))
        return;
    StackManager stackManager = this.rosePlugin.getManager(StackManager.class);
    if (stackManager.isWorldDisabled(event.getPlayer().getWorld()))
        return;
    if (!stackManager.isEntityStackingEnabled())
        return;
    LivingEntity entity = (LivingEntity) event.getRightClicked();
    StackedEntity stackedEntity = stackManager.getStackedEntity(entity);
    if (stackedEntity == null)
        return;
    Player player = event.getPlayer();
    ItemStack itemStack = event.getHand() == EquipmentSlot.HAND ? player.getInventory().getItemInMainHand() : player.getInventory().getItemInOffHand();
    if (itemStack.getType() == Material.NAME_TAG) {
        Bukkit.getScheduler().runTask(this.rosePlugin, stackedEntity::updateDisplay);
        return;
    } else if (itemStack.getType() == Material.WATER_BUCKET) {
        switch(entity.getType()) {
            case COD:
            case SALMON:
            case PUFFERFISH:
            case TROPICAL_FISH:
            case AXOLOTL:
                break;
            default:
                return;
        }
        if (stackedEntity.getStackSize() != 1)
            Bukkit.getScheduler().runTask(this.rosePlugin, stackedEntity::decreaseStackSize);
        return;
    }
    if (this.spawnEntities(entity, entity.getLocation(), itemStack)) {
        ItemUtils.takeOneItem(event.getPlayer(), event.getHand());
        event.setCancelled(true);
    }
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) Player(org.bukkit.entity.Player) StackManager(dev.rosewood.rosestacker.manager.StackManager) ItemStack(org.bukkit.inventory.ItemStack) EventHandler(org.bukkit.event.EventHandler)

Example 17 with StackedEntity

use of dev.rosewood.rosestacker.stack.StackedEntity in project RoseStacker by Rosewood-Development.

the class StackToolListener method onLeftClickEntity.

/**
 * Handles Shift Left Clicks for StackedEntities
 *
 * @param event The EntityDamageByEntityEvent
 */
@EventHandler(priority = EventPriority.LOWEST)
public void onLeftClickEntity(EntityDamageByEntityEvent event) {
    if (!(event.getDamager() instanceof Player))
        return;
    Player player = (Player) event.getDamager();
    ItemStack tool = player.getInventory().getItemInMainHand();
    if (!ItemUtils.isStackingTool(tool))
        return;
    event.setCancelled(true);
    if (!(event.getEntity() instanceof LivingEntity))
        return;
    if (!player.hasPermission("rosestacker.stacktool")) {
        this.localeManager.sendMessage(player, "command-stacktool-no-permission");
        return;
    }
    LivingEntity entity = (LivingEntity) event.getEntity();
    StackedEntity stackedEntity = this.stackManager.getStackedEntity(entity);
    if (stackedEntity == null) {
        this.localeManager.sendMessage(player, "command-stacktool-invalid-entity");
        return;
    }
    if (!player.isSneaking()) {
        SelectedEntities selected = this.selectedEntities.get(player.getUniqueId());
        if (selected == null) {
            selected = new SelectedEntities();
            this.selectedEntities.put(player.getUniqueId(), selected);
        }
        if (selected.getEntity1() == stackedEntity) {
            selected.unselect();
            this.localeManager.sendMessage(player, "command-stacktool-unselect-1", StringPlaceholders.single("type", stackedEntity.getStackSettings().getDisplayName()));
            return;
        }
        selected.select(stackedEntity);
        if (!selected.hasSelected()) {
            this.localeManager.sendMessage(player, "command-stacktool-select-1", StringPlaceholders.single("type", stackedEntity.getStackSettings().getDisplayName()));
        } else {
            this.localeManager.sendMessage(player, "command-stacktool-select-2", StringPlaceholders.single("type", stackedEntity.getStackSettings().getDisplayName()));
            StackedEntity entity1 = selected.getEntity1();
            StackedEntity entity2 = selected.getEntity2();
            selected.unselect();
            EntityStackComparisonResult result = stackedEntity.getStackSettings().canStackWith(entity1, entity2, false, true);
            if (result == EntityStackComparisonResult.CAN_STACK) {
                this.localeManager.sendMessage(player, "command-stacktool-can-stack");
            } else {
                this.localeManager.sendMessage(player, "command-stacktool-can-not-stack", StringPlaceholders.single("reason", result.name()));
            }
        }
    } else {
        String trueStr = this.localeManager.getLocaleMessage("command-stacktool-info-true");
        String falseStr = this.localeManager.getLocaleMessage("command-stacktool-info-false");
        this.localeManager.sendMessage(player, "command-stacktool-info");
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-uuid", StringPlaceholders.single("uuid", entity.getUniqueId().toString()));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-entity-id", StringPlaceholders.single("id", entity.getEntityId()));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-entity-type", StringPlaceholders.single("type", entity.getType().name()));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-stack-size", StringPlaceholders.single("amount", stackedEntity.getStackSize()));
        if (entity.getCustomName() != null)
            this.localeManager.sendSimpleMessage(player, "command-stacktool-info-custom-name", StringPlaceholders.single("name", entity.getCustomName()));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-entity-stackable", StringPlaceholders.single("value", PersistentDataUtils.isUnstackable(entity) ? falseStr : trueStr));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-entity-from-spawner", StringPlaceholders.single("value", PersistentDataUtils.isSpawnedFromSpawner(entity) ? trueStr : falseStr));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-entity-has-ai", StringPlaceholders.single("value", !PersistentDataUtils.isAiDisabled(entity) && entity.hasAI() ? trueStr : falseStr));
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-location", StringPlaceholders.builder("x", entity.getLocation().getBlockX()).addPlaceholder("y", entity.getLocation().getBlockY()).addPlaceholder("z", entity.getLocation().getBlockZ()).addPlaceholder("world", entity.getWorld().getName()).build());
        this.localeManager.sendSimpleMessage(player, "command-stacktool-info-chunk", StringPlaceholders.builder("x", entity.getLocation().getChunk().getX()).addPlaceholder("z", entity.getLocation().getChunk().getZ()).build());
    }
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) Player(org.bukkit.entity.Player) EntityStackComparisonResult(dev.rosewood.rosestacker.stack.EntityStackComparisonResult) ItemStack(org.bukkit.inventory.ItemStack) EventHandler(org.bukkit.event.EventHandler)

Example 18 with StackedEntity

use of dev.rosewood.rosestacker.stack.StackedEntity in project RoseStacker by Rosewood-Development.

the class WildStackerEntityConversionHandler method handleConversion.

@Override
public Set<Stack<?>> handleConversion(Set<ConversionData> conversionData) {
    Set<LivingEntity> entities = conversionData.stream().map(ConversionData::getEntity).filter(Objects::nonNull).collect(Collectors.toSet());
    Set<Stack<?>> stacks = new HashSet<>();
    for (LivingEntity entity : entities) {
        PersistentDataContainer dataContainer = entity.getPersistentDataContainer();
        if (dataContainer.has(PersistentDataUtils.CONVERTED_KEY, PersistentDataType.INTEGER))
            continue;
        int stackSize = dataContainer.getOrDefault(STACK_KEY, PersistentDataType.INTEGER, -1);
        if (stackSize == -1)
            continue;
        dataContainer.set(PersistentDataUtils.CONVERTED_KEY, PersistentDataType.INTEGER, 1);
        StackedEntity stackedEntity = new StackedEntity(entity, this.createEntityStackNBT(entity.getType(), stackSize, entity.getLocation()));
        this.stackManager.addEntityStack(stackedEntity);
        stacks.add(stackedEntity);
    }
    return stacks;
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) ConversionData(dev.rosewood.rosestacker.conversion.ConversionData) Stack(dev.rosewood.rosestacker.stack.Stack) HashSet(java.util.HashSet) PersistentDataContainer(org.bukkit.persistence.PersistentDataContainer)

Example 19 with StackedEntity

use of dev.rosewood.rosestacker.stack.StackedEntity in project RoseStacker by Rosewood-Development.

the class MobSpawningMethod method spawn.

@Override
public void spawn(StackedSpawner stackedSpawner) {
    StackedSpawnerTile spawnerTile = stackedSpawner.getSpawnerTile();
    SpawnerStackSettings stackSettings = stackedSpawner.getStackSettings();
    // Mob spawning logic
    List<ConditionTag> spawnRequirements = new ArrayList<>(stackSettings.getSpawnRequirements());
    // Check general spawner conditions
    List<ConditionTag> perSpawnConditions = spawnRequirements.stream().filter(ConditionTag::isRequiredPerSpawn).collect(Collectors.toList());
    spawnRequirements.removeAll(perSpawnConditions);
    Set<ConditionTag> invalidSpawnConditions = spawnRequirements.stream().filter(x -> !x.check(stackedSpawner, stackedSpawner.getBlock())).collect(Collectors.toSet());
    if (Setting.SPAWNER_SPAWN_ONLY_PLAYER_PLACED.getBoolean() && !stackedSpawner.isPlacedByPlayer())
        invalidSpawnConditions.add(NotPlayerPlacedConditionTag.INSTANCE);
    boolean passedSpawnerChecks = invalidSpawnConditions.isEmpty();
    // Will be removed when they pass
    invalidSpawnConditions.addAll(perSpawnConditions);
    // Spawn the mobs
    int spawnAmount;
    if (Setting.SPAWNER_SPAWN_COUNT_STACK_SIZE_RANDOMIZED.getBoolean()) {
        if (stackSettings.getSpawnCountStackSizeMultiplier() != -1) {
            int spawnerSpawnCount = Math.max(spawnerTile.getSpawnCount(), 0);
            spawnAmount = StackerUtils.randomInRange(stackedSpawner.getStackSize(), spawnerSpawnCount);
        } else {
            spawnAmount = this.random.nextInt(spawnerTile.getSpawnCount()) + 1;
        }
    } else {
        spawnAmount = spawnerTile.getSpawnCount();
    }
    EntityCacheManager entityCacheManager = RoseStacker.getInstance().getManager(EntityCacheManager.class);
    StackManager stackManager = RoseStacker.getInstance().getManager(StackManager.class);
    Bukkit.getScheduler().runTaskAsynchronously(RoseStacker.getInstance(), () -> {
        Set<Location> spawnLocations = new HashSet<>();
        int spawnRange = spawnerTile.getSpawnRange();
        for (int i = 0; i < spawnAmount; i++) {
            int attempts = 0;
            while (attempts < Setting.SPAWNER_MAX_FAILED_SPAWN_ATTEMPTS.getInt()) {
                int xOffset = this.random.nextInt(spawnRange * 2 + 1) - spawnRange;
                int yOffset = !Setting.SPAWNER_USE_VERTICAL_SPAWN_RANGE.getBoolean() ? this.random.nextInt(3) - 1 : this.random.nextInt(spawnRange * 2 + 1) - spawnRange;
                int zOffset = this.random.nextInt(spawnRange * 2 + 1) - spawnRange;
                Location spawnLocation = stackedSpawner.getLocation().clone().add(xOffset + 0.5, yOffset, zOffset + 0.5);
                Block target = stackedSpawner.getLocation().clone().add(xOffset, yOffset, zOffset).getBlock();
                boolean invalid = false;
                for (ConditionTag conditionTag : perSpawnConditions) {
                    if (!conditionTag.check(stackedSpawner, target)) {
                        invalid = true;
                    } else {
                        invalidSpawnConditions.remove(conditionTag);
                    }
                }
                if (invalid) {
                    attempts++;
                    continue;
                }
                if (!passedSpawnerChecks)
                    break;
                spawnLocations.add(spawnLocation);
                break;
            }
        }
        EntityType entityType = stackedSpawner.getSpawnerTile().getSpawnedType();
        Predicate<Entity> predicate = entity -> entity.getType() == entityType;
        Collection<Entity> nearbyEntities = entityCacheManager.getNearbyEntities(stackedSpawner.getLocation(), stackSettings.getSpawnRange(), predicate);
        List<StackedEntity> nearbyStackedEntities = new ArrayList<>();
        for (Entity entity : nearbyEntities) {
            StackedEntity stackedEntity = stackManager.getStackedEntity((LivingEntity) entity);
            if (stackedEntity != null)
                nearbyStackedEntities.add(stackedEntity);
        }
        int successfulSpawns = this.spawnEntitiesIntoNearbyStacks(stackedSpawner, spawnAmount, spawnLocations, nearbyStackedEntities, stackManager);
        stackedSpawner.getLastInvalidConditions().clear();
        if (successfulSpawns <= 0) {
            if (invalidSpawnConditions.isEmpty()) {
                stackedSpawner.getLastInvalidConditions().add(NoneConditionTag.class);
            } else {
                List<Class<? extends ConditionTag>> invalidSpawnConditionClasses = new ArrayList<>();
                for (ConditionTag conditionTag : invalidSpawnConditions) invalidSpawnConditionClasses.add(conditionTag.getClass());
                stackedSpawner.getLastInvalidConditions().addAll(invalidSpawnConditionClasses);
            }
            // Spawn particles indicating the spawn did not occur
            stackedSpawner.getWorld().spawnParticle(Particle.SMOKE_NORMAL, stackedSpawner.getLocation().clone().add(0.5, 0.5, 0.5), 50, 0.5, 0.5, 0.5, 0);
        } else {
            // Spawn particles indicating the spawn occurred
            stackedSpawner.getWorld().spawnParticle(Particle.FLAME, stackedSpawner.getLocation().clone().add(0.5, 0.5, 0.5), 50, 0.5, 0.5, 0.5, 0);
            Bukkit.getScheduler().runTask(RoseStacker.getInstance(), () -> {
                if (stackedSpawner.getBlock().getType() == Material.SPAWNER)
                    PersistentDataUtils.increaseSpawnCount(spawnerTile, successfulSpawns);
            });
        }
    });
}
Also used : RoseStacker(dev.rosewood.rosestacker.RoseStacker) WorldGuardHook(dev.rosewood.rosestacker.hook.WorldGuardHook) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) NoneConditionTag(dev.rosewood.rosestacker.spawner.conditions.tags.NoneConditionTag) Random(java.util.Random) SpawnerSpawnEvent(org.bukkit.event.entity.SpawnerSpawnEvent) StackedSpawner(dev.rosewood.rosestacker.stack.StackedSpawner) ArrayList(java.util.ArrayList) EntityStackSettings(dev.rosewood.rosestacker.stack.settings.EntityStackSettings) HashSet(java.util.HashSet) StackSettingManager(dev.rosewood.rosestacker.manager.StackSettingManager) Block(org.bukkit.block.Block) Location(org.bukkit.Location) NotPlayerPlacedConditionTag(dev.rosewood.rosestacker.spawner.conditions.tags.NotPlayerPlacedConditionTag) World(org.bukkit.World) NMSHandler(dev.rosewood.rosestacker.nms.NMSHandler) StackedSpawnerTile(dev.rosewood.rosestacker.nms.spawner.StackedSpawnerTile) PersistentDataUtils(dev.rosewood.rosestacker.utils.PersistentDataUtils) Material(org.bukkit.Material) Ageable(org.bukkit.entity.Ageable) Bukkit(org.bukkit.Bukkit) Setting(dev.rosewood.rosestacker.manager.ConfigurationManager.Setting) ConditionTag(dev.rosewood.rosestacker.spawner.conditions.ConditionTag) Entity(org.bukkit.entity.Entity) Predicate(java.util.function.Predicate) CreatureSpawnEvent(org.bukkit.event.entity.CreatureSpawnEvent) Collection(java.util.Collection) Set(java.util.Set) EntityType(org.bukkit.entity.EntityType) LivingEntity(org.bukkit.entity.LivingEntity) EntityCacheManager(dev.rosewood.rosestacker.manager.EntityCacheManager) Collectors(java.util.stream.Collectors) Particle(org.bukkit.Particle) Vector(org.bukkit.util.Vector) StackManager(dev.rosewood.rosestacker.manager.StackManager) SpawnerFlagPersistenceHook(dev.rosewood.rosestacker.hook.SpawnerFlagPersistenceHook) List(java.util.List) Optional(java.util.Optional) StackerUtils(dev.rosewood.rosestacker.utils.StackerUtils) NMSAdapter(dev.rosewood.rosestacker.nms.NMSAdapter) SpawnerStackSettings(dev.rosewood.rosestacker.stack.settings.SpawnerStackSettings) SpawnerStackSettings(dev.rosewood.rosestacker.stack.settings.SpawnerStackSettings) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) Entity(org.bukkit.entity.Entity) LivingEntity(org.bukkit.entity.LivingEntity) StackedEntity(dev.rosewood.rosestacker.stack.StackedEntity) NoneConditionTag(dev.rosewood.rosestacker.spawner.conditions.tags.NoneConditionTag) NotPlayerPlacedConditionTag(dev.rosewood.rosestacker.spawner.conditions.tags.NotPlayerPlacedConditionTag) ConditionTag(dev.rosewood.rosestacker.spawner.conditions.ConditionTag) StackManager(dev.rosewood.rosestacker.manager.StackManager) ArrayList(java.util.ArrayList) EntityCacheManager(dev.rosewood.rosestacker.manager.EntityCacheManager) StackedSpawnerTile(dev.rosewood.rosestacker.nms.spawner.StackedSpawnerTile) EntityType(org.bukkit.entity.EntityType) Block(org.bukkit.block.Block) Location(org.bukkit.Location) HashSet(java.util.HashSet)

Aggregations

StackedEntity (dev.rosewood.rosestacker.stack.StackedEntity)19 LivingEntity (org.bukkit.entity.LivingEntity)14 EventHandler (org.bukkit.event.EventHandler)10 StackManager (dev.rosewood.rosestacker.manager.StackManager)8 Player (org.bukkit.entity.Player)8 Entity (org.bukkit.entity.Entity)7 ItemStack (org.bukkit.inventory.ItemStack)7 NMSHandler (dev.rosewood.rosestacker.nms.NMSHandler)6 Setting (dev.rosewood.rosestacker.manager.ConfigurationManager.Setting)5 EntityCacheManager (dev.rosewood.rosestacker.manager.EntityCacheManager)5 SpawnerStackSettings (dev.rosewood.rosestacker.stack.settings.SpawnerStackSettings)5 PersistentDataUtils (dev.rosewood.rosestacker.utils.PersistentDataUtils)5 StackerUtils (dev.rosewood.rosestacker.utils.StackerUtils)5 ArrayList (java.util.ArrayList)5 HashSet (java.util.HashSet)5 Bukkit (org.bukkit.Bukkit)5 Material (org.bukkit.Material)5 EntityType (org.bukkit.entity.EntityType)5 RoseStacker (dev.rosewood.rosestacker.RoseStacker)4 StackSettingManager (dev.rosewood.rosestacker.manager.StackSettingManager)4