Skip to content

Commit

Permalink
Re-enabled rendering of build markers.
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Zangl committed Dec 28, 2015
1 parent 1699d39 commit d1c05d0
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 39 deletions.
27 changes: 21 additions & 6 deletions Minebot/src/net/famzangl/minecraft/minebot/ai/AIController.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import net.famzangl.minecraft.minebot.ai.command.IAIControllable;
import net.famzangl.minecraft.minebot.ai.net.MinebotNetHandler;
import net.famzangl.minecraft.minebot.ai.net.NetworkHelper;
import net.famzangl.minecraft.minebot.ai.profiler.InterceptingProfiler;
import net.famzangl.minecraft.minebot.ai.render.BuildMarkerRenderer;
import net.famzangl.minecraft.minebot.ai.render.PosMarkerRenderer;
import net.famzangl.minecraft.minebot.ai.strategy.AIStrategy;
Expand Down Expand Up @@ -115,7 +116,7 @@ public void ungrabMouseCursor() {
}

private boolean dead;
private AIStrategy currentStrategy;
private volatile AIStrategy currentStrategy;

private AIStrategy deactivatedStrategy;

Expand All @@ -134,6 +135,8 @@ public void ungrabMouseCursor() {

private BuildMarkerRenderer buildMarkerRenderer;
private NetworkHelper networkHelper;
private InterceptingProfiler profilerHelper;
private RenderTickEvent activeDrawEvent;

public AIController() {
AIChatController.getRegistry().setControlled(this);
Expand All @@ -142,6 +145,14 @@ public AIController() {
@SubscribeEvent
public void connect(ClientConnectedToServerEvent e) {
networkHelper = MinebotNetHandler.inject(this, e.manager, e.handler);
profilerHelper = InterceptingProfiler.inject(getMinecraft());
// Hook into net.minecraft.client.renderer.RenderGlobal.drawBlockDamageTexture(Tessellator, WorldRenderer, Entity, float)
profilerHelper.addLisener("hand", new Runnable() {
@Override
public void run() {
drawMakers();
}
});
}

/**
Expand Down Expand Up @@ -327,10 +338,14 @@ public void resetOnGameEnd2(PlayerRespawnEvent unload) {
* @param event
*/
@SubscribeEvent
public void drawMarkers(RenderTickEvent event) {
if (event.phase != Phase.END) {
public void beforeDrawMarkers(RenderTickEvent event) {
if (event.phase != Phase.START) {
return;
}
activeDrawEvent = event;
}

public void drawMakers() {
final Entity view = getMinecraft().getRenderViewEntity();
if (!(view instanceof EntityPlayerSP)) {
return;
Expand All @@ -341,17 +356,17 @@ public void drawMarkers(RenderTickEvent event) {
if (markerRenderer == null) {
markerRenderer = new PosMarkerRenderer(1, 0, 0);
}
markerRenderer.render(event, this, pos1, pos2);
markerRenderer.render(activeDrawEvent, this, pos1, pos2);
} else if (player.getHeldItem() != null
&& player.getHeldItem().getItem() == Items.stick) {
if (buildMarkerRenderer == null) {
buildMarkerRenderer = new BuildMarkerRenderer();
}
buildMarkerRenderer.render(event, this);
buildMarkerRenderer.render(activeDrawEvent, this);
}
AIStrategy strat = currentStrategy;
if (strat != null) {
strat.drawMarkers(event, this);
strat.drawMarkers(activeDrawEvent, this);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.famzangl.minecraft.minebot.ai.profiler;

import java.util.concurrent.ConcurrentHashMap;

import net.famzangl.minecraft.minebot.ai.utils.PrivateFieldUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.profiler.Profiler;

/**
* This is a special profiler class that allows you to run some code when
* minecraft reaches a start of a profiler section.
*
* @author michael
*
*/
public class InterceptingProfiler extends Profiler {

private ConcurrentHashMap<String, Runnable> runOnSection = new ConcurrentHashMap<String, Runnable>();

@Override
public void startSection(String name) {
Runnable runnable = runOnSection.get(name);
if (runnable != null) {
runnable.run();
}
super.startSection(name);
}

public void addLisener(String name, Runnable r) {
runOnSection.put(name, r);
}

public static InterceptingProfiler inject(Minecraft minecraft) {
InterceptingProfiler profiler = new InterceptingProfiler();
// set minecraft.mcProfiler
PrivateFieldUtils.setFieldValue(minecraft, Minecraft.class, Profiler.class, profiler);
return profiler;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@
package net.famzangl.minecraft.minebot.ai.render;

import net.famzangl.minecraft.minebot.ai.AIHelper;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.entity.Entity;
import net.minecraft.util.BlockPos;
import net.minecraftforge.fml.common.gameevent.TickEvent.RenderTickEvent;
Expand All @@ -37,10 +41,13 @@ public class RenderHelper {
private static final double MAX = 1.05;
private static final double MIN = -0.05;

private boolean hadBlend;
public static final VertexFormat VF = new VertexFormat();
static {
VF.setElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3));
VF.setElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.COLOR, 4));
}

public void renderStart(RenderTickEvent event, AIHelper helper) {
final Tessellator tessellator = Tessellator.getInstance();
final Entity player = helper.getMinecraft().getRenderViewEntity();
final double x = player.lastTickPosX
+ (player.posX - player.lastTickPosX) * event.renderTickTime;
Expand All @@ -49,42 +56,53 @@ public void renderStart(RenderTickEvent event, AIHelper helper) {
final double z = player.lastTickPosZ
+ (player.posZ - player.lastTickPosZ) * event.renderTickTime;

GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR);
GL11.glDisable(GL11.GL_TEXTURE_2D);

OpenGlHelper.glBlendFunc(774, 768, 1, 0);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F);
GL11.glPushMatrix();
GL11.glPolygonOffset(-3.0F, -3.0F);
GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
GL11.glEnable(GL11.GL_ALPHA_TEST);
hadBlend = GL11.glIsEnabled(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_BLEND);
tessellator.getWorldRenderer().startDrawingQuads();
tessellator.getWorldRenderer().setTranslation(-x, -y, -z);
preRender();
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
worldrenderer.setVertexFormat(VF);
worldrenderer.setTranslation(-x, -y, -z);
worldrenderer.startDrawingQuads();
// worldrenderer.markDirty();
}

private void preRender()
{
GlStateManager.disableTexture2D();
GlStateManager.enableBlend();
GlStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR, 1, 0);

GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
GlStateManager.doPolygonOffset(-3.0F, -3.0F);
GlStateManager.enablePolygonOffset();
GlStateManager.alphaFunc(516, 0.1F);
GlStateManager.enableAlpha();
GlStateManager.pushMatrix();
}

private void postRender()
{
GlStateManager.disableAlpha();
GlStateManager.doPolygonOffset(0.0F, 0.0F);
GlStateManager.disablePolygonOffset();
GlStateManager.enableAlpha();
GlStateManager.depthMask(true);
GlStateManager.popMatrix();
GlStateManager.disableBlend();
GlStateManager.enableTexture2D();
}
protected void renderEnd() {
final Tessellator tessellator = Tessellator.getInstance();

WorldRenderer worldrenderer = tessellator.getWorldRenderer();
tessellator.draw();
tessellator.getWorldRenderer().setTranslation(0.0D, 0.0D, 0.0D);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glPolygonOffset(0.0F, 0.0F);
GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
GL11.glEnable(GL11.GL_ALPHA_TEST);
if (!hadBlend) {
GL11.glDisable(GL11.GL_BLEND);
}
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDepthMask(true);
GL11.glPopMatrix();
worldrenderer.setTranslation(0.0D, 0.0D, 0.0D);
postRender();
}

protected void renderMarker(BlockPos m, float r, float g, float b, float a) {
final Tessellator tessellator = Tessellator.getInstance();
tessellator.getWorldRenderer().setColorRGBA_F(r, g, b, a);
renderMarkerP(tessellator.getWorldRenderer(), m.getX(), m.getY(), m.getZ());
WorldRenderer renderer = tessellator.getWorldRenderer();
renderer.setColorRGBA_F(r, g, b, a);
renderMarkerP(renderer, m.getX(), m.getY(), m.getZ());
}

private void renderMarkerP(WorldRenderer worldRenderer, int x, int y, int z) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,35 @@ public static <T> T getFieldValue(Object o, Class<?> baseClass,
throw new IllegalArgumentException(e);
}
}
}

if (f.getType().isArray()) {
Class<?> componentType = f.getType().getComponentType();
if (componentType == ItemStack.class) {
throw new IllegalArgumentException("No field of type " + fieldType
+ " in " + baseClass);
}
public static <T> void setFieldValue(Object o, Class<?> baseClass,
Class<T> fieldType, T value) {
if (o == null) {
throw new NullPointerException();
}
if (!baseClass.isAssignableFrom(o.getClass())) {
throw new IllegalArgumentException("Got a " + o.getClass().getName() + " but expected a " + baseClass.getName());
}
for (Field f : baseClass.getDeclaredFields()) {
if (typeEquals(f.getType(), fieldType) && !Modifier.isStatic(f.getModifiers())) {
f.setAccessible(true);
try {
f.set(o, value);
return;
} catch (IllegalAccessException e) {
e.printStackTrace();
throw new IllegalArgumentException(e);
}
}
}

throw new IllegalArgumentException("No field of type " + fieldType
+ " in " + baseClass);
}

public static boolean typeEquals(Class<?> a, Class<?> b) {
return a.equals(b);
}
Expand Down

2 comments on commit d1c05d0

@PromoFaux
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent! I missed this from the 1.7.10 release.

Does this add back in right click with a wooden axe to set pos1/2?

@michaelzangl
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, not yet. You can add an issue for that.

Please sign in to comment.