Как сделать чтобы EntityThrowable летел даже по не прогруженным чанкам?

Версия Minecraft
1.12.2
API
Forge
55
1
1
Всем приветик! Тут возникла у меня проблема, ну так вот. Делаю EntityThrowable, и я хотел сделать чтобы он летел далёко, даже по не прогруженным чанкам. Пробывал сделать так, чтобы EntityThrowable прогружал сам чанки, но не работает. Это вообще возможно сделать? Прошу подсказку у вас, спасибо!
 
55
1
1
Назначь его чанк-лоадером. См. ForgeChunkManager
Привет, я это пытался сделать. Делал как когда-то писал tox1cozZ. Но оно не работает, тоесть не прогружает чанки
Entity:
public class EntityArmorPiercingProjectile extends EntityThrowable implements ChunkLoadingEntity {
    public EntityArmorPiercingProjectile(World world) {
        super(world);
    }

    public EntityArmorPiercingProjectile(World world, EntityLivingBase thrower) {
        super(world, thrower);
    }

    public EntityArmorPiercingProjectile(World world, double x, double y, double z) {
        super(world, x, y, z);
    }
    @Override
    @SideOnly(Side.CLIENT)
    public void handleStatusUpdate(byte id) {
        if (id == 3) {
            for (int i = 0; i < 8; ++i) {
              
                this.world.spawnParticle(EnumParticleTypes.EXPLOSION_LARGE, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
            }
        }
    }
    @Override
    protected void onImpact(RayTraceResult result) {
        if (!this.world.isRemote) {
            if(result.typeOfHit == Type.BLOCK)
            {       
                world.createExplosion(this, this.posX,this.posY , this.posZ, 3f, true);
                System.out.println(posX);
                System.out.println(posZ);
                this.setDead();
            }
        }
        
    }

    @Override
    public void onAddedTicket(Ticket ticket) {

        
    }

    @Override
    public void onRemovedTicket(Ticket ticket) {

        
    }

}
ChunkLoader:
@SideOnly(Side.SERVER)
public class EntityChunkLoadingManager implements ForgeChunkManager.LoadingCallback{

    private final Object mod;
    private final WeakHashMap<ChunkLoadingEntity, Ticket> tickets = new WeakHashMap<>();
    private final WorldAccessor worldAccessor = new WorldAccessor();

    public EntityChunkLoadingManager(Object modInstance){
        mod = modInstance;
        MinecraftForge.EVENT_BUS.register(this);
        ForgeChunkManager.setForcedChunkLoadingCallback(mod, this);
    }

    @SubscribeEvent
    public void onEnteringChunk(EntityEvent.EnteringChunk e){
        if(e.getEntity() instanceof ChunkLoadingEntity && !e.getEntity().isDead){
            ChunkLoadingEntity loadingEntity = (ChunkLoadingEntity)e.getEntity();
            ForgeChunkManager.Ticket ticket = getTicket(loadingEntity);
            if(ticket == null){
                ticket = ForgeChunkManager.requestTicket(mod, e.getEntity().world, ForgeChunkManager.Type.ENTITY);
                if(ticket != null){
                    ticket.bindEntity(e.getEntity());
                    addTicket(loadingEntity, ticket);
                    loadingEntity.onAddedTicket(ticket);
                }
            }
            if(ticket != null){
                if(e.getOldChunkX() != 0 && e.getOldChunkZ() != 0){
                    ForgeChunkManager.unforceChunk(ticket, new ChunkPos(e.getOldChunkX(), e.getOldChunkZ()));
                }
                ForgeChunkManager.forceChunk(ticket, new ChunkPos(e.getNewChunkX(), e.getNewChunkZ()));
            }
        }
    }

    @SubscribeEvent
    public void onWorldLoad(WorldEvent.Load e){
        e.getWorld().removeEventListener(worldAccessor);
        e.getWorld().addEventListener(worldAccessor);
    }

    @Override
    public void ticketsLoaded(List<Ticket> tickets, World world){
        for(ForgeChunkManager.Ticket ticket : tickets){
            boolean saved = false;
            Entity entity = ticket.getEntity();
            if(entity instanceof ChunkLoadingEntity && !entity.isDead){
                saved = true;
                addTicket((ChunkLoadingEntity)entity, ticket);
            }
            if(!saved){
                ForgeChunkManager.releaseTicket(ticket);
            }
        }
    }

    public ForgeChunkManager.Ticket removeTicket(ChunkLoadingEntity entity){
        ForgeChunkManager.Ticket ticket = tickets.get(entity);
        if(ticket != null){
            ForgeChunkManager.releaseTicket(ticket);
        }
        tickets.remove(entity);
        return ticket;
    }

    public void addTicket(ChunkLoadingEntity entity, ForgeChunkManager.Ticket ticket){
        if(tickets.get(entity) != null){
            removeTicket(entity);
        }
        tickets.put(entity, ticket);
    }

    public ForgeChunkManager.Ticket getTicket(ChunkLoadingEntity entity){
        return tickets.get(entity);
    }

    private class WorldAccessor implements IWorldEventListener{

        @Override
        public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags){

        }

        @Override
        public void notifyLightSet(BlockPos pos){

        }

        @Override
        public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2){

        }

