/*
данный метод тоже нужен для хука, почитайте коммент к самому методу, в который мы хукаемся в 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;
}