Skip to content
Snippets Groups Projects
Commit 2228332f authored by Melledy's avatar Melledy
Browse files

Call checkSpawns from World instead of from Player

parent c3f9fd3c
Branches
Tags
No related merge requests found
......@@ -695,10 +695,6 @@ public class GenshinPlayer {
it.remove();
}
}
//
if (this.getScene() != null && this.getSceneLoadState() == SceneLoadState.LOADED) {
this.getScene().checkSpawns(this);
}
// Ping
if (this.getWorld() != null) {
// RTT notify - very important to send this often
......
......@@ -315,32 +315,31 @@ public class GenshinScene {
target.onDeath(attackerId);
}
// TODO Do not use yet
public synchronized void onTick() {
for (GenshinPlayer player : this.getPlayers()) {
this.checkSpawns(player);
}
public void onTick() {
this.checkSpawns();
}
// TODO - Test
public void checkSpawns(GenshinPlayer player) {
public void checkSpawns() {
SpatialIndex<SpawnGroupEntry> list = GenshinDepot.getSpawnListById(this.getId());
Set<SpawnDataEntry> visible = new HashSet<>();
int RANGE = 100;
Collection<SpawnGroupEntry> entries = list.query(
new double[] {player.getPos().getX() - RANGE, player.getPos().getZ() - RANGE},
new double[] {player.getPos().getX() + RANGE, player.getPos().getZ() + RANGE}
);
for (SpawnGroupEntry entry : entries) {
for (SpawnDataEntry spawnData : entry.getSpawns()) {
visible.add(spawnData);
for (GenshinPlayer player : this.getPlayers()) {
int RANGE = 100;
Collection<SpawnGroupEntry> entries = list.query(
new double[] {player.getPos().getX() - RANGE, player.getPos().getZ() - RANGE},
new double[] {player.getPos().getX() + RANGE, player.getPos().getZ() + RANGE}
);
for (SpawnGroupEntry entry : entries) {
for (SpawnDataEntry spawnData : entry.getSpawns()) {
visible.add(spawnData);
}
}
}
// World level
WorldLevelData worldLevelData = GenshinData.getWorldLevelDataMap().get(player.getWorldLevel());
WorldLevelData worldLevelData = GenshinData.getWorldLevelDataMap().get(getWorld().getWorldLevel());
int worldLevelOverride = 0;
if (worldLevelData != null) {
......
......@@ -37,6 +37,7 @@ import emu.grasscutter.server.packet.send.PacketWorldPlayerInfoNotify;
import emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify;
import emu.grasscutter.utils.Position;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public class World implements Iterable<GenshinPlayer> {
......@@ -58,11 +59,13 @@ public class World implements Iterable<GenshinPlayer> {
public World(GenshinPlayer player, boolean isMultiplayer) {
this.owner = player;
this.players = Collections.synchronizedList(new ArrayList<>());
this.scenes = new Int2ObjectOpenHashMap<>();
this.scenes = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>());
this.levelEntityId = getNextEntityId(EntityIdType.MPLEVEL);
this.worldLevel = player.getWorldLevel();
this.isMultiplayer = isMultiplayer;
this.owner.getServer().registerWorld(this);
}
public GenshinPlayer getHost() {
......@@ -273,6 +276,12 @@ public class World implements Iterable<GenshinPlayer> {
}
}
public void onTick() {
for (GenshinScene scene : this.getScenes().values()) {
scene.onTick();
}
}
public void close() {
}
......
......@@ -10,6 +10,7 @@ import emu.grasscutter.command.CommandMap;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.GenshinPlayer;
import emu.grasscutter.game.World;
import emu.grasscutter.game.dungeons.DungeonManager;
import emu.grasscutter.game.gacha.GachaManager;
import emu.grasscutter.game.managers.ChatManager;
......@@ -26,6 +27,7 @@ public final class GameServer extends MihoyoKcpServer {
private final GameServerPacketHandler packetHandler;
private final Map<Integer, GenshinPlayer> players;
private final Set<World> worlds;
private final ChatManager chatManager;
private final InventoryManager inventoryManager;
......@@ -50,6 +52,7 @@ public final class GameServer extends MihoyoKcpServer {
this.address = address;
this.packetHandler = new GameServerPacketHandler(PacketHandler.class);
this.players = new ConcurrentHashMap<>();
this.worlds = Collections.synchronizedSet(new HashSet<>());
this.chatManager = new ChatManager(this);
this.inventoryManager = new InventoryManager(this);
......@@ -84,6 +87,10 @@ public final class GameServer extends MihoyoKcpServer {
return players;
}
public Set<World> getWorlds() {
return worlds;
}
public ChatManager getChatManager() {
return chatManager;
}
......@@ -161,12 +168,32 @@ public final class GameServer extends MihoyoKcpServer {
}
public void onTick() throws Exception {
Iterator<World> it = this.getWorlds().iterator();
while (it.hasNext()) {
World world = it.next();
if (world.getPlayerCount() == 0) {
it.remove();
}
world.onTick();
}
for (GenshinPlayer player : this.getPlayers().values()) {
player.onTick();
}
OnGameServerTick.post(new GameServerTickEvent());
}
public void registerWorld(World world) {
this.getWorlds().add(world);
}
public void deregisterWorld(World world) {
// TODO Auto-generated method stub
}
@Override
public void onStartFinish() {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment