添加子弹模组的额外属性
This commit is contained in:
parent
045745cc0f
commit
d12e6c749f
14 changed files with 295 additions and 153 deletions
|
@ -7,6 +7,9 @@ import net.mcreator.superbwarfare.config.client.DisplayConfig;
|
||||||
import net.mcreator.superbwarfare.event.ClientEventHandler;
|
import net.mcreator.superbwarfare.event.ClientEventHandler;
|
||||||
import net.mcreator.superbwarfare.init.ModItems;
|
import net.mcreator.superbwarfare.init.ModItems;
|
||||||
import net.mcreator.superbwarfare.init.ModTags;
|
import net.mcreator.superbwarfare.init.ModTags;
|
||||||
|
import net.mcreator.superbwarfare.perk.AmmoPerk;
|
||||||
|
import net.mcreator.superbwarfare.perk.Perk;
|
||||||
|
import net.mcreator.superbwarfare.perk.PerkHelper;
|
||||||
import net.minecraft.client.CameraType;
|
import net.minecraft.client.CameraType;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.Font;
|
import net.minecraft.client.gui.Font;
|
||||||
|
@ -53,6 +56,7 @@ public class CrossHairOverlay {
|
||||||
float deltaFrame = Minecraft.getInstance().getDeltaFrameTime();
|
float deltaFrame = Minecraft.getInstance().getDeltaFrameTime();
|
||||||
float moveX = 0;
|
float moveX = 0;
|
||||||
float moveY = 0;
|
float moveY = 0;
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
|
||||||
if (DisplayConfig.FLOAT_CROSS_HAIR.get()) {
|
if (DisplayConfig.FLOAT_CROSS_HAIR.get()) {
|
||||||
moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX);
|
moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX);
|
||||||
|
@ -77,12 +81,13 @@ public class CrossHairOverlay {
|
||||||
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) {
|
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) {
|
||||||
if (stack.is(ModTags.Items.SHOTGUN)) {
|
if (stack.is(ModTags.Items.SHOTGUN)) {
|
||||||
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength);
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
|
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
|
||||||
|
} else {
|
||||||
|
shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
|
||||||
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,17 +97,20 @@ public class CrossHairOverlay {
|
||||||
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) {
|
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) {
|
||||||
if (ClientEventHandler.zoomTime < 0.1) {
|
if (ClientEventHandler.zoomTime < 0.1) {
|
||||||
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength);
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
|
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
|
||||||
|
} else {
|
||||||
|
shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
|
||||||
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 在开启伤害指示器时才进行渲染
|
// 在开启伤害指示器时才进行渲染
|
||||||
if (DisplayConfig.KILL_INDICATION.get()) {
|
if (DisplayConfig.KILL_INDICATION.get()) {
|
||||||
renderKillIndicator(guiGraphics, w, h, moveX, moveY);
|
renderKillIndicator(guiGraphics, w, h, moveX, moveY);
|
||||||
|
@ -125,6 +133,17 @@ public class CrossHairOverlay {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void normalCrossHair(GuiGraphics guiGraphics, int w, int h, double spread, float moveX, float moveY ) {
|
||||||
|
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
|
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
|
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
|
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void shotgunCrossHair(GuiGraphics guiGraphics, float finPosX, float finPosY, float finLength) {
|
||||||
|
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength);
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean shouldRenderCrossHair(Player player) {
|
private static boolean shouldRenderCrossHair(Player player) {
|
||||||
if (player == null) return false;
|
if (player == null) return false;
|
||||||
|
|
||||||
|
|
|
@ -340,7 +340,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
|
|
||||||
this.onHitBlock(hitVec);
|
this.onHitBlock(hitVec);
|
||||||
if (heBullet) {
|
if (heBullet) {
|
||||||
explosionBulletBlock(this, damage, heLevel, monsterMultiple + 1, hitVec);
|
explosionBulletBlock(this, this.damage, heLevel, monsterMultiple + 1, hitVec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,8 +363,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
|
|
||||||
protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) {
|
protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) {
|
||||||
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
|
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
|
||||||
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)),
|
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.9 * damage) * (1 + 0.1 * heLevel)),
|
||||||
hitVec.x, hitVec.y, hitVec.z, (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
|
hitVec.x, hitVec.y, hitVec.z, (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
|
||||||
explosion.explode();
|
explosion.explode();
|
||||||
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
|
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
|
||||||
explosion.finalizeExplosion(false);
|
explosion.finalizeExplosion(false);
|
||||||
|
@ -502,7 +502,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
}
|
}
|
||||||
|
|
||||||
if (heBullet) {
|
if (heBullet) {
|
||||||
explosionBulletEntity(this, entity, damage, heLevel, mMultiple);
|
explosionBulletEntity(this, entity, this.damage, heLevel, mMultiple);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (headshot) {
|
if (headshot) {
|
||||||
|
@ -546,8 +546,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
|
|
||||||
protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) {
|
protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) {
|
||||||
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
|
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
|
||||||
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)),
|
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.8 * damage) * (1 + 0.1 * heLevel)),
|
||||||
target.getX(), target.getY(), target.getZ(), (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
|
target.getX(), target.getY(), target.getZ(), (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
|
||||||
explosion.explode();
|
explosion.explode();
|
||||||
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
|
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
|
||||||
explosion.finalizeExplosion(false);
|
explosion.finalizeExplosion(false);
|
||||||
|
|
|
@ -6,10 +6,10 @@ import net.mcreator.superbwarfare.entity.DroneEntity;
|
||||||
import net.mcreator.superbwarfare.entity.ICannonEntity;
|
import net.mcreator.superbwarfare.entity.ICannonEntity;
|
||||||
import net.mcreator.superbwarfare.init.ModItems;
|
import net.mcreator.superbwarfare.init.ModItems;
|
||||||
import net.mcreator.superbwarfare.init.ModMobEffects;
|
import net.mcreator.superbwarfare.init.ModMobEffects;
|
||||||
import net.mcreator.superbwarfare.init.ModPerks;
|
|
||||||
import net.mcreator.superbwarfare.init.ModTags;
|
import net.mcreator.superbwarfare.init.ModTags;
|
||||||
import net.mcreator.superbwarfare.network.ModVariables;
|
import net.mcreator.superbwarfare.network.ModVariables;
|
||||||
import net.mcreator.superbwarfare.network.message.ShootMessage;
|
import net.mcreator.superbwarfare.network.message.ShootMessage;
|
||||||
|
import net.mcreator.superbwarfare.perk.AmmoPerk;
|
||||||
import net.mcreator.superbwarfare.perk.Perk;
|
import net.mcreator.superbwarfare.perk.Perk;
|
||||||
import net.mcreator.superbwarfare.perk.PerkHelper;
|
import net.mcreator.superbwarfare.perk.PerkHelper;
|
||||||
import net.mcreator.superbwarfare.tools.MillisTimer;
|
import net.mcreator.superbwarfare.tools.MillisTimer;
|
||||||
|
@ -162,7 +162,7 @@ public class ClientEventHandler {
|
||||||
if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
|
if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
|
||||||
zoomSpread = 1 - (0.995 * zoomTime);
|
zoomSpread = 1 - (0.995 * zoomTime);
|
||||||
} else if (stack.is(ModTags.Items.SHOTGUN)) {
|
} else if (stack.is(ModTags.Items.SHOTGUN)) {
|
||||||
if (perk == ModPerks.HE_BULLET.get()) {
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
zoomSpread = 1 - (0.85 * zoomTime);
|
zoomSpread = 1 - (0.85 * zoomTime);
|
||||||
} else {
|
} else {
|
||||||
zoomSpread = 1 - (0.25 * zoomTime);
|
zoomSpread = 1 - (0.25 * zoomTime);
|
||||||
|
@ -456,7 +456,7 @@ public class ClientEventHandler {
|
||||||
private static void handleWeaponZoom(LivingEntity entity) {
|
private static void handleWeaponZoom(LivingEntity entity) {
|
||||||
if (!(entity instanceof Player player)) return;
|
if (!(entity instanceof Player player)) return;
|
||||||
float times = 5 * Minecraft.getInstance().getDeltaFrameTime();
|
float times = 5 * Minecraft.getInstance().getDeltaFrameTime();
|
||||||
if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame() && !player.getCooldowns().isOnCooldown(player.getMainHandItem().getItem())) {
|
if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame()) {
|
||||||
zoomTime = Mth.clamp(zoomTime + 0.03 * times, 0, 1);
|
zoomTime = Mth.clamp(zoomTime + 0.03 * times, 0, 1);
|
||||||
} else {
|
} else {
|
||||||
zoomTime = Mth.clamp(zoomTime - 0.04 * times, 0, 1);
|
zoomTime = Mth.clamp(zoomTime - 0.04 * times, 0, 1);
|
||||||
|
|
|
@ -194,19 +194,19 @@ public class GunEventHandler {
|
||||||
|
|
||||||
if (!player.level().isClientSide()) {
|
if (!player.level().isClientSide()) {
|
||||||
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
|
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
|
||||||
float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple");
|
float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple") * (float) perkDamage(heldItem);
|
||||||
float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity");
|
float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity") * (float) perkSpeed(heldItem);
|
||||||
|
int projectileAmount = (int) heldItem.getOrCreateTag().getDouble("projectile_amount");
|
||||||
|
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
|
||||||
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
|
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
|
||||||
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
|
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
|
||||||
|
|
||||||
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
||||||
.shooter(player)
|
.shooter(player)
|
||||||
.damage((perk == ModPerks.HE_BULLET.get() ? (int)heldItem.getOrCreateTag().getDouble("projectile_amount") * damage : damage))
|
.damage(perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? projectileAmount * damage : damage)
|
||||||
.headShot(headshot)
|
.headShot(headshot)
|
||||||
.zoom(zoom);
|
.zoom(zoom);
|
||||||
|
|
||||||
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
|
|
||||||
|
|
||||||
if (perk instanceof AmmoPerk ammoPerk) {
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
||||||
|
|
||||||
|
@ -239,7 +239,6 @@ public class GunEventHandler {
|
||||||
} else if (perk == ModPerks.HE_BULLET.get()) {
|
} else if (perk == ModPerks.HE_BULLET.get()) {
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
||||||
projectile.heBullet(true, level);
|
projectile.heBullet(true, level);
|
||||||
velocity *= 0.6f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
|
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
|
||||||
|
@ -255,6 +254,22 @@ public class GunEventHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double perkDamage(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
return ammoPerk.damageRate;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double perkSpeed(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
return ammoPerk.speedRate;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用的武器换弹流程
|
* 通用的武器换弹流程
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -9,6 +9,8 @@ import net.mcreator.superbwarfare.item.gun.GunItem;
|
||||||
import net.mcreator.superbwarfare.network.ModVariables;
|
import net.mcreator.superbwarfare.network.ModVariables;
|
||||||
import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage;
|
import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage;
|
||||||
import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage;
|
import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage;
|
||||||
|
import net.mcreator.superbwarfare.perk.AmmoPerk;
|
||||||
|
import net.mcreator.superbwarfare.perk.Perk;
|
||||||
import net.mcreator.superbwarfare.perk.PerkHelper;
|
import net.mcreator.superbwarfare.perk.PerkHelper;
|
||||||
import net.mcreator.superbwarfare.tools.DamageTypeTool;
|
import net.mcreator.superbwarfare.tools.DamageTypeTool;
|
||||||
import net.mcreator.superbwarfare.tools.SoundTool;
|
import net.mcreator.superbwarfare.tools.SoundTool;
|
||||||
|
@ -117,21 +119,26 @@ public class LivingEventHandler {
|
||||||
double damage = amount;
|
double damage = amount;
|
||||||
|
|
||||||
ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY;
|
ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY;
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
|
||||||
//距离衰减
|
//距离衰减
|
||||||
if (DamageTypeTool.isGunDamage(source)) {
|
if (DamageTypeTool.isGunDamage(source)) {
|
||||||
double distance = entity.position().distanceTo(sourceEntity.position());
|
double distance = entity.position().distanceTo(sourceEntity.position());
|
||||||
|
|
||||||
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
|
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
|
||||||
damage = reduceDamageByDistance(amount, distance, 0.03, 25);
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
|
damage = reduceDamageByDistance(amount, distance, 0.015, 50);
|
||||||
|
} else {
|
||||||
|
damage = reduceDamageByDistance(amount, distance, 0.03, 25);
|
||||||
|
}
|
||||||
} else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) {
|
} else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) {
|
||||||
damage = reduceDamageByDistance(amount, distance, 0.001, 200);
|
damage = reduceDamageByDistance(amount, distance, 0.001, 150);
|
||||||
} else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) {
|
} else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) {
|
||||||
damage = reduceDamageByDistance(amount, distance, 0.03, 50);
|
damage = reduceDamageByDistance(amount, distance, 0.02, 50);
|
||||||
} else if (stack.is(ModTags.Items.SMG)) {
|
} else if (stack.is(ModTags.Items.SMG)) {
|
||||||
damage = reduceDamageByDistance(amount, distance, 0.03, 50);
|
damage = reduceDamageByDistance(amount, distance, 0.02, 50);
|
||||||
} else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) || stack.getItem() == ModItems.BOCEK.get()) {
|
} else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) || stack.getItem() == ModItems.BOCEK.get()) {
|
||||||
damage = reduceDamageByDistance(amount, distance, 0.0025, 150);
|
damage = reduceDamageByDistance(amount, distance, 0.007, 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +166,7 @@ public class LivingEventHandler {
|
||||||
event.setAmount((float) damage);
|
event.setAmount((float) damage);
|
||||||
|
|
||||||
if (entity instanceof TargetEntity && sourceEntity instanceof Player player) {
|
if (entity instanceof TargetEntity && sourceEntity instanceof Player player) {
|
||||||
player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.#").format(damage) +
|
player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.##").format(damage) +
|
||||||
" Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false);
|
" Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,15 +29,15 @@ public class ModPerks {
|
||||||
public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID);
|
public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID);
|
||||||
|
|
||||||
public static final RegistryObject<Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet",
|
public static final RegistryObject<Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).rgb(230, 70, 35)));
|
() -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).damageRate(0.9f).speedRate(1.2f).slug(true).rgb(230, 70, 35)));
|
||||||
public static final RegistryObject<Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet",
|
public static final RegistryObject<Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).rgb(230, 131, 65)));
|
() -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.9f).slug(true).rgb(230, 131, 65)));
|
||||||
public static final RegistryObject<Perk> HE_BULLET = AMMO_PERKS.register("he_bullet",
|
public static final RegistryObject<Perk> HE_BULLET = AMMO_PERKS.register("he_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).rgb(240, 20, 10)));
|
() -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.6f).slug(true).rgb(240, 20, 10)));
|
||||||
public static final RegistryObject<Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet",
|
public static final RegistryObject<Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).rgb(87, 166, 219)));
|
() -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).damageRate(0.8f).speedRate(1.1f).rgb(87, 166, 219)));
|
||||||
public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",
|
public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("poisonous_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(48, 131, 6)
|
() -> new AmmoPerk(new AmmoPerk.Builder("poisonous_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).damageRate(1.0f).speedRate(1.0f).rgb(48, 131, 6)
|
||||||
.mobEffect(() -> MobEffects.POISON)));
|
.mobEffect(() -> MobEffects.POISON)));
|
||||||
public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet",
|
public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet",
|
||||||
() -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14)));
|
() -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14)));
|
||||||
|
@ -69,11 +69,11 @@ public class ModPerks {
|
||||||
public static void registerCompatPerks() {
|
public static void registerCompatPerks() {
|
||||||
if (ModList.get().isLoaded(CompatHolder.DMV)) {
|
if (ModList.get().isLoaded(CompatHolder.DMV)) {
|
||||||
AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO)
|
AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO)
|
||||||
.bypassArmorRate(-0.2f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING)));
|
.bypassArmorRate(-0.2f).damageRate(0.7f).speedRate(0.8f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING)));
|
||||||
}
|
}
|
||||||
if (ModList.get().isLoaded(CompatHolder.VRC)) {
|
if (ModList.get().isLoaded(CompatHolder.VRC)) {
|
||||||
AMMO_PERKS.register("curse_flame_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("curse_flame_bullet", Perk.Type.AMMO)
|
AMMO_PERKS.register("curse_flame_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("curse_flame_bullet", Perk.Type.AMMO)
|
||||||
.bypassArmorRate(0.0f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME)));
|
.bypassArmorRate(0.0f).damageRate(1.2f).speedRate(0.9f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package net.mcreator.superbwarfare.item;
|
package net.mcreator.superbwarfare.item;
|
||||||
|
|
||||||
|
import net.mcreator.superbwarfare.perk.AmmoPerk;
|
||||||
import net.mcreator.superbwarfare.perk.Perk;
|
import net.mcreator.superbwarfare.perk.Perk;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
@ -42,5 +43,22 @@ public class PerkItem extends Item {
|
||||||
tooltips.add(Component.literal(""));
|
tooltips.add(Component.literal(""));
|
||||||
tooltips.add(Component.translatable("perk.superbwarfare.slot").withStyle(ChatFormatting.GOLD)
|
tooltips.add(Component.translatable("perk.superbwarfare.slot").withStyle(ChatFormatting.GOLD)
|
||||||
.append(Component.translatable("perk.superbwarfare.slot_" + this.getPerk().type.getName()).withStyle(chatFormatting)));
|
.append(Component.translatable("perk.superbwarfare.slot_" + this.getPerk().type.getName()).withStyle(chatFormatting)));
|
||||||
|
if (this.getPerk() instanceof AmmoPerk ammoPerk) {
|
||||||
|
if (ammoPerk.damageRate < 1) {
|
||||||
|
tooltips.add(Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED));
|
||||||
|
} else if (ammoPerk.damageRate > 1) {
|
||||||
|
tooltips.add(Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ammoPerk.speedRate < 1) {
|
||||||
|
tooltips.add(Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED));
|
||||||
|
} else if (ammoPerk.speedRate > 1) {
|
||||||
|
tooltips.add(Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ammoPerk.slug) {
|
||||||
|
tooltips.add(Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,10 +174,27 @@ public class FireMessage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void handleBowShoot(Player player) {
|
public static double perkDamage(ItemStack stack) {
|
||||||
ItemStack stack = player.getMainHandItem();
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
return ammoPerk.damageRate;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
double power = stack.getOrCreateTag().getDouble("power");
|
public static double perkSpeed(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
return ammoPerk.speedRate;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleBowShoot(Player player) {
|
||||||
|
if (player.level().isClientSide()) return;
|
||||||
|
|
||||||
|
ItemStack stack = player.getMainHandItem();
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
|
||||||
if (player instanceof ServerPlayer serverPlayer) {
|
if (player instanceof ServerPlayer serverPlayer) {
|
||||||
SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS);
|
SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS);
|
||||||
|
@ -187,97 +204,23 @@ public class FireMessage {
|
||||||
if (stack.getOrCreateTag().getDouble("power") >= 6) {
|
if (stack.getOrCreateTag().getDouble("power") >= 6) {
|
||||||
stack.getOrCreateTag().putDouble("speed", stack.getOrCreateTag().getDouble("power"));
|
stack.getOrCreateTag().putDouble("speed", stack.getOrCreateTag().getDouble("power"));
|
||||||
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) {
|
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) {
|
||||||
Level plevel = player.level();
|
|
||||||
if (!plevel.isClientSide()) {
|
|
||||||
ItemStack heldItem = player.getMainHandItem();
|
|
||||||
|
|
||||||
if (player.level().isClientSide()) return;
|
spawnBullet(player);
|
||||||
|
spawnFakeArrow(player);
|
||||||
|
|
||||||
CompoundTag tag = heldItem.getOrCreateTag();
|
SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1);
|
||||||
double damage;
|
player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1);
|
||||||
float headshot = (float) tag.getDouble("headshot");
|
|
||||||
float velocity = 2 * (float) tag.getDouble("speed");
|
|
||||||
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
|
|
||||||
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
|
|
||||||
|
|
||||||
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
|
||||||
.shooter(player)
|
|
||||||
.headShot(headshot)
|
|
||||||
.zoom(zoom);
|
|
||||||
|
|
||||||
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
|
|
||||||
if (perk instanceof AmmoPerk ammoPerk) {
|
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
|
||||||
|
|
||||||
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
|
||||||
projectile.setRGB(ammoPerk.rgb);
|
|
||||||
|
|
||||||
if (ammoPerk.mobEffect.get() != null) {
|
|
||||||
projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 70 + 30 * level, level - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bypassArmorRate = Math.max(bypassArmorRate, 0);
|
|
||||||
projectile.bypassArmorRate(bypassArmorRate);
|
|
||||||
|
|
||||||
if (perk == ModPerks.SILVER_BULLET.get()) {
|
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
|
||||||
projectile.undeadMultiple(1.0f + 0.5f * level);
|
|
||||||
} else if (perk == ModPerks.BEAST_BULLET.get()) {
|
|
||||||
projectile.beast();
|
|
||||||
} else if (perk == ModPerks.JHP_BULLET.get()) {
|
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
|
||||||
projectile.jhpBullet(true, level);
|
|
||||||
} else if (perk == ModPerks.HE_BULLET.get()) {
|
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
|
||||||
projectile.heBullet(true, level);
|
|
||||||
velocity *= 0.6f;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
|
|
||||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
|
||||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, heldItem);
|
|
||||||
projectile.monsterMultiple(0.1f + 0.1f * perkLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
|
|
||||||
|
|
||||||
damage = 0.08333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple");
|
|
||||||
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0);
|
|
||||||
projectile.damage((float) damage);
|
|
||||||
player.level().addFreshEntity(projectile);
|
|
||||||
|
|
||||||
BocekArrowEntity arrow = new BocekArrowEntity(player, plevel);
|
|
||||||
arrow.setBaseDamage(0);
|
|
||||||
arrow.setKnockback(0);
|
|
||||||
arrow.setSilent(true);
|
|
||||||
arrow.setPierceLevel((byte) 2);
|
|
||||||
arrow.pickup = AbstractArrow.Pickup.DISALLOWED;
|
|
||||||
|
|
||||||
arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
|
|
||||||
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (2 * power), 0);
|
|
||||||
plevel.addFreshEntity(arrow);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.level().isClientSide()) {
|
|
||||||
SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1);
|
|
||||||
player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
|
||||||
|
|
||||||
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : 10); index0++) {
|
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 10); index0++) {
|
||||||
spawnBullet(player);
|
spawnBullet(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.level().isClientSide() && player.getServer() != null) {
|
SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1);
|
||||||
SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1);
|
player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1);
|
||||||
player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
|
||||||
|
|
||||||
if (perk == ModPerks.BEAST_BULLET.get()) {
|
if (perk == ModPerks.BEAST_BULLET.get()) {
|
||||||
player.playSound(ModSounds.HENG.get(), 4f, 1f);
|
player.playSound(ModSounds.HENG.get(), 4f, 1f);
|
||||||
|
|
||||||
|
@ -314,18 +257,30 @@ public class FireMessage {
|
||||||
if (player.level().isClientSide()) return;
|
if (player.level().isClientSide()) return;
|
||||||
|
|
||||||
CompoundTag tag = heldItem.getOrCreateTag();
|
CompoundTag tag = heldItem.getOrCreateTag();
|
||||||
double damage;
|
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
|
||||||
float headshot = (float) tag.getDouble("headshot");
|
float headshot = (float) tag.getDouble("headshot");
|
||||||
float velocity = 2 * (float) tag.getDouble("speed");
|
float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem);
|
||||||
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
|
|
||||||
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
|
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
|
||||||
|
double damage;
|
||||||
|
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
|
||||||
|
|
||||||
|
|
||||||
|
float spread;
|
||||||
|
|
||||||
|
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) {
|
||||||
|
spread = 0.01f;
|
||||||
|
damage = 0.08333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem);
|
||||||
|
} else {
|
||||||
|
spread = perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 2.5f;
|
||||||
|
damage = (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 0.08333333 : 0.008333333) * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem);
|
||||||
|
}
|
||||||
|
|
||||||
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
||||||
.shooter(player)
|
.shooter(player)
|
||||||
.headShot(headshot)
|
.headShot(headshot)
|
||||||
.zoom(zoom);
|
.zoom(zoom);
|
||||||
|
|
||||||
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
|
|
||||||
if (perk instanceof AmmoPerk ammoPerk) {
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
||||||
|
|
||||||
|
@ -351,7 +306,6 @@ public class FireMessage {
|
||||||
} else if (perk == ModPerks.HE_BULLET.get()) {
|
} else if (perk == ModPerks.HE_BULLET.get()) {
|
||||||
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
|
||||||
projectile.heBullet(true, level);
|
projectile.heBullet(true, level);
|
||||||
velocity *= 0.6f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
|
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
|
||||||
|
@ -362,12 +316,32 @@ public class FireMessage {
|
||||||
|
|
||||||
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
|
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
|
||||||
|
|
||||||
damage = 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple");
|
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, spread);
|
||||||
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 2.5f);
|
|
||||||
projectile.damage((float) (perk == ModPerks.HE_BULLET.get() ? 10 * damage : damage));
|
projectile.damage((float) damage);
|
||||||
|
|
||||||
player.level().addFreshEntity(projectile);
|
player.level().addFreshEntity(projectile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void spawnFakeArrow(Player player) {
|
||||||
|
|
||||||
|
ItemStack heldItem = player.getMainHandItem();
|
||||||
|
CompoundTag tag = heldItem.getOrCreateTag();
|
||||||
|
|
||||||
|
float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem);
|
||||||
|
|
||||||
|
BocekArrowEntity arrow = new BocekArrowEntity(player, player.level());
|
||||||
|
arrow.setBaseDamage(0);
|
||||||
|
arrow.setKnockback(0);
|
||||||
|
arrow.setSilent(true);
|
||||||
|
arrow.setPierceLevel((byte) 2);
|
||||||
|
arrow.pickup = AbstractArrow.Pickup.DISALLOWED;
|
||||||
|
|
||||||
|
arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
|
||||||
|
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0);
|
||||||
|
player.level().addFreshEntity(arrow);
|
||||||
|
}
|
||||||
|
|
||||||
private static void handleTaserFire(Player player) {
|
private static void handleTaserFire(Player player) {
|
||||||
if (player.isSpectator()) return;
|
if (player.isSpectator()) return;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import net.mcreator.superbwarfare.init.ModPerks;
|
||||||
import net.mcreator.superbwarfare.init.ModSounds;
|
import net.mcreator.superbwarfare.init.ModSounds;
|
||||||
import net.mcreator.superbwarfare.init.ModTags;
|
import net.mcreator.superbwarfare.init.ModTags;
|
||||||
import net.mcreator.superbwarfare.network.ModVariables;
|
import net.mcreator.superbwarfare.network.ModVariables;
|
||||||
|
import net.mcreator.superbwarfare.perk.AmmoPerk;
|
||||||
import net.mcreator.superbwarfare.perk.Perk;
|
import net.mcreator.superbwarfare.perk.Perk;
|
||||||
import net.mcreator.superbwarfare.perk.PerkHelper;
|
import net.mcreator.superbwarfare.perk.PerkHelper;
|
||||||
import net.mcreator.superbwarfare.tools.ParticleTool;
|
import net.mcreator.superbwarfare.tools.ParticleTool;
|
||||||
|
@ -67,6 +68,7 @@ public class ShootMessage {
|
||||||
|
|
||||||
int coolDownTick = (int) Math.ceil(20 / (rpm / 60));
|
int coolDownTick = (int) Math.ceil(20 / (rpm / 60));
|
||||||
double mode = stack.getOrCreateTag().getInt("fire_mode");
|
double mode = stack.getOrCreateTag().getInt("fire_mode");
|
||||||
|
int projectileAmount = (int) stack.getOrCreateTag().getDouble("projectile_amount");
|
||||||
|
|
||||||
if (((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).holdFire || stack.getOrCreateTag().getInt("burst_fire") > 0)
|
if (((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).holdFire || stack.getOrCreateTag().getInt("burst_fire") > 0)
|
||||||
&& !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))
|
&& !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))
|
||||||
|
@ -154,7 +156,7 @@ public class ShootMessage {
|
||||||
|
|
||||||
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
|
||||||
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) {
|
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
|
||||||
gunShoot(player, spared);
|
gunShoot(player, spared);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,6 +170,8 @@ public class ShootMessage {
|
||||||
} else if (stack.is(ModItems.MINIGUN.get())) {
|
} else if (stack.is(ModItems.MINIGUN.get())) {
|
||||||
var tag = stack.getOrCreateTag();
|
var tag = stack.getOrCreateTag();
|
||||||
|
|
||||||
|
int projectileAmount = (int) tag.getDouble("projectile_amount");
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (var inv : player.getInventory().items) {
|
for (var inv : player.getInventory().items) {
|
||||||
if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) {
|
if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) {
|
||||||
|
@ -199,7 +203,7 @@ public class ShootMessage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) {
|
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
|
||||||
gunShoot(player, spared);
|
gunShoot(player, spared);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,18 @@ import java.util.function.Supplier;
|
||||||
|
|
||||||
public class AmmoPerk extends Perk {
|
public class AmmoPerk extends Perk {
|
||||||
public float bypassArmorRate;
|
public float bypassArmorRate;
|
||||||
|
public float damageRate;
|
||||||
|
public float speedRate;
|
||||||
|
public boolean slug;
|
||||||
public float[] rgb;
|
public float[] rgb;
|
||||||
public Supplier<MobEffect> mobEffect;
|
public Supplier<MobEffect> mobEffect;
|
||||||
|
|
||||||
public AmmoPerk(AmmoPerk.Builder builder) {
|
public AmmoPerk(AmmoPerk.Builder builder) {
|
||||||
super(builder.descriptionId, builder.type);
|
super(builder.descriptionId, builder.type);
|
||||||
this.bypassArmorRate = builder.bypassArmorRate;
|
this.bypassArmorRate = builder.bypassArmorRate;
|
||||||
|
this.damageRate = builder.damageRate;
|
||||||
|
this.speedRate = builder.speedRate;
|
||||||
|
this.slug = builder.slug;
|
||||||
this.rgb = builder.rgb;
|
this.rgb = builder.rgb;
|
||||||
this.mobEffect = builder.mobEffect;
|
this.mobEffect = builder.mobEffect;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +27,9 @@ public class AmmoPerk extends Perk {
|
||||||
String descriptionId;
|
String descriptionId;
|
||||||
Type type;
|
Type type;
|
||||||
float bypassArmorRate = 0.0f;
|
float bypassArmorRate = 0.0f;
|
||||||
|
float damageRate = 1.0f;
|
||||||
|
float speedRate = 1.0f;
|
||||||
|
boolean slug = false;
|
||||||
float[] rgb = {1, 222 / 255f, 39 / 255f};
|
float[] rgb = {1, 222 / 255f, 39 / 255f};
|
||||||
public Supplier<MobEffect> mobEffect = () -> null;
|
public Supplier<MobEffect> mobEffect = () -> null;
|
||||||
|
|
||||||
|
@ -34,6 +43,21 @@ public class AmmoPerk extends Perk {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AmmoPerk.Builder damageRate(float damageRate) {
|
||||||
|
this.damageRate = Mth.clamp(damageRate, 0, Float.POSITIVE_INFINITY);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AmmoPerk.Builder speedRate(float speedRate) {
|
||||||
|
this.speedRate = Mth.clamp(speedRate, 0, Float.POSITIVE_INFINITY);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AmmoPerk.Builder slug(boolean slug) {
|
||||||
|
this.slug = slug;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public AmmoPerk.Builder rgb(int r, int g, int b) {
|
public AmmoPerk.Builder rgb(int r, int g, int b) {
|
||||||
this.rgb[0] = r / 255f;
|
this.rgb[0] = r / 255f;
|
||||||
this.rgb[1] = g / 255f;
|
this.rgb[1] = g / 255f;
|
||||||
|
|
|
@ -148,9 +148,9 @@ public class CustomExplosion extends Explosion {
|
||||||
|
|
||||||
double damageFinal = (damagePercent * damagePercent + damagePercent) / 2.0D * damage;
|
double damageFinal = (damagePercent * damagePercent + damagePercent) / 2.0D * damage;
|
||||||
if (entity instanceof Monster monster) {
|
if (entity instanceof Monster monster) {
|
||||||
monster.hurt(this.damageSource, (int) damageFinal * (1 + 0.2f * this.damageMultiplier));
|
monster.hurt(this.damageSource, (float) damageFinal * (1 + 0.2f * this.damageMultiplier));
|
||||||
} else {
|
} else {
|
||||||
entity.hurt(this.damageSource, (float) ((int) damageFinal));
|
entity.hurt(this.damageSource, (float) damageFinal);
|
||||||
}
|
}
|
||||||
if (entity instanceof LivingEntity) {
|
if (entity instanceof LivingEntity) {
|
||||||
entity.invulnerableTime = 0;
|
entity.invulnerableTime = 0;
|
||||||
|
|
|
@ -28,15 +28,36 @@ public class TooltipTool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double perkDamage(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
return ammoPerk.damageRate;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean heBullet(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
return perk == ModPerks.HE_BULLET.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int heBulletLevel(ItemStack stack) {
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk == ModPerks.HE_BULLET.get()) {
|
||||||
|
return PerkHelper.getItemPerkLevel(perk, stack);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public static void addGunTips(List<Component> tooltip, ItemStack stack) {
|
public static void addGunTips(List<Component> tooltip, ItemStack stack) {
|
||||||
tooltip.add(Component.literal(""));
|
tooltip.add(Component.literal(""));
|
||||||
|
|
||||||
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
|
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
|
||||||
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
|
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
|
||||||
|
|
||||||
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
|
.append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
|
||||||
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
||||||
addRpmTips(tooltip, stack);
|
addRpmTips(tooltip, stack);
|
||||||
}
|
}
|
||||||
|
@ -48,12 +69,29 @@ public class TooltipTool {
|
||||||
public static void addShotgunTips(List<Component> tooltip, ItemStack stack) {
|
public static void addShotgunTips(List<Component> tooltip, ItemStack stack) {
|
||||||
tooltip.add(Component.literal(""));
|
tooltip.add(Component.literal(""));
|
||||||
|
|
||||||
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
|
boolean slug = false;
|
||||||
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
|
|
||||||
|
|
||||||
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN)));
|
slug = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slug) {
|
||||||
|
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "projectile_amount", 0)
|
||||||
|
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
|
||||||
|
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
|
||||||
|
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
|
||||||
|
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN)));
|
||||||
|
}
|
||||||
|
|
||||||
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
||||||
addRpmTips(tooltip, stack);
|
addRpmTips(tooltip, stack);
|
||||||
|
@ -126,12 +164,30 @@ public class TooltipTool {
|
||||||
|
|
||||||
if (!ammoTag.isEmpty()) {
|
if (!ammoTag.isEmpty()) {
|
||||||
String id = ammoTag.getString("id").split(":")[1];
|
String id = ammoTag.getString("id").split(":")[1];
|
||||||
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW)
|
tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW)
|
||||||
.append(Component.literal(" >> "))
|
.append(Component.literal(" >> "))
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
|
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
|
||||||
.append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
|
.append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
|
||||||
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
|
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk) {
|
||||||
|
if (ammoPerk.damageRate < 1) {
|
||||||
|
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED));
|
||||||
|
} else if (ammoPerk.damageRate > 1) {
|
||||||
|
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ammoPerk.speedRate < 1) {
|
||||||
|
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED));
|
||||||
|
} else if (ammoPerk.speedRate > 1) {
|
||||||
|
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ammoPerk.slug && stack.is(ModTags.Items.SHOTGUN)) {
|
||||||
|
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!functionalTag.isEmpty()) {
|
if (!functionalTag.isEmpty()) {
|
||||||
|
@ -157,14 +213,26 @@ public class TooltipTool {
|
||||||
|
|
||||||
public static void addBocekTips(List<Component> tooltip, ItemStack stack) {
|
public static void addBocekTips(List<Component> tooltip, ItemStack stack) {
|
||||||
tooltip.add(Component.literal(""));
|
tooltip.add(Component.literal(""));
|
||||||
|
boolean slug = false;
|
||||||
|
|
||||||
double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
|
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
|
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||||
|
slug = true;
|
||||||
|
}
|
||||||
|
|
||||||
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN))
|
if (slug) {
|
||||||
.append(Component.literal(" / ").withStyle(ChatFormatting.RESET))
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN)));
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(total) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * total * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
|
||||||
|
} else {
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN))
|
||||||
|
.append(Component.literal(" / ").withStyle(ChatFormatting.RESET))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN)));
|
||||||
|
}
|
||||||
|
|
||||||
addLevelTips(tooltip, stack);
|
addLevelTips(tooltip, stack);
|
||||||
addBypassTips(tooltip, stack);
|
addBypassTips(tooltip, stack);
|
||||||
|
@ -183,17 +251,18 @@ public class TooltipTool {
|
||||||
if (flag.get()) {
|
if (flag.get()) {
|
||||||
double damage = (ItemNBTTool.getDouble(stack, "damage", 0) +
|
double damage = (ItemNBTTool.getDouble(stack, "damage", 0) +
|
||||||
ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0))
|
ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0))
|
||||||
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
|
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1)
|
||||||
|
* perkDamage(stack);
|
||||||
|
|
||||||
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD)));
|
.append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD)));
|
||||||
} else {
|
} else {
|
||||||
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
|
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
|
||||||
|
|
||||||
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
|
.append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? new DecimalFormat("##.#").format(0.4 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
|
||||||
|
|
|
@ -386,6 +386,12 @@
|
||||||
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
|
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
|
||||||
"config.superbwarfare.client.display.armor_plate_hud": "Armor Plate HUD",
|
"config.superbwarfare.client.display.armor_plate_hud": "Armor Plate HUD",
|
||||||
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久",
|
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久",
|
||||||
"des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。"
|
"des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。",
|
||||||
|
|
||||||
|
"des.superbwarfare.perk_damage_reduce": "Damage -",
|
||||||
|
"des.superbwarfare.perk_damage_plus": "Damage +",
|
||||||
|
"des.superbwarfare.perk_speed_reduce": "Velocity -",
|
||||||
|
"des.superbwarfare.perk_speed_plus": "Velocity +",
|
||||||
|
"des.superbwarfare.perk_slug": "Slug"
|
||||||
|
|
||||||
}
|
}
|
|
@ -384,5 +384,11 @@
|
||||||
"config.superbwarfare.client.display.camera_rotate": "视角摇晃",
|
"config.superbwarfare.client.display.camera_rotate": "视角摇晃",
|
||||||
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
|
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
|
||||||
"config.superbwarfare.client.display.armor_plate_hud": "防弹插板信息",
|
"config.superbwarfare.client.display.armor_plate_hud": "防弹插板信息",
|
||||||
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久"
|
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久",
|
||||||
|
|
||||||
|
"des.superbwarfare.perk_damage_reduce": "伤害 -",
|
||||||
|
"des.superbwarfare.perk_damage_plus": "伤害 +",
|
||||||
|
"des.superbwarfare.perk_speed_reduce": "子弹初速 -",
|
||||||
|
"des.superbwarfare.perk_speed_plus": "子弹初速 +",
|
||||||
|
"des.superbwarfare.perk_slug": "独头弹"
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue