From ef42cf72cea6cec003ea603b532fec175fa9c33e Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Thu, 19 Dec 2024 23:22:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=BD=BD=E5=85=B7perk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/entity/SpeedboatEntity.java | 46 ++++++++++++++++++- .../event/LivingEventHandler.java | 14 ++++++ .../superbwarfare/init/ModVillagers.java | 4 +- .../superbwarfare/menu/VehicleMenu.java | 3 +- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java index 513fdbe47..6bff33663 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java @@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.item.PerkItem; import com.atsuishio.superbwarfare.menu.VehicleMenu; import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; +import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.EntityFindUtil; @@ -37,6 +38,8 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.*; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; @@ -76,6 +79,7 @@ import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -378,6 +382,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, if (this.getItemStacks().stream().noneMatch(stack -> stack.is(ModItems.HEAVY_AMMO.get())) && !player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get()))) return; if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).holdFire) { + ProjectileEntity projectile = new ProjectileEntity(driver.level()) .shooter(player) .damage(CannonConfig.SPEEDBOAT_GUN_DAMAGE.get()) @@ -390,6 +395,43 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, (float) 0.4); this.level().addFreshEntity(projectile); + if (this.getItemStacks().size() > 102) { + ItemStack perkItem = this.getItemStacks().get(102); + if (perkItem.getItem() instanceof PerkItem perk) { + if (perk.getPerk() == ModPerks.SILVER_BULLET.get()) { + projectile.undeadMultiple(2.5f); + } else if (perk.getPerk() == ModPerks.BEAST_BULLET.get()) { + projectile.beast(); + } else if (perk.getPerk() == ModPerks.JHP_BULLET.get()) { + projectile.jhpBullet(true, 3); + } else if (perk.getPerk() == ModPerks.HE_BULLET.get()) { + projectile.heBullet(true, 3); + } else if (perk.getPerk() == ModPerks.INCENDIARY_BULLET.get()) { + projectile.fireBullet(true, 3, false); + } + + if (perk.getPerk() instanceof AmmoPerk ammoPerk) { + projectile.setRGB(ammoPerk.rgb); + if (!ammoPerk.mobEffects.get().isEmpty()) { + ArrayList mobEffectInstances = new ArrayList<>(); + for (MobEffect effect : ammoPerk.mobEffects.get()) { + mobEffectInstances.add(new MobEffectInstance(effect, 160, 2)); + } + projectile.effect(mobEffectInstances); + } + } + } + } + + if (this.getItemStacks().size() > 104) { + ItemStack perkItem = this.getItemStacks().get(104); + if (perkItem.getItem() instanceof PerkItem perk) { + if (perk.getPerk() == ModPerks.MONSTER_HUNTER.get()) { + projectile.monsterMultiple(0.5f); + } + } + } + float pitch = this.entityData.get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * java.lang.Math.abs(60 - this.entityData.get(HEAT))); if (player instanceof ServerPlayer serverPlayer) { @@ -775,9 +817,9 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, case VehicleMenu.DEFAULT_AMMO_PERK_SLOT -> pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.AMMO; case VehicleMenu.DEFAULT_FUNC_PERK_SLOT -> - pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.FUNCTIONAL; + pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.FUNCTIONAL && perkItem.getPerk() == ModPerks.POWERFUL_ATTRACTION.get(); case VehicleMenu.DEFAULT_DAMAGE_PERK_SLOT -> - pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.DAMAGE; + pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.DAMAGE && perkItem.getPerk() == ModPerks.MONSTER_HUNTER.get(); default -> true; }; } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index c04304bc9..b4ccd576b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -713,6 +713,20 @@ public class LivingEventHandler { if (!(sourceEntity instanceof Player player)) return; ItemStack stack = player.getMainHandItem(); + if (sourceEntity.getVehicle() instanceof IVehicleEntity vehicle && DamageTypeTool.isGunDamage(source) && !stack.is(ModTags.Items.GUN)) { + var drops = event.getDrops(); + if (vehicle instanceof ContainerEntity containerEntity) { + drops.forEach(itemEntity -> { + ItemStack item = itemEntity.getItem(); + if (!HopperBlockEntity.addItem(containerEntity, itemEntity)) { + player.drop(item, false); + } + }); + event.setCanceled(true); + return; + } + } + if (sourceEntity.getVehicle() instanceof IVehicleEntity vehicle && source.is(ModDamageTypes.VEHICLE_STRIKE)) { var drops = event.getDrops(); if (vehicle instanceof ContainerEntity containerEntity) { diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java index fcb02304b..4a241ae68 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java @@ -57,7 +57,7 @@ public class ModVillagers { trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1), new ItemStack(ModItems.SHOTGUN_AMMO.get(), 2), 16, 1, 0.05f)); trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1), - new ItemStack(ModItems.HEAVY_AMMO.get(), 2), 16, 1, 0.05f)); + new ItemStack(ModItems.HEAVY_AMMO.get(), 2), 32, 1, 0.05f)); trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HANDGUN_AMMO.get(), 8), new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); @@ -68,7 +68,7 @@ public class ModVillagers { trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.SHOTGUN_AMMO.get(), 4), new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HEAVY_AMMO.get(), 4), - new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); + new ItemStack(Items.EMERALD, 1), 64, 2, 0.05f)); // 等级 2 交易 trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10), diff --git a/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java b/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java index f62304d1b..a31d8b093 100644 --- a/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java +++ b/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.menu; import com.atsuishio.superbwarfare.init.ModMenuTypes; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.item.PerkItem; import com.atsuishio.superbwarfare.perk.Perk; import net.minecraft.world.Container; @@ -106,7 +107,7 @@ public class VehicleMenu extends AbstractContainerMenu { @Override public boolean mayPlace(ItemStack pStack) { - return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type; + return pStack.getItem() instanceof PerkItem perkItem && (perkItem.getPerk().type == Perk.Type.AMMO || perkItem.getPerk() == ModPerks.POWERFUL_ATTRACTION.get() || perkItem.getPerk() == ModPerks.MONSTER_HUNTER.get()); } @Override