Search in sources :

Example 6 with PlayerWrapper

use of me.deecaad.weaponmechanics.wrappers.PlayerWrapper in project MechanicsMain by WeaponMechanics.

the class TriggerPlayerListeners method animation.

/**
 * This is simply used to cancel player arm swing animation from OTHER players.
 * It can't be cancelled from the player doing the arm swing.
 */
@EventHandler(ignoreCancelled = true)
public void animation(PlayerAnimationEvent e) {
    if (e.getAnimationType() != PlayerAnimationType.ARM_SWING)
        return;
    if (getBasicConfigurations().getBool("Disabled_Trigger_Checks.Right_And_Left_Click"))
        return;
    Player player = e.getPlayer();
    EntityEquipment playerEquipment = player.getEquipment();
    if (player.getGameMode() == GameMode.SPECTATOR || playerEquipment == null)
        return;
    PlayerWrapper playerWrapper = getPlayerWrapper(player);
    double version = CompatibilityAPI.getVersion();
    if (version >= 1.15 && !NumberUtil.hasMillisPassed(playerWrapper.getLastDropWeaponTime(), 25)) {
        e.setCancelled(true);
        return;
    }
    ItemStack mainStack = playerEquipment.getItemInMainHand();
    String mainWeapon = weaponHandler.getInfoHandler().getWeaponTitle(mainStack, false);
    if (mainWeapon != null && getConfigurations().getBool(mainWeapon + ".Info.Cancel.Arm_Swing_Animation")) {
        e.setCancelled(true);
        return;
    }
    ItemStack offStack = playerEquipment.getItemInOffHand();
    String offWeapon = weaponHandler.getInfoHandler().getWeaponTitle(offStack, false);
    if (offWeapon != null && getConfigurations().getBool(offWeapon + ".Info.Cancel.Arm_Swing_Animation")) {
        e.setCancelled(true);
    }
}
Also used : Player(org.bukkit.entity.Player) EntityEquipment(org.bukkit.inventory.EntityEquipment) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper) ItemStack(org.bukkit.inventory.ItemStack) EventHandler(org.bukkit.event.EventHandler)

Example 7 with PlayerWrapper

use of me.deecaad.weaponmechanics.wrappers.PlayerWrapper in project MechanicsMain by WeaponMechanics.

the class TriggerPlayerListeners method dropItem.

@EventHandler(ignoreCancelled = true)
public void dropItem(PlayerDropItemEvent e) {
    Player player = e.getPlayer();
    if (getBasicConfigurations().getBool("Disabled_Trigger_Checks.Drop_Item"))
        return;
    PlayerWrapper playerWrapper = getPlayerWrapper(player);
    if (playerWrapper.isInventoryOpen())
        return;
    EntityEquipment playerEquipment = player.getEquipment();
    if (player.getGameMode() == GameMode.SPECTATOR || playerEquipment == null)
        return;
    ItemStack mainStack = e.getItemDrop().getItemStack();
    String mainWeapon = weaponHandler.getInfoHandler().getWeaponTitle(mainStack, false);
    ItemStack offStack = playerEquipment.getItemInOffHand();
    String offWeapon = weaponHandler.getInfoHandler().getWeaponTitle(offStack, false);
    if (mainWeapon == null && offWeapon == null)
        return;
    // Cancel reload (and other tasks) since drop item will most of the time cause
    // itemstack reference change which will cause other bugs (e.g. infinite reload bug)
    playerWrapper.getMainHandData().cancelTasks();
    playerWrapper.getOffHandData().cancelTasks();
    if (mainWeapon != null && getConfigurations().getBool(mainWeapon + ".Info.Cancel.Drop_Item") || offWeapon != null && getConfigurations().getBool(offWeapon + ".Info.Cancel.Drop_Item")) {
        e.setCancelled(true);
    }
    if (weaponHandler.getInfoHandler().denyDualWielding(TriggerType.DROP_ITEM, player, mainWeapon, offWeapon))
        return;
    boolean dualWield = mainWeapon != null && offWeapon != null;
    if (mainWeapon != null) {
        playerWrapper.droppedWeapon();
        // This due to sometimes the instance changes in item drop...
        // - 1 item in slot when dropping -> reference changes
        // - 2 items or more in slot when dropping -> reference stays same
        Bukkit.getScheduler().runTask(WeaponMechanics.getPlugin(), () -> weaponHandler.tryUses(playerWrapper, mainWeapon, playerEquipment.getItemInMainHand(), EquipmentSlot.HAND, TriggerType.DROP_ITEM, dualWield, null));
    }
    if (offWeapon != null) {
        playerWrapper.droppedWeapon();
        Bukkit.getScheduler().runTask(WeaponMechanics.getPlugin(), () -> weaponHandler.tryUses(playerWrapper, offWeapon, playerEquipment.getItemInOffHand(), EquipmentSlot.OFF_HAND, TriggerType.DROP_ITEM, dualWield, null));
    }
}
Also used : Player(org.bukkit.entity.Player) EntityEquipment(org.bukkit.inventory.EntityEquipment) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper) ItemStack(org.bukkit.inventory.ItemStack) EventHandler(org.bukkit.event.EventHandler)

Example 8 with PlayerWrapper

use of me.deecaad.weaponmechanics.wrappers.PlayerWrapper in project MechanicsMain by WeaponMechanics.

the class ScopeHandler method zoomOutWithoutTiming.

/**
 * @return true if successfully zoomed out
 */
private boolean zoomOutWithoutTiming(ItemStack weaponStack, String weaponTitle, EntityWrapper entityWrapper, ZoomData zoomData, EquipmentSlot slot) {
    if (!zoomData.isZooming())
        return false;
    LivingEntity entity = entityWrapper.getEntity();
    // Zoom amount and stack 0 because zooming out
    WeaponScopeEvent weaponScopeEvent = new WeaponScopeEvent(weaponTitle, weaponStack, entity, WeaponScopeEvent.ScopeType.OUT, 0, 0);
    Bukkit.getPluginManager().callEvent(weaponScopeEvent);
    if (weaponScopeEvent.isCancelled()) {
        return false;
    }
    updateZoom(entityWrapper, zoomData, weaponScopeEvent.getZoomAmount());
    zoomData.setZoomStacks(0);
    Mechanics zoomOffMechanics = getConfigurations().getObject(weaponTitle + ".Scope.Zoom_Off.Mechanics", Mechanics.class);
    if (zoomOffMechanics != null)
        zoomOffMechanics.use(new CastData(entityWrapper, weaponTitle, weaponStack));
    WeaponInfoDisplay weaponInfoDisplay = getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
    if (weaponInfoDisplay != null)
        weaponInfoDisplay.send((PlayerWrapper) entityWrapper, slot);
    weaponHandler.getSkinHandler().tryUse(entityWrapper, weaponTitle, weaponStack, slot);
    if (zoomData.hasZoomNightVision())
        useNightVision(entityWrapper, zoomData);
    HandData handData = slot == EquipmentSlot.HAND ? entityWrapper.getMainHandData() : entityWrapper.getOffHandData();
    handData.setLastScopeTime(System.currentTimeMillis());
    if (getConfigurations().getBool(weaponTitle + ".Info.Show_Cooldown.Shoot_Delay_After_Scope")) {
        CompatibilityAPI.getEntityCompatibility().setCooldown((Player) entity, weaponStack.getType(), getConfigurations().getInt(weaponTitle + ".Scope.Shoot_Delay_After_Scope") / 50);
    }
    return true;
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) CastData(me.deecaad.weaponmechanics.mechanics.CastData) Mechanics(me.deecaad.weaponmechanics.mechanics.Mechanics) WeaponMechanics(me.deecaad.weaponmechanics.WeaponMechanics) WeaponScopeEvent(me.deecaad.weaponmechanics.weapon.weaponevents.WeaponScopeEvent) WeaponInfoDisplay(me.deecaad.weaponmechanics.weapon.info.WeaponInfoDisplay) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper) HandData(me.deecaad.weaponmechanics.wrappers.HandData)

