Spaces:
Build error
Build error
package net.minecraft.client.renderer.debug; | |
import com.google.common.collect.Lists; | |
import com.google.common.collect.Maps; | |
import com.google.common.collect.Sets; | |
import com.mojang.blaze3d.vertex.PoseStack; | |
import java.util.Collection; | |
import java.util.HashMap; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Objects; | |
import java.util.Set; | |
import java.util.UUID; | |
import java.util.Map.Entry; | |
import java.util.stream.Collectors; | |
import javax.annotation.Nullable; | |
import net.minecraft.client.Camera; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.renderer.MultiBufferSource; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.core.Position; | |
import net.minecraft.network.protocol.common.custom.BeeDebugPayload; | |
import net.minecraft.network.protocol.common.custom.HiveDebugPayload; | |
import net.minecraft.network.protocol.game.DebugEntityNameGenerator; | |
import net.minecraft.world.entity.Entity; | |
import net.minecraft.world.entity.player.Player; | |
import net.minecraftforge.api.distmarker.Dist; | |
import net.minecraftforge.api.distmarker.OnlyIn; | |
public class BeeDebugRenderer implements DebugRenderer.SimpleDebugRenderer { | |
private static final boolean SHOW_GOAL_FOR_ALL_BEES = true; | |
private static final boolean SHOW_NAME_FOR_ALL_BEES = true; | |
private static final boolean SHOW_HIVE_FOR_ALL_BEES = true; | |
private static final boolean SHOW_FLOWER_POS_FOR_ALL_BEES = true; | |
private static final boolean SHOW_TRAVEL_TICKS_FOR_ALL_BEES = true; | |
private static final boolean SHOW_PATH_FOR_ALL_BEES = false; | |
private static final boolean SHOW_GOAL_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_NAME_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_HIVE_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_FLOWER_POS_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_TRAVEL_TICKS_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_PATH_FOR_SELECTED_BEE = true; | |
private static final boolean SHOW_HIVE_MEMBERS = true; | |
private static final boolean SHOW_BLACKLISTS = true; | |
private static final int MAX_RENDER_DIST_FOR_HIVE_OVERLAY = 30; | |
private static final int MAX_RENDER_DIST_FOR_BEE_OVERLAY = 30; | |
private static final int MAX_TARGETING_DIST = 8; | |
private static final int HIVE_TIMEOUT = 20; | |
private static final float TEXT_SCALE = 0.02F; | |
private static final int ORANGE = -23296; | |
private static final int GRAY = -3355444; | |
private static final int PINK = -98404; | |
private final Minecraft minecraft; | |
private final Map<BlockPos, BeeDebugRenderer.HiveDebugInfo> hives = new HashMap<>(); | |
private final Map<UUID, BeeDebugPayload.BeeInfo> beeInfosPerEntity = new HashMap<>(); | |
private UUID lastLookedAtUuid; | |
public BeeDebugRenderer(Minecraft p_113053_) { | |
this.minecraft = p_113053_; | |
} | |
public void clear() { | |
this.hives.clear(); | |
this.beeInfosPerEntity.clear(); | |
this.lastLookedAtUuid = null; | |
} | |
public void addOrUpdateHiveInfo(HiveDebugPayload.HiveInfo p_299034_, long p_298824_) { | |
this.hives.put(p_299034_.pos(), new BeeDebugRenderer.HiveDebugInfo(p_299034_, p_298824_)); | |
} | |
public void addOrUpdateBeeInfo(BeeDebugPayload.BeeInfo p_300160_) { | |
this.beeInfosPerEntity.put(p_300160_.uuid(), p_300160_); | |
} | |
public void removeBeeInfo(int p_173764_) { | |
this.beeInfosPerEntity.values().removeIf(p_296269_ -> p_296269_.id() == p_173764_); | |
} | |
public void render(PoseStack p_113061_, MultiBufferSource p_113062_, double p_113063_, double p_113064_, double p_113065_) { | |
this.clearRemovedHives(); | |
this.clearRemovedBees(); | |
this.doRender(p_113061_, p_113062_); | |
if (!this.minecraft.player.isSpectator()) { | |
this.updateLastLookedAtUuid(); | |
} | |
} | |
private void clearRemovedBees() { | |
this.beeInfosPerEntity.entrySet().removeIf(p_296260_ -> this.minecraft.level.getEntity(p_296260_.getValue().id()) == null); | |
} | |
private void clearRemovedHives() { | |
long i = this.minecraft.level.getGameTime() - 20L; | |
this.hives.entrySet().removeIf(p_296254_ -> p_296254_.getValue().lastSeen() < i); | |
} | |
private void doRender(PoseStack p_270886_, MultiBufferSource p_270808_) { | |
BlockPos blockpos = this.getCamera().getBlockPosition(); | |
this.beeInfosPerEntity.values().forEach(p_296263_ -> { | |
if (this.isPlayerCloseEnoughToMob(p_296263_)) { | |
this.renderBeeInfo(p_270886_, p_270808_, p_296263_); | |
} | |
}); | |
this.renderFlowerInfos(p_270886_, p_270808_); | |
for (BlockPos blockpos1 : this.hives.keySet()) { | |
if (blockpos.closerThan(blockpos1, 30.0)) { | |
highlightHive(p_270886_, p_270808_, blockpos1); | |
} | |
} | |
Map<BlockPos, Set<UUID>> map = this.createHiveBlacklistMap(); | |
this.hives.values().forEach(p_296259_ -> { | |
if (blockpos.closerThan(p_296259_.info.pos(), 30.0)) { | |
Set<UUID> set = map.get(p_296259_.info.pos()); | |
this.renderHiveInfo(p_270886_, p_270808_, p_296259_.info, (Collection<UUID>)(set == null ? Sets.newHashSet() : set)); | |
} | |
}); | |
this.getGhostHives().forEach((p_269699_, p_269700_) -> { | |
if (blockpos.closerThan(p_269699_, 30.0)) { | |
this.renderGhostHive(p_270886_, p_270808_, p_269699_, (List<String>)p_269700_); | |
} | |
}); | |
} | |
private Map<BlockPos, Set<UUID>> createHiveBlacklistMap() { | |
Map<BlockPos, Set<UUID>> map = Maps.newHashMap(); | |
this.beeInfosPerEntity | |
.values() | |
.forEach( | |
p_296271_ -> p_296271_.blacklistedHives() | |
.forEach(p_296274_ -> map.computeIfAbsent(p_296274_, p_173777_ -> Sets.newHashSet()).add(p_296271_.uuid())) | |
); | |
return map; | |
} | |
private void renderFlowerInfos(PoseStack p_270578_, MultiBufferSource p_270098_) { | |
Map<BlockPos, Set<UUID>> map = Maps.newHashMap(); | |
this.beeInfosPerEntity.values().forEach(p_296251_ -> { | |
if (p_296251_.flowerPos() != null) { | |
map.computeIfAbsent(p_296251_.flowerPos(), p_296252_ -> new HashSet<>()).add(p_296251_.uuid()); | |
} | |
}); | |
map.forEach((p_325526_, p_325527_) -> { | |
Set<String> set = p_325527_.stream().map(DebugEntityNameGenerator::getEntityName).collect(Collectors.toSet()); | |
int i = 1; | |
renderTextOverPos(p_270578_, p_270098_, set.toString(), p_325526_, i++, -256); | |
renderTextOverPos(p_270578_, p_270098_, "Flower", p_325526_, i++, -1); | |
float f = 0.05F; | |
DebugRenderer.renderFilledBox(p_270578_, p_270098_, p_325526_, 0.05F, 0.8F, 0.8F, 0.0F, 0.3F); | |
}); | |
} | |
private static String getBeeUuidsAsString(Collection<UUID> p_113116_) { | |
if (p_113116_.isEmpty()) { | |
return "-"; | |
} else { | |
return p_113116_.size() > 3 | |
? p_113116_.size() + " bees" | |
: p_113116_.stream().map(DebugEntityNameGenerator::getEntityName).collect(Collectors.toSet()).toString(); | |
} | |
} | |
private static void highlightHive(PoseStack p_270133_, MultiBufferSource p_270766_, BlockPos p_270687_) { | |
float f = 0.05F; | |
DebugRenderer.renderFilledBox(p_270133_, p_270766_, p_270687_, 0.05F, 0.2F, 0.2F, 1.0F, 0.3F); | |
} | |
private void renderGhostHive(PoseStack p_270949_, MultiBufferSource p_270718_, BlockPos p_270550_, List<String> p_270221_) { | |
float f = 0.05F; | |
DebugRenderer.renderFilledBox(p_270949_, p_270718_, p_270550_, 0.05F, 0.2F, 0.2F, 1.0F, 0.3F); | |
renderTextOverPos(p_270949_, p_270718_, p_270221_ + "", p_270550_, 0, -256); | |
renderTextOverPos(p_270949_, p_270718_, "Ghost Hive", p_270550_, 1, -65536); | |
} | |
private void renderHiveInfo(PoseStack p_270194_, MultiBufferSource p_270431_, HiveDebugPayload.HiveInfo p_297933_, Collection<UUID> p_270946_) { | |
int i = 0; | |
if (!p_270946_.isEmpty()) { | |
renderTextOverHive(p_270194_, p_270431_, "Blacklisted by " + getBeeUuidsAsString(p_270946_), p_297933_, i++, -65536); | |
} | |
renderTextOverHive(p_270194_, p_270431_, "Out: " + getBeeUuidsAsString(this.getHiveMembers(p_297933_.pos())), p_297933_, i++, -3355444); | |
if (p_297933_.occupantCount() == 0) { | |
renderTextOverHive(p_270194_, p_270431_, "In: -", p_297933_, i++, -256); | |
} else if (p_297933_.occupantCount() == 1) { | |
renderTextOverHive(p_270194_, p_270431_, "In: 1 bee", p_297933_, i++, -256); | |
} else { | |
renderTextOverHive(p_270194_, p_270431_, "In: " + p_297933_.occupantCount() + " bees", p_297933_, i++, -256); | |
} | |
renderTextOverHive(p_270194_, p_270431_, "Honey: " + p_297933_.honeyLevel(), p_297933_, i++, -23296); | |
renderTextOverHive(p_270194_, p_270431_, p_297933_.hiveType() + (p_297933_.sedated() ? " (sedated)" : ""), p_297933_, i++, -1); | |
} | |
private void renderPath(PoseStack p_270424_, MultiBufferSource p_270123_, BeeDebugPayload.BeeInfo p_299438_) { | |
if (p_299438_.path() != null) { | |
PathfindingRenderer.renderPath( | |
p_270424_, | |
p_270123_, | |
p_299438_.path(), | |
0.5F, | |
false, | |
false, | |
this.getCamera().getPosition().x(), | |
this.getCamera().getPosition().y(), | |
this.getCamera().getPosition().z() | |
); | |
} | |
} | |
private void renderBeeInfo(PoseStack p_270154_, MultiBufferSource p_270397_, BeeDebugPayload.BeeInfo p_299435_) { | |
boolean flag = this.isBeeSelected(p_299435_); | |
int i = 0; | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, p_299435_.toString(), -1, 0.03F); | |
if (p_299435_.hivePos() == null) { | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, "No hive", -98404, 0.02F); | |
} else { | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, "Hive: " + this.getPosDescription(p_299435_, p_299435_.hivePos()), -256, 0.02F); | |
} | |
if (p_299435_.flowerPos() == null) { | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, "No flower", -98404, 0.02F); | |
} else { | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, "Flower: " + this.getPosDescription(p_299435_, p_299435_.flowerPos()), -256, 0.02F); | |
} | |
for (String s : p_299435_.goals()) { | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, s, -16711936, 0.02F); | |
} | |
if (flag) { | |
this.renderPath(p_270154_, p_270397_, p_299435_); | |
} | |
if (p_299435_.travelTicks() > 0) { | |
int j = p_299435_.travelTicks() < 2400 ? -3355444 : -23296; | |
renderTextOverMob(p_270154_, p_270397_, p_299435_.pos(), i++, "Travelling: " + p_299435_.travelTicks() + " ticks", j, 0.02F); | |
} | |
} | |
private static void renderTextOverHive( | |
PoseStack p_270915_, MultiBufferSource p_270663_, String p_270119_, HiveDebugPayload.HiveInfo p_300591_, int p_270930_, int p_270094_ | |
) { | |
renderTextOverPos(p_270915_, p_270663_, p_270119_, p_300591_.pos(), p_270930_, p_270094_); | |
} | |
private static void renderTextOverPos(PoseStack p_270438_, MultiBufferSource p_270244_, String p_270486_, BlockPos p_270062_, int p_270574_, int p_270228_) { | |
double d0 = 1.3; | |
double d1 = 0.2; | |
double d2 = (double)p_270062_.getX() + 0.5; | |
double d3 = (double)p_270062_.getY() + 1.3 + (double)p_270574_ * 0.2; | |
double d4 = (double)p_270062_.getZ() + 0.5; | |
DebugRenderer.renderFloatingText(p_270438_, p_270244_, p_270486_, d2, d3, d4, p_270228_, 0.02F, true, 0.0F, true); | |
} | |
private static void renderTextOverMob( | |
PoseStack p_270426_, MultiBufferSource p_270600_, Position p_270548_, int p_270592_, String p_270198_, int p_270792_, float p_270938_ | |
) { | |
double d0 = 2.4; | |
double d1 = 0.25; | |
BlockPos blockpos = BlockPos.containing(p_270548_); | |
double d2 = (double)blockpos.getX() + 0.5; | |
double d3 = p_270548_.y() + 2.4 + (double)p_270592_ * 0.25; | |
double d4 = (double)blockpos.getZ() + 0.5; | |
float f = 0.5F; | |
DebugRenderer.renderFloatingText(p_270426_, p_270600_, p_270198_, d2, d3, d4, p_270792_, p_270938_, false, 0.5F, true); | |
} | |
private Camera getCamera() { | |
return this.minecraft.gameRenderer.getMainCamera(); | |
} | |
private Set<String> getHiveMemberNames(HiveDebugPayload.HiveInfo p_298287_) { | |
return this.getHiveMembers(p_298287_.pos()).stream().map(DebugEntityNameGenerator::getEntityName).collect(Collectors.toSet()); | |
} | |
private String getPosDescription(BeeDebugPayload.BeeInfo p_300427_, BlockPos p_113070_) { | |
double d0 = Math.sqrt(p_113070_.distToCenterSqr(p_300427_.pos())); | |
double d1 = (double)Math.round(d0 * 10.0) / 10.0; | |
return p_113070_.toShortString() + " (dist " + d1 + ")"; | |
} | |
private boolean isBeeSelected(BeeDebugPayload.BeeInfo p_298081_) { | |
return Objects.equals(this.lastLookedAtUuid, p_298081_.uuid()); | |
} | |
private boolean isPlayerCloseEnoughToMob(BeeDebugPayload.BeeInfo p_300675_) { | |
Player player = this.minecraft.player; | |
BlockPos blockpos = BlockPos.containing(player.getX(), p_300675_.pos().y(), player.getZ()); | |
BlockPos blockpos1 = BlockPos.containing(p_300675_.pos()); | |
return blockpos.closerThan(blockpos1, 30.0); | |
} | |
private Collection<UUID> getHiveMembers(BlockPos p_113130_) { | |
return this.beeInfosPerEntity | |
.values() | |
.stream() | |
.filter(p_296249_ -> p_296249_.hasHive(p_113130_)) | |
.map(BeeDebugPayload.BeeInfo::uuid) | |
.collect(Collectors.toSet()); | |
} | |
private Map<BlockPos, List<String>> getGhostHives() { | |
Map<BlockPos, List<String>> map = Maps.newHashMap(); | |
for (BeeDebugPayload.BeeInfo beedebugpayload$beeinfo : this.beeInfosPerEntity.values()) { | |
if (beedebugpayload$beeinfo.hivePos() != null && !this.hives.containsKey(beedebugpayload$beeinfo.hivePos())) { | |
map.computeIfAbsent(beedebugpayload$beeinfo.hivePos(), p_113140_ -> Lists.newArrayList()).add(beedebugpayload$beeinfo.generateName()); | |
} | |
} | |
return map; | |
} | |
private void updateLastLookedAtUuid() { | |
DebugRenderer.getTargetedEntity(this.minecraft.getCameraEntity(), 8).ifPresent(p_113059_ -> this.lastLookedAtUuid = p_113059_.getUUID()); | |
} | |
static record HiveDebugInfo(HiveDebugPayload.HiveInfo info, long lastSeen) { | |
} | |
} |