        @Override
        public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch){

        }

        @Override
        public void playRecord(SoundEvent soundIn, BlockPos pos){

        }

        @Override
        public void spawnParticle(int particleID, boolean ignoreRange, double xCoord, double yCoord, double zCoord, double xSpeed, double ySpeed, double zSpeed, int... parameters){

        }

        @Override
        public void spawnParticle(int id, boolean ignoreRange, boolean minimiseParticleLevel, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed, int... parameters){

        }

        @Override
        public void onEntityAdded(Entity entityIn){

        }

        @Override
        public void onEntityRemoved(Entity entity){
            if(entity instanceof ChunkLoadingEntity){
                ChunkLoadingEntity loadingEntity = (ChunkLoadingEntity)entity;
                Ticket ticket = removeTicket(loadingEntity);
                loadingEntity.onRemovedTicket(ticket);
            }
        }

        @Override
        public void broadcastSound(int soundID, BlockPos pos, int data){

        }

        @Override
        public void playEvent(EntityPlayer player, int type, BlockPos blockPosIn, int data){

        }

        @Override
        public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress){

        }
    }
}
 
1,074
72
372
Проверяй работоспособность метода onEnteringChunk(). Он здесь главный за всю логику прогрузки чанков. Билеты на прогрузку должны выдаваться успешно, если не достигнут лимит.
 
55
1
1
Да я проверил, не работает регистрация чанклоудера. Регистрировал в главном классе, но ничего не происходит. Как писали в теме, убрал @SideOnly. Начал крашить. Писали еще в теме, что нужно запускать физический сервер, но я не знаю как.
reg:
@SideOnly(Side.SERVER)
private EntityChunkLoadingManager entityChunkLoadingManager;

@EventHandler
@SideOnly(Side.SERVER)
public void preInitServer(FMLPreInitializationEvent e){
    entityChunkLoadingManager = new EntityChunkLoadingManager(INSTANCE); // INSTANCE - наш инстанс мода (на котором весит @Instance)
}
crash:
---- Minecraft Crash Report ----
// Daisy, daisy...

Time: 12/5/22 4:58 PM
Description: Initializing game

java.lang.NoClassDefFoundError: Lru/SinT/ArtilleryMod/Utils/EntityChunkLoadingManager;
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Unknown Source)
    at java.lang.Class.getDeclaredField(Unknown Source)
    at net.minecraftforge.fml.common.ProxyInjector.inject(ProxyInjector.java:70)
    at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:613)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:219)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:197)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:136)
    at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:595)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:232)
    at net.minecraft.client.Minecraft.init(Minecraft.java:514)
    at net.minecraft.client.Minecraft.run(Minecraft.java:422)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)
Caused by: java.lang.ClassNotFoundException: ru.SinT.ArtilleryMod.Utils.EntityChunkLoadingManager
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 47 more
Caused by: net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerException: Exception in class transformer net.minecraftforge.fml.common.asm.transformers.SideTransformer@372e01e0 from coremod FMLCorePlugin
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:260)
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)
    ... 49 more
Caused by: java.lang.RuntimeException: Attempted to load class ru/SinT/ArtilleryMod/Utils/EntityChunkLoadingManager for invalid side CLIENT
    at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:62)
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:256)
    ... 51 more


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

-- Head --
Thread: Client thread
Stacktrace:
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Unknown Source)
    at java.lang.Class.getDeclaredField(Unknown Source)
    at net.minecraftforge.fml.common.ProxyInjector.inject(ProxyInjector.java:70)
    at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:613)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:219)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:197)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:136)
    at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:595)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:232)
    at net.minecraft.client.Minecraft.init(Minecraft.java:514)

-- Initialization --
Details:
Stacktrace:
    at net.minecraft.client.Minecraft.run(Minecraft.java:422)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)

-- System Details --
Details:
    Minecraft Version: 1.12.2
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_201, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 727811744 bytes (694 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: MCP 9.42 Powered by Forge 14.23.5.2847 6 mods loaded, 6 mods active
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

    | State | ID         | Version      | Source                           | Signature |
    |:----- |:---------- |:------------ |:-------------------------------- |:--------- |
    | LC    | minecraft  | 1.12.2       | minecraft.jar                    | None      |
    | LC    | mcp        | 9.42         | minecraft.jar                    | None      |
    | LC    | FML        | 8.0.99.99    | forgeSrc-1.12.2-14.23.5.2847.jar | None      |
    | LC    | forge      | 14.23.5.2847 | forgeSrc-1.12.2-14.23.5.2847.jar | None      |
    | L     | artillery  | 1.0          | bin                              | None      |
    | L     | objlibrary | 1.0          | SinTrecksLibrary.jar             | None      |

    Loaded coremods (and transformers):
    GL info: ' Vendor: 'NVIDIA Corporation' Version: '4.6.0 NVIDIA 516.94' Renderer: 'NVIDIA GeForce GTX 1050 Ti/PCIe/SSE2'
    Launched Version: 1.12.2
    LWJGL: 2.9.4
    OpenGL: NVIDIA GeForce GTX 1050 Ti/PCIe/SSE2 GL version 4.6.0 NVIDIA 516.94, NVIDIA Corporation
    GL Caps: Using GL 1.3 multitexturing.
Using GL 1.3 texture combiners.
Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
Shaders are available because OpenGL 2.1 is supported.
VBOs are available because OpenGL 1.5 is supported.

    Using VBOs: Yes
    Is Modded: Definitely; Client brand changed to 'fml,forge'
    Type: Client (map_client.txt)
    Resource Packs:
    Current Language: English (US)
    Profiler Position: N/A (disabled)
    CPU: 8x Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
 
1,074
72
372
Неправильное понимание назначения аннотации. @SideOnly используется для автоматического удаления кода при запуске мода на отличной от указанной Side. Основное применение: предотвращение краша выделенного сервера в попытке загрузить клиентский код. Потому вариант @SideOnly(Side.SERVER) почти нигде не применяется.
  • Клиент игры = сервер + клиент
  • Выделенный сервер = сервер
 
Сверху