Jump to content

TheDerpyParagon

Members
  • Posts

    19
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

TheDerpyParagon's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. Alright, I've fixed the issue and everything seems to be working correctly, thanks!
  2. So would I even need PlayerEvent#StartTracking if I don't want other players data?
  3. You are using @SubscribeEvent on the methods, do you have @EventBusSubscriber(bus = Bus.FORGE) on the class? Yes. @Mod.EventBusSubscriber(modid = TitanShiftersMod.MOD_ID, bus = Bus.FORGE) public class TitanTransformationControl { @Mod.EventBusSubscriber(modid = TitanShiftersMod.MOD_ID, bus = Bus.FORGE) public class EventHandler {
  4. as i can see you never add your Capability to the player using AttachCapabilitiesEvent I attach my capability to the player in my main class: @SubscribeEvent public static void onAttachCapabilities(AttachCapabilitiesEvent<Entity> event) { if (event.getObject() instanceof PlayerEntity) { event.addCapability(resourceLocation, new TitanShiftersProvider()); } }
  5. I tried to debug some of the points in the code where I need the client to get the NBT data from the server, and I figured out that none of them are working. For example, I tried to print out a line in the console with the StartTracking method: @SubscribeEvent public void onPlayerTracking(PlayerEvent.StartTracking event) { if(event.getTarget() instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity)event.getTarget(); ServerPlayerEntity target = (ServerPlayerEntity)event.getPlayer(); if(!player.getCommandSenderWorld().isClientSide()) { player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.PLAYER.with(() -> target), message); System.out.println("Tracking working!"); }); } } } Which didn't work. The line never got printed on any of the method I tried this on. I even got rid of the line where it checks if the player is in the server side, and that didn't work either. Maybe the player doesn't have the capability? The capability system has been working fine for me so far, however. Could you please provide a suggestion for how to fix this? I know I have to add an entity id in my message, but could you explain a bit more?
  6. I'm trying to sync player capabilities from server to client using packets. I've researched about this topic a lot, but man is it confusing. I'm trying to update the players data on the client side when the player logs in, respawns, and when they change dimension. I also do so with the event StartTracking. Here are those events: @SubscribeEvent public void onPlayerTracking(PlayerEvent.StartTracking event) { if(event.getTarget() instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity)event.getTarget(); ServerPlayerEntity target = (ServerPlayerEntity)event.getPlayer(); if(!player.getCommandSenderWorld().isClientSide()) { player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.PLAYER.with(() -> target), message); }); } } } @SubscribeEvent public void onPlayerLogin(PlayerLoggedInEvent event) { ServerPlayerEntity player = (ServerPlayerEntity)event.getPlayer(); if(!player.getCommandSenderWorld().isClientSide()) { player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.PLAYER.with(() -> player), message); }); } } @SubscribeEvent public void onPlayerRespawn(PlayerRespawnEvent event) { ServerPlayerEntity player = (ServerPlayerEntity)event.getPlayer(); if(!player.getCommandSenderWorld().isClientSide()) { player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.PLAYER.with(() -> player), message); }); } } @SubscribeEvent public void onPlayerChangeDimension(PlayerChangedDimensionEvent event) { ServerPlayerEntity player = (ServerPlayerEntity)event.getPlayer(); if(!player.getCommandSenderWorld().isClientSide()) { player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.PLAYER.with(() -> player), message); }); } } Here is the packet I am sending: public class ClientMessage { private CompoundNBT data; public ClientMessage(CompoundNBT d) { data = d; } public static void encode(ClientMessage message, PacketBuffer buffer) { buffer.writeNbt(message.data); } public static ClientMessage decode(PacketBuffer buffer) { return new ClientMessage(buffer.readNbt()); } public static void handle(ClientMessage message, Supplier<NetworkEvent.Context> supplier) { NetworkEvent.Context context = supplier.get(); context.enqueueWork(() -> { if(context.getDirection().getReceptionSide().isClient() && context.getDirection().getOriginationSide().isServer()) { @SuppressWarnings("resource") ClientPlayerEntity p = Minecraft.getInstance().player; p.getEntity().getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { Capability.IStorage<ITitanShifters> storage = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY.getStorage(); storage.readNBT(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY, capability, TitanShiftersMod.direction, message.data); }); } }); context.setPacketHandled(true); } } Here is my network class: (I made two networks for sending packets to server and to client) public class TitanShiftersNetwork { private static int id = 0; public static final String NETWORK_VERSION = "0.1.0"; private static ResourceLocation loc = new ResourceLocation(TitanShiftersMod.MOD_ID, "network"); private static ResourceLocation Clientloc = new ResourceLocation(TitanShiftersMod.MOD_ID, "networkclient"); public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(loc, () -> NETWORK_VERSION, version -> version.equals(NETWORK_VERSION), version -> version.equals(NETWORK_VERSION)); public static final SimpleChannel CLIENTCHANNEL = NetworkRegistry.ChannelBuilder.named(Clientloc).clientAcceptedVersions(s -> Objects.equals(s, "1")) .serverAcceptedVersions(s -> Objects.equals(s, "1")).networkProtocolVersion(() -> "1").simpleChannel(); public static void init() { CHANNEL.registerMessage(0, InputMessage.class, InputMessage::encode, InputMessage::decode, InputMessage::handle); CLIENTCHANNEL.messageBuilder(ClientMessage.class, id++).decoder(ClientMessage::decode).encoder(ClientMessage::encode).consumer(ClientMessage::handle).add(); } } Here is where the Init() method is being called: @SubscribeEvent public void commonSetup(final FMLCommonSetupEvent event) { TitanShiftersNetwork.init(); } And here is where I am trying to update the data on the client side: public static void InheritAttack(PlayerEntity player) { LazyOptional<ITitanShifters> titan = player.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY, TitanShiftersMod.direction); ITitanShifters titanShifter = titan.orElse(new TitanShifters()); TitanShiftersStats.setAttackTitan(true, player); pureUnshift(player); System.out.println(player.getScoreboardName() + " is pure titan: " + titanShifter.getPureTitan().toString()); ServerPlayerEntity p = (ServerPlayerEntity)player; if(!p.getCommandSenderWorld().isClientSide()) { p.getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY).ifPresent(capability -> { CompoundNBT nbt = new CompoundNBT(); Capability<ITitanShifters> cap = TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY; Capability.IStorage<ITitanShifters> storage = cap.getStorage(); nbt.put(cap.getName(), storage.writeNBT(cap, capability, TitanShiftersMod.direction)); ClientMessage message = new ClientMessage(nbt); TitanShiftersNetwork.CLIENTCHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> p), message); }); } System.out.println(player.getScoreboardName() + " has inherited the attack titan!"); } Rest of the code is here: https://github.com/TheDerpyParagon/TitanShiftersMod Any help is much appreciated!
  7. Thanks for the suggestion, I’ll try it out when I can.
  8. Thanks for the reply. How would I read and write the entity? I remember only having the methods of readint or writeint, readfloat or writefloat, etc. (only primal variables) how would I go about doing this but with an entity?
  9. That's probably it. I've never used packets before, so I am not very familiar with how they work. Here's my network: public class TitanShiftersNetwork { public static final String NETWORK_VERSION = "0.1.0"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(TitanShiftersMod.MOD_ID, "network"), () -> NETWORK_VERSION, version -> version.equals(NETWORK_VERSION), version -> version.equals(NETWORK_VERSION)); public static void init() { CHANNEL.registerMessage(0, InputMessage.class, InputMessage::encode, InputMessage::decode, InputMessage::handle); } } And here's my Input Message: public class InputMessage { private static Entity entity; public InputMessage() { } public InputMessage(Entity e) { entity = e; } public static void encode(InputMessage message, PacketBuffer buffer) { } public static InputMessage decode(PacketBuffer buffer) { return new InputMessage(entity); } public static void handle(InputMessage message, Supplier<NetworkEvent.Context> contextSupplier) { NetworkEvent.Context context = contextSupplier.get(); context.enqueueWork(() -> { ServerPlayerEntity player = context.getSender(); player.attack(entity); System.out.println("Working!"); }); context.setPacketHandled(true); } } And here's how I send a packet through to the server: TitanShiftersNetwork.CHANNEL.sendToServer(new InputMessage(t.getEntity())); This packet prints out the "Working!" line into the console, but does not attack the entity. Any help is much appreciated, thanks!
  10. I am creating a mod in which I need to extend the attack reach of the player without the player using an item like a sword. I got an amazing EntityRayTraceResult variable from someone on the forums, and that is what you can see in the middle of my code. The RayTraceResult gets the entity successfully, and it is printed in the console, but I am having trouble getting the player to actually attack the entity. @EventBusSubscriber(modid = TitanShiftersMod.MOD_ID, bus = Bus.FORGE) public class EntityReachExtender { private static double range; public static void setEntityRange(double r) { range = r * 80; } public static double getEntityRange() { return range; } public static EntityRayTraceResult getPlayerPOVHitResult(PlayerEntity player) { float playerRotX = player.xRot; float playerRotY = player.yRot; Vector3d startPos = player.getEyePosition(1); float f2 = (float) Math.cos(-playerRotY * ((float)Math.PI / 180F) - (float)Math.PI); float f3 = (float) Math.sin(-playerRotY * ((float)Math.PI / 180F) - (float)Math.PI); float f4 = (float) -Math.cos(-playerRotX * ((float)Math.PI / 180F)); float additionY = (float) Math.sin(-playerRotX * ((float)Math.PI / 180F)); float additionX = f3 * f4; float additionZ = f2 * f4; double d0 = range; Vector3d endVec = startPos.add((double)additionX * d0, (double)additionY * d0, (double)additionZ * d0); AxisAlignedBB startEndBox = new AxisAlignedBB(startPos, endVec); Entity entity = null; for(Entity entity1 : player.level.getEntities(player, startEndBox, (val) -> true)) { AxisAlignedBB aabb = entity1.getBoundingBox().inflate(entity1.getPickRadius()); Optional<Vector3d> optional = aabb.clip(startPos, endVec); if (aabb.contains(startPos)) { if (d0 >= 0.0D) { entity = entity1; startPos = optional.orElse(startPos); d0 = 0.0D; } } else if (optional.isPresent()) { Vector3d vec31 = optional.get(); double d1 = startPos.distanceToSqr(vec31); if (d1 < d0 || d0 == 0.0D) { if (entity1.getRootVehicle() == player.getRootVehicle() && !entity1.canRiderInteract()) { if (d0 == 0.0D) { entity = entity1; startPos = vec31; } } else { entity = entity1; startPos = vec31; d0 = d1; } } } } return (entity == null) ? null:new EntityRayTraceResult(entity); } @SubscribeEvent public void entityReach(LeftClickEmpty event) { LazyOptional<ITitanShifters> titan = event.getPlayer().getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY, TitanShiftersMod.direction); ITitanShifters titanShifter = titan.orElse(new TitanShifters()); EntityRayTraceResult t = getPlayerPOVHitResult(event.getPlayer()); if(titanShifter.getPureTitan()) { if(t != null) { if(t.getEntity() != null) { System.out.println(t.getEntity()); event.getPlayer().attack(t.getEntity()); } } } } } The entity gets printed out successfully, but the entity does not get damaged. I have tried using a packet to make the player attack the entity on the server side, but that did not work. I got the same results as I am getting with this code.
  11. Thanks, everything seems to be working great now.
  12. The reason I have structured my mod like this is because when I first got into modding, which wasn't too long ago, I watched a tutorial to get started, and the person in the tutorial structured their mod like that, so that's just what I've been doing. What you said does make more sense to me, though, so I'll change up my structure to make more sense. As for the client package, I'm going to keep my PlayerSizeControl class in common because yes, there are client-sided things in the class like the renderPlayerEvent events, but there are other things that are non-client-sided like EntityEvent.size. I'm pretty sure client-sided means just rendering, correct? Thanks, it would've taken me a long time to notice that I didn't assign any value to the pureTitan Boolean in my constructor. I'll also change my resource location to have no capitals.
  13. Wow, thank you so much for all of this help. I'm gonna be pretty busy today, so I'll get back to you tonight. Again, thank you very much for all this help.
  14. Sure thing. https://github.com/TheDerpyParagon/TitanShiftersMod
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.