Example 9 with PlayerWrapper

use of me.deecaad.weaponmechanics.wrappers.PlayerWrapper in project MechanicsMain by WeaponMechanics.

the class ScopeHandler method zoomInWithoutTiming.

/**
 * @return true if successfully zoomed in or stacked
 */
private boolean zoomInWithoutTiming(ItemStack weaponStack, String weaponTitle, EntityWrapper entityWrapper, ZoomData zoomData, EquipmentSlot slot) {
    Configuration config = getConfigurations();
    LivingEntity entity = entityWrapper.getEntity();
    if (zoomData.isZooming()) {
        // zoom stack
        int increaseZoomPerStack = config.getInt(weaponTitle + ".Scope.Zoom_Stacking.Increase_Zoom_Per_Stack");
        if (increaseZoomPerStack != 0) {
            int zoomStack = zoomData.getZoomStacks() + 1;
            int zoomAmount = config.getInt(weaponTitle + ".Scope.Zoom_Amount");
            WeaponScopeEvent weaponScopeEvent = new WeaponScopeEvent(weaponTitle, weaponStack, entity, WeaponScopeEvent.ScopeType.STACK, zoomAmount + (zoomStack * increaseZoomPerStack), zoomStack);
            Bukkit.getPluginManager().callEvent(weaponScopeEvent);
            if (weaponScopeEvent.isCancelled()) {
                return false;
            }
            updateZoom(entityWrapper, zoomData, weaponScopeEvent.getZoomAmount());
            zoomData.setZoomStacks(zoomStack);
            weaponHandler.getSkinHandler().tryUse(entityWrapper, weaponTitle, weaponStack, slot);
            Mechanics zoomStackingMechanics = config.getObject(weaponTitle + ".Scope.Zoom_Stacking.Mechanics", Mechanics.class);
            if (zoomStackingMechanics != null)
                zoomStackingMechanics.use(new CastData(entityWrapper, weaponTitle, weaponStack));
            WeaponInfoDisplay weaponInfoDisplay = getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
            if (weaponInfoDisplay != null)
                weaponInfoDisplay.send((PlayerWrapper) entityWrapper, slot);
            return true;
        } else {
            debug.log(LogLevel.WARN, "For some reason zoom in was called on entity when it shouldn't have.", "Entity was already zooming so it should have stacked zoom, but not zoom stacking wasn't used at all?", "Ignoring this call, but this shouldn't even happen...", "Are you sure you have defined both Maximum_Stacks and Increase_Zoom_Per_Stack for weapon " + weaponTitle + "?");
            return false;
        }
    }
    int zoomAmount = config.getInt(weaponTitle + ".Scope.Zoom_Amount");
    if (zoomAmount == 0)
        return false;
    // zoom stack = 0, because its not used OR this is first zoom in
    WeaponScopeEvent weaponScopeEvent = new WeaponScopeEvent(weaponTitle, weaponStack, entity, WeaponScopeEvent.ScopeType.IN, zoomAmount, 0);
    Bukkit.getPluginManager().callEvent(weaponScopeEvent);
    if (weaponScopeEvent.isCancelled()) {
        return false;
    }
    updateZoom(entityWrapper, zoomData, weaponScopeEvent.getZoomAmount());
    Mechanics zoomMechanics = config.getObject(weaponTitle + ".Scope.Mechanics", Mechanics.class);
    if (zoomMechanics != null)
        zoomMechanics.use(new CastData(entityWrapper, weaponTitle, weaponStack));
    WeaponInfoDisplay weaponInfoDisplay = getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
    if (weaponInfoDisplay != null)
        weaponInfoDisplay.send((PlayerWrapper) entityWrapper, slot);
    weaponHandler.getSkinHandler().tryUse(entityWrapper, weaponTitle, weaponStack, slot);
    if (config.getBool(weaponTitle + ".Scope.Night_Vision"))
        useNightVision(entityWrapper, zoomData);
    return true;
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) CastData(me.deecaad.weaponmechanics.mechanics.CastData) Configuration(me.deecaad.core.file.Configuration) Mechanics(me.deecaad.weaponmechanics.mechanics.Mechanics) WeaponMechanics(me.deecaad.weaponmechanics.WeaponMechanics) WeaponScopeEvent(me.deecaad.weaponmechanics.weapon.weaponevents.WeaponScopeEvent) WeaponInfoDisplay(me.deecaad.weaponmechanics.weapon.info.WeaponInfoDisplay) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper)

Example 10 with PlayerWrapper

use of me.deecaad.weaponmechanics.wrappers.PlayerWrapper in project MechanicsMain by WeaponMechanics.

the class Explosion method explode.

public void explode(LivingEntity cause, Location origin, WeaponProjectile projectile) {
    // Handle worldguard flags
    WorldGuardCompatibility worldGuard = CompatibilityAPI.getWorldGuardCompatibility();
    EntityWrapper entityWrapper = WeaponMechanics.getEntityWrapper(cause);
    if (!worldGuard.testFlag(origin, entityWrapper instanceof PlayerWrapper ? ((PlayerWrapper) entityWrapper).getPlayer() : null, "weapon-explode")) {
        Object obj = worldGuard.getValue(origin, "weapon-explode-message");
        if (obj != null && !obj.toString().isEmpty()) {
            entityWrapper.getEntity().sendMessage(StringUtil.color(obj.toString()));
        }
        return;
    }
    // triggered instead of the explosion.
    if (projectile != null && airStrike != null && projectile.getIntTag("airstrike-bomb") == 0) {
        airStrike.trigger(origin, cause, projectile);
        return;
    }
    List<Block> blocks;
    BlockRegenSorter sorter;
    DoubleMap<LivingEntity> entities;
    if (projectile != null) {
        // This event is not cancellable. If developers want to cancel
        // explosions, they should use ProjectilePreExplodeEvent
        ProjectileExplodeEvent event = new ProjectileExplodeEvent(projectile, shape.getBlocks(origin), new LayerDistanceSorter(origin, this), exposure.mapExposures(origin, shape));
        Bukkit.getPluginManager().callEvent(event);
        blocks = event.getBlocks();
        sorter = event.getSorter();
        entities = event.getEntities();
    } else {
        blocks = shape.getBlocks(origin);
        sorter = new LayerDistanceSorter(origin, this);
        entities = exposure.mapExposures(origin, shape);
    }
    int initialCapacity = Math.max(blocks.size(), 10);
    List<Block> transparent = new ArrayList<>(initialCapacity);
    List<Block> solid = new ArrayList<>(initialCapacity);
    // redstone contraptions.
    for (Block block : blocks) {
        if (block.getType().isSolid()) {
            solid.add(block);
        } else if (!block.isEmpty()) {
            transparent.add(block);
        }
    }
    // regenerate in a random order.
    try {
        if (sorter == null) {
            debug.debug("Null sorter used while regenerating explosion... Was this intentional?");
        } else {
            solid.sort(sorter);
        }
    } catch (IllegalArgumentException e) {
        debug.log(LogLevel.ERROR, "A plugin modified the explosion block sorter with an illegal sorter! " + "Please report this error to the developers of that plugin. Sorter: " + sorter.getClass(), e);
    }
    // spawn falling blocks. We also don't need to worry about regeneration.
    if (blockDamage != null) {
        int timeOffset = regeneration == null ? -1 : (solid.size() * regeneration.getInterval() / regeneration.getMaxBlocksPerUpdate());
        damageBlocks(transparent, true, origin, timeOffset);
        damageBlocks(solid, false, origin, 0);
    }
    if (projectile != null && projectile.getWeaponTitle() != null) {
        WeaponMechanics.getWeaponHandler().getDamageHandler().tryUseExplosion(projectile, origin, entities);
        // higher your exposure, the greater the knockback.
        if (isKnockback) {
            Vector originVector = origin.toVector();
            for (DoubleEntry<LivingEntity> entry : entities.entrySet()) {
                LivingEntity entity = entry.getKey();
                double exposure = entry.getValue();
                // Normalized vector between the explosion and entity involved
                Vector between = VectorUtil.setLength(entity.getLocation().toVector().subtract(originVector), exposure);
                Vector motion = entity.getVelocity().add(between);
                entity.setVelocity(motion);
            }
        }
        if (cluster != null)
            cluster.trigger(projectile, cause, origin);
    } else {
        // size explosion they may want
        for (DoubleEntry<LivingEntity> entry : entities.entrySet()) {
            LivingEntity entity = entry.getKey();
            double impact = entry.getValue();
            entity.sendMessage(StringUtil.color("&cYou suffered " + impact * 100 + "% of the impact"));
        }
    }
    if (flashbang != null)
        flashbang.trigger(exposure, projectile, origin);
    if (mechanics != null)
        mechanics.use(new CastData(entityWrapper, origin, projectile == null ? null : projectile.getWeaponTitle(), projectile == null ? null : projectile.getWeaponStack()));
}
Also used : CastData(me.deecaad.weaponmechanics.mechanics.CastData) BlockRegenSorter(me.deecaad.weaponmechanics.weapon.explode.regeneration.BlockRegenSorter) LayerDistanceSorter(me.deecaad.weaponmechanics.weapon.explode.regeneration.LayerDistanceSorter) ArrayList(java.util.ArrayList) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper) LivingEntity(org.bukkit.entity.LivingEntity) WorldGuardCompatibility(me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility) EntityWrapper(me.deecaad.weaponmechanics.wrappers.EntityWrapper) Block(org.bukkit.block.Block) Vector(org.bukkit.util.Vector) ProjectileExplodeEvent(me.deecaad.weaponmechanics.weapon.weaponevents.ProjectileExplodeEvent)

