Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

GrigLog

Members
  • Posts

    30
  • Joined

  • Last visited

Recent Profile Visitors

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

GrigLog's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. What Im trying to do is to implement a "dash" mechanic on a Shift button. @SubscribeEvent public static void onEvent(InputEvent.KeyInputEvent event){ KeyBinding runBinding = Minecraft.getInstance().gameSettings.keyBindSprint; int key = event.getKey(); int runKey = runBinding.getKey().getKeyCode(); ClientPlayerEntity player = Minecraft.getInstance().player; if (key == runKey){ //some checks, and then: float yaw = player.rotationYaw; float x = -MathHelper.sin(yaw * 0.017453292F); float z = MathHelper.cos(yaw * 0.017453292F); double groundMotion = 5, airMotion = 2; if (player.isOnGround()) player.setMotion(new Vector3d(x * groundMotion, 0, z * groundMotion)); else player.setMotion(new Vector3d(x * airMotion, 0, z * airMotion)); } } And this code works. The problem is, it causes a lot of lag when the setMotion() is called - my fps drops from 60 to 50-40 and the dash movement looks discrete. I wonder why is it so and how it can be improved...
  2. Like this: -Xms128M -Xmx4096M This will limit RAM usage by 4 gb
  3. Im pretty sure you just need to limit your max RAM in java arguments
  4. Im sorry, there was a result actually - on server side capability got copied correctly, I just didn't see it from the game because its not synced. Now, how can I send that data to client? In which event?
  5. Well, thats exactly what Im struggling with. Ive also tried soulNew.setNbt(soul.getNbt()), but with no result The thing is, I actively use input events and I have to send player inputs to server somehow. I should probably make 2 separate capabilities (for mana and for inputs) later SoulCap class: public class SoulCap { public static int CATimerMax = 20; public static int dashWindowMax = 3; public static int dashCDMax = 20; public int parryTimer = 0; public int CATimer = 0; public int dashWindow = 0; public int dashCD = 0; public boolean justParried = false; public boolean rightClicked = false; public boolean leftClicked = false; public double mana = 0; public double maxMana = 10; public HashMap<String, Integer> usedKeyItems = new HashMap<>(); public boolean trySpendMana(double a) { if (mana >= a){ mana -= a; return true; } return false; } public void addMana(double a){ mana += a; if (mana > maxMana) mana = maxMana; } public CompoundNBT getNbt(){ CompoundNBT tag = new CompoundNBT(); tag.putInt("parryTimer", parryTimer); tag.putInt("CATimer", CATimer); tag.putBoolean("justParried", justParried); tag.putBoolean("rightClicked", rightClicked); tag.putBoolean("leftClicked", leftClicked); tag.putDouble("mana", mana); tag.putDouble("maxMana", maxMana); CompoundNBT keyItems = new CompoundNBT(); for (String s : usedKeyItems.keySet()){ keyItems.putInt(s, usedKeyItems.get(s)); } tag.put("usedKeyItems", keyItems); return tag; } public SoulCap setNbt(CompoundNBT nbt){ parryTimer = nbt.getInt("parryTimer"); CATimer= nbt.getInt("CATimer"); justParried = nbt.getBoolean("justParried"); rightClicked = nbt.getBoolean("rightClicked"); leftClicked = nbt.getBoolean("leftClicked"); mana = nbt.getDouble("mana"); maxMana = nbt.getDouble("maxMana"); CompoundNBT keyItems = nbt.getCompound("usedKeyItems"); for (String s : keyItems.keySet()){ usedKeyItems.put(s, keyItems.getInt(s)); } return this; } public static class SoulProvider implements ICapabilitySerializable<INBT> { @CapabilityInject(SoulCap.class) public static Capability<SoulCap> SOUL_CAP; private final LazyOptional<SoulCap> instance = LazyOptional.of(() -> new SoulCap()); @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } @Override public INBT serializeNBT() { return SOUL_CAP.getStorage().writeNBT(SOUL_CAP, this.instance.resolve().get(), null); } @Override public void deserializeNBT(INBT nbt) { SOUL_CAP.getStorage().readNBT(SOUL_CAP, this.instance.resolve().get(), null, nbt); } } public static class SoulStorage implements Capability.IStorage<SoulCap> { @Override public INBT writeNBT(Capability<SoulCap> capability, SoulCap soulCap, Direction side) { return soulCap.getNbt(); } @Override public void readNBT(Capability<SoulCap> capability, SoulCap soulCap, Direction side, INBT nbt) { soulCap.setNbt((CompoundNBT)nbt); } } }
  6. Forge 1.16.5-36.1.30. Docs say that PlayerEvent.Copy event is helpful for this, but I cant figure out what to do exactly. This is what I wrote and it doesnt work: EventHandler: @SubscribeEvent static void copyPlayerDataOnRespawn(PlayerEvent.Clone event){ SoulCap soul = SF.getSoul(event.getOriginal()); SoulCap soulNew = SF.getSoul(event.getPlayer()); soulNew = soul; SF.sendToClient((ServerPlayerEntity)event.getPlayer(), soulNew); } SF: public static SoulCap getSoul(PlayerEntity player){ return player.getCapability(SoulCap.SoulProvider.SOUL_CAP, null).resolve().orElse(null); } public static void sendToClient(ServerPlayerEntity player, SoulCap cap){ PacketSender.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new SoulPacket(cap)); } SoulPacket: static void handle(SoulPacket p, Supplier<NetworkEvent.Context> ctx){ ctx.get().enqueueWork(() -> { if (ctx.get().getDirection() == NetworkDirection.PLAY_TO_CLIENT) { ClientPlayerEntity player = Minecraft.getInstance().player; SoulCap cap = SF.getSoul(player); cap.setNbt(p.cap.getNbt()); if (cap.justParried) { player.stopActiveHand(); cap.justParried = false; } } else if (ctx.get().getDirection() == NetworkDirection.PLAY_TO_SERVER){ ServerPlayerEntity player = ctx.get().getSender(); SoulCap cap = SF.getSoul(player); cap.setNbt(p.cap.getNbt()); if (cap.justParried) { cap.justParried = false; } } }); ctx.get().setPacketHandled(true); } First of all, the sentToClient side can be easlily removed because at this point in code Minecraft.getInstance().player is still null. But I still have to sync sides somehow... And secondly, the capability is not actually getting copied. I guess its because in this case player.getCapability() only provides a copy of the asked capability, not an assignable reference. But there is no player.setCapability method... So what do I do?
  7. Ive made an armor model in Blockbench (just a bunch of random stripes), exported it as a .java object and binded a texture to it. The problem is, it is not rendered as it should, it just floats with the player. Model code (mostly generated by Blockbench): public class CustomArmorModel extends BipedModel<LivingEntity> { private final ModelRenderer Head; private final ModelRenderer Body; private final ModelRenderer RightArm; private final ModelRenderer LeftArm; private final ModelRenderer RightLeg; private final ModelRenderer LeftLeg; public CustomArmorModel() { super(1); textureWidth = 64; textureHeight = 64; Head = new ModelRenderer(this); Head.setRotationPoint(0.0F, 0.0F, 0.0F); Head.setTextureOffset(32, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, 0.5F, false); Body = new ModelRenderer(this); Body.setRotationPoint(0.0F, 0.0F, 0.0F); Body.setTextureOffset(16, 32).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, 0.25F, false); Body.setTextureOffset(0, 0).addBox(-1.0F, 2.0F, 3.0F, 1.0F, 1.0F, 1.0F, 0.0F, false); Body.setTextureOffset(40, 32).addBox(-8.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false); RightArm = new ModelRenderer(this); RightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); LeftArm = new ModelRenderer(this); LeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); LeftArm.setTextureOffset(48, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false); RightLeg = new ModelRenderer(this); RightLeg.setRotationPoint(-1.9F, 12.0F, 0.0F); RightLeg.setTextureOffset(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false); LeftLeg = new ModelRenderer(this); LeftLeg.setRotationPoint(1.9F, 12.0F, 0.0F); LeftLeg.setTextureOffset(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false); } @Override public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ Head.render(matrixStack, buffer, packedLight, packedOverlay); Body.render(matrixStack, buffer, packedLight, packedOverlay); RightArm.render(matrixStack, buffer, packedLight, packedOverlay); LeftArm.render(matrixStack, buffer, packedLight, packedOverlay); RightLeg.render(matrixStack, buffer, packedLight, packedOverlay); LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay); } } Whats wrong there? And are there other ways to make models, better than Blockbench?
  8. Yes, this time you were right. But how can I sync server with client now? I dont see any Event of (de)serialization
  9. Btw I obtain all Capabilities references in code like this: SoulCap cap = player.getCapability(SoulCap.SoulProvider.SOUL_CAP, null).resolve().get(); mb this one is incorrect?
  10. They are called, and they change the SoulProvider.instance and save it to nbt as intended. But looks like the player has some other instance of SoulProvider, which is never (de)serialized. I literally see maxMana=20 in debug and maxMana=10 in game.
  11. Ive made it like this, but nothing changed: public static class SoulProvider implements ICapabilitySerializable<INBT> { @CapabilityInject(SoulCap.class) public static Capability<SoulCap> SOUL_CAP; private final LazyOptional<SoulCap> instance = LazyOptional.of(() -> new SoulCap()); @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } @Override public INBT serializeNBT() { return SOUL_CAP.getStorage().writeNBT(SOUL_CAP, this.instance.resolve().get(), null); } @Override public void deserializeNBT(INBT nbt) { SOUL_CAP.getStorage().readNBT(SOUL_CAP, this.instance.resolve().get(), null, nbt); } }
×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.