(Forge 1.16.5) Не понимаю, почему крашает

Версия Minecraft
1.16.5
API
Forge
Всем здравствуйте! Столкнулся со следующей проблемой: я захотел сделать шарик, который, достигая кого-то живого, хилит человека, который этот шарик закастил, но при попытке захилить - игра крашает
Вот код шарика:
Java:
package com.painwizzard.magical.entities;

import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.DamagingProjectileEntity;
import net.minecraft.network.IPacket;
import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.DamageSource;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks;

public class VampireBall extends DamagingProjectileEntity {
    private LivingEntity caster = null;
    public IPacket<?> getAddEntityPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }
    protected VampireBall(EntityType<? extends DamagingProjectileEntity> p_i50173_1_, World p_i50173_2_) {
        super(p_i50173_1_, p_i50173_2_);
    }

    public VampireBall(EntityType<? extends DamagingProjectileEntity> pEntityType, double pX, double pY, double pZ, double pOffsetX, double pOffsetY, double pOffsetZ, World pLevel) {
        super(pEntityType, pX, pY, pZ, pOffsetX, pOffsetY, pOffsetZ, pLevel);
    }

    public VampireBall(EntityType<? extends DamagingProjectileEntity> pEntityType, LivingEntity pShooter, double pOffsetX, double pOffsetY, double pOffsetZ, World pLevel) {
        super(pEntityType, pShooter, pOffsetX, pOffsetY, pOffsetZ, pLevel);
        caster = pShooter;
    }

    @Override
    protected void onHitEntity(EntityRayTraceResult pResult) {
        this.remove();
        if (pResult.getEntity() instanceof LivingEntity) {
            World world = this.level;
            LivingEntity entity = (LivingEntity) pResult.getEntity();
            entity.hurt(DamageSource.MAGIC, 4);
            caster.heal(2.0f);
        }
        super.onHitEntity(pResult);
    }

    @Override
    protected boolean shouldBurn() {
        return false;
    }

    @Override
    protected float getInertia() {
        return 1.0f;
    }

    @Override
    protected IParticleData getTrailParticle() {
        return ParticleTypes.ENCHANT;
    }

    @Override
    protected void onHitBlock(BlockRayTraceResult pResult) {
        this.remove();
        super.onHitBlock(pResult);
    }
}
 
Краш-лог
---- Minecraft Crash Report ----
// I bet Cylons wouldn't have this problem.

Time: 09.03.24 9:31
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
at com.painwizzard.magical.entities.VampireBall.onHitEntity(VampireBall.java:45) ~[main/:?] {re:classloading}
at net.minecraft.entity.projectile.ProjectileEntity.onHit(ProjectileEntity.java:121) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraft.entity.projectile.DamagingProjectileEntity.tick(DamagingProjectileEntity.java:78) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraft.client.world.ClientWorld.tickNonPassenger(ClientWorld.java:199) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.world.World.guardEntityTick(World.java:591) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.client.world.ClientWorld.tickEntities(ClientWorld.java:168) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.tick(Minecraft.java:1532) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.runTick(Minecraft.java:980) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.run(Minecraft.java:612) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_402] {}
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_402] {}
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_402] {}
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_402] {}
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:38) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.1.3.jar:?] {}
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:94) [forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Render thread
Stacktrace:
at com.painwizzard.magical.entities.VampireBall.onHitEntity(VampireBall.java:45) ~[?:?] {re:classloading}
at net.minecraft.entity.projectile.ProjectileEntity.onHit(ProjectileEntity.java:121) ~[forge:?] {re:classloading}
at net.minecraft.entity.projectile.DamagingProjectileEntity.tick(DamagingProjectileEntity.java:78) ~[forge:?] {re:classloading}
at net.minecraft.client.world.ClientWorld.tickNonPassenger(ClientWorld.java:199) ~[forge:?] {re:classloading,pl:runtimedistcleaner:A}
-- Entity being ticked --
Details:
Entity Type: magical:vampireball (com.painwizzard.magical.entities.VampireBall)
Entity ID: 397
Entity Name: entity.magical.vampireball
Entity's Exact location: -328.94, 73.29, -279.54
Entity's Block location: World: (-329,73,-280), Chunk: (at 7,4,8 in -21,-18; contains blocks -336,0,-288 to -321,255,-273), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
Entity's Momentum: 1.54, -1.16, -3.59
Entity's Passengers: []
Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
at net.minecraft.world.World.guardEntityTick(World.java:591) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.client.world.ClientWorld.tickEntities(ClientWorld.java:168) ~[forge:?] {re:classloading,pl:runtimedistcleaner:A}


-- Affected level --
Details:
All players: 1 total; [ClientPlayerEntity['Dev'/96, l='ClientLevel', x=-336.07, y=78.50, z=-262.75]]
Chunk stats: Client Chunk Cache: 841, 572
Level dimension: minecraft:overworld
Level spawn location: World: (-96,79,-224), Chunk: (at 0,4,0 in -6,-14; contains blocks -96,0,-224 to -81,255,-209), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
Level time: 63123 game time, 51360 day time
Server brand: forge
Server type: Integrated singleplayer server
Stacktrace:
at net.minecraft.client.world.ClientWorld.fillReportDetails(ClientWorld.java:473) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.fillReport(Minecraft.java:2093) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.run(Minecraft.java:628) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_402] {}
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_402] {}
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_402] {}
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_402] {}
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:38) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.1.3.jar:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.1.3.jar:?] {}
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:94) [forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}


