完成了成绩单
This commit is contained in:
parent
43dbb4c31d
commit
5140f3e0cd
5 changed files with 121 additions and 29 deletions
|
@ -2,10 +2,8 @@ package net.mcreator.superbwarfare.entity;
|
||||||
|
|
||||||
import net.mcreator.superbwarfare.ModUtils;
|
import net.mcreator.superbwarfare.ModUtils;
|
||||||
import net.mcreator.superbwarfare.block.BarbedWireBlock;
|
import net.mcreator.superbwarfare.block.BarbedWireBlock;
|
||||||
import net.mcreator.superbwarfare.init.ModDamageTypes;
|
import net.mcreator.superbwarfare.init.*;
|
||||||
import net.mcreator.superbwarfare.init.ModEntities;
|
import net.mcreator.superbwarfare.item.Transcript;
|
||||||
import net.mcreator.superbwarfare.init.ModParticleTypes;
|
|
||||||
import net.mcreator.superbwarfare.init.ModSounds;
|
|
||||||
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.tools.ExtendedEntityRayTraceResult;
|
import net.mcreator.superbwarfare.tools.ExtendedEntityRayTraceResult;
|
||||||
|
@ -16,6 +14,8 @@ import net.minecraft.core.Direction;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.network.protocol.game.ClientboundSoundPacket;
|
import net.minecraft.network.protocol.game.ClientboundSoundPacket;
|
||||||
|
@ -35,6 +35,7 @@ import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.MobType;
|
import net.minecraft.world.entity.MobType;
|
||||||
import net.minecraft.world.entity.monster.Monster;
|
import net.minecraft.world.entity.monster.Monster;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.ClipContext;
|
import net.minecraft.world.level.ClipContext;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.*;
|
import net.minecraft.world.level.block.*;
|
||||||
|
@ -55,8 +56,10 @@ import software.bernie.geckolib.util.GeckoLibUtil;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
@ -317,19 +320,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
if (state.getBlock() instanceof TargetBlock) {
|
if (state.getBlock() instanceof TargetBlock) {
|
||||||
int rings = getRings(blockHitResult, hitVec);
|
int rings = getRings(blockHitResult, hitVec);
|
||||||
double dis = shooter.position().distanceTo(hitVec);
|
double dis = shooter.position().distanceTo(hitVec);
|
||||||
|
recordHitScore(rings, dis);
|
||||||
if (shooter instanceof Player player) {
|
|
||||||
player.displayClientMessage(Component.literal(String.valueOf(rings))
|
|
||||||
.append(Component.translatable("des.superbwarfare.shoot.rings"))
|
|
||||||
.append(Component.literal(new DecimalFormat("##.#").format(dis) + "M")), false);
|
|
||||||
|
|
||||||
if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer splayer) {
|
|
||||||
var holder = rings == 10 ? Holder.direct(ModSounds.HEADSHOT.get()) : Holder.direct(ModSounds.INDICATION.get());
|
|
||||||
splayer.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong()));
|
|
||||||
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ClientIndicatorMessage(rings == 10 ? 1 : 0, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.onHitBlock(hitVec);
|
this.onHitBlock(hitVec);
|
||||||
|
@ -353,21 +344,63 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getRings(@NotNull BlockHitResult blockHitResult, @NotNull Vec3 hitVec) {
|
private static int getRings(@NotNull BlockHitResult blockHitResult, @NotNull Vec3 hitVec) {
|
||||||
Direction $$2 = blockHitResult.getDirection();
|
Direction direction = blockHitResult.getDirection();
|
||||||
double $$3 = Math.abs(Mth.frac(hitVec.x) - 0.5);
|
double x = Math.abs(Mth.frac(hitVec.x) - 0.5);
|
||||||
double $$4 = Math.abs(Mth.frac(hitVec.y) - 0.5);
|
double y = Math.abs(Mth.frac(hitVec.y) - 0.5);
|
||||||
double $$5 = Math.abs(Mth.frac(hitVec.z) - 0.5);
|
double z = Math.abs(Mth.frac(hitVec.z) - 0.5);
|
||||||
Direction.Axis $$6 = $$2.getAxis();
|
Direction.Axis axis = direction.getAxis();
|
||||||
double $$9;
|
double v;
|
||||||
if ($$6 == Direction.Axis.Y) {
|
if (axis == Direction.Axis.Y) {
|
||||||
$$9 = Math.max($$3, $$5);
|
v = Math.max(x, z);
|
||||||
} else if ($$6 == Direction.Axis.Z) {
|
} else if (axis == Direction.Axis.Z) {
|
||||||
$$9 = Math.max($$3, $$4);
|
v = Math.max(x, y);
|
||||||
} else {
|
} else {
|
||||||
$$9 = Math.max($$4, $$5);
|
v = Math.max(y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.max(1, Mth.ceil(10.0 * Mth.clamp((0.5 - $$9) / 0.5, 0.0, 1.0)));
|
return Math.max(1, Mth.ceil(10.0 * Mth.clamp((0.5 - v) / 0.5, 0.0, 1.0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void recordHitScore(int score, double distance) {
|
||||||
|
if (!(shooter instanceof Player player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.displayClientMessage(Component.literal(String.valueOf(score))
|
||||||
|
.append(Component.translatable("des.superbwarfare.shoot.rings"))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(distance) + "m")), false);
|
||||||
|
|
||||||
|
if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer serverPlayer) {
|
||||||
|
var holder = score == 10 ? Holder.direct(ModSounds.HEADSHOT.get()) : Holder.direct(ModSounds.INDICATION.get());
|
||||||
|
serverPlayer.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong()));
|
||||||
|
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ClientIndicatorMessage(score == 10 ? 1 : 0, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack stack = player.getOffhandItem();
|
||||||
|
if (stack.is(ModItems.TRANSCRIPT.get())) {
|
||||||
|
final int size = 10;
|
||||||
|
|
||||||
|
ListTag tags = stack.getOrCreateTag().getList(Transcript.TAG_SCORES, Tag.TAG_COMPOUND);
|
||||||
|
|
||||||
|
Queue<CompoundTag> queue = new ArrayDeque<>();
|
||||||
|
for (int i = 0; i < tags.size(); i++) {
|
||||||
|
queue.add(tags.getCompound(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
CompoundTag tag = new CompoundTag();
|
||||||
|
tag.putInt("Score", score);
|
||||||
|
tag.putDouble("Distance", distance);
|
||||||
|
queue.offer(tag);
|
||||||
|
|
||||||
|
while (queue.size() > size) {
|
||||||
|
queue.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
ListTag newTags = new ListTag();
|
||||||
|
newTags.addAll(queue);
|
||||||
|
|
||||||
|
stack.getOrCreateTag().put(Transcript.TAG_SCORES, newTags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onHitBlock(Vec3 location) {
|
protected void onHitBlock(Vec3 location) {
|
||||||
|
|
|
@ -120,6 +120,7 @@ public class ModItems {
|
||||||
public static final RegistryObject<Item> SCHEELITE = ITEMS.register("scheelite", () -> new Item(new Item.Properties()));
|
public static final RegistryObject<Item> SCHEELITE = ITEMS.register("scheelite", () -> new Item(new Item.Properties()));
|
||||||
public static final RegistryObject<Item> DOG_TAG = ITEMS.register("dog_tag", DogTag::new);
|
public static final RegistryObject<Item> DOG_TAG = ITEMS.register("dog_tag", DogTag::new);
|
||||||
public static final RegistryObject<Item> SHIELD_CELL = ITEMS.register("shield_cell", () -> new Item(new Item.Properties().rarity(Rarity.RARE)));
|
public static final RegistryObject<Item> SHIELD_CELL = ITEMS.register("shield_cell", () -> new Item(new Item.Properties().rarity(Rarity.RARE)));
|
||||||
|
public static final RegistryObject<Item> TRANSCRIPT = ITEMS.register("transcript", Transcript::new);
|
||||||
|
|
||||||
public static final RegistryObject<Item> TUNGSTEN_ROD = ITEMS.register("tungsten_rod", () -> new Item(new Item.Properties()));
|
public static final RegistryObject<Item> TUNGSTEN_ROD = ITEMS.register("tungsten_rod", () -> new Item(new Item.Properties()));
|
||||||
public static final RegistryObject<Item> IRON_BARREL = ITEMS.register("iron_barrel", () -> new Item(new Item.Properties()));
|
public static final RegistryObject<Item> IRON_BARREL = ITEMS.register("iron_barrel", () -> new Item(new Item.Properties()));
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package net.mcreator.superbwarfare.item;
|
||||||
|
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.nbt.Tag;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.TooltipFlag;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Transcript extends Item {
|
||||||
|
public static final String TAG_SCORES = "Scores";
|
||||||
|
|
||||||
|
public Transcript() {
|
||||||
|
super(new Properties().stacksTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void appendHoverText(ItemStack stack, @Nullable Level level, List<Component> tooltip, TooltipFlag pIsAdvanced) {
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.transcript").withStyle(ChatFormatting.GRAY));
|
||||||
|
addScoresText(stack, tooltip);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addScoresText(ItemStack stack, List<Component> tooltip) {
|
||||||
|
ListTag tags = stack.getOrCreateTag().getList(TAG_SCORES, Tag.TAG_COMPOUND);
|
||||||
|
|
||||||
|
int total = 0;
|
||||||
|
for (int i = 0; i < tags.size(); i++) {
|
||||||
|
CompoundTag tag = tags.getCompound(i);
|
||||||
|
|
||||||
|
int score = tag.getInt("Score");
|
||||||
|
total += score;
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.transcript.score").withStyle(ChatFormatting.GRAY)
|
||||||
|
.append(Component.literal(score + " ").withStyle(score == 10 ? ChatFormatting.GOLD : ChatFormatting.WHITE))
|
||||||
|
.append(Component.translatable("des.superbwarfare.transcript.distance").withStyle(ChatFormatting.GRAY))
|
||||||
|
.append(Component.literal(new DecimalFormat("##.#").format(tag.getDouble("Distance")) + "m").withStyle(ChatFormatting.WHITE)));
|
||||||
|
}
|
||||||
|
|
||||||
|
tooltip.add(Component.translatable("des.superbwarfare.transcript.total").withStyle(ChatFormatting.YELLOW)
|
||||||
|
.append(Component.literal(total + " ").withStyle(total == 100 ? ChatFormatting.GOLD : ChatFormatting.WHITE)));
|
||||||
|
}
|
||||||
|
}
|
|
@ -149,6 +149,11 @@
|
||||||
"item.superbwarfare.monitor": "Monitor",
|
"item.superbwarfare.monitor": "Monitor",
|
||||||
"item.superbwarfare.hand_grenade": "Hand Grenade",
|
"item.superbwarfare.hand_grenade": "Hand Grenade",
|
||||||
"item.superbwarfare.rgo_grenade": "RGO Grenade",
|
"item.superbwarfare.rgo_grenade": "RGO Grenade",
|
||||||
|
"item.superbwarfare.transcript": "Transcript",
|
||||||
|
"des.superbwarfare.transcript": "Recent 10 shooting records:",
|
||||||
|
"des.superbwarfare.transcript.score": "Score: ",
|
||||||
|
"des.superbwarfare.transcript.distance": "Distance: ",
|
||||||
|
"des.superbwarfare.transcript.total": "Total: ",
|
||||||
|
|
||||||
"attribute.superbwarfare.spread": "Spread",
|
"attribute.superbwarfare.spread": "Spread",
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,11 @@
|
||||||
"item.superbwarfare.monitor": "遥控器",
|
"item.superbwarfare.monitor": "遥控器",
|
||||||
"item.superbwarfare.hand_grenade": "M67手榴弹",
|
"item.superbwarfare.hand_grenade": "M67手榴弹",
|
||||||
"item.superbwarfare.rgo_grenade": "RGO手榴弹",
|
"item.superbwarfare.rgo_grenade": "RGO手榴弹",
|
||||||
|
"item.superbwarfare.transcript": "成绩单",
|
||||||
|
"des.superbwarfare.transcript": "最近10次的射击成绩:",
|
||||||
|
"des.superbwarfare.transcript.score": "环数:",
|
||||||
|
"des.superbwarfare.transcript.distance": "距离:",
|
||||||
|
"des.superbwarfare.transcript.total": "总环数:",
|
||||||
|
|
||||||
"attribute.superbwarfare.spread": "散布",
|
"attribute.superbwarfare.spread": "散布",
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue