Помогите разобраться с BlockEvent.PlaceEvent

Версия Minecraft
1.7.10
210
1
19
NkYco9xSow.png


Это ошибка в логе клиента, который не запускается с моим модом. При этом сервер запускается без проблем.
Виновник - этот код:
Java:
    @SubscribeEvent
    public void onBlockPlace(BlockEvent.PlaceEvent e){
        if(e.world.isRemote){return;}
        if(e.player.inventory.getCurrentItem().getItem() == Item.getItemFromBlock(Blocks.mob_spawner)){
            if(!e.player.capabilities.isCreativeMode){
                List <TileEntity> tileentities = e.world.loadedTileEntityList;
                for(TileEntity tile : tileentities){
                    if(!(tile instanceof TileEntityMobSpawner)){continue;}
                    int dist = Functions.getDistanceBetweenXYZ(tile.xCoord, tile.yCoord, tile.zCoord, (int)e.x, (int)e.y, (int)e.z);
                    if(dist > 0 && dist < 30){
                        if(e.world.getBlock(tile.xCoord, tile.yCoord, tile.zCoord) != Blocks.mob_spawner){e.world.removeTileEntity(tile.xCoord, tile.yCoord, tile.zCoord);} else {
                            e.player.addChatMessage(new ChatComponentTranslation("event.nosetspawner", new Object[0]));
                            e.setCanceled(true);
                            return;
                        }
                    }
                }
            }
            ItemStack spawner = e.player.inventory.getCurrentItem();
            if(!spawner.hasTagCompound()){return;}
            NBTTagCompound tag = spawner.stackTagCompound;
            String mob = tag.getString("MobType");
            if(mob == null || mob == ""){return;}
            Console.out().println("[FORGE] Mob is " + mob);
            if(e.world.getTileEntity(e.x, e.y, e.z) != null){
                ((TileEntityMobSpawner) e.world.getTileEntity(e.x, e.y, e.z)).func_145881_a().setEntityName(mob);
                ((TileEntityMobSpawner) e.world.getTileEntity(e.x, e.y, e.z)).func_145881_a().updateSpawner();
            }
        }
    }

Если убрать его, скомпилировать и залить в клиент - всё работает. Но я же не могу компилировать два разных мода для сервера и клиента отдельно. Я пробовал этот код кидать и на MinecraftForge.EVENT_BUS, и на FMLCommonHandler.instance().bus(). Пробовал прятать этот код в serverSide и пробовал писать над кодом @SideOnly(Side.SERVER). Код работает только в первом случае, в остальных случаях игнорируется.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Проблема явно в вызове register ивент-баса, он там хитрым ASM-ом делает класс-листенер из твоего метода(того, что с аннотацией), и судя по всему, на клиенте у него почему-то не получается.

Если на клиенте тебе этот ивент не нужен, то можешь вынести его в отдельный класс, и регистрировать этот класс только на сервере, прост проверкой FMLCommonHandler.instance().getEffectiveSide().isServer()
Ну и на всякий случай сервер-сайд на класс тоже навешать можно при этом.
 
210
1
19
Я вынес, как ты сказал. И после серии тестов выяснил, что в эклипсовом клиенте и в одиночном режиме на конечном продукте код не пашет, а когда на сервер заходишь - пашет. И всё бы ничего, но такого результата я ранее уже добивался плагинами. Хотел, чтобы эта хрень работала в одиночном режиме.
Вообще подобную хрень уже второй раз встречаю. Здесь клиент (неэклипсовый) не заводится, а в прошлый раз просто код не работал в одиночке. На сервере работал, в эклипсовом клиенте работал, а в одиночном режиме - нет. Там я использую ExplosionEvent.
 
210
1
19
Ладно, бог с ним.

Я удалил один мод и теперь мне появляются фразы типа "Skipping BlockEntity with id..."
Я думал сначала, что он не только эти ныне удаленные энтити пропускает (skipping), но и удаляет при этом. Однако уже прошла неделя, но на тех же самых местах (том же спавне) при входе игроков появляется серия таких сообщений - часто довольно объёмная.

Как-то так:

2Ge9QoLFrW.png


Хотелось бы знать, как сделать, чтоб они удалялись полностью и навсегда. Есть мысли?
 
Сверху