-- System Details --
Details:
Minecraft Version: 1.16.5
Minecraft Version ID: 1.16.5
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_402, Amazon.com Inc.
Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Amazon.com Inc.
Memory: 469943008 bytes (448 MB) / 1873281024 bytes (1786 MB) up to 3804758016 bytes (3628 MB)
CPUs: 6
JVM Flags: 2 total; -XX:+IgnoreUnrecognizedVMOptions -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
ModLauncher: 8.1.3+8.1.3+main-8.1.x.c94d18ec
ModLauncher launch target: fmluserdevclient
ModLauncher naming: mcp
ModLauncher services:
/mixin-0.8.4.jar mixin PLUGINSERVICE
/eventbus-4.0.0.jar eventbus PLUGINSERVICE
/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar object_holder_definalize PLUGINSERVICE
/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar runtime_enum_extender PLUGINSERVICE
/accesstransformers-3.0.1.jar accesstransformer PLUGINSERVICE
/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar capability_inject_definalize PLUGINSERVICE
/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar runtimedistcleaner PLUGINSERVICE
/mixin-0.8.4.jar mixin TRANSFORMATIONSERVICE
/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar fml TRANSFORMATIONSERVICE
FML: 36.2
Forge: net.minecraftforge:36.2.41
FML Language Providers:
[email protected]
minecraft@1
Mod List:
client-extra.jar |Minecraft |minecraft |1.16.5 |DONE |Manifest: a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f
main |MagicalCraft |magical |beta-1.0 |DONE |Manifest: NOSIGNATURE
forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1|Forge |forge |36.2.41 |DONE |Manifest: NOSIGNATURE
Crash Report UUID: 908b879c-ad9c-42cc-ab49-f07b73650df2
Launched Version: MOD_DEV
Backend library: LWJGL version 3.2.2 build 10
Backend API: NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2 GL version 4.6.0 NVIDIA 551.61, NVIDIA Corporation
GL Caps: Using framebuffer using OpenGL 3.0
Using VBOs: Yes
Is Modded: Definitely; Client brand changed to 'forge'
Type: Client (map_client.txt)
Graphics mode: fancy
Resource Packs: vanilla, mod_resources
Current Language: English (US)
CPU: 6x Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz
Краш-лог:
---- Minecraft Crash Report ----
// I bet Cylons wouldn't have this problem.

