Search in sources :

Example 1 with WeaponPreShootEvent

use of me.deecaad.weaponmechanics.weapon.weaponevents.WeaponPreShootEvent 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)1 Configuration (me.deecaad.core.file.Configuration)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 WeaponPreShootEvent (me.deecaad.weaponmechanics.weapon.weaponevents.WeaponPreShootEvent)1 HandData (me.deecaad.weaponmechanics.wrappers.HandData)1 PlayerWrapper (me.deecaad.weaponmechanics.wrappers.PlayerWrapper)1 Location (org.bukkit.Location)1