2023-08-10 15:18:54 +02:00

332 lines
10 KiB
Java

package com.hbm.handler.guncfg;
import java.util.List;
import java.util.Random;
import com.hbm.entity.projectile.EntityBulletBaseNT;
import com.hbm.entity.projectile.EntityBulletBaseNT.IBulletUpdateBehaviorNT;
import com.hbm.explosion.ExplosionNukeGeneric;
import com.hbm.handler.BulletConfigSyncingUtil;
import com.hbm.handler.BulletConfiguration;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.items.ModItems;
import com.hbm.lib.ModDamageSource;
import com.hbm.main.MainRegistry;
import com.hbm.packet.AuxParticlePacketNT;
import com.hbm.packet.PacketDispatcher;
import com.hbm.util.BobMathUtil;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.Vec3;
public class GunNPCFactory {
public static BulletConfiguration getMaskmanOrb() {
BulletConfiguration bullet = new BulletConfiguration();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.velocity = 0.25F;
bullet.spread = 0.000F;
bullet.wear = 10;
bullet.bulletsMin = 1;
bullet.bulletsMax = 1;
bullet.dmgMin = 100;
bullet.dmgMax = 100;
bullet.gravity = 0.0D;
bullet.maxAge = 60;
bullet.doesRicochet = false;
bullet.ricochetAngle = 0;
bullet.HBRC = 0;
bullet.LBRC = 0;
bullet.bounceMod = 1.0;
bullet.doesPenetrate = false;
bullet.doesBreakGlass = false;
bullet.style = BulletConfiguration.STYLE_ORB;
bullet.trail = 1;
bullet.explosive = 1.5F;
bullet.bntUpdate = (bulletnt) -> {
if(bulletnt.worldObj.isRemote)
return;
if(bulletnt.ticksExisted % 10 != 5)
return;
List<EntityPlayer> players = bulletnt.worldObj.getEntitiesWithinAABB(EntityPlayer.class, bulletnt.boundingBox.expand(50, 50, 50));
for(EntityPlayer player : players) {
Vec3 motion = Vec3.createVectorHelper(player.posX - bulletnt.posX, (player.posY + player.getEyeHeight()) - bulletnt.posY, player.posZ - bulletnt.posZ);
motion = motion.normalize();
EntityBulletBaseNT bolt = new EntityBulletBaseNT(bulletnt.worldObj, BulletConfigSyncingUtil.MASKMAN_BOLT);
bolt.setThrower(bulletnt.getThrower());
bolt.setPosition(bulletnt.posX, bulletnt.posY, bulletnt.posZ);
bolt.setThrowableHeading(motion.xCoord, motion.yCoord, motion.zCoord, 0.5F, 0.05F);
bulletnt.worldObj.spawnEntityInWorld(bolt);
}
};
return bullet;
}
public static BulletConfiguration getMaskmanBolt() {
BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.spread = 0.0F;
bullet.dmgMin = 15;
bullet.dmgMax = 20;
bullet.wear = 10;
bullet.leadChance = 0;
bullet.explosive = 0.5F;
bullet.setToBolt(BulletConfiguration.BOLT_LACUNAE);
bullet.vPFX = "reddust";
bullet.damageType = ModDamageSource.s_laser;
return bullet;
}
public static BulletConfiguration getMaskmanBullet() {
BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.spread = 0.0F;
bullet.dmgMin = 5;
bullet.dmgMax = 10;
bullet.wear = 10;
bullet.leadChance = 15;
bullet.style = BulletConfiguration.STYLE_FLECHETTE;
bullet.vPFX = "bluedust";
return bullet;
}
public static BulletConfiguration getMaskmanTracer() {
BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.spread = 0.0F;
bullet.dmgMin = 15;
bullet.dmgMax = 20;
bullet.wear = 10;
bullet.leadChance = 0;
bullet.setToBolt(BulletConfiguration.BOLT_NIGHTMARE);
bullet.vPFX = "reddust";
bullet.damageType = ModDamageSource.s_laser;
bullet.bntImpact = (bulletnt, x, y, z, sideHit) -> {
if(bulletnt.worldObj.isRemote)
return;
EntityBulletBaseNT meteor = new EntityBulletBaseNT(bulletnt.worldObj, BulletConfigSyncingUtil.MASKMAN_METEOR);
meteor.setPosition(bulletnt.posX, bulletnt.posY + 30 + meteor.worldObj.rand.nextInt(10), bulletnt.posZ);
meteor.motionY = -1D;
meteor.setThrower(bulletnt.getThrower());
bulletnt.worldObj.spawnEntityInWorld(meteor);
};
return bullet;
}
public static BulletConfiguration getMaskmanRocket() {
BulletConfiguration bullet = BulletConfigFactory.standardGrenadeConfig();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.gravity = 0.1D;
bullet.velocity = 1.0F;
bullet.dmgMin = 15;
bullet.dmgMax = 20;
bullet.blockDamage = false;
bullet.explosive = 5.0F;
bullet.style = BulletConfiguration.STYLE_ROCKET;
return bullet;
}
public static BulletConfiguration getMaskmanMeteor() {
BulletConfiguration bullet = BulletConfigFactory.standardGrenadeConfig();
bullet.ammo = new ComparableStack(ModItems.coin_maskman);
bullet.gravity = 0.1D;
bullet.velocity = 1.0F;
bullet.dmgMin = 20;
bullet.dmgMax = 30;
bullet.blockDamage = false;
bullet.incendiary = 3;
bullet.explosive = 2.5F;
bullet.style = BulletConfiguration.STYLE_METEOR;
bullet.bntUpdate = (bulletnt) -> {
if(!bulletnt.worldObj.isRemote)
return;
Random rand = bulletnt.worldObj.rand;
for(int i = 0; i < 5; i++) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setString("type", "vanillaExt");
nbt.setString("mode", "flame");
nbt.setDouble("posX", bulletnt.posX + rand.nextDouble() * 0.5 - 0.25);
nbt.setDouble("posY", bulletnt.posY + rand.nextDouble() * 0.5 - 0.25);
nbt.setDouble("posZ", bulletnt.posZ + rand.nextDouble() * 0.5 - 0.25);
MainRegistry.proxy.effectNT(nbt);
}
};
return bullet;
}
public static BulletConfiguration getWormBolt() {
BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig();
bullet.ammo = new ComparableStack(ModItems.coin_worm);
bullet.spread = 0.0F;
bullet.maxAge = 60;
bullet.dmgMin = 15;
bullet.dmgMax = 25;
bullet.leadChance = 0;
bullet.doesRicochet = false;
bullet.setToBolt(BulletConfiguration.BOLT_WORM);
bullet.damageType = ModDamageSource.s_laser;
return bullet;
}
public static BulletConfiguration getWormHeadBolt() {
BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig();
bullet.ammo = new ComparableStack(ModItems.coin_worm);
bullet.spread = 0.0F;
bullet.maxAge = 100;
bullet.dmgMin = 35;
bullet.dmgMax = 60;
bullet.leadChance = 0;
bullet.doesRicochet = false;
bullet.setToBolt(BulletConfiguration.BOLT_LASER);
bullet.damageType = ModDamageSource.s_laser;
return bullet;
}
public static BulletConfiguration getRocketUFOConfig() {
BulletConfiguration bullet = GunRocketFactory.getRocketConfig();
bullet.vPFX = "reddust";
bullet.destroysBlocks = false;
bullet.explosive = 0F;
bullet.bntUpdate = new IBulletUpdateBehaviorNT() {
double angle = 90;
double range = 100;
@Override
public void behaveUpdate(EntityBulletBaseNT bullet) {
if(bullet.worldObj.isRemote)
return;
if(bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget")) == null) {
chooseTarget(bullet);
}
Entity target = bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget"));
if(target != null) {
if(bullet.getDistanceSqToEntity(target) < 5) {
bullet.getConfig().bntImpact.behaveBlockHit(bullet, -1, -1, -1, -1);
bullet.setDead();
return;
}
Vec3 delta = Vec3.createVectorHelper(target.posX - bullet.posX, target.posY + target.height / 2 - bullet.posY, target.posZ - bullet.posZ);
delta = delta.normalize();
double vel = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ).lengthVector();
bullet.motionX = delta.xCoord * vel;
bullet.motionY = delta.yCoord * vel;
bullet.motionZ = delta.zCoord * vel;
}
}
private void chooseTarget(EntityBulletBaseNT bullet) {
List<EntityLivingBase> entities = bullet.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bullet.boundingBox.expand(range, range, range));
Vec3 mot = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ);
EntityLivingBase target = null;
double targetAngle = angle;
for(EntityLivingBase e : entities) {
if(!e.isEntityAlive() || e == bullet.getThrower())
continue;
Vec3 delta = Vec3.createVectorHelper(e.posX - bullet.posX, e.posY + e.height / 2 - bullet.posY, e.posZ - bullet.posZ);
if(bullet.worldObj.func_147447_a(Vec3.createVectorHelper(bullet.posX, bullet.posY, bullet.posZ), Vec3.createVectorHelper(e.posX, e.posY + e.height / 2, e.posZ), false, true, false) != null)
continue;
double dist = e.getDistanceSqToEntity(bullet);
if(dist < range * range) {
double deltaAngle = BobMathUtil.getCrossAngle(mot, delta);
if(deltaAngle < targetAngle) {
target = e;
targetAngle = deltaAngle;
}
}
}
if(target != null) {
bullet.getEntityData().setInteger("homingTarget", target.getEntityId());
}
}
};
bullet.bntImpact = (bulletnt, x, y, z, sideHit) -> {
bulletnt.worldObj.playSoundEffect(bulletnt.posX, bulletnt.posY, bulletnt.posZ, "hbm:entity.ufoBlast", 5.0F, 0.9F + bulletnt.worldObj.rand.nextFloat() * 0.2F);
bulletnt.worldObj.playSoundEffect(bulletnt.posX, bulletnt.posY, bulletnt.posZ, "fireworks.blast", 5.0F, 0.5F);
ExplosionNukeGeneric.dealDamage(bulletnt.worldObj, bulletnt.posX, bulletnt.posY, bulletnt.posZ, 10, 50);
for(int i = 0; i < 3; i++) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "plasmablast");
data.setFloat("r", 0.0F);
data.setFloat("g", 0.75F);
data.setFloat("b", 1.0F);
data.setFloat("pitch", -30F + 30F * i);
data.setFloat("yaw", bulletnt.worldObj.rand.nextFloat() * 180F);
data.setFloat("scale", 5F);
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, bulletnt.posX, bulletnt.posY, bulletnt.posZ),
new TargetPoint(bulletnt.worldObj.provider.dimensionId, bulletnt.posX, bulletnt.posY, bulletnt.posZ, 100));
}
};
return bullet;
}
}