-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add serverside entity tracking
Haven't fully replaced vanilla's `ServerEntityManager` yet, might be interfering with movement ticking, since cows currently move at double speed.
- Loading branch information
1 parent
1c5f1a6
commit f55d72e
Showing
11 changed files
with
256 additions
and
22 deletions.
There are no files selected for viewing
2 changes: 1 addition & 1 deletion
2
common/src/main/java/io/github/steveplays28/noisium/Noisium.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
common/src/main/java/io/github/steveplays28/noisium/server/NoisiumServerInitialiser.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package io.github.steveplays28.noisium.server; | ||
|
||
import dev.architectury.event.events.common.LifecycleEvent; | ||
import io.github.steveplays28.noisium.server.player.NoisiumServerPlayerBlockUpdater; | ||
import io.github.steveplays28.noisium.server.player.NoisiumServerPlayerChunkLoader; | ||
|
||
public class NoisiumServerInitialiser { | ||
/** | ||
* Keeps a reference to the {@link NoisiumServerPlayerChunkLoader}, to make sure it doesn't get garbage collected until the object is no longer necessary. | ||
*/ | ||
@SuppressWarnings("unused") | ||
private static NoisiumServerPlayerChunkLoader serverPlayerChunkLoader; | ||
/** | ||
* Keeps a reference to the {@link NoisiumServerPlayerBlockUpdater}, to make sure it doesn't get garbage collected until the object is no longer necessary. | ||
*/ | ||
@SuppressWarnings("unused") | ||
private static NoisiumServerPlayerBlockUpdater serverPlayerBlockUpdater; | ||
|
||
public static void initialise() { | ||
LifecycleEvent.SERVER_STARTED.register(instance -> { | ||
serverPlayerChunkLoader = new NoisiumServerPlayerChunkLoader(); | ||
serverPlayerBlockUpdater = new NoisiumServerPlayerBlockUpdater(); | ||
}); | ||
LifecycleEvent.SERVER_STOPPING.register(instance -> { | ||
serverPlayerChunkLoader = null; | ||
serverPlayerBlockUpdater = null; | ||
}); | ||
} | ||
} |
27 changes: 27 additions & 0 deletions
27
...in/java/io/github/steveplays28/noisium/server/player/NoisiumServerPlayerBlockUpdater.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package io.github.steveplays28.noisium.server.player; | ||
|
||
import dev.architectury.event.EventResult; | ||
import dev.architectury.event.events.common.BlockEvent; | ||
import io.github.steveplays28.noisium.util.world.chunk.ChunkUtil; | ||
import net.minecraft.block.Blocks; | ||
import net.minecraft.server.world.ServerWorld; | ||
import net.minecraft.util.math.BlockPos; | ||
import net.minecraft.world.World; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
public class NoisiumServerPlayerBlockUpdater { | ||
public NoisiumServerPlayerBlockUpdater() { | ||
// TODO: Replace this event with an event that runs when ServerChunkManager#markForUpdate is called | ||
// The mixin for that event should cancel the existing method to improve performance (it'll do nothing anyway) | ||
BlockEvent.BREAK.register((world, blockPos, blockState, player, xp) -> onBlockBreak(world, blockPos)); | ||
} | ||
|
||
private EventResult onBlockBreak(@NotNull World world, BlockPos blockPos) { | ||
if (world.isClient()) { | ||
return EventResult.pass(); | ||
} | ||
|
||
ChunkUtil.sendBlockUpdateToPlayers(((ServerWorld) world).getPlayers(), blockPos, Blocks.AIR.getDefaultState()); | ||
return EventResult.pass(); | ||
} | ||
} |
17 changes: 0 additions & 17 deletions
17
...n/src/main/java/io/github/steveplays28/noisium/server/world/NoisiumServerInitialiser.java
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
...java/io/github/steveplays28/noisium/server/world/chunk/event/NoisiumServerChunkEvent.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package io.github.steveplays28.noisium.server.world.chunk.event; | ||
|
||
import dev.architectury.event.Event; | ||
import dev.architectury.event.EventFactory; | ||
import net.minecraft.world.chunk.WorldChunk; | ||
|
||
public interface NoisiumServerChunkEvent { | ||
/** | ||
* @see WorldChunkGenerated | ||
*/ | ||
Event<WorldChunkGenerated> WORLD_CHUNK_GENERATED = EventFactory.createLoop(); | ||
|
||
@FunctionalInterface | ||
interface WorldChunkGenerated { | ||
/** | ||
* Invoked after a {@link WorldChunk} has been generated by {@link io.github.steveplays28.noisium.server.world.NoisiumServerWorldChunkManager}. | ||
* | ||
* @param worldChunk The generated {@link WorldChunk}. | ||
*/ | ||
void onWorldChunkGenerated(WorldChunk worldChunk); | ||
} | ||
} |
68 changes: 68 additions & 0 deletions
68
...a/io/github/steveplays28/noisium/server/world/entity/NoisiumServerWorldEntityTracker.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package io.github.steveplays28.noisium.server.world.entity; | ||
|
||
import dev.architectury.event.EventResult; | ||
import dev.architectury.event.events.common.EntityEvent; | ||
import dev.architectury.event.events.common.TickEvent; | ||
import net.minecraft.entity.Entity; | ||
import net.minecraft.network.packet.Packet; | ||
import net.minecraft.server.network.EntityTrackerEntry; | ||
import net.minecraft.server.world.ServerWorld; | ||
import net.minecraft.world.World; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.function.Consumer; | ||
|
||
// TODO: Reimplement the rest of ServerEntityManager and replace it | ||
public class NoisiumServerWorldEntityTracker { | ||
private final Map<Integer, EntityTrackerEntry> entityTrackerEntries; | ||
private final Consumer<Packet<?>> packetSendConsumer; | ||
|
||
public NoisiumServerWorldEntityTracker(Consumer<Packet<?>> packetSendConsumer) { | ||
this.entityTrackerEntries = new HashMap<>(); | ||
this.packetSendConsumer = packetSendConsumer; | ||
|
||
EntityEvent.ADD.register(this::onEntityAdded); | ||
TickEvent.SERVER_LEVEL_PRE.register(this::onTick); | ||
} | ||
|
||
@SuppressWarnings("ForLoopReplaceableByForEach") | ||
private EventResult onEntityAdded(@NotNull Entity entity, @NotNull World world) { | ||
if (world.isClient()) { | ||
return EventResult.pass(); | ||
} | ||
|
||
var entityType = entity.getType(); | ||
entityTrackerEntries.put( | ||
entity.getId(), | ||
new EntityTrackerEntry( | ||
(ServerWorld) world, entity, entityType.getTrackTickInterval(), entityType.alwaysUpdateVelocity(), | ||
packetSendConsumer | ||
) | ||
); | ||
|
||
var players = ((ServerWorld) world).getPlayers(); | ||
for (int i = 0; i < players.size(); i++) { | ||
entityTrackerEntries.get(entity.getId()).startTracking(players.get(i)); | ||
} | ||
|
||
return EventResult.pass(); | ||
} | ||
|
||
@SuppressWarnings("ForLoopReplaceableByForEach") | ||
private EventResult onEntityRemoved(@NotNull Entity entity, @NotNull World world) { | ||
var players = ((ServerWorld) world).getPlayers(); | ||
for (int i = 0; i < players.size(); i++) { | ||
entityTrackerEntries.get(entity.getId()).stopTracking(players.get(i)); | ||
} | ||
entityTrackerEntries.remove(entity.getId()); | ||
return EventResult.pass(); | ||
} | ||
|
||
private void onTick(ServerWorld serverWorld) { | ||
for (var entityTrackerEntry : entityTrackerEntries.values()) { | ||
entityTrackerEntry.tick(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
...in/java/io/github/steveplays28/noisium/util/world/chunk/networking/packet/PacketUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package io.github.steveplays28.noisium.util.world.chunk.networking.packet; | ||
|
||
import net.minecraft.network.packet.Packet; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.util.List; | ||
|
||
public class PacketUtil { | ||
/** | ||
* Sends a packet to a {@link List} of players. | ||
* | ||
* @param players The {@link List} of players. | ||
* @param packet The {@link Packet} that should be sent to the {@link List} of players. | ||
*/ | ||
@SuppressWarnings("ForLoopReplaceableByForEach") | ||
public static void sendPacketToPlayers(@NotNull List<ServerPlayerEntity> players, @NotNull Packet<?> packet) { | ||
for (int i = 0; i < players.size(); i++) { | ||
players.get(i).networkHandler.sendPacket(packet); | ||
} | ||
} | ||
} |