diff --git a/src/main/java/net/mcreator/target/command/PvPmodeCommand.java b/src/main/java/net/mcreator/target/command/PvPmodeCommand.java new file mode 100644 index 000000000..c07f94f0b --- /dev/null +++ b/src/main/java/net/mcreator/target/command/PvPmodeCommand.java @@ -0,0 +1,55 @@ + +package net.mcreator.target.command; + +import org.checkerframework.checker.units.qual.s; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.common.util.FakePlayerFactory; + +import net.minecraft.world.level.Level; +import net.minecraft.world.entity.Entity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.Direction; +import net.minecraft.commands.Commands; +import net.minecraft.world.entity.player.Player; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.LevelAccessor; + +import net.mcreator.target.network.TargetModVariables; + +@Mod.EventBusSubscriber +public class PvPmodeCommand { + @SubscribeEvent + public static void registerCommand(RegisterCommandsEvent event) { + event.getDispatcher().register(Commands.literal("target:pvpmode").requires(s -> s.hasPermission(4)).executes(arguments -> { + Level world = arguments.getSource().getUnsidedLevel(); + double x = arguments.getSource().getPosition().x(); + double y = arguments.getSource().getPosition().y(); + double z = arguments.getSource().getPosition().z(); + Entity entity = arguments.getSource().getEntity(); + if (entity == null && world instanceof ServerLevel _servLevel) + entity = FakePlayerFactory.getMinecraft(_servLevel); + Direction direction = Direction.DOWN; + if (entity != null) + direction = entity.getDirection(); + + if (TargetModVariables.MapVariables.get(world).pvpmode == true) { + TargetModVariables.MapVariables.get(world).pvpmode = false; + TargetModVariables.MapVariables.get(world).syncData(world); + if (entity instanceof Player _player && !_player.level().isClientSide()) + _player.displayClientMessage(Component.literal("PVPMODE:OFF"), false); + + } else { + TargetModVariables.MapVariables.get(world).pvpmode = true; + TargetModVariables.MapVariables.get(world).syncData(world); + if (entity instanceof Player _player && !_player.level().isClientSide()) + _player.displayClientMessage(Component.literal("PVPMODE:ON"), false); + + } + return 0; + })); + } +} diff --git a/src/main/java/net/mcreator/target/network/TargetModVariables.java b/src/main/java/net/mcreator/target/network/TargetModVariables.java index 165a184c2..060af6a8b 100644 --- a/src/main/java/net/mcreator/target/network/TargetModVariables.java +++ b/src/main/java/net/mcreator/target/network/TargetModVariables.java @@ -1,33 +1,45 @@ package net.mcreator.target.network; -import net.mcreator.target.TargetMod; -import net.minecraft.client.Minecraft; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.capabilities.*; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.Capability; + +import net.minecraft.world.level.saveddata.SavedData; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.Level; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.Entity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.nbt.Tag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.Direction; +import net.minecraft.client.Minecraft; + +import net.mcreator.target.TargetMod; -import java.util.ArrayList; import java.util.function.Supplier; +import java.util.ArrayList; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class TargetModVariables { @SubscribeEvent public static void init(FMLCommonSetupEvent event) { + TargetMod.addNetworkMessage(SavedDataSyncMessage.class, SavedDataSyncMessage::buffer, SavedDataSyncMessage::new, SavedDataSyncMessage::handler); TargetMod.addNetworkMessage(PlayerVariablesSyncMessage.class, PlayerVariablesSyncMessage::buffer, PlayerVariablesSyncMessage::new, PlayerVariablesSyncMessage::handler); } @@ -42,7 +54,7 @@ public class TargetModVariables { public static void onPlayerLoggedInSyncPlayerVariables(PlayerEvent.PlayerLoggedInEvent event) { if (!event.getEntity().level().isClientSide()) { for (Entity entityiterator : new ArrayList<>(event.getEntity().level().players())) { - entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entityiterator); + ((PlayerVariables) entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())).syncPlayerVariables(entityiterator); } } } @@ -51,7 +63,7 @@ public class TargetModVariables { public static void onPlayerRespawnedSyncPlayerVariables(PlayerEvent.PlayerRespawnEvent event) { if (!event.getEntity().level().isClientSide()) { for (Entity entityiterator : new ArrayList<>(event.getEntity().level().players())) { - entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entityiterator); + ((PlayerVariables) entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())).syncPlayerVariables(entityiterator); } } } @@ -60,7 +72,7 @@ public class TargetModVariables { public static void onPlayerChangedDimensionSyncPlayerVariables(PlayerEvent.PlayerChangedDimensionEvent event) { if (!event.getEntity().level().isClientSide()) { for (Entity entityiterator : new ArrayList<>(event.getEntity().level().players())) { - entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entityiterator); + ((PlayerVariables) entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())).syncPlayerVariables(entityiterator); } } } @@ -68,8 +80,8 @@ public class TargetModVariables { @SubscribeEvent public static void clonePlayer(PlayerEvent.Clone event) { event.getOriginal().revive(); - PlayerVariables original = event.getOriginal().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()); - PlayerVariables clone = event.getEntity().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()); + PlayerVariables original = ((PlayerVariables) event.getOriginal().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())); + PlayerVariables clone = ((PlayerVariables) event.getEntity().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())); clone.zoom = original.zoom; clone.zooming = original.zooming; clone.recoil = original.recoil; @@ -91,10 +103,143 @@ public class TargetModVariables { } if (!event.getEntity().level().isClientSide()) { for (Entity entityiterator : new ArrayList<>(event.getEntity().level().players())) { - entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entityiterator); + ((PlayerVariables) entityiterator.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())).syncPlayerVariables(entityiterator); } } } + + @SubscribeEvent + public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + if (!event.getEntity().level().isClientSide()) { + SavedData mapdata = MapVariables.get(event.getEntity().level()); + SavedData worlddata = WorldVariables.get(event.getEntity().level()); + if (mapdata != null) + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getEntity()), new SavedDataSyncMessage(0, mapdata)); + if (worlddata != null) + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getEntity()), new SavedDataSyncMessage(1, worlddata)); + } + } + + @SubscribeEvent + public static void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) { + if (!event.getEntity().level().isClientSide()) { + SavedData worlddata = WorldVariables.get(event.getEntity().level()); + if (worlddata != null) + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getEntity()), new SavedDataSyncMessage(1, worlddata)); + } + } + } + + public static class WorldVariables extends SavedData { + public static final String DATA_NAME = "target_worldvars"; + + public static WorldVariables load(CompoundTag tag) { + WorldVariables data = new WorldVariables(); + data.read(tag); + return data; + } + + public void read(CompoundTag nbt) { + } + + @Override + public CompoundTag save(CompoundTag nbt) { + return nbt; + } + + public void syncData(LevelAccessor world) { + this.setDirty(); + if (world instanceof Level level && !level.isClientSide()) + TargetMod.PACKET_HANDLER.send(PacketDistributor.DIMENSION.with(level::dimension), new SavedDataSyncMessage(1, this)); + } + + static WorldVariables clientSide = new WorldVariables(); + + public static WorldVariables get(LevelAccessor world) { + if (world instanceof ServerLevel level) { + return level.getDataStorage().computeIfAbsent(e -> WorldVariables.load(e), WorldVariables::new, DATA_NAME); + } else { + return clientSide; + } + } + } + + public static class MapVariables extends SavedData { + public static final String DATA_NAME = "target_mapvars"; + public boolean pvpmode = false; + + public static MapVariables load(CompoundTag tag) { + MapVariables data = new MapVariables(); + data.read(tag); + return data; + } + + public void read(CompoundTag nbt) { + pvpmode = nbt.getBoolean("pvpmode"); + } + + @Override + public CompoundTag save(CompoundTag nbt) { + nbt.putBoolean("pvpmode", pvpmode); + return nbt; + } + + public void syncData(LevelAccessor world) { + this.setDirty(); + if (world instanceof Level && !world.isClientSide()) + TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this)); + } + + static MapVariables clientSide = new MapVariables(); + + public static MapVariables get(LevelAccessor world) { + if (world instanceof ServerLevelAccessor serverLevelAcc) { + return serverLevelAcc.getLevel().getServer().getLevel(Level.OVERWORLD).getDataStorage().computeIfAbsent(e -> MapVariables.load(e), MapVariables::new, DATA_NAME); + } else { + return clientSide; + } + } + } + + public static class SavedDataSyncMessage { + private final int type; + private SavedData data; + + public SavedDataSyncMessage(FriendlyByteBuf buffer) { + this.type = buffer.readInt(); + CompoundTag nbt = buffer.readNbt(); + if (nbt != null) { + this.data = this.type == 0 ? new MapVariables() : new WorldVariables(); + if (this.data instanceof MapVariables mapVariables) + mapVariables.read(nbt); + else if (this.data instanceof WorldVariables worldVariables) + worldVariables.read(nbt); + } + } + + public SavedDataSyncMessage(int type, SavedData data) { + this.type = type; + this.data = data; + } + + public static void buffer(SavedDataSyncMessage message, FriendlyByteBuf buffer) { + buffer.writeInt(message.type); + if (message.data != null) + buffer.writeNbt(message.data.save(new CompoundTag())); + } + + public static void handler(SavedDataSyncMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (!context.getDirection().getReceptionSide().isServer() && message.data != null) { + if (message.type == 0) + MapVariables.clientSide = (MapVariables) message.data; + else + WorldVariables.clientSide = (WorldVariables) message.data; + } + }); + context.setPacketHandled(true); + } } public static final Capability PLAYER_VARIABLES_CAPABILITY = CapabilityManager.get(new CapabilityToken() { @@ -147,7 +292,7 @@ public class TargetModVariables { public double killind = 0; public void syncPlayerVariables(Entity entity) { - if (entity instanceof ServerPlayer) + if (entity instanceof ServerPlayer serverPlayer) TargetMod.PACKET_HANDLER.send(PacketDistributor.DIMENSION.with(entity.level()::dimension), new PlayerVariablesSyncMessage(this, entity.getId())); } @@ -224,7 +369,7 @@ public class TargetModVariables { NetworkEvent.Context context = contextSupplier.get(); context.enqueueWork(() -> { if (!context.getDirection().getReceptionSide().isServer()) { - PlayerVariables variables = Minecraft.getInstance().player.level().getEntity(message.target).getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()); + PlayerVariables variables = ((PlayerVariables) Minecraft.getInstance().player.level().getEntity(message.target).getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())); variables.zoom = message.data.zoom; variables.zooming = message.data.zooming; variables.recoil = message.data.recoil; diff --git a/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java b/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java index 7ac546853..242a10e47 100644 --- a/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java +++ b/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java @@ -46,7 +46,7 @@ public class BulletFireNormalProcedure { ProjectileEntity projectile = new ProjectileEntity(entity.level(), living, damage, headshot); projectile.setPos((living.getX() + (-0.5) * living.getLookAngle().x), (living.getEyeY() - 0.1 + (-0.5) * living.getLookAngle().y), (living.getZ() + (-0.5) * living.getLookAngle().z)); - projectile.shoot(living.getLookAngle().x, living.getLookAngle().y, living.getLookAngle().z, velocity, 2.5f); + projectile.shoot(living.getLookAngle().x, living.getLookAngle().y, living.getLookAngle().z,3 * (float) heldItem.getOrCreateTag().getDouble("speed"), 2.5f); entity.level().addFreshEntity(projectile); } else { @@ -56,7 +56,7 @@ public class BulletFireNormalProcedure { ProjectileEntity projectile = new ProjectileEntity(entity.level(), living, damage, headshot); projectile.setPos((living.getX() + (-0.5) * living.getLookAngle().x), (living.getEyeY() - 0.1 + (-0.5) * living.getLookAngle().y), (living.getZ() + (-0.5) * living.getLookAngle().z)); - projectile.shoot(living.getLookAngle().x, living.getLookAngle().y, living.getLookAngle().z, (float) heldItem.getOrCreateTag().getDouble("velocity"), + projectile.shoot(living.getLookAngle().x, living.getLookAngle().y, living.getLookAngle().z,3 * (float) heldItem.getOrCreateTag().getDouble("velocity"), (float) living.getAttribute(TargetModAttributes.SPREAD.get()).getBaseValue()); entity.level().addFreshEntity(projectile); } diff --git a/src/main/java/net/mcreator/target/procedures/GunsDataProcedure.java b/src/main/java/net/mcreator/target/procedures/GunsDataProcedure.java index 1704fd109..51b52c06c 100644 --- a/src/main/java/net/mcreator/target/procedures/GunsDataProcedure.java +++ b/src/main/java/net/mcreator/target/procedures/GunsDataProcedure.java @@ -12,6 +12,8 @@ import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.mcreator.target.network.TargetModVariables; + import javax.annotation.Nullable; @@ -35,11 +37,17 @@ public class GunsDataProcedure { itemstackiterator = (entity instanceof LivingEntity _livEnt ? _livEnt.getMainHandItem() : ItemStack.EMPTY); if (itemstackiterator.is(ItemTags.create(new ResourceLocation("target:gun")))) { - if (itemstackiterator.getOrCreateTag().getDouble("level") >= 10) { - itemstackiterator.getOrCreateTag().putDouble("damageadd", 1 + 0.05 * (itemstackiterator.getOrCreateTag().getDouble("level") - 10)); + + if (TargetModVariables.MapVariables.get(world).pvpmode == false) { + if (itemstackiterator.getOrCreateTag().getDouble("level") >= 10) { + itemstackiterator.getOrCreateTag().putDouble("damageadd", 1 + 0.05 * (itemstackiterator.getOrCreateTag().getDouble("level") - 10)); + } else { + itemstackiterator.getOrCreateTag().putDouble("damageadd", 1); + } } else { itemstackiterator.getOrCreateTag().putDouble("damageadd", 1); } + if (itemstackiterator.getItem() == TargetModItems.SKS.get()) { itemstackiterator.getOrCreateTag().putDouble("zoomspeed", 1); itemstackiterator.getOrCreateTag().putDouble("zoom", 1.25);