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

[1.16.5] NullPointerException on player respawn


mclich
 Share

Recommended Posts

I have an item (basically totem), that will teleport player to its spawnpoint after fell in void. I use PlayerList#respawn method to teleport player back, but it throws NullPointerException. The code is below:

private void activateTotem(World world, ServerPlayerEntity player, ItemStack itemStack)
{
	player.fallDistance=0F;
	ItemStack totem=itemStack.copy();
	Minecraft minecraft=Minecraft.getInstance();
	if(world.dimension()==World.END) player.moveTo(100.5F, 49F, 0.5F);
	else player=world.getServer().getPlayerList().respawn(player, false);
	if(minecraft.gameMode.getPlayerMode().isSurvival()) itemStack.shrink(1);
	DistExecutor.unsafeRunWhenOn(Dist.CLIENT, ()->()->minecraft.gameRenderer.displayItemActivation(totem));
	minecraft.particleEngine.createTrackingEmitter(player, ParticleTypes.PORTAL, 40);
	world.playSound((PlayerEntity)null, player.blockPosition(), SoundEvents.TOTEM_USE, SoundCategory.PLAYERS, 2F, 1F);
	player.playSound(SoundEvents.TOTEM_USE, 2F, 1F);
}

Is there any errors or am i just do something wrong?

Link to comment
Share on other sites

 

2 minutes ago, diesieben07 said:

This code will hard-crash on servers, the Minecraft class does not exist there.

Show the stacktrace of the exception.

 

[17:29:37] [Server thread/ERROR] [minecraft/MinecraftServer]: Encountered an unexpected exception
net.minecraft.crash.ReportedException: Ticking player
	at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:137) ~[forge:?] {re:classloading}
	at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:865) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:787) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.integrated.IntegratedServer.tickServer(IntegratedServer.java:78) ~[forge:?] {re:classloading,pl:runtimedistcleaner:A}
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:642) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:232) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_291] {}
Caused by: java.lang.NullPointerException
	at net.minecraft.world.server.TicketManager.removePlayer(TicketManager.java:227) ~[forge:?] {re:classloading}
	at net.minecraft.world.server.ChunkManager.updatePlayerStatus(ChunkManager.java:843) ~[forge:?] {re:classloading}
	at net.minecraft.world.server.ChunkManager.removeEntity(ChunkManager.java:982) ~[forge:?] {re:classloading}
	at net.minecraft.world.server.ServerChunkProvider.removeEntity(ServerChunkProvider.java:454) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.world.server.ServerWorld.removeEntityComplete(ServerWorld.java:905) ~[forge:?] {re:classloading}
	at net.minecraft.world.server.ServerWorld.removeEntity(ServerWorld.java:951) ~[forge:?] {re:classloading}
	at net.minecraft.world.server.ServerWorld.removePlayer(ServerWorld.java:968) ~[forge:?] {re:classloading}
	at net.minecraft.server.management.PlayerList.respawn(PlayerList.java:411) ~[forge:?] {re:classloading}
	at com.mclich.engmod.item.TotemOfAbyssItem.activateTotem(TotemOfAbyssItem.java:72) ~[?:?] {re:classloading}
	at com.mclich.engmod.item.TotemOfAbyssItem.inventoryTick(TotemOfAbyssItem.java:58) ~[?:?] {re:classloading}
	at net.minecraft.item.ItemStack.inventoryTick(ItemStack.java:434) ~[forge:?] {re:classloading,xf:fml:forge:filled_map.4,xf:fml:forge:itemstack}
	at net.minecraft.entity.player.PlayerInventory.tick(PlayerInventory.java:238) ~[forge:?] {re:classloading}
	at net.minecraft.entity.player.PlayerEntity.aiStep(PlayerEntity.java:487) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.entity.LivingEntity.tick(LivingEntity.java:2158) ~[forge:?] {re:classloading}
	at net.minecraft.entity.player.PlayerEntity.tick(PlayerEntity.java:223) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.entity.player.ServerPlayerEntity.doTick(ServerPlayerEntity.java:404) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.network.play.ServerPlayNetHandler.tick(ServerPlayNetHandler.java:207) ~[forge:?] {re:classloading}
	at net.minecraft.network.NetworkManager.tick(NetworkManager.java:226) ~[forge:?] {re:classloading}
	at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:134) ~[forge:?] {re:classloading}
	... 6 more
Edited by mclich
Link to comment
Share on other sites

5 minutes ago, diesieben07 said:

Honestly I have no idea.

So as i understand the exception occurs when game tries to delete player from the chunk, but can not find it there:

public void removePlayer(SectionPos p_219367_1_, ServerPlayerEntity p_219367_2_) {
      long i = p_219367_1_.chunk().toLong();
      ObjectSet<ServerPlayerEntity> objectset = this.playersPerChunk.get(i);
      objectset.remove(p_219367_2_);
      if (objectset.isEmpty()) {
         this.playersPerChunk.remove(i);
         this.naturalSpawnChunkCounter.update(i, Integer.MAX_VALUE, false);
         this.playerTicketManager.update(i, Integer.MAX_VALUE, false);
      }

   }

 objectset.remove(p_219367_2_) that line actually throws NullPointerException, am i right?

Edited by mclich
Link to comment
Share on other sites

On 10/17/2021 at 6:15 PM, diesieben07 said:

Yes.

Can you post a Git repo of your mod so I can debug this locally?

Sorry for not responding for a while. Here is my repo: https://github.com/mclich/ElderNorseGods.git
A little update: the strange thing is that even an exception occurs, player will be teleported to spawn point anyway, but after that player just cannot move, break blocks or do any other action. Main camera still moves, but it looks like it "stuck" inside players head

Edited by mclich
Link to comment
Share on other sites

The problem here is that you are calling respawn on the server, so the server does so. But the client doesn't have any idea of this happening yet (normally you only respawn when you are dead), so the client keeps sending position and look packets which the server cannot handle while in the process of respawning the player. I am not sure how to best do this.

Link to comment
Share on other sites

20 minutes ago, diesieben07 said:

I am not sure how to best do this.

do the same thing as vanilla in DeathScreen...?
i'm not sure if this would work, but the normal respawn logic is fired when you click the Respawn-Button in the DeathScreen
which is LocalPlayer#respawn, it will send a ServerboundClientCommandPacket with the respawn Action to the Server,
the handle methode on Server use the same code your are running (PlayerList#respawn), but with the missing data (position and look)

Link to comment
Share on other sites

35 minutes ago, Luis_ST said:

do the same thing as vanilla in DeathScreen...?
i'm not sure if this would work, but the normal respawn logic is fired when you click the Respawn-Button in the DeathScreen
which is LocalPlayer#respawn, it will send a ServerboundClientCommandPacket with the respawn Action to the Server,
the handle methode on Server use the same code your are running (PlayerList#respawn), but with the missing data (position and look)

I also tried it. Instead of 

world.getServer().getPlayerList().respawn(player, false)

i tried 

DistExecutor.unsafeRunWhenOn(Dist.CLIENT, ()->()->Minecraft.getInstance().player.respawn())

but it actually did nothing

Link to comment
Share on other sites

3 minutes ago, mclich said:

I also tried it. Instead of 

world.getServer().getPlayerList().respawn(player, false)

i tried 

DistExecutor.unsafeRunWhenOn(Dist.CLIENT, ()->()->Minecraft.getInstance().player.respawn())

but it actually did nothing

This is not what runWhenOn does! You are still on the server thread here, you must check that you are on the logical client side using World#isClientSide. Then you can use DistExecutor.

Link to comment
Share on other sites

3 minutes ago, diesieben07 said:

This is not what runWhenOn does! You are still on the server thread here, you must check that you are on the logical client side using World#isClientSide. Then you can use DistExecutor.

Oh, i thought DistExecutor.runWhenOn can be called not depending on logical side. Thanks for information, i'll try fix it

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Register your own IRecipeSerializer. It is registered like any other registry entry. However note that you should have as much as possible in the JSON. Don't just have a placeholder JSON file and then hardcode all the logic in code. That defeats the point of datapacks. You'll have to have your own repair recipe then (see above for how to make your own serializer) and override getRemainingItems. If the knife is your item, override hasContainerItem and getContainerItem in your Item class. If the knife is not your item, refer to the section about repairing. Use a GlobalLootModifier.
    • So, im kinda new to modding. Trying to make relatively complicated mod(as I see now, it breaks the api a little bit...), and faced into some problems, especially with crafting. I think I should tell a little bit about my mod, you actually can skip this part, but if you don't get something, i strongly suggest to read this part. The goal i'm chasing is to implement similar food mechanics to TFC classic(1.7.10) mechanics. In a nutshell, it's food with durrability, and when you eat, you consume as much as you need(like if you have a steak and 1 hunger, if you eat it, stake's potential wastes, in case of my mod, it shouldn't). That's it, that's already done(with little bugs thou, but done). Now I have to do crafting somehow, using that items and modify durability while crafting. And it doesn't seems to be easy.     And.. question 1 will be: is it possible to hardcode crafts in 1.16.5? I know.. it's kinda not beautifull, but I really hate the json system. I've made as much crafts as possible by using it, but now, when I need to implement some logic, it's such a headache.   2. This question is about repearing. I mean, placing two damaged items in recipe grid. If you add 2 8/10 items, you'll get just one 10/10 item, and nothing more. I'd like 6/10 item to apear in grid after crafting. 3. Also there should be a recipe for extracting seeds with knife(i don't like to loose knife and whole peace of crop after craft). 4. And the last one. Well, I should change drop of crops if it's broken by special tool. I know, it's possible to do it by adding harvest tools, but I can't modify vanilla crops(maybe only by reflection..). Seems like it's reasonable to use onBlockBroken event, or something like that, but I keep finding deprecated code examples in google, and it doesn't work for me. Maybe there is a better solution.   About crafts.. I tried to figure out how CraftSerializers works, and i think it might be a good solution for that crafting stuff. But don't understand how to bind the serializer to regular minecraft crafting. Tried to read ShapelessRecipe class, but don't understand what happens in mathes, so cant do any assumptions how should I modify it. 
    • IP: Play.EpicLandCraft.Com Version: Cualquiera
    • 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...
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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