ModularPowersuits/src/main/java/net/machinemuse/powersuits/powermodule/misc/MobRepulsorModule.java

139 lines
5.6 KiB
Java

package net.machinemuse.powersuits.powermodule.misc;
import net.machinemuse.api.IModularItem;
import net.machinemuse.api.ModuleManager;
import net.machinemuse.api.moduletrigger.IPlayerTickModule;
import net.machinemuse.api.moduletrigger.IToggleableModule;
import net.machinemuse.powersuits.item.ItemComponent;
import net.machinemuse.powersuits.powermodule.PowerModuleBase;
import net.machinemuse.utils.ElectricItemUtils;
import net.machinemuse.utils.MuseCommonStrings;
import net.machinemuse.utils.MuseItemUtils;
import net.minecraft.entity.Entity;
import net.minecraft.entity.boss.EntityDragon;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.entity.projectile.EntityFireball;
import net.minecraft.entity.projectile.EntityPotion;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import java.util.Iterator;
import java.util.List;
/**
* Created by User: Andrew2448
* 8:26 PM 4/25/13
*/
public class MobRepulsorModule extends PowerModuleBase implements IPlayerTickModule, IToggleableModule {
public static final String MODULE_MOB_REPULSOR = "Mob Repulsor";
public static final String MOB_REPULSOR_ENERGY_CONSUMPTION = "Repulsor Energy Consumption";
public MobRepulsorModule(List<IModularItem> validItems) {
super(validItems);
addBaseProperty(MOB_REPULSOR_ENERGY_CONSUMPTION, 250);
addBaseProperty(MuseCommonStrings.WEIGHT, 2000);
addInstallCost(MuseItemUtils.copyAndResize(ItemComponent.magnet, 1));
addInstallCost(MuseItemUtils.copyAndResize(ItemComponent.controlCircuit, 1));
}
@Override
public String getTextureFile() {
return "magneta";
}
@Override
public String getCategory() {
return MuseCommonStrings.CATEGORY_ENVIRONMENTAL;
}
@Override
public String getDataName() {
return MODULE_MOB_REPULSOR;
}
@Override
public String getUnlocalizedName() {
return "mobRepulsor";
}
@Override
public String getDescription() {
return "Pushes mobs away from you when activated, but constantly drains power. It is highly recommended that you set this module to a keybind because of the high energy draw.";
}
@Override
public void onPlayerTickActive(EntityPlayer player, ItemStack item) {
if (ElectricItemUtils.getPlayerEnergy(player) > ModuleManager.computeModularProperty(item, MOB_REPULSOR_ENERGY_CONSUMPTION)) {
if (player.worldObj.getTotalWorldTime() % 20 == 0) {
ElectricItemUtils.drainPlayerEnergy(player, ModuleManager.computeModularProperty(item, MOB_REPULSOR_ENERGY_CONSUMPTION));
}
repulse(player.worldObj, (int) player.posX, (int) player.posY, (int) player.posZ);
}
}
@Override
public void onPlayerTickInactive(EntityPlayer player, ItemStack item) {
}
public void repulse(World world, int i, int j, int k) {
float distance = 5.0F;
Entity entity;
Iterator iterator;
List list = world.getEntitiesWithinAABB(EntityMob.class, AxisAlignedBB.getBoundingBox(i - distance, j - distance, k - distance, i + distance, j + distance, k + distance));
for (iterator = list.iterator(); iterator.hasNext(); push(entity, i, j, k)) {
entity = (Entity) iterator.next();
}
list = world.getEntitiesWithinAABB(EntityArrow.class, AxisAlignedBB.getBoundingBox(i - distance, j - distance, k - distance, i + distance, j + distance, k + distance));
for (iterator = list.iterator(); iterator.hasNext(); push(entity, i, j, k)) {
entity = (Entity) iterator.next();
}
list = world.getEntitiesWithinAABB(EntityFireball.class, AxisAlignedBB.getBoundingBox(i - distance, j - distance, k - distance, i + distance, j + distance, k + distance));
for (iterator = list.iterator(); iterator.hasNext(); push(entity, i, j, k)) {
entity = (Entity) iterator.next();
}
list = world.getEntitiesWithinAABB(EntityPotion.class, AxisAlignedBB.getBoundingBox(i - distance, j - distance, k - distance, i + distance, j + distance, k + distance));
for (iterator = list.iterator(); iterator.hasNext(); push(entity, i, j, k)) {
entity = (Entity) iterator.next();
}
}
private void push(Entity entity, int i, int j, int k) {
if (!(entity instanceof EntityPlayer) && !(entity instanceof EntityDragon)) {
Entity entity2 = entity;
double d = i - entity2.posX;
double d1 = j - entity2.posY;
double d2 = k - entity2.posZ;
double d4 = d * d + d1 * d1 + d2 * d2;
d4 *= d4;
if (d4 <= Math.pow(6.0D, 4.0D)) {
double d5 = -(d * 0.01999999955296516D / d4) * Math.pow(6.0D, 3.0D);
double d6 = -(d1 * 0.01999999955296516D / d4) * Math.pow(6.0D, 3.0D);
double d7 = -(d2 * 0.01999999955296516D / d4) * Math.pow(6.0D, 3.0D);
if (d5 > 0.0D) {
d5 = 0.22D;
} else if (d5 < 0.0D) {
d5 = -0.22D;
}
if (d6 > 0.2D) {
d6 = 0.12D;
} else if (d6 < -0.1D) {
d6 = 0.12D;
}
if (d7 > 0.0D) {
d7 = 0.22D;
} else if (d7 < 0.0D) {
d7 = -0.22D;
}
entity2.motionX += d5;
entity2.motionY += d6;
entity2.motionZ += d7;
}
}
}
}