Search in sources :

Example 1 with WorldGuardCompatibility

use of me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility in project MechanicsMain by WeaponMechanics.

the class WeaponMechanics method onLoad.

public void onLoad() {
    setupDebugger();
    // Check Java version and warn users about untested/unsupported versions
    if (ReflectionUtil.getJavaVersion() < 8) {
        debug.error("Detected a JAVA version under java 1.8. This plugin will NOT work in versions under java 1.8.");
        debug.error("Detected JAVA version: " + ReflectionUtil.getJavaVersion());
    } else if (ReflectionUtil.getJavaVersion() > 17) {
        debug.debug("Detected a JAVA version above java 17. This plugin has not been tested in versions above java 17.");
        debug.debug("Detected JAVA version: " + ReflectionUtil.getJavaVersion());
    }
    // Register all WorldGuard flags
    WorldGuardCompatibility guard = CompatibilityAPI.getWorldGuardCompatibility();
    if (guard.isInstalled()) {
        debug.info("Detected WorldGuard, registering flags");
        guard.registerFlag("weapon-shoot", WorldGuardCompatibility.FlagType.STATE_FLAG);
        guard.registerFlag("weapon-shoot-message", WorldGuardCompatibility.FlagType.STRING_FLAG);
        guard.registerFlag("weapon-explode", WorldGuardCompatibility.FlagType.STATE_FLAG);
        guard.registerFlag("weapon-explode-message", WorldGuardCompatibility.FlagType.STRING_FLAG);
        guard.registerFlag("weapon-break-block", WorldGuardCompatibility.FlagType.STATE_FLAG);
        guard.registerFlag("weapon-damage", WorldGuardCompatibility.FlagType.STATE_FLAG);
        guard.registerFlag("weapon-damage-message", WorldGuardCompatibility.FlagType.STRING_FLAG);
    } else {
        debug.debug("No WorldGuard detected!");
    }
}
Also used : WorldGuardCompatibility(me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility)

Example 2 with WorldGuardCompatibility

use of me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility in project MechanicsMain by WeaponMechanics.

the class RayTraceResult method handleMeleeHit.

/**
 * @return true if hit was cancelled
 */
public boolean handleMeleeHit(LivingEntity shooter, Vector shooterDirection, String weaponTitle, ItemStack weaponStack) {
    // Handle worldguard flags
    WorldGuardCompatibility worldGuard = CompatibilityAPI.getWorldGuardCompatibility();
    Location loc = hitLocation.clone().toLocation(shooter.getWorld());
    if (!worldGuard.testFlag(loc, shooter instanceof Player ? (Player) shooter : null, "weapon-damage")) {
        // is cancelled check
        Object obj = worldGuard.getValue(loc, "weapon-damage-message");
        if (obj != null && !obj.toString().isEmpty() && shooter != null) {
            shooter.sendMessage(StringUtil.color(obj.toString()));
        }
        return true;
    }
    boolean backstab = livingEntity.getLocation().getDirection().dot(shooterDirection) > 0.0;
    return !damageHandler.tryUse(livingEntity, getConfigurations().getDouble(weaponTitle + ".Damage.Base_Damage"), hitPoint, backstab, shooter, weaponTitle, weaponStack, getDistanceTravelled());
}
Also used : Player(org.bukkit.entity.Player) WorldGuardCompatibility(me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility) Location(org.bukkit.Location)

Example 3 with WorldGuardCompatibility

use of me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility 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)

Example 4 with WorldGuardCompatibility

use of me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility in project MechanicsMain by WeaponMechanics.

the class RayTraceResult method handleEntityHit.

private boolean handleEntityHit(WeaponProjectile projectile) {
    // Handle worldguard flags
    WorldGuardCompatibility worldGuard = CompatibilityAPI.getWorldGuardCompatibility();
    Location loc = hitLocation.clone().toLocation(projectile.getWorld());
    LivingEntity shooter = projectile.getShooter();
    if (!worldGuard.testFlag(loc, shooter instanceof Player ? (Player) shooter : null, "weapon-damage")) {
        // is cancelled check
        Object obj = worldGuard.getValue(loc, "weapon-damage-message");
        if (obj != null && !obj.toString().isEmpty() && shooter != null) {
            shooter.sendMessage(StringUtil.color(obj.toString()));
        }
        return true;
    }
    boolean backstab = livingEntity.getLocation().getDirection().dot(projectile.getMotion()) > 0.0;
    ProjectileHitEntityEvent hitEntityEvent = new ProjectileHitEntityEvent(projectile, livingEntity, hitLocation.clone(), hitPoint, backstab);
    Bukkit.getPluginManager().callEvent(hitEntityEvent);
    if (hitEntityEvent.isCancelled())
        return true;
    hitPoint = hitEntityEvent.getPoint();
    backstab = hitEntityEvent.isBackStab();
    if (!damageHandler.tryUse(livingEntity, projectile, getConfigurations().getDouble(projectile.getWeaponTitle() + ".Damage.Base_Damage"), hitPoint, backstab)) {
        // Damage was cancelled
        return true;
    }
    Explosion explosion = getConfigurations().getObject(projectile.getWeaponTitle() + ".Explosion", Explosion.class);
    if (explosion != null)
        explosion.handleExplosion(projectile.getShooter(), hitLocation.clone().toLocation(projectile.getWorld()), projectile, ExplosionTrigger.ENTITY);
    return false;
}
Also used : LivingEntity(org.bukkit.entity.LivingEntity) Player(org.bukkit.entity.Player) Explosion(me.deecaad.weaponmechanics.weapon.explode.Explosion) WorldGuardCompatibility(me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility) ProjectileHitEntityEvent(me.deecaad.weaponmechanics.weapon.weaponevents.ProjectileHitEntityEvent) Location(org.bukkit.Location)