Time: 09.03.24 9:31
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
	at com.painwizzard.magical.entities.VampireBall.onHitEntity(VampireBall.java:45) ~[main/:?] {re:classloading}
	at net.minecraft.entity.projectile.ProjectileEntity.onHit(ProjectileEntity.java:121) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading}
	at net.minecraft.entity.projectile.DamagingProjectileEntity.tick(DamagingProjectileEntity.java:78) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading}
	at net.minecraft.client.world.ClientWorld.tickNonPassenger(ClientWorld.java:199) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
	at net.minecraft.world.World.guardEntityTick(World.java:591) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.client.world.ClientWorld.tickEntities(ClientWorld.java:168) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
	at net.minecraft.client.Minecraft.tick(Minecraft.java:1532) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
	at net.minecraft.client.Minecraft.runTick(Minecraft.java:980) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
	at net.minecraft.client.Minecraft.run(Minecraft.java:612) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
	at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_402] {}
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_402] {}
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_402] {}
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_402] {}
	at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:38) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.1.3.jar:?] {}
	at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:94) [forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Render thread
Stacktrace:
	at com.painwizzard.magical.entities.VampireBall.onHitEntity(VampireBall.java:45) ~[?:?] {re:classloading}
	at net.minecraft.entity.projectile.ProjectileEntity.onHit(ProjectileEntity.java:121) ~[forge:?] {re:classloading}
	at net.minecraft.entity.projectile.DamagingProjectileEntity.tick(DamagingProjectileEntity.java:78) ~[forge:?] {re:classloading}
	at net.minecraft.client.world.ClientWorld.tickNonPassenger(ClientWorld.java:199) ~[forge:?] {re:classloading,pl:runtimedistcleaner:A}
-- Entity being ticked --
Details:
	Entity Type: magical:vampireball (com.painwizzard.magical.entities.VampireBall)
	Entity ID: 397
	Entity Name: entity.magical.vampireball
	Entity's Exact location: -328.94, 73.29, -279.54
	Entity's Block location: World: (-329,73,-280), Chunk: (at 7,4,8 in -21,-18; contains blocks -336,0,-288 to -321,255,-273), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
	Entity's Momentum: 1.54, -1.16, -3.59
	Entity's Passengers: []
	Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
	at net.minecraft.world.World.guardEntityTick(World.java:591) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.client.world.ClientWorld.tickEntities(ClientWorld.java:168) ~[forge:?] {re:classloading,pl:runtimedistcleaner:A}


-- Affected level --
Details:
	All players: 1 total; [ClientPlayerEntity['Dev'/96, l='ClientLevel', x=-336.07, y=78.50, z=-262.75]]
	Chunk stats: Client Chunk Cache: 841, 572
	Level dimension: minecraft:overworld
	Level spawn location: World: (-96,79,-224), Chunk: (at 0,4,0 in -6,-14; contains blocks -96,0,-224 to -81,255,-209), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
	Level time: 63123 game time, 51360 day time
	Server brand: forge
	Server type: Integrated singleplayer server
Stacktrace:
	at net.minecraft.client.world.ClientWorld.fillReportDetails(ClientWorld.java:473) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
	at net.minecraft.client.Minecraft.fillReport(Minecraft.java:2093) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
	at net.minecraft.client.Minecraft.run(Minecraft.java:628) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
	at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_402] {}
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_402] {}
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_402] {}
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_402] {}
	at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:38) ~[forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.1.3.jar:?] {}
	at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.1.3.jar:?] {}
	at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:94) [forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-recomp.jar:?] {}


