优化ShootMessage相关调用
This commit is contained in:
parent
e8fe60b719
commit
229a1050ce
5 changed files with 55 additions and 29 deletions
|
@ -489,6 +489,12 @@ public abstract class GunItem extends Item implements CustomRendererItem {
|
||||||
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
|
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加服务端在开火时的额外行为
|
||||||
|
*/
|
||||||
|
public void onShoot(GunData data, Player player) {
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
private static void registerGunExtensions(RegisterClientExtensionsEvent event) {
|
private static void registerGunExtensions(RegisterClientExtensionsEvent event) {
|
||||||
for (var item : ModItems.GUNS.getEntries()) {
|
for (var item : ModItems.GUNS.getEntries()) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.item.ItemDisplayContext;
|
import net.minecraft.world.item.ItemDisplayContext;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
@ -160,6 +161,15 @@ public class M60Item extends GunItem implements GeoItem {
|
||||||
return FireMode.AUTO.flag;
|
return FireMode.AUTO.flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShoot(GunData data, Player player) {
|
||||||
|
super.onShoot(data, player);
|
||||||
|
|
||||||
|
if (data.ammo.get() <= 5) {
|
||||||
|
data.hideBulletChain.set(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
|
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
|
||||||
super.addReloadTimeBehavior(behaviors);
|
super.addReloadTimeBehavior(behaviors);
|
||||||
|
|
|
@ -9,10 +9,15 @@ import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||||
import com.atsuishio.superbwarfare.perk.Perk;
|
import com.atsuishio.superbwarfare.perk.Perk;
|
||||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||||
|
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.inventory.tooltip.TooltipComponent;
|
import net.minecraft.world.inventory.tooltip.TooltipComponent;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.item.ItemDisplayContext;
|
import net.minecraft.world.item.ItemDisplayContext;
|
||||||
|
@ -118,6 +123,19 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShoot(GunData data, Player player) {
|
||||||
|
super.onShoot(data, player);
|
||||||
|
|
||||||
|
var stack = data.stack();
|
||||||
|
stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> {
|
||||||
|
});
|
||||||
|
if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) {
|
||||||
|
ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y,
|
||||||
|
player.getZ() + 1.8 * player.getLookAngle().z, 30, 0.4, 0.4, 0.4, 0.005, true, serverPlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvailableFireModes() {
|
public int getAvailableFireModes() {
|
||||||
return FireMode.SEMI.flag;
|
return FireMode.SEMI.flag;
|
||||||
|
|
|
@ -15,6 +15,7 @@ import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.inventory.tooltip.TooltipComponent;
|
import net.minecraft.world.inventory.tooltip.TooltipComponent;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.item.ItemDisplayContext;
|
import net.minecraft.world.item.ItemDisplayContext;
|
||||||
|
@ -189,6 +190,16 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem
|
||||||
return FireMode.SEMI.flag;
|
return FireMode.SEMI.flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShoot(GunData data, Player player) {
|
||||||
|
super.onShoot(data, player);
|
||||||
|
|
||||||
|
var cap = data.stack.getCapability(Capabilities.EnergyStorage.ITEM);
|
||||||
|
if (cap != null) {
|
||||||
|
cap.extractEnergy(3000, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxEnergy() {
|
public int getMaxEnergy() {
|
||||||
return 24000;
|
return 24000;
|
||||||
|
|
|
@ -2,24 +2,23 @@ package com.atsuishio.superbwarfare.network.message.send;
|
||||||
|
|
||||||
import com.atsuishio.superbwarfare.Mod;
|
import com.atsuishio.superbwarfare.Mod;
|
||||||
import com.atsuishio.superbwarfare.event.GunEventHandler;
|
import com.atsuishio.superbwarfare.event.GunEventHandler;
|
||||||
import com.atsuishio.superbwarfare.init.*;
|
import com.atsuishio.superbwarfare.init.ModItems;
|
||||||
|
import com.atsuishio.superbwarfare.init.ModPerks;
|
||||||
|
import com.atsuishio.superbwarfare.init.ModSounds;
|
||||||
|
import com.atsuishio.superbwarfare.init.ModTags;
|
||||||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||||
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||||
import com.atsuishio.superbwarfare.perk.Perk;
|
import com.atsuishio.superbwarfare.perk.Perk;
|
||||||
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
||||||
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.SoundTool;
|
import com.atsuishio.superbwarfare.tools.SoundTool;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
|
||||||
import net.minecraft.network.codec.ByteBufCodecs;
|
import net.minecraft.network.codec.ByteBufCodecs;
|
||||||
import net.minecraft.network.codec.StreamCodec;
|
import net.minecraft.network.codec.StreamCodec;
|
||||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.neoforged.neoforge.capabilities.Capabilities;
|
|
||||||
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
@ -54,38 +53,23 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP
|
||||||
data.holdOpen.set(true);
|
data.holdOpen.set(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO 替换左轮判断方式
|
||||||
if (stack.is(ModTags.Items.REVOLVER)) {
|
if (stack.is(ModTags.Items.REVOLVER)) {
|
||||||
data.canImmediatelyShoot.set(true);
|
data.canImmediatelyShoot.set(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO 替换左轮判断方式
|
||||||
// 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态
|
// 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态
|
||||||
if (data.defaultActionTime() > 0 && data.ammo.get() > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) {
|
if (data.defaultActionTime() > 0 && data.ammo.get() > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) {
|
||||||
data.bolt.needed.set(true);
|
data.bolt.needed.set(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 调用事件
|
||||||
|
data.item.onShoot(data, player);
|
||||||
|
|
||||||
data.ammo.set(data.ammo.get() - 1);
|
data.ammo.set(data.ammo.get() - 1);
|
||||||
data.isEmpty.set(true);
|
data.isEmpty.set(true);
|
||||||
|
|
||||||
if (stack.getItem() == ModItems.M_60.get() && data.ammo.get() <= 5) {
|
|
||||||
data.hideBulletChain.set(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack.getItem() == ModItems.HOMEMADE_SHOTGUN.get()) {
|
|
||||||
stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> {
|
|
||||||
});
|
|
||||||
if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) {
|
|
||||||
ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y,
|
|
||||||
player.getZ() + 1.8 * player.getLookAngle().z, 30, 0.4, 0.4, 0.4, 0.005, true, serverPlayer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack.getItem() == ModItems.SENTINEL.get()) {
|
|
||||||
var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
|
|
||||||
if (cap != null) {
|
|
||||||
cap.extractEnergy(3000, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var perk = data.perk.get(Perk.Type.AMMO);
|
var perk = data.perk.get(Perk.Type.AMMO);
|
||||||
|
|
||||||
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
|
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
|
||||||
|
@ -95,9 +79,8 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP
|
||||||
GunEventHandler.playGunSounds(player, zoom);
|
GunEventHandler.playGunSounds(player, zoom);
|
||||||
}
|
}
|
||||||
} else if (stack.is(ModItems.MINIGUN.get())) {
|
} else if (stack.is(ModItems.MINIGUN.get())) {
|
||||||
var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch();
|
|
||||||
|
|
||||||
if (data.hasAmmo(player)) {
|
if (data.hasAmmo(player)) {
|
||||||
|
// TODO 替换为通用过热处理
|
||||||
tag.putDouble("heat", (tag.getDouble("heat") + 0.1));
|
tag.putDouble("heat", (tag.getDouble("heat") + 0.1));
|
||||||
if (tag.getDouble("heat") >= 50.5) {
|
if (tag.getDouble("heat") >= 50.5) {
|
||||||
tag.putDouble("overheat", 40);
|
tag.putDouble("overheat", 40);
|
||||||
|
@ -125,8 +108,6 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP
|
||||||
GunEventHandler.gunShoot(player, data, spared, false);
|
GunEventHandler.gunShoot(player, data, spared, false);
|
||||||
if (!InventoryTool.hasCreativeAmmoBox(player)) {
|
if (!InventoryTool.hasCreativeAmmoBox(player)) {
|
||||||
data.consumeAmmo(player, 1);
|
data.consumeAmmo(player, 1);
|
||||||
player.setData(ModAttachments.PLAYER_VARIABLE, cap);
|
|
||||||
cap.sync(player);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue