Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ref(event): change tick event to have pre/post classes #9890

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,13 @@ public void onEntityJoinWorld(EntityJoinLevelEvent event) {
}

@SubscribeEvent
public void onServerTick(ServerTickEvent event) {
WorldWorkerManager.tick(event.phase == TickEvent.Phase.START);
public void onServerTick(ServerTickEvent.Pre event) {
WorldWorkerManager.tick(true);
}

@SubscribeEvent
public void onServerTick(ServerTickEvent.Post event) {
WorldWorkerManager.tick(false);
}

@SubscribeEvent
Expand Down
20 changes: 10 additions & 10 deletions src/main/java/net/minecraftforge/event/ForgeEventFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -799,43 +799,43 @@ public static void firePlayerSmeltedEvent(Player player, ItemStack smelted) {
}

public static void onRenderTickStart(float timer) {
post(new TickEvent.RenderTickEvent(TickEvent.Phase.START, timer));
post(new TickEvent.RenderTickEvent.Pre(timer));
}

public static void onRenderTickEnd(float timer) {
post(new TickEvent.RenderTickEvent(TickEvent.Phase.END, timer));
post(new TickEvent.RenderTickEvent.Post(timer));
}

public static void onPlayerPreTick(Player player) {
post(new TickEvent.PlayerTickEvent(TickEvent.Phase.START, player));
post(new TickEvent.PlayerTickEvent.Pre(player));
}

public static void onPlayerPostTick(Player player) {
post(new TickEvent.PlayerTickEvent(TickEvent.Phase.END, player));
post(new TickEvent.PlayerTickEvent.Post(player));
}

public static void onPreLevelTick(Level level, BooleanSupplier haveTime) {
post(new TickEvent.LevelTickEvent(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, TickEvent.Phase.START, level, haveTime));
post(new TickEvent.LevelTickEvent.Pre(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime));
}

public static void onPostLevelTick(Level level, BooleanSupplier haveTime) {
post(new TickEvent.LevelTickEvent(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, TickEvent.Phase.END, level, haveTime));
post(new TickEvent.LevelTickEvent.Post(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime));
}

public static void onPreClientTick() {
post(new TickEvent.ClientTickEvent(TickEvent.Phase.START));
post(TickEvent.ClientTickEvent.Pre.get());
}

public static void onPostClientTick() {
post(new TickEvent.ClientTickEvent(TickEvent.Phase.END));
post(TickEvent.ClientTickEvent.Post.get());
}

public static void onPreServerTick(BooleanSupplier haveTime, MinecraftServer server) {
post(new TickEvent.ServerTickEvent(TickEvent.Phase.START, haveTime, server));
post(new TickEvent.ServerTickEvent.Pre(haveTime, server));
}

public static void onPostServerTick(BooleanSupplier haveTime, MinecraftServer server) {
post(new TickEvent.ServerTickEvent(TickEvent.Phase.END, haveTime, server));
post(new TickEvent.ServerTickEvent.Post(haveTime, server));
}

public static WeightedRandomList<MobSpawnSettings.SpawnerData> getPotentialSpawns(LevelAccessor level, MobCategory category, BlockPos pos, WeightedRandomList<MobSpawnSettings.SpawnerData> oldList) {
Expand Down
141 changes: 115 additions & 26 deletions src/main/java/net/minecraftforge/event/TickEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.fml.LogicalSide;

public class TickEvent extends Event
{
public class TickEvent extends Event {
public enum Type {
LEVEL, PLAYER, CLIENT, SERVER, RENDER;
}

public enum Phase {
START, END;
}

public final Type type;
public final LogicalSide side;
@Deprecated(forRemoval = true, since = "1.20.6")
public final Phase phase;
public TickEvent(Type type, LogicalSide side, Phase phase)
{
public TickEvent(Type type, LogicalSide side, Phase phase) {
this.type = type;
this.side = side;
this.phase = phase;
Expand All @@ -38,78 +38,167 @@ public static class ServerTickEvent extends TickEvent {
private final BooleanSupplier haveTime;
private final MinecraftServer server;

public ServerTickEvent(Phase phase, BooleanSupplier haveTime, MinecraftServer server)
{
@Deprecated(forRemoval = true, since = "1.20.6")
public ServerTickEvent(Phase phase, BooleanSupplier haveTime, MinecraftServer server) {
this(haveTime, server, phase);
}
protected ServerTickEvent(BooleanSupplier haveTime, MinecraftServer server, Phase phase) {
Copy link
Member

Choose a reason for hiding this comment

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

All of these public -> protected are binary breaks.
Its fine to change them to protected {and move the phase to the end} but the public ones have to stay as bouncers.
And also you should mark the proper time for removal
@Deprecated(forRemoval = true, since = "1.20.6")

Maintaining binary compatibility means that your PR can be backported without major modifications

Suggested change
protected ServerTickEvent(BooleanSupplier haveTime, MinecraftServer server, Phase phase) {
@Deprecated(forRemoval = true, since = "1.20.6")
public ServerTickEvent(Phase phase, BooleanSupplier haveTime, MinecraftServer server) {
this(haveTime, server, phase);
}
protected ServerTickEvent(BooleanSupplier haveTime, MinecraftServer server, Phase phase) {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah yes I completely missed that, thank you! I think I managed to get all of them now

super(Type.SERVER, LogicalSide.SERVER, phase);
this.haveTime = haveTime;
this.server = server;
}

/**
* @return {@code true} whether the server has enough time to perform any
* additional tasks (usually IO related) during the current tick,
* otherwise {@code false}
* additional tasks (usually IO related) during the current tick,
* otherwise {@code false}
*/
public boolean haveTime()
{
public boolean haveTime() {
return this.haveTime.getAsBoolean();
}

/**
* {@return the server instance}
*/
public MinecraftServer getServer()
{
public MinecraftServer getServer() {
return server;
}

public static class Pre extends ServerTickEvent {

public Pre(BooleanSupplier haveTime, MinecraftServer server) {
super(haveTime, server, Phase.START);
}
}

public static class Post extends ServerTickEvent {

public Post(BooleanSupplier haveTime, MinecraftServer server) {
super(haveTime, server, Phase.END);
}
}
}

public static class ClientTickEvent extends TickEvent {
public ClientTickEvent(Phase phase)
{
@Deprecated(forRemoval = true, since = "1.20.6")
public ClientTickEvent(Phase phase) {
super(Type.CLIENT, LogicalSide.CLIENT, phase);
}

public static class Pre extends ClientTickEvent {

private static final Pre INSTANCE = new Pre();

private Pre() {
super(Phase.START);
}

public static Pre get() {
return INSTANCE;
}
}

public static class Post extends ClientTickEvent {

private static final Post INSTANCE = new Post();

private Post() {
super(Phase.END);
}

public static Post get() {
return INSTANCE;
}
}
}

public static class LevelTickEvent extends TickEvent {
public final Level level;
private final BooleanSupplier haveTime;

public LevelTickEvent(LogicalSide side, Phase phase, Level level, BooleanSupplier haveTime)
{
@Deprecated(forRemoval = true, since = "1.20.6")
public LevelTickEvent(LogicalSide side, Phase phase, Level level, BooleanSupplier haveTime) {
super(Type.LEVEL, side, phase);
this.level = level;
this.haveTime = haveTime;
}
protected LevelTickEvent(LogicalSide side, Level level, BooleanSupplier haveTime, Phase phase) {
super(Type.LEVEL, side, phase);
this.level = level;
this.haveTime = haveTime;
}

/**
* @return {@code true} whether the server has enough time to perform any
* additional tasks (usually IO related) during the current tick,
* otherwise {@code false}
*
* additional tasks (usually IO related) during the current tick,
* otherwise {@code false}
* @see ServerTickEvent#haveTime()
*/
public boolean haveTime()
{
public boolean haveTime() {
return this.haveTime.getAsBoolean();
}

public static class Pre extends LevelTickEvent {
public Pre(LogicalSide side, Level level, BooleanSupplier haveTime) {
super(side, level, haveTime, Phase.START);
}
}

public static class Post extends LevelTickEvent {
public Post(LogicalSide side, Level level, BooleanSupplier haveTime) {
super(side, level, haveTime, Phase.END);
}
}
}

public static class PlayerTickEvent extends TickEvent {
public final Player player;

public PlayerTickEvent(Phase phase, Player player)
{
@Deprecated(forRemoval = true, since = "1.20.6")
public PlayerTickEvent(Phase phase, Player player) {
this(player, phase);
}
protected PlayerTickEvent(Player player, Phase phase) {
super(Type.PLAYER, player instanceof ServerPlayer ? LogicalSide.SERVER : LogicalSide.CLIENT, phase);
this.player = player;
}

public static class Pre extends PlayerTickEvent {
public Pre(Player player) {
super(player, Phase.START);
}
}

public static class Post extends PlayerTickEvent {
public Post(Player player) {
super(player, Phase.END);
}
}
}

public static class RenderTickEvent extends TickEvent {
public final float renderTickTime;
public RenderTickEvent(Phase phase, float renderTickTime)
{

@Deprecated(forRemoval = true, since = "1.20.6")
public RenderTickEvent(Phase phase, float renderTickTime) {
super(Type.RENDER, LogicalSide.CLIENT, phase);
this.renderTickTime = renderTickTime;
}
protected RenderTickEvent(float renderTickTime, Phase phase) {
super(Type.RENDER, LogicalSide.CLIENT, phase);
this.renderTickTime = renderTickTime;
}

public static class Pre extends RenderTickEvent {
public Pre(float renderTickTime) {
super(renderTickTime, Phase.START);
}
}

public static class Post extends RenderTickEvent {
public Post(float renderTickTime) {
super(renderTickTime, Phase.END);
}
}
}
}