应用载具perk

This commit is contained in:
Atsuihsio 2024-12-19 23:22:50 +08:00
parent 810ccd64f3
commit ef42cf72ce
4 changed files with 62 additions and 5 deletions

View file

@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.item.PerkItem;
import com.atsuishio.superbwarfare.menu.VehicleMenu; import com.atsuishio.superbwarfare.menu.VehicleMenu;
import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage;
import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.CustomExplosion;
import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.EntityFindUtil;
@ -37,6 +38,8 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.damagesource.DamageTypes; 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.*;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Inventory; 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.core.object.PlayState;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; 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()))) if (this.getItemStacks().stream().noneMatch(stack -> stack.is(ModItems.HEAVY_AMMO.get())) && !player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())))
return; return;
if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).holdFire) { if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).holdFire) {
ProjectileEntity projectile = new ProjectileEntity(driver.level()) ProjectileEntity projectile = new ProjectileEntity(driver.level())
.shooter(player) .shooter(player)
.damage(CannonConfig.SPEEDBOAT_GUN_DAMAGE.get()) .damage(CannonConfig.SPEEDBOAT_GUN_DAMAGE.get())
@ -390,6 +395,43 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
(float) 0.4); (float) 0.4);
this.level().addFreshEntity(projectile); 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<MobEffectInstance> 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))); 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) { if (player instanceof ServerPlayer serverPlayer) {
@ -775,9 +817,9 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
case VehicleMenu.DEFAULT_AMMO_PERK_SLOT -> case VehicleMenu.DEFAULT_AMMO_PERK_SLOT ->
pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.AMMO; pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.AMMO;
case VehicleMenu.DEFAULT_FUNC_PERK_SLOT -> 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 -> 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; default -> true;
}; };
} }

View file

@ -713,6 +713,20 @@ public class LivingEventHandler {
if (!(sourceEntity instanceof Player player)) return; if (!(sourceEntity instanceof Player player)) return;
ItemStack stack = player.getMainHandItem(); 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)) { if (sourceEntity.getVehicle() instanceof IVehicleEntity vehicle && source.is(ModDamageTypes.VEHICLE_STRIKE)) {
var drops = event.getDrops(); var drops = event.getDrops();
if (vehicle instanceof ContainerEntity containerEntity) { if (vehicle instanceof ContainerEntity containerEntity) {

View file

@ -57,7 +57,7 @@ public class ModVillagers {
trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1), trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1),
new ItemStack(ModItems.SHOTGUN_AMMO.get(), 2), 16, 1, 0.05f)); new ItemStack(ModItems.SHOTGUN_AMMO.get(), 2), 16, 1, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1), 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), trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HANDGUN_AMMO.get(), 8),
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); 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), trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.SHOTGUN_AMMO.get(), 4),
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HEAVY_AMMO.get(), 4), 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 交易 // 等级 2 交易
trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10), trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10),

View file

@ -1,6 +1,7 @@
package com.atsuishio.superbwarfare.menu; package com.atsuishio.superbwarfare.menu;
import com.atsuishio.superbwarfare.init.ModMenuTypes; import com.atsuishio.superbwarfare.init.ModMenuTypes;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.item.PerkItem; import com.atsuishio.superbwarfare.item.PerkItem;
import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.Perk;
import net.minecraft.world.Container; import net.minecraft.world.Container;
@ -106,7 +107,7 @@ public class VehicleMenu extends AbstractContainerMenu {
@Override @Override
public boolean mayPlace(ItemStack pStack) { 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 @Override