-- System Details --
Details:
	Minecraft Version: 1.16.5
	Minecraft Version ID: 1.16.5
	Operating System: Windows 10 (amd64) version 10.0
	Java Version: 1.8.0_402, Amazon.com Inc.
	Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Amazon.com Inc.
	Memory: 469943008 bytes (448 MB) / 1873281024 bytes (1786 MB) up to 3804758016 bytes (3628 MB)
	CPUs: 6
	JVM Flags: 2 total; -XX:+IgnoreUnrecognizedVMOptions -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
	ModLauncher: 8.1.3+8.1.3+main-8.1.x.c94d18ec
	ModLauncher launch target: fmluserdevclient
	ModLauncher naming: mcp
	ModLauncher services: 
		/mixin-0.8.4.jar mixin PLUGINSERVICE 
		/eventbus-4.0.0.jar eventbus PLUGINSERVICE 
		/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar object_holder_definalize PLUGINSERVICE 
		/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar runtime_enum_extender PLUGINSERVICE 
		/accesstransformers-3.0.1.jar accesstransformer PLUGINSERVICE 
		/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar capability_inject_definalize PLUGINSERVICE 
		/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar runtimedistcleaner PLUGINSERVICE 
		/mixin-0.8.4.jar mixin TRANSFORMATIONSERVICE 
		/forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1.16.5-launcher.jar fml TRANSFORMATIONSERVICE 
	FML: 36.2
	Forge: net.minecraftforge:36.2.41
	FML Language Providers: 
		[email protected]
		minecraft@1
	Mod List: 
		client-extra.jar                                  |Minecraft                     |minecraft                     |1.16.5              |DONE      |Manifest: a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f
		main                                              |MagicalCraft                  |magical                       |beta-1.0            |DONE      |Manifest: NOSIGNATURE
		forge-1.16.5-36.2.41_mapped_parchment_2022.03.06-1|Forge                         |forge                         |36.2.41             |DONE      |Manifest: NOSIGNATURE
	Crash Report UUID: 908b879c-ad9c-42cc-ab49-f07b73650df2
	Launched Version: MOD_DEV
	Backend library: LWJGL version 3.2.2 build 10
	Backend API: NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2 GL version 4.6.0 NVIDIA 551.61, NVIDIA Corporation
	GL Caps: Using framebuffer using OpenGL 3.0
	Using VBOs: Yes
	Is Modded: Definitely; Client brand changed to 'forge'
	Type: Client (map_client.txt)
	Graphics mode: fancy
	Resource Packs: vanilla, mod_resources
	Current Language: English (US)
	CPU: 6x Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz
1,369
112
241
private LivingEntity caster = null;
Тебе нужно внутри шарика хранить UUID кастера и хилить уже по UUID, а не по внутриклассовому полю. На всякий: UUID хранится в NBT.
Так сделано в ванилле (стрелы, файерболлы и т.д.), так следует сделать и тебе.
 
1,369
112
241
я в этом не очень силен, можешь дать пример кода, пожалуйста?
Нет IDE под рукой на эту версию.
я с uuid ни разу не работал
UUID можно получить с ЛЮБОГО entity. Этот UUID можно легко записать в NBT. Entity (который кастует) можно указывать в конструкторе, в конструкторе же и вносить все необходимые изменения.
Пример только для 1.20 есть:
С 1.20, в классе твоего entity:
    public SpellEntity(EntityType<? extends SpellEntity> type, Level level) {
        super(type, level);
    }

    public SpellEntity(EntityType<? extends SpellBallEntity> type, LivingEntity entity, Spell spell) {
        super(type, entity, getSpellVec(entity).x, getSpellVec(entity).y, getSpellVec(entity).z, entity.level());
        this.spell = spell;
        Vec3 pos = new Vec3(entity.getPosition(0.5f).x,
                entity.getPosition(0.5f).y + 1, entity.getPosition(0.5f).z);
        moveTo(pos);
    }

    //.....

    @Override
    public void addAdditionalSaveData(CompoundTag tag) {
        super.addAdditionalSaveData(tag);
        CompoundTag spellTag = spell.writeToNbt();
        if(spellTag != null)
            tag.put("Spell", spellTag);

    }

    @Override
    public void readAdditionalSaveData(CompoundTag tag) {
        super.readAdditionalSaveData(tag);
        CompoundTag spellTag = (CompoundTag) tag.get("Spell");
        if(spellTag != null)
            this.spell = Spell.readFromNbt((ServerLevel) level(), spellTag);
    }
 