Aggregations

PlayerWrapper (me.deecaad.weaponmechanics.wrappers.PlayerWrapper)19 CastData (me.deecaad.weaponmechanics.mechanics.CastData)11 WeaponInfoDisplay (me.deecaad.weaponmechanics.weapon.info.WeaponInfoDisplay)10 ItemStack (org.bukkit.inventory.ItemStack)9 Mechanics (me.deecaad.weaponmechanics.mechanics.Mechanics)7 LivingEntity (org.bukkit.entity.LivingEntity)7 Player (org.bukkit.entity.Player)7 WeaponMechanics (me.deecaad.weaponmechanics.WeaponMechanics)6 HandData (me.deecaad.weaponmechanics.wrappers.HandData)6 Configuration (me.deecaad.core.file.Configuration)5 EventHandler (org.bukkit.event.EventHandler)5 EntityEquipment (org.bukkit.inventory.EntityEquipment)4 FirearmAction (me.deecaad.weaponmechanics.weapon.firearm.FirearmAction)3 FirearmState (me.deecaad.weaponmechanics.weapon.firearm.FirearmState)3 EntityWrapper (me.deecaad.weaponmechanics.wrappers.EntityWrapper)3 ArrayList (java.util.ArrayList)2 WorldGuardCompatibility (me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility)2 AmmoTypes (me.deecaad.weaponmechanics.weapon.reload.ammo.AmmoTypes)2 Recoil (me.deecaad.weaponmechanics.weapon.shoot.recoil.Recoil)2 Trigger (me.deecaad.weaponmechanics.weapon.trigger.Trigger)2