Z0rdak / Yet-Another-World-Protector

Yet Another World Protector is a server-side protection mod which allows you to protect your creations against various different events/actions of players, mobs and the environment. It was inspired by the forge mod WorldProtector and the WorldGuard plugin.
https://www.curseforge.com/minecraft/mc-mods/yawp
GNU Affero General Public License v3.0
22 stars 9 forks source link

NPE on onPlayerUseToolSecondary #117

Closed namsic6460 closed 1 month ago

namsic6460 commented 3 months ago

Version: 0.0.4.0-beta1 Modpack: Craft To Exile 2 (v0.6.1)

I added this mod to modpack and encountered an NPE error. The modpack I am playing includes the Minecolonies mod, and there was an issue with the farmer AI. Upon investigation, I found that the problem was related to this mod.

As a temporary fix, I modified the code and built it, which resolved the issue. What I did was simply check if the event.getPlayer function returned null before entering the if statement of the event. If it was null, I just used return. I'm not sure if similar issues can occur with other events, but it seems like a good idea to fix this part for now.

https://github.com/Z0rdak/Yet-Another-World-Protector/blob/b2283324a3ba7e54152f7995bec9161e97942de9/src/main/java/de/z0rdak/yawp/handler/flags/PlayerFlagHandler.java#L494

Full Error Log [087월2024 01:51:23.615] [Server thread/WARN] [minecolonies/]: Statemachine for state PREPARING threw an exception: java.lang.NullPointerException: Cannot invoke "net.minecraft.world.entity.Entity.m_20193_()" because "entity" is null at de.z0rdak.yawp.handler.flags.HandlerUtil.getEntityDim(HandlerUtil.java:70) ~[yawp-1.20.1-0.0.4.0-beta1-forge.jar%23616!/:0.0.4.0-beta1] at de.z0rdak.yawp.handler.flags.PlayerFlagHandler.onPlayerUseToolSecondary(PlayerFlagHandler.java:492) ~[yawp-1.20.1-0.0.4.0-beta1-forge.jar%23616!/:0.0.4.0-beta1] at de.z0rdak.yawp.handler.flags.__PlayerFlagHandler_onPlayerUseToolSecondary_BlockToolModificationEvent.invoke(.dynamic) ~[yawp-1.20.1-0.0.4.0-beta1-forge.jar%23616!/:0.0.4.0-beta1] at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) ~[eventbus-6.0.5.jar%2352!/:?] at net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) ~[eventbus-6.0.5.jar%2352!/:?] at net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) ~[eventbus-6.0.5.jar%2352!/:?] at net.minecraftforge.event.ForgeEventFactory.onToolUse(ForgeEventFactory.java:429) ~[forge-1.20.1-47.2.18-universal.jar%23634!/:?] at net.minecraftforge.common.extensions.IForgeBlockState.getToolModifiedState(IForgeBlockState.java:661) ~[forge-1.20.1-47.2.18-universal.jar%23634!/:?] at com.minecolonies.core.entity.ai.workers.production.agriculture.EntityAIWorkFarmer.findHoeableSurface(EntityAIWorkFarmer.java:375) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.ai.workers.production.agriculture.EntityAIWorkFarmer.lambda$prepareForFarming$1(EntityAIWorkFarmer.java:268) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.ai.workers.production.agriculture.EntityAIWorkFarmer.checkIfShouldExecute(EntityAIWorkFarmer.java:312) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.ai.workers.production.agriculture.EntityAIWorkFarmer.prepareForFarming(EntityAIWorkFarmer.java:268) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicTransition.getNextState(BasicTransition.java:79) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicStateMachine.transitionToNext(BasicStateMachine.java:163) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicStateMachine.checkTransition(BasicStateMachine.java:149) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.checkTransition(TickRateStateMachine.java:126) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.tick(TickRateStateMachine.java:102) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.ai.workers.AbstractAISkeleton.tick(AbstractAISkeleton.java:63) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.ai.workers.CitizenAI.lambda$registerWorkAI$4(CitizenAI.java:97) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicTransition.getNextState(BasicTransition.java:79) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicStateMachine.transitionToNext(BasicStateMachine.java:163) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicStateMachine.checkTransition(BasicStateMachine.java:149) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.checkTransition(TickRateStateMachine.java:126) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.tick(TickRateStateMachine.java:102) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.citizen.EntityCitizen.lambda$new$11(EntityCitizen.java:303) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicTransition.checkCondition(BasicTransition.java:87) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.basestatemachine.BasicStateMachine.checkTransition(BasicStateMachine.java:138) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.checkTransition(TickRateStateMachine.java:126) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.ai.statemachine.tickratestatemachine.TickRateStateMachine.tick(TickRateStateMachine.java:102) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.api.entity.citizen.AbstractEntityCitizen.m_8107_(AbstractEntityCitizen.java:431) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at com.minecolonies.core.entity.citizen.EntityCitizen.m_8107_(EntityCitizen.java:717) ~[minecolonies-1.20.1-1.1.593-BETA.jar%23516!/:1.20.1-1.1.593-BETA] at net.minecraft.world.entity.LivingEntity.m_8119_(LivingEntity.java:2298) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.world.entity.Mob.m_8119_(Mob.java:337) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.level.ServerLevel.m_8647_(ServerLevel.java:693) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.world.level.Level.mixinextras$bridge$accept$143(Level.java) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at com.bawnorton.neruina.handler.TickHandler.safelyTickEntities(TickHandler.java:91) ~[neruina-forge-2.0.0-beta.10+1.20.1.jar%23529!/:?] at net.minecraft.world.level.Level.wrapOperation$bek000$catchTickingEntities$notTheCauseOfTickLag(Level.java:3040) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.world.level.Level.m_46653_(Level.java:479) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.level.ServerLevel.m_184063_(ServerLevel.java:343) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.world.level.entity.EntityTickList.m_156910_(EntityTickList.java:54) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.level.ServerLevel.m_8793_(ServerLevel.java:323) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:893) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:283) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:814) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:661) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23629!/:?] at java.lang.Thread.run(Thread.java:1583) ~[?:?] [087월2024 01:51:23.616] [Server thread/ERROR] [minecolonies/]: Pausing Citizen Will U. Fuentes (com.minecolonies.job.farmer) in colony:3 at BlockPos{x=-5235, y=74, z=4525} for 6400 Seconds because of error:

namsic6460 commented 3 months ago

image

Thodor12 commented 1 month ago

Hello, I'm one of the devs behind Minecolonies. We just had another report of this mod causing nullpointers on our code.

Like @namsic6460 above here mentioned nullability is important to consider, it's not for no reason that Forge marks the player argument as nullable because entities can programatically invoke this (or other events), our farmer uses this to check what blocks may be converted to farmland.

Preferably all event calls need a player nullability check as there's no guarantee the event is necessarily made by a player.

Z0rdak commented 1 month ago

Hey there, Thank you for the report @namsic6460 and thanks @Thodor12 for the additional context.

As a solo dev of this mod I was struggling to keep up with issues and bugs in the last time.

I am quite aware of the importance of null checks. It must have slipped through in the last update - I am sorry about that.

I try to fix this (and some other bugs) in the next few days.

I‘ll close this issue as soon as I am done so you’ll get notified, too.

Best regards Zordak

Z0rdak commented 1 month ago

I just released 0.0.4.0-beta2 for 1.20.1 for Forge which should fix this bug.

Edit: The patch for 1.16.5 and 1.18.2 will follow most likely tomorrow.