diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java index 17e832204..272e9d804 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java @@ -348,8 +348,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, collideBlock(); gunnerAngle(); gunnerFire(); - -// attractEntity(); + pickUpItem(); this.refreshDimensions(); } @@ -593,26 +592,22 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, } } -// public boolean hasEnoughSpaceFor(Entity pEntity) { -// return pEntity.getBbWidth() < this.getBbWidth(); -// } -// -// public void attractEntity() { -// List list = this.level().getEntities(this, this.getBoundingBox().inflate(0.2F, -0.01F, 0.2F), EntitySelector.pushableBy(this)); + + public void pickUpItem() { +// List list = this.level().getEntities(this, this.getBoundingBox().inflate(0.2F, 0.1, 0.2F)); // if (!list.isEmpty()) { -// boolean flag = !this.level().isClientSide && !(this.getControllingPassenger() instanceof Player); // // for (Entity entity : list) { -// if (!entity.hasPassenger(this)) { -// if (flag && this.getPassengers().size() < this.getMaxPassengers() && !entity.isPassenger() && this.hasEnoughSpaceFor(entity) && entity instanceof LivingEntity && !(entity instanceof WaterAnimal) && !(entity instanceof Player)) { -// entity.startRiding(this); -// } else { -// this.push(entity); -// } +// if (!this.level().isClientSide && entity instanceof ItemEntity itemEntity) { +// ItemStack itemStack = itemEntity.getItem(); +// boolean flag = !this.level().isClientSide; +// +// this.getItemStacks().add(itemStack); +// itemEntity.discard(); // } // } // } -// } + } public static double calculateAngle(Vec3 move, Vec3 view) { move = move.multiply(1, 0, 1).normalize(); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index 34be0ac4e..111a6513b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -710,9 +710,10 @@ public class LivingEventHandler { Entity sourceEntity = source.getEntity(); if (!(sourceEntity instanceof Player player)) return; ItemStack stack = player.getMainHandItem(); - if (!stack.is(ModTags.Items.GUN)) return; - if (PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0) { + //TODO 将撞击致死产生掉落物添加到载具储存空间而不是直接加到玩家身上 + + if (sourceEntity.getVehicle() instanceof IVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) { var drops = event.getDrops(); drops.forEach(itemEntity -> { ItemStack item = itemEntity.getItem(); @@ -720,7 +721,17 @@ public class LivingEventHandler { player.drop(item, false); } }); + event.setCanceled(true); + } + if (stack.is(ModTags.Items.GUN) && PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0) { + var drops = event.getDrops(); + drops.forEach(itemEntity -> { + ItemStack item = itemEntity.getItem(); + if (!player.addItem(item)) { + player.drop(item, false); + } + }); event.setCanceled(true); } } @@ -729,15 +740,22 @@ public class LivingEventHandler { public static void onLivingExperienceDrop(LivingExperienceDropEvent event) { Player player = event.getAttackingPlayer(); if (player == null) return; - ItemStack stack = player.getMainHandItem(); - if (!stack.is(ModTags.Items.GUN)) return; - - int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack); - if (level > 0) { - player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level))); + DamageSource source = event.getAttackingPlayer().getLastDamageSource(); + if (source == null) return; + if (player.getVehicle() instanceof IVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) { + player.giveExperiencePoints(event.getDroppedExperience()); event.setCanceled(true); } + + ItemStack stack = player.getMainHandItem(); + if (stack.is(ModTags.Items.GUN)) { + int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack); + if (level > 0) { + player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level))); + event.setCanceled(true); + } + } } public static void handlePlayerBeamReset(Player player) { diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java index a6853b35a..fcb02304b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java @@ -1,8 +1,8 @@ package com.atsuishio.superbwarfare.init; +import com.atsuishio.superbwarfare.ModUtils; import com.google.common.collect.ImmutableSet; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import com.atsuishio.superbwarfare.ModUtils; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.ai.village.poi.PoiType; @@ -56,6 +56,8 @@ public class ModVillagers { new ItemStack(ModItems.SNIPER_AMMO.get(), 2), 16, 1, 0.05f)); 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)); trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HANDGUN_AMMO.get(), 8), new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); @@ -65,6 +67,8 @@ public class ModVillagers { new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); 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)); // 等级 2 交易 trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10), @@ -204,6 +208,8 @@ public class ModVillagers { new ItemStack(ModItems.DEVOTION_BLUEPRINT.get()), 10, 30, 0.05f)); trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 64), new ItemStack(ModItems.QBZ_95_BLUEPRINT.get()), 10, 30, 0.05f)); + trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 64), + new ItemStack(ModItems.AK_12_BLUEPRINT.get()), 10, 30, 0.05f)); trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 16), new ItemStack(ModItems.HE_5_INCHES.get(), 1), 8, 10, 0.05f));