use of me.deecaad.weaponmechanics.mechanics.CastData in project MechanicsMain by WeaponMechanics.
the class Flashbang method effect.
public void effect(WeaponProjectile projectile, LivingEntity entity) {
if (mechanics != null) {
EntityWrapper wrapper = WeaponMechanics.getEntityWrapper(entity);
mechanics.use(new CastData(wrapper, projectile.getWeaponTitle(), projectile.getWeaponStack()));
}
}
use of me.deecaad.weaponmechanics.mechanics.CastData in project MechanicsMain by WeaponMechanics.
the class ReloadHandler method startReloadWithoutTriggerAndWithoutTiming.
private boolean startReloadWithoutTriggerAndWithoutTiming(EntityWrapper entityWrapper, String weaponTitle, ItemStack weaponStack, EquipmentSlot slot, boolean dualWield, boolean isReloadLoop) {
// Don't try to reload if either one of the hands is already reloading / full autoing
HandData mainHandData = entityWrapper.getMainHandData();
HandData offHandData = entityWrapper.getOffHandData();
if (mainHandData.isReloading() || mainHandData.isUsingFullAuto() || mainHandData.isUsingBurst() || offHandData.isReloading() || offHandData.isUsingFullAuto() || offHandData.isUsingBurst()) {
return false;
}
WeaponPreReloadEvent preReloadEvent = new WeaponPreReloadEvent(weaponTitle, weaponStack, entityWrapper.getEntity());
Bukkit.getPluginManager().callEvent(preReloadEvent);
if (preReloadEvent.isCancelled())
return false;
Configuration config = getConfigurations();
int reloadDuration = config.getInt(weaponTitle + ".Reload.Reload_Duration");
int tempMagazineSize = config.getInt(weaponTitle + ".Reload.Magazine_Size");
if (tempMagazineSize <= 0 || reloadDuration <= 0) {
// This ensures that non intended reloads doesn't occur from ShootHandler for example
return false;
}
int ammoLeft = getAmmoLeft(weaponStack, weaponTitle);
if (ammoLeft == -1) {
// This shouldn't be -1 at this point since reload should be used, perhaps ammo was added for weapon in configs later in server...
CustomTag.AMMO_LEFT.setInteger(weaponStack, 0);
ammoLeft = 0;
}
// On reload force zoom out
entityWrapper.getMainHandData().ifZoomingForceZoomOut();
entityWrapper.getOffHandData().ifZoomingForceZoomOut();
boolean mainhand = slot == EquipmentSlot.HAND;
HandData handData = mainhand ? entityWrapper.getMainHandData() : entityWrapper.getOffHandData();
int ammoPerReload = config.getInt(weaponTitle + ".Reload.Ammo_Per_Reload", -1);
// Check how much ammo should be added during this reload iteration
int tempAmmoToAdd;
if (ammoPerReload != -1) {
tempAmmoToAdd = ammoPerReload;
if (ammoLeft + tempAmmoToAdd > tempMagazineSize) {
tempAmmoToAdd = tempMagazineSize - ammoLeft;
}
} else {
tempAmmoToAdd = tempMagazineSize - ammoLeft;
}
LivingEntity shooter = entityWrapper.getEntity();
WeaponInfoDisplay weaponInfoDisplay = shooter.getType() != EntityType.PLAYER ? null : getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
PlayerWrapper playerWrapper = weaponInfoDisplay == null ? null : (PlayerWrapper) entityWrapper;
FirearmAction firearmAction = config.getObject(weaponTitle + ".Firearm_Action", FirearmAction.class);
FirearmState state = null;
boolean isRevolver = false;
boolean isPump = false;
int firearmOpenTime = 0;
int firearmCloseTime = 0;
if (firearmAction != null) {
state = firearmAction.getState(weaponStack);
isRevolver = firearmAction.getFirearmType() == FirearmType.REVOLVER;
isPump = firearmAction.getFirearmType() == FirearmType.PUMP;
// Is revolver or ammo is 0
if (!isReloadLoop && (isRevolver || ammoLeft <= 0)) {
firearmOpenTime = firearmAction.getOpenTime();
firearmCloseTime = firearmAction.getCloseTime();
switch(state) {
case OPEN:
if (isPump)
reloadDuration = 0;
break;
case CLOSE:
firearmOpenTime = 0;
reloadDuration = 0;
break;
default:
break;
}
}
}
WeaponReloadEvent reloadEvent = new WeaponReloadEvent(weaponTitle, weaponStack, entityWrapper.getEntity(), reloadDuration, tempAmmoToAdd, tempMagazineSize, firearmOpenTime, firearmCloseTime);
Bukkit.getPluginManager().callEvent(reloadEvent);
reloadDuration = reloadEvent.getReloadTime();
tempAmmoToAdd = reloadEvent.getReloadAmount();
tempMagazineSize = reloadEvent.getMagazineSize();
firearmOpenTime = reloadEvent.getFirearmOpenTime();
firearmCloseTime = reloadEvent.getFirearmCloseTime();
final int finalAmmoToAdd = tempAmmoToAdd;
final int magazineSize = tempMagazineSize;
if (ammoLeft >= magazineSize || reloadDuration == 0) {
if (state != null && state != FirearmState.READY) {
if (!isPump) {
// Since with pump we want to first OPEN and then CLOSE
if (state != FirearmState.CLOSE)
firearmAction.changeState(weaponStack, FirearmState.CLOSE);
}
// Simply CLOSE weapon or OPEN CLOSE if pump
weaponHandler.getShootHandler().doShootFirearmActions(entityWrapper, weaponTitle, weaponStack, handData, slot);
// Here true because firearm actions started
return true;
}
return false;
}
AmmoTypes ammoTypes = playerWrapper != null ? config.getObject(weaponTitle + ".Reload.Ammo.Ammo_Types", AmmoTypes.class) : null;
if (ammoTypes != null && !ammoTypes.hasAmmo(weaponTitle, weaponStack, playerWrapper)) {
Mechanics outOfAmmoMechanics = getConfigurations().getObject(weaponTitle + ".Reload.Ammo.Out_Of_Ammo", Mechanics.class);
if (outOfAmmoMechanics != null)
outOfAmmoMechanics.use(new CastData(entityWrapper, weaponTitle, weaponStack));
return false;
}
boolean unloadAmmoOnReload = config.getBool(weaponTitle + ".Reload.Unload_Ammo_On_Reload");
// This is necessary for events to be used correctly
handData.setReloadData(weaponTitle, weaponStack);
ChainTask reloadTask = new ChainTask(reloadDuration) {
private int unloadedAmount;
@Override
public void task() {
ItemStack taskReference = mainhand ? entityWrapper.getEntity().getEquipment().getItemInMainHand() : entityWrapper.getEntity().getEquipment().getItemInOffHand();
if (taskReference == weaponStack) {
taskReference = weaponStack;
} else {
handData.setReloadData(weaponTitle, taskReference);
}
int ammoLeft = getAmmoLeft(taskReference, weaponTitle);
// Here creating this again since this may change if there isn't enough ammo...
int ammoToAdd = finalAmmoToAdd + unloadedAmount;
if (ammoTypes != null) {
int removedAmount = ammoTypes.removeAmmo(taskReference, playerWrapper, ammoToAdd, magazineSize);
// Just check if for some reason ammo disappeared from entity before reaching reload "complete" state
if (removedAmount <= 0) {
Mechanics outOfAmmoMechanics = getConfigurations().getObject(weaponTitle + ".Reload.Ammo.Out_Of_Ammo", Mechanics.class);
if (outOfAmmoMechanics != null)
outOfAmmoMechanics.use(new CastData(entityWrapper, weaponTitle, taskReference));
// Remove next task as reload can't be finished
setNextTask(null);
handData.stopReloadingTasks();
return;
}
// Else simply set ammo to add value to removed amount
// Removed amount will be less than ammo to add amount IF player didn't have that much ammo
ammoToAdd = removedAmount;
}
int finalAmmoSet = ammoLeft + ammoToAdd;
handleWeaponStackAmount(entityWrapper, taskReference);
CustomTag.AMMO_LEFT.setInteger(taskReference, finalAmmoSet);
finishReload(entityWrapper, weaponTitle, taskReference, handData, slot);
if (ammoPerReload != -1) {
// Start the loop
startReloadWithoutTrigger(entityWrapper, weaponTitle, taskReference, slot, dualWield, true);
}
}
@Override
public void setup() {
handData.addReloadTask(getTaskId());
int ammoLeft = CustomTag.AMMO_LEFT.getInteger(weaponStack);
if (unloadAmmoOnReload && ammoLeft > 0) {
if (ammoTypes != null)
ammoTypes.giveAmmo(weaponStack, playerWrapper, ammoLeft, magazineSize);
unloadedAmount = ammoLeft;
handleWeaponStackAmount(entityWrapper, weaponStack);
CustomTag.AMMO_LEFT.setInteger(weaponStack, 0);
}
CastData castData = new CastData(entityWrapper, weaponTitle, weaponStack);
// Set the extra data so SoundMechanic knows to save task id to hand's reload tasks
castData.setData(ReloadSound.getDataKeyword(), mainhand ? ReloadSound.MAIN_HAND.getId() : ReloadSound.OFF_HAND.getId());
Mechanics reloadStartMechanics = config.getObject(weaponTitle + ".Reload.Start_Mechanics", Mechanics.class);
if (reloadStartMechanics != null)
reloadStartMechanics.use(castData);
weaponInfoDisplay.send(playerWrapper, slot);
weaponHandler.getSkinHandler().tryUse(entityWrapper, weaponTitle, weaponStack, slot);
}
};
if (getConfigurations().getBool(weaponTitle + ".Info.Show_Cooldown.Reload_Time") && entityWrapper.getEntity().getType() == EntityType.PLAYER) {
CompatibilityAPI.getEntityCompatibility().setCooldown((Player) entityWrapper.getEntity(), weaponStack.getType(), reloadEvent.getReloadCompleteTime());
}
// OR ammo left is above 0 and revolver isn't used (when using revolver firearm actions should always occur)
if (isReloadLoop || state == null || (ammoLeft > 0 && !isRevolver)) {
reloadTask.startChain();
return true;
}
ChainTask closeTask = getCloseTask(firearmCloseTime, firearmAction, weaponStack, handData, entityWrapper, weaponTitle, mainhand, slot);
if (state == FirearmState.CLOSE) {
closeTask.startChain();
return true;
}
ChainTask openTask = getOpenTask(firearmOpenTime, firearmAction, weaponStack, handData, entityWrapper, weaponTitle, mainhand, slot);
if (isPump) {
firearmAction.changeState(weaponStack, FirearmState.OPEN);
if (ammoPerReload != -1) {
reloadTask.startChain();
} else {
reloadTask.setNextTask(openTask).setNextTask(closeTask);
reloadTask.startChain();
}
} else {
if (ammoPerReload != -1) {
openTask.setNextTask(reloadTask);
openTask.startChain();
} else {
openTask.setNextTask(reloadTask).setNextTask(closeTask);
openTask.startChain();
}
}
return true;
}
use of me.deecaad.weaponmechanics.mechanics.CastData in project MechanicsMain by WeaponMechanics.
the class ReloadHandler method getOpenTask.
private ChainTask getOpenTask(int firearmOpenTime, FirearmAction firearmAction, ItemStack weaponStack, HandData handData, EntityWrapper entityWrapper, String weaponTitle, boolean mainhand, EquipmentSlot slot) {
return new ChainTask(firearmOpenTime) {
@Override
public void task() {
ItemStack taskReference = mainhand ? entityWrapper.getEntity().getEquipment().getItemInMainHand() : entityWrapper.getEntity().getEquipment().getItemInOffHand();
if (taskReference != weaponStack) {
handData.setReloadData(weaponTitle, taskReference);
}
}
@Override
public void setup() {
handData.addReloadTask(getTaskId());
firearmAction.changeState(weaponStack, FirearmState.OPEN);
CastData castData = new CastData(entityWrapper, weaponTitle, weaponStack);
// Set the extra data so SoundMechanic knows to save task id to hand's reload tasks
castData.setData(ReloadSound.getDataKeyword(), mainhand ? ReloadSound.MAIN_HAND.getId() : ReloadSound.OFF_HAND.getId());
firearmAction.useMechanics(castData, true);
if (entityWrapper instanceof PlayerWrapper) {
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);
}
};
}
use of me.deecaad.weaponmechanics.mechanics.CastData in project MechanicsMain by WeaponMechanics.
the class ShootHandler method shoot.
/**
* Shoots using weapon.
* Does not use ammo nor check for it.
*/
public void shoot(EntityWrapper entityWrapper, String weaponTitle, ItemStack weaponStack, Location shootLocation, boolean mainHand, boolean updateSpreadChange, boolean isMelee) {
Configuration config = getConfigurations();
LivingEntity livingEntity = entityWrapper.getEntity();
if (!isMelee) {
HandData handData = mainHand ? entityWrapper.getMainHandData() : entityWrapper.getOffHandData();
handData.setLastShotTime(System.currentTimeMillis());
if (getConfigurations().getBool(weaponTitle + ".Info.Show_Cooldown.Delay_Between_Shots") && entityWrapper.getEntity().getType() == EntityType.PLAYER) {
CompatibilityAPI.getEntityCompatibility().setCooldown((Player) entityWrapper, weaponStack.getType(), config.getInt(weaponTitle + ".Shoot.Delay_Between_Shots") / 50);
}
}
Mechanics shootMechanics = config.getObject(weaponTitle + ".Shoot.Mechanics", Mechanics.class);
if (shootMechanics != null)
shootMechanics.use(new CastData(entityWrapper, weaponTitle, weaponStack));
if (entityWrapper instanceof PlayerWrapper) {
WeaponInfoDisplay weaponInfoDisplay = getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
if (weaponInfoDisplay != null)
weaponInfoDisplay.send((PlayerWrapper) entityWrapper, mainHand ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND);
}
Projectile projectile = config.getObject(weaponTitle + ".Projectile", Projectile.class);
if (projectile == null || isMelee) {
// No projectile defined or was melee trigger
return;
}
Spread spread = config.getObject(weaponTitle + ".Shoot.Spread", Spread.class);
Recoil recoil = config.getObject(weaponTitle + ".Shoot.Recoil", Recoil.class);
double projectileSpeed = config.getDouble(weaponTitle + ".Shoot.Projectile_Speed");
for (int i = 0; i < config.getInt(weaponTitle + ".Shoot.Projectiles_Per_Shot"); ++i) {
// i == 0
// -> Only allow spread changing on first shot
Vector motion = spread != null ? spread.getNormalizedSpreadDirection(entityWrapper, mainHand, i == 0 && updateSpreadChange).multiply(projectileSpeed) : livingEntity.getLocation().getDirection().multiply(projectileSpeed);
if (recoil != null && i == 0 && livingEntity instanceof Player) {
recoil.start((Player) livingEntity, mainHand);
}
// Only create bullet first if WeaponShootEvent changes
WeaponProjectile bullet = projectile.create(livingEntity, shootLocation, motion, weaponStack, weaponTitle);
WeaponShootEvent shootEvent = new WeaponShootEvent(bullet);
Bukkit.getPluginManager().callEvent(shootEvent);
bullet = shootEvent.getProjectile();
// Shoot the given bullet
projectile.shoot(bullet, shootLocation);
}
}
use of me.deecaad.weaponmechanics.mechanics.CastData in project MechanicsMain by WeaponMechanics.
the class ShootHandler method doShootFirearmActions.
public void doShootFirearmActions(EntityWrapper entityWrapper, String weaponTitle, ItemStack weaponStack, HandData handData, EquipmentSlot slot) {
FirearmAction firearmAction = getConfigurations().getObject(weaponTitle + ".Firearm_Action", FirearmAction.class);
if (firearmAction == null || handData.hasRunningFirearmAction())
return;
FirearmState state = firearmAction.getState(weaponStack);
// If state is ready, check if this shot should not cause firearm actions
if (state == FirearmState.READY && (weaponHandler.getReloadHandler().getAmmoLeft(weaponStack, weaponTitle) % firearmAction.getFirearmActionFrequency() != 0 || !firearmAction.getFirearmType().hasShootActions())) {
return;
}
boolean mainhand = slot == EquipmentSlot.HAND;
LivingEntity shooter = entityWrapper.getEntity();
WeaponInfoDisplay weaponInfoDisplay = shooter.getType() != EntityType.PLAYER ? null : getConfigurations().getObject(weaponTitle + ".Info.Weapon_Info_Display", WeaponInfoDisplay.class);
PlayerWrapper playerWrapper = weaponInfoDisplay == null ? null : (PlayerWrapper) entityWrapper;
// Initiate CLOSE task
BukkitRunnable closeRunnable = new BukkitRunnable() {
@Override
public void run() {
ItemStack taskReference = mainhand ? entityWrapper.getEntity().getEquipment().getItemInMainHand() : entityWrapper.getEntity().getEquipment().getItemInOffHand();
if (taskReference == weaponStack) {
taskReference = weaponStack;
}
firearmAction.changeState(taskReference, FirearmState.READY);
if (weaponInfoDisplay != null)
weaponInfoDisplay.send(playerWrapper, slot);
handData.stopFirearmActionTasks();
}
};
// Init cast data
CastData castData = new CastData(entityWrapper, weaponTitle, weaponStack);
castData.setData(FirearmSound.getDataKeyword(), mainhand ? FirearmSound.MAIN_HAND.getId() : FirearmSound.OFF_HAND.getId());
// Check if OPEN state was already completed
if (state == FirearmState.CLOSE) {
// Only do CLOSE state
// Set the extra data so SoundMechanic knows to save task id to hand's firearm action tasks
firearmAction.useMechanics(castData, false);
if (weaponInfoDisplay != null)
weaponInfoDisplay.send(playerWrapper, slot);
if (getConfigurations().getBool(weaponTitle + ".Info.Show_Cooldown.Firearm_Actions_Time") && playerWrapper != null) {
CompatibilityAPI.getEntityCompatibility().setCooldown(playerWrapper.getPlayer(), weaponStack.getType(), firearmAction.getCloseTime());
}
handData.addFirearmActionTask(closeRunnable.runTaskLater(WeaponMechanics.getPlugin(), firearmAction.getCloseTime()).getTaskId());
// Return since we only want to do close state
return;
}
// Update state
if (state != FirearmState.OPEN)
firearmAction.changeState(weaponStack, FirearmState.OPEN);
// Set the extra data so SoundMechanic knows to save task id to hand's firearm action tasks
firearmAction.useMechanics(castData, true);
if (weaponInfoDisplay != null)
weaponInfoDisplay.send(playerWrapper, slot);
if (getConfigurations().getBool(weaponTitle + ".Info.Show_Cooldown.Firearm_Actions_Time") && playerWrapper != null) {
CompatibilityAPI.getEntityCompatibility().setCooldown(playerWrapper.getPlayer(), weaponStack.getType(), firearmAction.getOpenTime() + firearmAction.getCloseTime());
}
// Add the task to shoot firearm action tasks
handData.addFirearmActionTask(new BukkitRunnable() {
@Override
public void run() {
ItemStack taskReference = mainhand ? entityWrapper.getEntity().getEquipment().getItemInMainHand() : entityWrapper.getEntity().getEquipment().getItemInOffHand();
if (taskReference == weaponStack)
taskReference = weaponStack;
firearmAction.changeState(taskReference, FirearmState.CLOSE);
// Set the extra data so SoundMechanic knows to save task id to hand's firearm action tasks
CastData castData = new CastData(entityWrapper, weaponTitle, taskReference);
castData.setData(FirearmSound.getDataKeyword(), mainhand ? FirearmSound.MAIN_HAND.getId() : FirearmSound.OFF_HAND.getId());
firearmAction.useMechanics(castData, false);
if (weaponInfoDisplay != null)
weaponInfoDisplay.send(playerWrapper, slot);
handData.addFirearmActionTask(closeRunnable.runTaskLater(WeaponMechanics.getPlugin(), firearmAction.getCloseTime()).getTaskId());
}
}.runTaskLater(WeaponMechanics.getPlugin(), firearmAction.getOpenTime()).getTaskId());
}
Aggregations