Example 5 with WorldGuardCompatibility

use of me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility in project MechanicsMain by WeaponMechanics.

the class ShootHandler method shootWithoutTrigger.

/**
 * @return true if was able to shoot
 */
public boolean shootWithoutTrigger(EntityWrapper entityWrapper, String weaponTitle, ItemStack weaponStack, EquipmentSlot slot, TriggerType triggerType, boolean dualWield) {
    HandData handData = slot == EquipmentSlot.HAND ? entityWrapper.getMainHandData() : entityWrapper.getOffHandData();
    // Don't even try if slot is already being used for full auto or burst
    if (handData.isUsingFullAuto() || handData.isUsingBurst())
        return false;
    Configuration config = getConfigurations();
    WeaponPreShootEvent preShootEvent = new WeaponPreShootEvent(weaponTitle, weaponStack, entityWrapper.getEntity());
    Bukkit.getPluginManager().callEvent(preShootEvent);
    if (preShootEvent.isCancelled())
        return false;
    // Cancel shooting if we can only shoot while scoped.
    if (config.getBool(weaponTitle + ".Shoot.Only_Shoot_While_Scoped") && !handData.getZoomData().isZooming())
        return false;
    boolean isMelee = triggerType == TriggerType.MELEE;
    // Handle worldguard flags
    WorldGuardCompatibility worldGuard = CompatibilityAPI.getWorldGuardCompatibility();
    Location loc = entityWrapper.getEntity().getLocation();
    if (!worldGuard.testFlag(loc, entityWrapper instanceof PlayerWrapper ? ((PlayerWrapper) entityWrapper).getPlayer() : null, "weapon-shoot")) {
        Object obj = worldGuard.getValue(loc, "weapon-shoot-message");
        if (obj != null && !obj.toString().isEmpty()) {
            entityWrapper.getEntity().sendMessage(StringUtil.color(obj.toString()));
        }
        return false;
    }
    ReloadHandler reloadHandler = weaponHandler.getReloadHandler();
    if (!getConfigurations().getBool(weaponTitle + ".Shoot.Consume_Item_On_Shoot")) {
        reloadHandler.handleWeaponStackAmount(entityWrapper, weaponStack);
    }
    int ammoLeft = reloadHandler.getAmmoLeft(weaponStack, weaponTitle);
    // Check if other hand is reloading and deny shooting if it is
    if (slot == EquipmentSlot.HAND) {
        if (entityWrapper.getOffHandData().isReloading()) {
            return false;
        }
    } else if (entityWrapper.getMainHandData().isReloading()) {
        return false;
    }
    // FIREARM START
    FirearmAction firearmAction = config.getObject(weaponTitle + ".Firearm_Action", FirearmAction.class);
    if (firearmAction != null) {
        FirearmState state = firearmAction.getState(weaponStack);
        if (state != FirearmState.READY) {
            if (ammoLeft > 0) {
                // Since weapon still has ammo, only CLOSE weapon and let it shoot AFTER that
                // Cancel reload if its running
                handData.stopReloadingTasks();
                // Call shoot firearm actions, so they can complete firearm actions
                doShootFirearmActions(entityWrapper, weaponTitle, weaponStack, handData, slot);
            } else {
                // Else continue to reload from where it left on...
                reloadHandler.startReloadWithoutTrigger(entityWrapper, weaponTitle, weaponStack, slot, dualWield, false);
            }
            // Return false since firearm state wasn't ready, and they need to be completed
            return false;
        }
    }
    // If no ammo left, start reloading
    if (ammoLeft == 0) {
        reloadHandler.startReloadWithoutTrigger(entityWrapper, weaponTitle, weaponStack, slot, dualWield, false);
        return false;
    } else if (handData.isReloading()) {
        // Else if reloading, cancel it
        handData.stopReloadingTasks();
    }
    // RELOAD END
    boolean usesSelectiveFire = config.getObject(weaponTitle + ".Shoot.Selective_Fire.Trigger", Trigger.class) != null;
    boolean isSelectiveFireAuto = false;
    int selectiveFire = 0;
    if (usesSelectiveFire) {
        selectiveFire = CustomTag.SELECTIVE_FIRE.getInteger(weaponStack);
        if (CustomTag.SELECTIVE_FIRE.hasInteger(weaponStack) && selectiveFire == SelectiveFireState.AUTO.getId()) {
            isSelectiveFireAuto = true;
        }
    }
    // Only check if selective fire doesn't have auto selected and it isn't melee
    if (!isSelectiveFireAuto && !isMelee) {
        int delayBetweenShots = config.getInt(weaponTitle + ".Shoot.Delay_Between_Shots");
        if (delayBetweenShots != 0 && !NumberUtil.hasMillisPassed(handData.getLastShotTime(), delayBetweenShots))
            return false;
    }
    int weaponEquipDelay = config.getInt(weaponTitle + ".Info.Weapon_Equip_Delay");
    if (weaponEquipDelay != 0 && !NumberUtil.hasMillisPassed(handData.getLastEquipTime(), weaponEquipDelay))
        return false;
    int shootDelayAfterScope = config.getInt(weaponTitle + ".Scope.Shoot_Delay_After_Scope");
    if (shootDelayAfterScope != 0 && !NumberUtil.hasMillisPassed(handData.getLastScopeTime(), shootDelayAfterScope))
        return false;
    if (isMelee) {
        return singleShot(entityWrapper, weaponTitle, weaponStack, handData, slot, dualWield, isMelee);
    }
    if (usesSelectiveFire) {
        switch(selectiveFire) {
            case // 1 = burst, can't use SelectiveFireState.BURST.getId() here
            (1):
                return burstShot(entityWrapper, weaponTitle, weaponStack, handData, slot, dualWield);
            case // 2 = auto, can't use SelectiveFireState.AUTO.getId() here
            (2):
                return fullAutoShot(entityWrapper, weaponTitle, weaponStack, handData, slot, triggerType, dualWield);
            default:
                return singleShot(entityWrapper, weaponTitle, weaponStack, handData, slot, dualWield, isMelee);
        }
    }
    // First try full auto, then burst then single fire
    return fullAutoShot(entityWrapper, weaponTitle, weaponStack, handData, slot, triggerType, dualWield) || burstShot(entityWrapper, weaponTitle, weaponStack, handData, slot, dualWield) || singleShot(entityWrapper, weaponTitle, weaponStack, handData, slot, dualWield, isMelee);
}
Also used : Configuration(me.deecaad.core.file.Configuration) WeaponPreShootEvent(me.deecaad.weaponmechanics.weapon.weaponevents.WeaponPreShootEvent) PlayerWrapper(me.deecaad.weaponmechanics.wrappers.PlayerWrapper) FirearmAction(me.deecaad.weaponmechanics.weapon.firearm.FirearmAction) Trigger(me.deecaad.weaponmechanics.weapon.trigger.Trigger) WorldGuardCompatibility(me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility) ReloadHandler(me.deecaad.weaponmechanics.weapon.reload.ReloadHandler) HandData(me.deecaad.weaponmechanics.wrappers.HandData) FirearmState(me.deecaad.weaponmechanics.weapon.firearm.FirearmState) Location(org.bukkit.Location)

Aggregations

WorldGuardCompatibility (me.deecaad.core.compatibility.worldguard.WorldGuardCompatibility)5 Location (org.bukkit.Location)3 PlayerWrapper (me.deecaad.weaponmechanics.wrappers.PlayerWrapper)2 LivingEntity (org.bukkit.entity.LivingEntity)2 Player (org.bukkit.entity.Player)2 ArrayList (java.util.ArrayList)1 Configuration (me.deecaad.core.file.Configuration)1 CastData (me.deecaad.weaponmechanics.mechanics.CastData)1 Explosion (me.deecaad.weaponmechanics.weapon.explode.Explosion)1 BlockRegenSorter (me.deecaad.weaponmechanics.weapon.explode.regeneration.BlockRegenSorter)1 LayerDistanceSorter (me.deecaad.weaponmechanics.weapon.explode.regeneration.LayerDistanceSorter)1 FirearmAction (me.deecaad.weaponmechanics.weapon.firearm.FirearmAction)1 FirearmState (me.deecaad.weaponmechanics.weapon.firearm.FirearmState)1 ReloadHandler (me.deecaad.weaponmechanics.weapon.reload.ReloadHandler)1 Trigger (me.deecaad.weaponmechanics.weapon.trigger.Trigger)1 ProjectileExplodeEvent (me.deecaad.weaponmechanics.weapon.weaponevents.ProjectileExplodeEvent)1 ProjectileHitEntityEvent (me.deecaad.weaponmechanics.weapon.weaponevents.ProjectileHitEntityEvent)1 WeaponPreShootEvent (me.deecaad.weaponmechanics.weapon.weaponevents.WeaponPreShootEvent)1 EntityWrapper (me.deecaad.weaponmechanics.wrappers.EntityWrapper)1 HandData (me.deecaad.weaponmechanics.wrappers.HandData)1