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!");
}
}
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());
}
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()));
}
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;
}
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);
}
Aggregations