Скинь код, где у тебя происходит создание projectile
Java:
@Override
    public ActionResult<ItemStack> use(World pLevel, PlayerEntity pPlayer, Hand pHand) {
        if (!pLevel.isClientSide()) {
            pLevel.playSound(null, pPlayer.getX(), pPlayer.getEyeY(), pPlayer.getZ(),
                    ModSoundEvents.WAND.get(), SoundCategory.BLOCKS, 0.8f, 1);
            VampireBall vampireBall = new VampireBall(ModEntities.VAMPIRE_BALL.get(), pPlayer.getX(), pPlayer.getEyeY(), pPlayer.getZ(), 0, 0, 0, pLevel);
            vampireBall.caster = pPlayer;
            Vector3d look = pPlayer.getViewVector(1.0f);
            double d0 = 4.0d;
            vampireBall.setDeltaMovement(look.x() * d0, look.y() * d0, look.z() * d0);
            pLevel.addFreshEntity(vampireBall);
            pPlayer.getCooldowns().addCooldown(this, 60);
            ItemStack stack = pPlayer.getItemInHand(pHand);
            stack.setDamageValue(stack.getDamageValue() + 1);
            if (stack.getDamageValue() >= stack.getMaxDamage()) stack.setCount(0);
            return ActionResult.success(stack);
        }
        return super.use(pLevel, pPlayer, pHand);
    }
 
