Add new guns
This commit is contained in:
parent
67817c4ec3
commit
14b75deec0
@ -36,29 +36,36 @@ public class PlasticGun implements ModInitializer {
|
|||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
|
|
||||||
// Bullets - Batch 1 (Better Bullets First)
|
// Bullets - Batch 1 (Better Bullets First)
|
||||||
bullets.add(new BulletItem("357_magnum", 1.4, 357));
|
bullets.add(new BulletItem("357_magnum", 1.4, 357, false, 0, 0));
|
||||||
bullets.add(new BulletItem("32_acp_high_velocity", 0.9, 32));
|
bullets.add(new BulletItem("32_acp_high_velocity", 0.9, 32, false, 0, 0));
|
||||||
bullets.add(new BulletItem("45_acp_hollow_point", 1.2, 45));
|
bullets.add(new BulletItem("45_acp_hollow_point", 1.2, 45, false, 0, 0));
|
||||||
bullets.add(new BulletItem("9mm_jhp", 1.05, 9));
|
bullets.add(new BulletItem("9mm_jhp", 1.05, 9, false, 0, 0));
|
||||||
bullets.add(new BulletItem("38_special_p", 1.3, 38));
|
bullets.add(new BulletItem("38_special_p", 1.3, 38, false, 0, 0));
|
||||||
bullets.add(new BulletItem("762_tokarev_ap", 1.2, 762));
|
bullets.add(new BulletItem("762_tokarev_ap", 1.2, 762, false, 0, 0));
|
||||||
|
|
||||||
// Bullets - Batch 2 (Standard Bullets)
|
// Bullets - Batch 2 (Standard Bullets)
|
||||||
bullets.add(new BulletItem("357_standard", 1, 357));
|
bullets.add(new BulletItem("357_standard", 1, 357, false, 0, 0));
|
||||||
bullets.add(new BulletItem("32_acp", 0.8, 32));
|
bullets.add(new BulletItem("32_acp", 0.8, 32, false, 0, 0));
|
||||||
bullets.add(new BulletItem("45_acp", 1, 45));
|
bullets.add(new BulletItem("45_acp", 1, 45, false, 0, 0));
|
||||||
bullets.add(new BulletItem("9mm_parabellum", 0.9, 9));
|
bullets.add(new BulletItem("9mm_parabellum", 0.9, 9, false, 0, 0));
|
||||||
bullets.add(new BulletItem("38_special", 0.95, 38));
|
bullets.add(new BulletItem("38_special", 0.95, 38, false, 0, 0));
|
||||||
bullets.add(new BulletItem("762_tokarev", 1.1, 762));
|
bullets.add(new BulletItem("762_tokarev", 1.1, 762, false, 0, 0));
|
||||||
|
|
||||||
|
bullets.add(new BulletItem("rpg_shell_incendiary", 1.1, 999, true, 1, 0));
|
||||||
|
bullets.add(new BulletItem("rpg_shell", 1.1, 999, false, 1, 0));
|
||||||
|
bullets.add(new BulletItem("force_container", 0, 888, false, 0, 1));
|
||||||
|
|
||||||
// Guns
|
// Guns
|
||||||
guns.add(new Gun("357_revolver", 0.3, 3, 6, 43, 357));
|
guns.add(new Gun("357_revolver", 0.3, 3, 6, 43, 357, 0, 0));
|
||||||
guns.add(new Gun("colt_1903", 0.25, 2, 8, 38, 32));
|
guns.add(new Gun("colt_1903", 0.25, 2, 8, 38, 32, 0, 0));
|
||||||
guns.add(new Gun("colt_45", 0.4, 2, 7, 48, 45));
|
guns.add(new Gun("colt_45", 0.4, 2, 7, 48, 45, 0, 0));
|
||||||
guns.add(new Gun("colt_peacemaker", 0.35, 4, 6, 43, 45));
|
guns.add(new Gun("colt_peacemaker", 0.35, 4, 6, 43, 45, 0, 0));
|
||||||
guns.add(new Gun("p2022", 0.3, 2, 10, 41, 9));
|
guns.add(new Gun("p2022", 0.3, 2, 10, 41, 9, 0, 0));
|
||||||
guns.add(new Gun("snub_nosed_revolver", 0.3, 3, 5, 36, 38));
|
guns.add(new Gun("snub_nosed_revolver", 0.3, 3, 5, 36, 38, 0, 0));
|
||||||
guns.add(new Gun("tokarev_tt_33", 0.35, 2, 8, 45, 762));
|
guns.add(new Gun("tokarev_tt_33", 0.35, 2, 8, 45, 762, 0, 0));
|
||||||
|
|
||||||
|
guns.add(new Gun("rpg9", 2, 2, 8, 10, 999, 8, 0));
|
||||||
|
guns.add(new Gun("forcegun", 0, 2, 8, 10, 888, 0, 20));
|
||||||
|
|
||||||
|
|
||||||
BULLET_ENTITY_TYPE = Registry.register(
|
BULLET_ENTITY_TYPE = Registry.register(
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package systems.brn.plasticgun.bullets;
|
package systems.brn.plasticgun.bullets;
|
||||||
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.projectile.PersistentProjectileEntity;
|
import net.minecraft.entity.projectile.PersistentProjectileEntity;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@ -13,17 +14,23 @@ import net.minecraft.util.hit.HitResult;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import eu.pb4.polymer.core.api.entity.PolymerEntity;
|
import eu.pb4.polymer.core.api.entity.PolymerEntity;
|
||||||
|
import net.minecraft.world.explosion.Explosion;
|
||||||
|
import net.minecraft.world.explosion.ExplosionBehavior;
|
||||||
import systems.brn.plasticgun.guns.Gun;
|
import systems.brn.plasticgun.guns.Gun;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import static systems.brn.plasticgun.PlasticGun.BULLET_ENTITY_TYPE;
|
import static systems.brn.plasticgun.PlasticGun.BULLET_ENTITY_TYPE;
|
||||||
import static systems.brn.plasticgun.PlasticGun.bullets;
|
import static systems.brn.plasticgun.PlasticGun.bullets;
|
||||||
|
import static systems.brn.plasticgun.lib.Util.applyKnockbackToEntities;
|
||||||
|
|
||||||
public class BulletEntity extends PersistentProjectileEntity implements PolymerEntity {
|
public class BulletEntity extends PersistentProjectileEntity implements PolymerEntity {
|
||||||
private final Gun gun;
|
private final Gun gun;
|
||||||
|
private final double explosionPower;
|
||||||
|
private final double repulsionPower;
|
||||||
|
private final boolean isIncendiary;
|
||||||
|
|
||||||
public BulletEntity(Vec3d pos, ServerPlayerEntity player, ItemStack stack, ItemStack weapon, Gun gun, double damage, int speed) {
|
public BulletEntity(Vec3d pos, ServerPlayerEntity player, ItemStack stack, ItemStack weapon, Gun gun, double damage, int speed, double explosionPower, double repulsionPower, boolean isIncendiary) {
|
||||||
super(BULLET_ENTITY_TYPE, pos.x, pos.y + 1.5d, pos.z, player.getEntityWorld(), stack, weapon);
|
super(BULLET_ENTITY_TYPE, pos.x, pos.y + 1.5d, pos.z, player.getEntityWorld(), stack, weapon);
|
||||||
this.setOwner(player);
|
this.setOwner(player);
|
||||||
this.setVelocity(player, player.getPitch(), player.getYaw(), 0.0F, speed, 0);
|
this.setVelocity(player, player.getPitch(), player.getYaw(), 0.0F, speed, 0);
|
||||||
@ -32,6 +39,9 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
|
|||||||
this.setSilent(true);
|
this.setSilent(true);
|
||||||
this.gun = gun;
|
this.gun = gun;
|
||||||
this.setCustomPierceLevel((byte) 1);
|
this.setCustomPierceLevel((byte) 1);
|
||||||
|
this.explosionPower = explosionPower;
|
||||||
|
this.repulsionPower = repulsionPower;
|
||||||
|
this.isIncendiary = isIncendiary;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCustomPierceLevel(byte level) {
|
public void setCustomPierceLevel(byte level) {
|
||||||
@ -46,6 +56,9 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
|
|||||||
public BulletEntity(EntityType<BulletEntity> entityType, World world) {
|
public BulletEntity(EntityType<BulletEntity> entityType, World world) {
|
||||||
super(entityType, world);
|
super(entityType, world);
|
||||||
this.gun = null;
|
this.gun = null;
|
||||||
|
this.explosionPower = 0;
|
||||||
|
this.repulsionPower = 0;
|
||||||
|
this.isIncendiary = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -62,6 +75,15 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
|
|||||||
return EntityType.ARROW;
|
return EntityType.ARROW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void hitDamage(Vec3d pos){
|
||||||
|
if(explosionPower > 0) {
|
||||||
|
getWorld().createExplosion(this, Explosion.createDamageSource(this.getWorld(), this), null, pos.getX(), pos.getY(), pos.getZ(), (float) explosionPower, isIncendiary, World.ExplosionSourceType.TNT);
|
||||||
|
}
|
||||||
|
if (repulsionPower > 0){
|
||||||
|
applyKnockbackToEntities(this, pos, repulsionPower * 100, repulsionPower);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onBlockHit(BlockHitResult blockHitResult) {
|
protected void onBlockHit(BlockHitResult blockHitResult) {
|
||||||
if (blockHitResult.getType() == HitResult.Type.BLOCK) {
|
if (blockHitResult.getType() == HitResult.Type.BLOCK) {
|
||||||
@ -75,6 +97,7 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
|
|||||||
this.setOnFire(true);
|
this.setOnFire(true);
|
||||||
super.onBlockHit(blockHitResult);
|
super.onBlockHit(blockHitResult);
|
||||||
this.setOnFire(false);
|
this.setOnFire(false);
|
||||||
|
hitDamage(blockHitResult.getPos());
|
||||||
this.discard();
|
this.discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,6 +108,7 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
|
|||||||
setSilent(true);
|
setSilent(true);
|
||||||
|
|
||||||
super.onEntityHit(entityHitResult);
|
super.onEntityHit(entityHitResult);
|
||||||
|
hitDamage(entityHitResult.getPos());
|
||||||
this.discard();
|
this.discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,10 +13,16 @@ import static systems.brn.plasticgun.lib.Util.id;
|
|||||||
public class BulletItem extends SimpleItem {
|
public class BulletItem extends SimpleItem {
|
||||||
public final double damageCoefficient;
|
public final double damageCoefficient;
|
||||||
public final int caliber;
|
public final int caliber;
|
||||||
public BulletItem(String path, double damageCoefficient, int caliber) {
|
public final boolean isIncendiary;
|
||||||
|
public final double explosionPowerCoefficient;
|
||||||
|
public final double repulsionPowerCoefficient;
|
||||||
|
public BulletItem(String path, double damageCoefficient, int caliber, boolean isIncendiary, double explosionPowerCoefficient, double repulsionPowerCoefficient) {
|
||||||
super(new Settings().maxCount(99), id(path), Items.STICK);
|
super(new Settings().maxCount(99), id(path), Items.STICK);
|
||||||
this.damageCoefficient = damageCoefficient;
|
this.damageCoefficient = damageCoefficient;
|
||||||
this.caliber = caliber;
|
this.caliber = caliber;
|
||||||
|
this.isIncendiary = isIncendiary;
|
||||||
|
this.explosionPowerCoefficient = explosionPowerCoefficient;
|
||||||
|
this.repulsionPowerCoefficient = repulsionPowerCoefficient;
|
||||||
Item item = Registry.register(Registries.ITEM, this.identifier, this);
|
Item item = Registry.register(Registries.ITEM, this.identifier, this);
|
||||||
ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item));
|
ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item));
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,10 @@ public class Gun extends SimpleItem implements PolymerItem {
|
|||||||
public final int speed;
|
public final int speed;
|
||||||
public final ArrayList<Item> ammo;
|
public final ArrayList<Item> ammo;
|
||||||
public final int caliber;
|
public final int caliber;
|
||||||
|
private final double explosionPowerGun;
|
||||||
|
private final double repulsionPowerGun;
|
||||||
|
|
||||||
public Gun(String path, double damage, int reloadCount, int clipSize, int speed, int caliber) {
|
public Gun(String path, double damage, int reloadCount, int clipSize, int speed, int caliber, double explosionPowerGun, double repulsionPowerGun) {
|
||||||
super(
|
super(
|
||||||
new Settings()
|
new Settings()
|
||||||
.maxCount(1)
|
.maxCount(1)
|
||||||
@ -56,6 +58,8 @@ public class Gun extends SimpleItem implements PolymerItem {
|
|||||||
}
|
}
|
||||||
this.ammo = ammo;
|
this.ammo = ammo;
|
||||||
this.caliber = caliber;
|
this.caliber = caliber;
|
||||||
|
this.explosionPowerGun = explosionPowerGun;
|
||||||
|
this.repulsionPowerGun = repulsionPowerGun;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reload(World world, PlayerEntity user, Hand hand) {
|
public void reload(World world, PlayerEntity user, Hand hand) {
|
||||||
@ -138,8 +142,26 @@ public class Gun extends SimpleItem implements PolymerItem {
|
|||||||
int currentReload = stack.getOrDefault(GUN_LOADING_COMPONENT, 1);
|
int currentReload = stack.getOrDefault(GUN_LOADING_COMPONENT, 1);
|
||||||
ItemStack chamber = stack.getOrDefault(GUN_AMMO_COMPONENT, ItemStack.EMPTY).copy();
|
ItemStack chamber = stack.getOrDefault(GUN_AMMO_COMPONENT, ItemStack.EMPTY).copy();
|
||||||
|
|
||||||
|
BulletItem bullet = null;
|
||||||
|
for (BulletItem bulletTemp : bullets) {
|
||||||
|
if (bulletTemp == chamber.getItem()) {
|
||||||
|
bullet = bulletTemp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!chamber.isEmpty() && currentReload == 1) {
|
if (!chamber.isEmpty() && currentReload == 1) {
|
||||||
BulletEntity bulletEntity = new BulletEntity(user.getPos(), player, chamber, user.getStackInHand(hand), this, damage, speed);
|
boolean isIncendiary = false;
|
||||||
|
double explosionPower = explosionPowerGun;
|
||||||
|
double repulsionPower = repulsionPowerGun;
|
||||||
|
|
||||||
|
if (bullet != null){
|
||||||
|
isIncendiary = bullet.isIncendiary;
|
||||||
|
explosionPower *= bullet.explosionPowerCoefficient;
|
||||||
|
repulsionPower *= bullet.repulsionPowerCoefficient;
|
||||||
|
}
|
||||||
|
|
||||||
|
BulletEntity bulletEntity = new BulletEntity(user.getPos(), player, chamber, user.getStackInHand(hand), this, damage, speed, explosionPower, repulsionPower, isIncendiary);
|
||||||
world.spawnEntity(bulletEntity);
|
world.spawnEntity(bulletEntity);
|
||||||
world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_GENERIC_EXPLODE.value(), SoundCategory.PLAYERS, 0.1f, 1.2f);
|
world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_GENERIC_EXPLODE.value(), SoundCategory.PLAYERS, 0.1f, 1.2f);
|
||||||
chamber.decrement(1);
|
chamber.decrement(1);
|
||||||
|
@ -1,14 +1,24 @@
|
|||||||
package systems.brn.plasticgun.lib;
|
package systems.brn.plasticgun.lib;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.entity.TntEntity;
|
||||||
|
import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.entity.player.PlayerInventory;
|
import net.minecraft.entity.player.PlayerInventory;
|
||||||
import net.minecraft.inventory.Inventory;
|
import net.minecraft.inventory.Inventory;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static net.minecraft.world.explosion.Explosion.getExposure;
|
||||||
import static systems.brn.plasticgun.PlasticGun.MOD_ID;
|
import static systems.brn.plasticgun.PlasticGun.MOD_ID;
|
||||||
|
|
||||||
public class Util {
|
public class Util {
|
||||||
@ -94,6 +104,49 @@ public class Util {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Entity> getEntitiesAround(Entity entity, double radius) {
|
||||||
|
Vec3d pos = entity.getPos();
|
||||||
|
int minX = MathHelper.floor(pos.x - radius - 1.0);
|
||||||
|
int maxX = MathHelper.floor(pos.x + radius + 1.0);
|
||||||
|
int minY = MathHelper.floor(pos.y - radius - 1.0);
|
||||||
|
int maxY = MathHelper.floor(pos.y + radius + 1.0);
|
||||||
|
int minZ = MathHelper.floor(pos.z - radius - 1.0);
|
||||||
|
int maxZ = MathHelper.floor(pos.z + radius + 1.0);
|
||||||
|
Box box = new Box(minX, minY, minZ, maxX, maxY, maxZ);
|
||||||
|
return entity.getEntityWorld().getOtherEntities(entity, box);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void applyKnockbackToEntities(Entity explodingEntity, Vec3d explosionPos, double power, double radius) {
|
||||||
|
List<Entity> entities = getEntitiesAround(explodingEntity, radius);
|
||||||
|
|
||||||
|
for (Entity entity : entities) {
|
||||||
|
double distanceRatio = Math.sqrt(entity.squaredDistanceTo(explosionPos)) / power;
|
||||||
|
if (distanceRatio > 1.0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double dx = entity.getX() - explosionPos.x;
|
||||||
|
double dy = entity.getY() - explosionPos.y;
|
||||||
|
double dz = entity.getZ() - explosionPos.z;
|
||||||
|
double distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
||||||
|
|
||||||
|
if (distance == 0.0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dx /= distance;
|
||||||
|
dy /= distance;
|
||||||
|
dz /= distance;
|
||||||
|
|
||||||
|
double knockbackStrength = (1.0 - distanceRatio) * getExposure(explosionPos, entity);
|
||||||
|
double knockback = knockbackStrength * (1.0 - (entity instanceof LivingEntity livingEntity ? livingEntity.getAttributeValue(EntityAttributes.GENERIC_EXPLOSION_KNOCKBACK_RESISTANCE) : 0.0));
|
||||||
|
|
||||||
|
Vec3d knockbackVec = new Vec3d(dx * knockback, dy * knockback, dz * knockback);
|
||||||
|
entity.setVelocity(entity.getVelocity().add(knockbackVec));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user