trackingRange

1,316
37
261
Плюсую лиахиму, не понял как генерить новый методс.бин, да и про это особо много не расписано.
Хукаюсь
Java:
@SideOnly(Side.CLIENT)
    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static boolean isInRangeToRenderDist(Entity e, double d)
    {
        if(e instanceof EntityPlayer){
        return true;
        }
        else if(e instanceof EntityLiving){
        return true;
        }
        else if(e instanceof EntityItem){
        return d < 400D;
        }
        else return true;
    }
Таким образом увеличиваю прорисовку сущностей. Метод клиентский. Но на сервере почему то, с этим хуком прорисовка все равно не увеличивается. Что делать?
В одиночной игре все просто прекрасненько
 
Но на сервере почему то, с этим хуком прорисовка все равно не увеличивается.
Java:
* @param trackingRange The range at which MC will send tracking updates
...
public static void registerModEntity(ResourceLocation registryName, Class<? extends Entity> entityClass, String entityName, int id, Object mod, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates, int eggPrimary, int eggSecondary)
Диапазон, в котором MC будет отправлять обновления отслеживания
Такое-же и у ванильных мобов есть.
package net.minecraft.entity;
class EntityTracker
Java:
        else if (entityIn instanceof EntityItem)
        {
            this.track(entityIn, 64, 20, true);
        }
Java:
    /**
     * Args : Entity, trackingRange, updateFrequency, sendVelocityUpdates
     */
    public void track(Entity entityIn, int trackingRange, final int updateFrequency, boolean sendVelocityUpdates)
---
Есть прорисовка, а есть появление моба. Зачем игроку знать что делается с мобом у другого игрока за тысячу блоков.
 
Плюсую лиахиму, не понял как генерить новый методс.бин, да и про это особо много не расписано.
Хукаюсь
Java:
@SideOnly(Side.CLIENT)
    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static boolean isInRangeToRenderDist(Entity e, double d)
    {
        if(e instanceof EntityPlayer){
        return true;
        }
        else if(e instanceof EntityLiving){
        return true;
        }
        else if(e instanceof EntityItem){
        return d < 400D;
        }
        else return true;
    }
Таким образом увеличиваю прорисовку сущностей. Метод клиентский. Но на сервере почему то, с этим хуком прорисовка все равно не увеличивается. Что делать?
В одиночной игре все просто прекрасненько

Хук-то скорее всего работает не только в одиночной игре, сервер просто не шлет информацию про эти сущности клиенту если игрок слишком далеко от них находится и клиенту рендерить банально нечего. Разбирайся с тем как увеличить радиус отправки информации про сущности, Тимаха уже писал про это
 
Хук-то скорее всего работает не только в одиночной игре, сервер просто не шлет информацию про эти сущности клиенту если игрок слишком далеко от них находится и клиенту рендерить банально нечего. Разбирайся с тем как увеличить радиус отправки информации про сущности, Тимаха уже писал про это
Ты же как то сделал такое не?
 
Тут помогаю только по проблемам хуклибы, говорить что-то про кишки кубача не хочу вообще, я застрял на версии шестилетней давности. Больших проблем с этим быть не должно, смотри код нужной тебе версии кубача начиная с класса EntityTracker (если его еще не переименовали конечно)
 
Такое-же и у ванильных мобов есть.
package net.minecraft.entity;
class EntityTracker
Java:
else if (entityIn instanceof EntityItem)
{
this.track(entityIn, 64, 20, true);
}
Java:
/**
* Args : Entity, trackingRange, updateFrequency, sendVelocityUpdates
*/
public void track(Entity entityIn, int trackingRange, final int updateFrequency, boolean sendVelocityUpdates)
где находится данный код? в ентититрекере не вижу
 
@fane4qa, это на 1.12.2 находиться:

на 1.7.10 тот-же класс, но просто метод другой:
Java:
public void addEntityToTracker(Entity p_72785_1_, int p_72785_2_, final int p_72785_3_, boolean p_72785_4_)
 
ааа, да, туплю
у EntityPlayerMP там вообще 512 рендж

Java:
 public void addEntityToTracker(Entity p_72786_1_)
    {
        if (EntityRegistry.instance().tryTrackingEntity(this, p_72786_1_))
        {
            return;
        }

        if (p_72786_1_ instanceof EntityPlayerMP)
        {
            this.addEntityToTracker(p_72786_1_, 512, 2);
            EntityPlayerMP entityplayermp = (EntityPlayerMP)p_72786_1_;
            Iterator iterator = this.trackedEntities.iterator();

            while (iterator.hasNext())
            {
                EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry)iterator.next();

                if (entitytrackerentry.myEntity != entityplayermp)
                {
                    entitytrackerentry.tryStartWachingThis(entityplayermp);
                }
            }
        }
        //some code
 }
 