UUID можно получить с ЛЮБОГО entity. Этот UUID можно легко записать в NBT. Entity (который кастует) можно указывать в конструкторе, в конструкторе же и вносить все необходимые изменения.
тяжко все-равно это понять, ибо я не знаю, что с этим делать, я глупый(
 
1,369
112
241
Java:
@Override
    public ActionResult<ItemStack> use(World pLevel, PlayerEntity pPlayer, Hand pHand) {
        if (!pLevel.isClientSide()) {
            pLevel.playSound(null, pPlayer.getX(), pPlayer.getEyeY(), pPlayer.getZ(),
                    ModSoundEvents.WAND.get(), SoundCategory.BLOCKS, 0.8f, 1);
            VampireBall vampireBall = new VampireBall(ModEntities.VAMPIRE_BALL.get(), pPlayer.getX(), pPlayer.getEyeY(), pPlayer.getZ(), 0, 0, 0, pLevel);
            vampireBall.caster = pPlayer;
            Vector3d look = pPlayer.getViewVector(1.0f);
            double d0 = 4.0d;
            vampireBall.setDeltaMovement(look.x() * d0, look.y() * d0, look.z() * d0);
            pLevel.addFreshEntity(vampireBall);
            pPlayer.getCooldowns().addCooldown(this, 60);
            ItemStack stack = pPlayer.getItemInHand(pHand);
            stack.setDamageValue(stack.getDamageValue() + 1);
            if (stack.getDamageValue() >= stack.getMaxDamage()) stack.setCount(0);
            return ActionResult.success(stack);
        }
        return super.use(pLevel, pPlayer, pHand);
    }
Entity создаётся 2 раза: для левой и для правой руки.
 
В CompoundTag есть отдельный метод putUUID(), UUID ты берёшь из Entity (в твоём случае это caster). Также происходит и считывание UUID.
Ничего сложного.
в этом то и суть я вообще ни один из вышеперечисленных терминов не понимаю и как с этим работать, соответственно, тоже
 
1,369
112
241
UUID - это отдельный идентификатор для каждой сущности. Он уникален.
Мир о каждом таком идентификаторе знает, и может по нему достать соотв. сущность.
UUID представляет собой некоторую стр. данных вида "{1D2E4F5-H6K8....}" (если будем это дело переводить в String).

И для осуществления передачи сущности из п. А в п. Б (через сущность, тайл и т.д.) нам необходим UUID. Мы записываем его в NBT (см. 5 сообщение в этом треде). Этот NBT мы сможем по итогу прочитать в необх. нам момент времени и получить необходимую нам сущность через мир.

Напрямую в конструктор UUID пихать нежелательно, поэтому мы туда пихаем Entity, который вызывает нашу сущность. И уже с Entity мы берём UUID, который запишем в NBT.
 
1,369
112
241
Значит у тебя нет понимания программирования в принципе. Программируй больше, и однажды осознаешь всё здесь написанное.
Из примера ниже можешь увидеть пример реализации (но для кастомного класса Spell). На этих костях можешь построить свой прожектайл.

Старый код для 1.20 (могут быть баги):
public abstract class SpellEntity extends AbstractHurtingProjectile implements ISpellEntity {

    private Spell spell;
    public SpellEntity(EntityType<? extends SpellEntity> type, Level level) {
        super(type, level);
    }

    public SpellEntity(EntityType<? extends SpellBallEntity> type, LivingEntity entity, Spell spell) {
        super(type, entity, getSpellVec(entity).x, getSpellVec(entity).y, getSpellVec(entity).z, entity.level());
        this.spell = spell;
        Vec3 pos = new Vec3(entity.getPosition(0.5f).x,
                entity.getPosition(0.5f).y + 1, entity.getPosition(0.5f).z);

        moveTo(pos);
    }

    @Override
    protected void onHitEntity(EntityHitResult result) {
        if(!level().isClientSide && spell != null && result.getEntity() instanceof LivingEntity le) {
            List<ISpellPart> parts = spell.getPartsWithoutTrigger();
            parts.remove(0);
            damageBySpell(le);
            spell.getElement().onHitEntity(level(), le, spell.getPlayer());
            for (ISpellPart part : parts) {
                part.effect(result.getEntity(), spell);
            }
            if (spell.getParts().stream().anyMatch(part -> part instanceof RangeModifier)) {
                List<LivingEntity> entities = le.level().getEntitiesOfClass(LivingEntity.class,
                        new AABB(result.getEntity().blockPosition()
                                .below((int) spell.getArea())
                                .north((int) spell.getArea())
                                .west((int) spell.getArea()),
                                result.getEntity().blockPosition()
                                        .above((int) spell.getArea())
                                        .south((int) spell.getArea())
                                        .east((int) spell.getArea()))
                );
                for (LivingEntity e : entities) {
                    if(e == spell.getPlayer())
                        continue;
                    damageBySpell(e);
                    spell.getElement().onHitEntity(level(), e, spell.getPlayer());
                    for (ISpellPart part : parts) {
                        part.effect(e, spell);
                    }
                }
            }
        }
        super.onHitEntity(result);
    }

    abstract void damageBySpell(LivingEntity e);

    public Spell getSpell() {
        return spell;
    }

    @Override
    protected void onHitBlock(BlockHitResult result) {
        super.onHitBlock(result);

        if(!level().isClientSide && spell != null)
            spell.getElement().onHitBlock(level(), result.getBlockPos(), spell.getPlayer());
    }

    @Override
    protected void onHit(HitResult result) {
        super.onHit(result);
        discard();
    }

    static Vec3 getSpellVec(LivingEntity entity) {
        return new Vec3(entity.getLookAngle().x, entity.getLookAngle().y, entity.getLookAngle().z);
    }

    @Override
    public void addAdditionalSaveData(CompoundTag tag) {
        super.addAdditionalSaveData(tag);
        CompoundTag spellTag = spell.writeToNbt();
        if(spellTag != null)
            tag.put("Spell", spellTag);
    }

    @Override
    public void readAdditionalSaveData(CompoundTag tag) {
        super.readAdditionalSaveData(tag);
        CompoundTag spellTag = (CompoundTag) tag.get("Spell");
        if(spellTag != null)
            this.spell = Spell.readFromNbt((ServerLevel) level(), spellTag);
    }

    @Override
    protected boolean shouldBurn() {
        return spell != null && spell.getElement().getId().equals("fire");
    }
}
 
116
13
13
я или слишком тупой или я не знаю. вот я впихнул в конструктор себя(плеера), после чего я достану у него uuid, запишу его в nbt, а дальше я даже на словах не понимаю, не говоря уже о коде
Если вкратце, то это нужно для того, чтобы при перезаходе в мир не обнулялся атакующий игрок в Projectile. Т.е. если бы ты перезашел, и этот projectile до кого-то долетел, ты бы также словил NullPointerException, но только по другой причине. А так при столкновении с другим entity, всегда будет известен атакующий entity. Наверное это хотел донести @_SupCM_
 
1,369
112
241
Т.е. если бы ты перезашел, и этот projectile до кого-то долетел, ты бы также словил NullPointerException, но только по другой причине.
Даже без перезахода такая ситуация возникает. Здесь уже не подскажу почему.

А так при столкновении с другим entity, всегда будет известен атакующий entity.
Именно так.
 
Сверху