Refactor some event related things

This commit is contained in:
Brady 2018-08-11 00:03:16 -05:00
parent 6900fb2ade
commit 273a00753d
No known key found for this signature in database
GPG Key ID: 73A788379A197567
5 changed files with 321 additions and 269 deletions

View File

@ -21,6 +21,7 @@ import baritone.bot.behavior.Behavior;
import baritone.bot.behavior.impl.LookBehavior; import baritone.bot.behavior.impl.LookBehavior;
import baritone.bot.behavior.impl.MemoryBehavior; import baritone.bot.behavior.impl.MemoryBehavior;
import baritone.bot.behavior.impl.PathingBehavior; import baritone.bot.behavior.impl.PathingBehavior;
import baritone.bot.event.GameEventHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -17,7 +17,7 @@
package baritone.bot.behavior; package baritone.bot.behavior;
import baritone.bot.event.AbstractGameEventListener; import baritone.bot.event.listener.AbstractGameEventListener;
import baritone.bot.utils.Helper; import baritone.bot.utils.Helper;
/** /**

View File

@ -1,168 +1,185 @@
/* /*
* This file is part of Baritone. * This file is part of Baritone.
* *
* Baritone is free software: you can redistribute it and/or modify * Baritone is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* Baritone is distributed in the hope that it will be useful, * Baritone is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Baritone. If not, see <https://www.gnu.org/licenses/>. * along with Baritone. If not, see <https://www.gnu.org/licenses/>.
*/ */
package baritone.bot; /*
* This file is part of Baritone.
import baritone.bot.behavior.Behavior; *
import baritone.bot.chunk.CachedWorld; * Baritone is free software: you can redistribute it and/or modify
import baritone.bot.chunk.CachedWorldProvider; * it under the terms of the GNU General Public License as published by
import baritone.bot.chunk.ChunkPacker; * the Free Software Foundation, either version 3 of the License, or
import baritone.bot.event.IGameEventListener; * (at your option) any later version.
import baritone.bot.event.events.*; *
import baritone.bot.event.events.type.EventState; * Baritone is distributed in the hope that it will be useful,
import baritone.bot.utils.Helper; * but WITHOUT ANY WARRANTY; without even the implied warranty of
import net.minecraft.client.renderer.BufferBuilder; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
import net.minecraft.client.renderer.GlStateManager; * GNU General Public License for more details.
import net.minecraft.client.renderer.Tessellator; *
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; * You should have received a copy of the GNU General Public License
import net.minecraft.client.settings.KeyBinding; * along with Baritone. If not, see <https://www.gnu.org/licenses/>.
import org.lwjgl.input.Keyboard; */
import java.util.function.Consumer; package baritone.bot.event;
/** import baritone.bot.Baritone;
* @author Brady import baritone.bot.InputOverrideHandler;
* @since 7/31/2018 11:04 PM import baritone.bot.behavior.Behavior;
*/ import baritone.bot.chunk.CachedWorld;
public final class GameEventHandler implements IGameEventListener, Helper { import baritone.bot.chunk.CachedWorldProvider;
import baritone.bot.chunk.ChunkPacker;
GameEventHandler() {} import baritone.bot.event.listener.IGameEventListener;
import baritone.bot.event.events.*;
@Override import baritone.bot.event.events.type.EventState;
public final void onTick(TickEvent event) { import baritone.bot.utils.Helper;
dispatch(behavior -> behavior.onTick(event)); import net.minecraft.client.renderer.BufferBuilder;
} import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
@Override import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
public void onPlayerUpdate() { import net.minecraft.client.settings.KeyBinding;
dispatch(Behavior::onPlayerUpdate); import org.lwjgl.input.Keyboard;
}
import java.util.function.Consumer;
@Override
public void onProcessKeyBinds() { /**
InputOverrideHandler inputHandler = Baritone.INSTANCE.getInputOverrideHandler(); * @author Brady
* @since 7/31/2018 11:04 PM
// Simulate the key being held down this tick */
for (InputOverrideHandler.Input input : InputOverrideHandler.Input.values()) { public final class GameEventHandler implements IGameEventListener, Helper {
KeyBinding keyBinding = input.getKeyBinding();
@Override
if (inputHandler.isInputForcedDown(keyBinding) && !keyBinding.isKeyDown()) { public final void onTick(TickEvent event) {
int keyCode = keyBinding.getKeyCode(); dispatch(behavior -> behavior.onTick(event));
}
if (keyCode < Keyboard.KEYBOARD_SIZE)
KeyBinding.onTick(keyCode < 0 ? keyCode + 100 : keyCode); @Override
} public void onPlayerUpdate() {
} dispatch(Behavior::onPlayerUpdate);
}
dispatch(Behavior::onProcessKeyBinds);
} @Override
public void onProcessKeyBinds() {
@Override InputOverrideHandler inputHandler = Baritone.INSTANCE.getInputOverrideHandler();
public void onSendChatMessage(ChatEvent event) {
dispatch(behavior -> behavior.onSendChatMessage(event)); // Simulate the key being held down this tick
} for (InputOverrideHandler.Input input : InputOverrideHandler.Input.values()) {
KeyBinding keyBinding = input.getKeyBinding();
@Override
public void onChunkEvent(ChunkEvent event) { if (inputHandler.isInputForcedDown(keyBinding) && !keyBinding.isKeyDown()) {
EventState state = event.getState(); int keyCode = keyBinding.getKeyCode();
ChunkEvent.Type type = event.getType();
if (keyCode < Keyboard.KEYBOARD_SIZE)
boolean isPostPopulate = state == EventState.POST KeyBinding.onTick(keyCode < 0 ? keyCode + 100 : keyCode);
&& type == ChunkEvent.Type.POPULATE; }
}
// Whenever the server sends us to another dimension, chunks are unloaded
// technically after the new world has been loaded, so we perform a check dispatch(Behavior::onProcessKeyBinds);
// to make sure the chunk being unloaded is already loaded. }
boolean isPreUnload = state == EventState.PRE
&& type == ChunkEvent.Type.UNLOAD @Override
&& mc.world.getChunkProvider().isChunkGeneratedAt(event.getX(), event.getZ()); public void onSendChatMessage(ChatEvent event) {
dispatch(behavior -> behavior.onSendChatMessage(event));
if (isPostPopulate || isPreUnload) { }
CachedWorldProvider.INSTANCE.ifWorldLoaded(world ->
world.updateCachedChunk(event.getX(), event.getZ(), @Override
ChunkPacker.createPackedChunk(mc.world.getChunk(event.getX(), event.getZ())))); public void onChunkEvent(ChunkEvent event) {
} EventState state = event.getState();
ChunkEvent.Type type = event.getType();
dispatch(behavior -> behavior.onChunkEvent(event));
} boolean isPostPopulate = state == EventState.POST
&& type == ChunkEvent.Type.POPULATE;
@Override
public void onRenderPass(RenderEvent event) { // Whenever the server sends us to another dimension, chunks are unloaded
/* // technically after the new world has been loaded, so we perform a check
CachedWorldProvider.INSTANCE.ifWorldLoaded(world -> world.forEachRegion(region -> region.forEachChunk(chunk -> { // to make sure the chunk being unloaded is already loaded.
drawChunkLine(region.getX() * 512 + chunk.getX() * 16, region.getZ() * 512 + chunk.getZ() * 16, event.getPartialTicks()); boolean isPreUnload = state == EventState.PRE
}))); && type == ChunkEvent.Type.UNLOAD
*/ && mc.world.getChunkProvider().isChunkGeneratedAt(event.getX(), event.getZ());
dispatch(behavior -> behavior.onRenderPass(event)); if (isPostPopulate || isPreUnload) {
} CachedWorldProvider.INSTANCE.ifWorldLoaded(world ->
world.updateCachedChunk(event.getX(), event.getZ(),
@Override ChunkPacker.createPackedChunk(mc.world.getChunk(event.getX(), event.getZ()))));
public void onWorldEvent(WorldEvent event) { }
CachedWorldProvider cache = CachedWorldProvider.INSTANCE;
dispatch(behavior -> behavior.onChunkEvent(event));
switch (event.getState()) { }
case PRE:
cache.ifWorldLoaded(CachedWorld::save); @Override
break; public void onRenderPass(RenderEvent event) {
case POST: /*
cache.closeWorld(); CachedWorldProvider.INSTANCE.ifWorldLoaded(world -> world.forEachRegion(region -> region.forEachChunk(chunk -> {
if (event.getWorld() != null) drawChunkLine(region.getX() * 512 + chunk.getX() * 16, region.getZ() * 512 + chunk.getZ() * 16, event.getPartialTicks());
cache.initWorld(event.getWorld()); })));
break; */
}
dispatch(behavior -> behavior.onRenderPass(event));
dispatch(behavior -> behavior.onWorldEvent(event)); }
}
@Override
@Override public void onWorldEvent(WorldEvent event) {
public void onSendPacket(PacketEvent event) { CachedWorldProvider cache = CachedWorldProvider.INSTANCE;
dispatch(behavior -> behavior.onSendPacket(event));
} switch (event.getState()) {
case PRE:
@Override cache.ifWorldLoaded(CachedWorld::save);
public void onReceivePacket(PacketEvent event) { break;
dispatch(behavior -> behavior.onReceivePacket(event)); case POST:
} cache.closeWorld();
if (event.getWorld() != null)
private void dispatch(Consumer<Behavior> dispatchFunction) { cache.initWorld(event.getWorld());
Baritone.INSTANCE.getBehaviors().stream().filter(Behavior::isEnabled).forEach(dispatchFunction); break;
} }
private void drawChunkLine(int posX, int posZ, float partialTicks) { dispatch(behavior -> behavior.onWorldEvent(event));
GlStateManager.enableBlend(); }
GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
GlStateManager.color(1.0F, 1.0F, 0.0F, 0.4F); @Override
GlStateManager.glLineWidth(2.0F); public void onSendPacket(PacketEvent event) {
GlStateManager.disableTexture2D(); dispatch(behavior -> behavior.onSendPacket(event));
}
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder buffer = tessellator.getBuffer(); @Override
double d0 = mc.getRenderManager().viewerPosX; public void onReceivePacket(PacketEvent event) {
double d1 = mc.getRenderManager().viewerPosY; dispatch(behavior -> behavior.onReceivePacket(event));
double d2 = mc.getRenderManager().viewerPosZ; }
buffer.begin(3, DefaultVertexFormats.POSITION);
buffer.pos(posX - d0, 0 - d1, posZ - d2).endVertex(); private void dispatch(Consumer<Behavior> dispatchFunction) {
buffer.pos(posX - d0, 256 - d1, posZ - d2).endVertex(); Baritone.INSTANCE.getBehaviors().stream().filter(Behavior::isEnabled).forEach(dispatchFunction);
tessellator.draw(); }
GlStateManager.enableDepth(); private void drawChunkLine(int posX, int posZ, float partialTicks) {
GlStateManager.depthMask(true); GlStateManager.enableBlend();
GlStateManager.enableTexture2D(); GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
GlStateManager.disableBlend(); GlStateManager.color(1.0F, 1.0F, 0.0F, 0.4F);
} GlStateManager.glLineWidth(2.0F);
} GlStateManager.disableTexture2D();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder buffer = tessellator.getBuffer();
double d0 = mc.getRenderManager().viewerPosX;
double d1 = mc.getRenderManager().viewerPosY;
double d2 = mc.getRenderManager().viewerPosZ;
buffer.begin(3, DefaultVertexFormats.POSITION);
buffer.pos(posX - d0, 0 - d1, posZ - d2).endVertex();
buffer.pos(posX - d0, 256 - d1, posZ - d2).endVertex();
tessellator.draw();
GlStateManager.enableDepth();
GlStateManager.depthMask(true);
GlStateManager.enableTexture2D();
GlStateManager.disableBlend();
}
}

View File

@ -15,7 +15,24 @@
* along with Baritone. If not, see <https://www.gnu.org/licenses/>. * along with Baritone. If not, see <https://www.gnu.org/licenses/>.
*/ */
package baritone.bot.event; /*
* This file is part of Baritone.
*
* Baritone is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Baritone is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
*/
package baritone.bot.event.listener;
import baritone.bot.event.events.*; import baritone.bot.event.events.*;

View File

@ -1,99 +1,116 @@
/* /*
* This file is part of Baritone. * This file is part of Baritone.
* *
* Baritone is free software: you can redistribute it and/or modify * Baritone is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* Baritone is distributed in the hope that it will be useful, * Baritone is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Baritone. If not, see <https://www.gnu.org/licenses/>. * along with Baritone. If not, see <https://www.gnu.org/licenses/>.
*/ */
package baritone.bot.event; /*
* This file is part of Baritone.
import baritone.bot.event.events.*; *
import io.netty.util.concurrent.GenericFutureListener; * Baritone is free software: you can redistribute it and/or modify
import net.minecraft.client.Minecraft; * it under the terms of the GNU General Public License as published by
import net.minecraft.client.entity.EntityPlayerSP; * the Free Software Foundation, either version 3 of the License, or
import net.minecraft.client.multiplayer.WorldClient; * (at your option) any later version.
import net.minecraft.client.renderer.EntityRenderer; *
import net.minecraft.client.settings.GameSettings; * Baritone is distributed in the hope that it will be useful,
import net.minecraft.network.NetworkManager; * but WITHOUT ANY WARRANTY; without even the implied warranty of
import net.minecraft.network.Packet; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
/** *
* @author Brady * You should have received a copy of the GNU General Public License
* @since 7/31/2018 11:05 PM * along with Baritone. If not, see <https://www.gnu.org/licenses/>.
*/ */
public interface IGameEventListener {
package baritone.bot.event.listener;
/**
* Run once per game tick before screen input is handled. import baritone.bot.event.events.*;
* import io.netty.util.concurrent.GenericFutureListener;
* @see Minecraft#runTick() import net.minecraft.client.Minecraft;
*/ import net.minecraft.client.entity.EntityPlayerSP;
void onTick(TickEvent event); import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.renderer.EntityRenderer;
/** import net.minecraft.client.settings.GameSettings;
* Run once per game tick from before the player rotation is sent to the server. import net.minecraft.network.NetworkManager;
* @see EntityPlayerSP#onUpdate() import net.minecraft.network.Packet;
*/
void onPlayerUpdate(); /**
* @author Brady
/** * @since 7/31/2018 11:05 PM
* Run once per game tick from before keybinds are processed. */
* public interface IGameEventListener {
* @see Minecraft#processKeyBinds()
*/ /**
void onProcessKeyBinds(); * Run once per game tick before screen input is handled.
*
/** * @see Minecraft#runTick()
* Runs whenever the client player sends a message to the server. */
* void onTick(TickEvent event);
* @see EntityPlayerSP#sendChatMessage(String)
*/ /**
void onSendChatMessage(ChatEvent event); * Run once per game tick from before the player rotation is sent to the server.
* @see EntityPlayerSP#onUpdate()
/** */
* Runs before and after whenever a chunk is either loaded, unloaded, or populated. void onPlayerUpdate();
*
* @see WorldClient#doPreChunk(int, int, boolean) /**
*/ * Run once per game tick from before keybinds are processed.
void onChunkEvent(ChunkEvent event); *
* @see Minecraft#processKeyBinds()
/** */
* Runs once per world render pass. Two passes are made when {@link GameSettings#anaglyph} is on. void onProcessKeyBinds();
* <p>
* <b>Note:</b> {@link GameSettings#anaglyph} has been removed in Minecraft 1.13 /**
* * Runs whenever the client player sends a message to the server.
* @see EntityRenderer#renderWorldPass(int, float, long) *
*/ * @see EntityPlayerSP#sendChatMessage(String)
void onRenderPass(RenderEvent event); */
void onSendChatMessage(ChatEvent event);
/**
* Runs before and after whenever a new world is loaded /**
* * Runs before and after whenever a chunk is either loaded, unloaded, or populated.
* @see Minecraft#loadWorld(WorldClient, String) *
*/ * @see WorldClient#doPreChunk(int, int, boolean)
void onWorldEvent(WorldEvent event); */
void onChunkEvent(ChunkEvent event);
/**
* Runs before a outbound packet is sent /**
* * Runs once per world render pass. Two passes are made when {@link GameSettings#anaglyph} is on.
* @see NetworkManager#dispatchPacket(Packet, GenericFutureListener[]) * <p>
*/ * <b>Note:</b> {@link GameSettings#anaglyph} has been removed in Minecraft 1.13
void onSendPacket(PacketEvent event); *
* @see EntityRenderer#renderWorldPass(int, float, long)
/** */
* Runs before an inbound packet is processed void onRenderPass(RenderEvent event);
*
* @see NetworkManager#dispatchPacket(Packet, GenericFutureListener[]) /**
*/ * Runs before and after whenever a new world is loaded
void onReceivePacket(PacketEvent event); *
} * @see Minecraft#loadWorld(WorldClient, String)
*/
void onWorldEvent(WorldEvent event);
/**
* Runs before a outbound packet is sent
*
* @see NetworkManager#dispatchPacket(Packet, GenericFutureListener[])
*/
void onSendPacket(PacketEvent event);
/**
* Runs before an inbound packet is processed
*
* @see NetworkManager#dispatchPacket(Packet, GenericFutureListener[])
*/
void onReceivePacket(PacketEvent event);
}