ап, разве никто не шарит?
кст да, если запустить сервак в эклипсе и два клиента, то дистанция прорисовки действительно больше, чем обычная, то же и с сущностями
 
Java:
/*
данный метод тоже нужен для хука, почитайте коммент к самому методу, в который мы хукаемся в EntityTrackerEntry
думаю, поймете почему я сюда запихнул хук
    int posX = MathHelper.floor_double(e.myEntity.posX * 96.0D);
    int posY = MathHelper.floor_double(e.myEntity.posY * 96.0D);
    int posZ = MathHelper.floor_double(e.myEntity.posZ * 96.0D);
изменены только эти строки в этом методе, в ориг методе стоит 32D вместо 96D
так как я увеличил свою прорисовку с 64 блоков до 192, т.е в 3 раза, то и здесь это число я увеличил в 3 раза, равное 96D

*/
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static void tryStartWachingThis(EntityTrackerEntry e, EntityPlayerMP p_73117_1_)
    {
    if (p_73117_1_ != e.myEntity)
    {
    double d0 = p_73117_1_.posX - (double)(e.lastScaledXPosition / 32);
    double d1 = p_73117_1_.posZ - (double)(e.lastScaledZPosition / 32);

    if (d0 >= (double)(-e.blocksDistanceThreshold) && d0 <= (double)e.blocksDistanceThreshold && d1 >= (double)(-e.blocksDistanceThreshold) && d1 <= (double)e.blocksDistanceThreshold)
    {
    if (!e.trackingPlayers.contains(p_73117_1_) && (e.isPlayerWatchingThisChunk(p_73117_1_) || e.myEntity.forceSpawn))
    {
    e.trackingPlayers.add(p_73117_1_);
    Packet packet = e.func_151260_c();
    p_73117_1_.playerNetServerHandler.sendPacket(packet);

    if (!e.myEntity.getDataWatcher().getIsBlank())
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S1CPacketEntityMetadata(e.myEntity.getEntityId(), e.myEntity.getDataWatcher(), true));
    }

    if (e.myEntity instanceof EntityLivingBase)
    {
    ServersideAttributeMap serversideattributemap = (ServersideAttributeMap)((EntityLivingBase)e.myEntity).getAttributeMap();
    Collection collection = serversideattributemap.getWatchedAttributes();

    if (!collection.isEmpty())
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S20PacketEntityProperties(e.myEntity.getEntityId(), collection));
    }
    }

    e.motionX = e.myEntity.motionX;
    e.motionY = e.myEntity.motionY;
    e.motionZ = e.myEntity.motionZ;

    int posX = MathHelper.floor_double(e.myEntity.posX * 96.0D);
    int posY = MathHelper.floor_double(e.myEntity.posY * 96.0D);
    int posZ = MathHelper.floor_double(e.myEntity.posZ * 96.0D);
    if (posX != e.lastScaledXPosition || posY != e.lastScaledYPosition || posZ != e.lastScaledZPosition)
    {
    FMLNetworkHandler.makeEntitySpawnAdjustment(e.myEntity, p_73117_1_, e.lastScaledXPosition, e.lastScaledYPosition, e.lastScaledZPosition);
    }

    if (e.sendVelocityUpdates && !(packet instanceof S0FPacketSpawnMob))
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S12PacketEntityVelocity(e.myEntity.getEntityId(), e.myEntity.motionX, e.myEntity.motionY, e.myEntity.motionZ));
    }

    if (e.myEntity.ridingEntity != null)
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(0, e.myEntity, e.myEntity.ridingEntity));
    }

    if (e.myEntity instanceof EntityLiving && ((EntityLiving)e.myEntity).getLeashedToEntity() != null)
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, e.myEntity, ((EntityLiving)e.myEntity).getLeashedToEntity()));
    }

    if (e.myEntity instanceof EntityLivingBase)
    {
    for (int i = 0; i < 5; ++i)
    {
    ItemStack itemstack = ((EntityLivingBase)e.myEntity).getEquipmentInSlot(i);

    if (itemstack != null)
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S04PacketEntityEquipment(e.myEntity.getEntityId(), i, itemstack));
    }
    }
    }

    if (e.myEntity instanceof EntityPlayer)
    {
    EntityPlayer entityplayer = (EntityPlayer)e.myEntity;

    if (entityplayer.isPlayerSleeping())
    {
    p_73117_1_.playerNetServerHandler.sendPacket(new S0APacketUseBed(entityplayer, MathHelper.floor_double(e.myEntity.posX), MathHelper.floor_double(e.myEntity.posY), MathHelper.floor_double(e.myEntity.posZ)));
    }
    }

    if (e.myEntity instanceof EntityLivingBase)
    {
    EntityLivingBase entitylivingbase = (EntityLivingBase)e.myEntity;
    Iterator iterator = entitylivingbase.getActivePotionEffects().iterator();

    while (iterator.hasNext())
    {
    PotionEffect potioneffect = (PotionEffect)iterator.next();
    p_73117_1_.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(e.myEntity.getEntityId(), potioneffect));
    }
    }
    net.minecraftforge.event.ForgeEventFactory.onStartEntityTracking(e.myEntity, p_73117_1_);
    }
    }
    else if (e.trackingPlayers.contains(p_73117_1_))
    {
    e.trackingPlayers.remove(p_73117_1_);
    p_73117_1_.func_152339_d(e.myEntity);
    net.minecraftforge.event.ForgeEventFactory.onStopEntityTracking(e.myEntity, p_73117_1_);
    }
    }
    }
 
    /*
    этот хук - фул копия ванил метода кроме первого параметра p_72785_2_ = 192;
    это дистанция прорисовки на которой будет отправляться, как я понял, пакеты с информацией
    о позиции сущности, что она делает и etc. Остальное идентично ванилке,
    */
    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static void addEntityToTracker(EntityTracker e, Entity p_72785_1_, int p_72785_2_, final int p_72785_3_, boolean p_72785_4_)
    {
       
        p_72785_2_ = 192;
       

        try
        {
            if (e.trackedEntityIDs.containsItem(p_72785_1_.getEntityId()))
            {
                throw new IllegalStateException("Entity is already tracked!");
            }

            EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(p_72785_1_, p_72785_2_, p_72785_3_, p_72785_4_);
            e.trackedEntities.add(entitytrackerentry);
            e.trackedEntityIDs.addKey(p_72785_1_.getEntityId(), entitytrackerentry);
            entitytrackerentry.sendEventsToPlayers(e.theWorld.playerEntities);
        }
        catch (Throwable throwable)
        {
            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Adding entity to track");
            CrashReportCategory crashreportcategory = crashreport.makeCategory("Entity To Track");
            crashreportcategory.addCrashSection("Tracking range", p_72785_2_ + " blocks");
            crashreportcategory.addCrashSectionCallable("Update interval", new Callable()
            {
                private static final String __OBFID = "CL_00001432";
                public String call()
                {
                    String s = "Once per " + p_72785_3_ + " ticks";

                    if (p_72785_3_ == Integer.MAX_VALUE)
                    {
                        s = "Maximum (" + s + ")";
                    }

                    return s;
                }
            });
            p_72785_1_.addEntityCrashInfo(crashreportcategory);
            CrashReportCategory crashreportcategory1 = crashreport.makeCategory("Entity That Is Already Tracked");
            ((EntityTrackerEntry)e.trackedEntityIDs.lookup(p_72785_1_.getEntityId())).myEntity.addEntityCrashInfo(crashreportcategory1);

            try
            {
                throw new ReportedException(crashreport);
            }
            catch (ReportedException reportedexception)
            {
                e.logger.error("\"Silently\" catching entity tracking error.", reportedexception);
            }
        }
    }
    /*
    хук отвечает за прорисовку сущности визуально
    хук полностью заменяет ванильный метод в Entity, работает он так:
    вернул тру = рендерить сущность, фолс = не рендерить сущность, тут все просто
    */
    @SideOnly(Side.CLIENT)
    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static boolean isInRangeToRenderDist(Entity e, double d)
    {
        if(e instanceof EntityPlayer){
        return true;
        }
        else if(e instanceof EntityLivingBase){
        return true;
        }
        else if(e instanceof EntityLiving){
        return true;
        }
        else if(e instanceof EntityItem){
        return d < 400D;
        }
        else return true;
    }
Говнокод конечно, но работает)00
попытался обьяснить что за чо отвечает и зачем, не бейте тока(9
и да, вам придется сделать поля и методы в EntityTracker and EntityTrackerEntry публичными, а то тут много обращений к приватным методам и полям, сделаете это с помощью АТ, гайд от дахаки найдете (респект)
 
Вот, кстати, легче такое АСМом сделать. Тупо пройтись по опкодам, найти в параметре число и поменять его. В любом случае, форум тебя не забудет -- кому-то пригодится
 
Ну с асм я не работал и как то не хочу :D
Надо будет почитать о нем на досуге, спасибо)
 
Это удобно только тем, кто уже хорошо разбирается в байткоде, поэтому легче просто заюзать инструменты вроде хуклибы
 
А что тяжёлого разбираться в опкодах? Просто инструкции с/без аргумента, всё
 
Назад
Сверху