diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index fdd4b11..636460b 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -8,12 +8,15 @@ import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; import mc.core.player.Player; import mc.core.player.PlayerManager; +import mc.core.player.PlayerSettings; import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -21,11 +24,21 @@ import static org.slf4j.helpers.MessageFormatter.format; @Slf4j @Component -public class H2PlayerManager implements PlayerManager { +public class H2PlayerManager implements PlayerManager, Runnable { @Setter @Autowired private H2PlayerDAO h2playerDao; - private List playerList = new ArrayList<>(); + private List playerList = Collections.synchronizedList(new ArrayList<>()); + private final Object lock = new Object(); + @Setter + private int keepAliveInterval = 1; + @Autowired + private World world; + + @PostConstruct + public void init() { + (new Thread(this, "KeepAlive")).start(); + } @Override public Player createPlayer(String name, EntityLocation location, World world) { @@ -36,6 +49,7 @@ public class H2PlayerManager implements PlayerManager { h2Player.setLocation(location.clone()); h2Player.setLoadedChunks(new ArrayList<>()); h2Player.setWorld(world); + h2Player.setSettings(new PlayerSettings()); try { h2playerDao.insert(h2Player); @@ -51,8 +65,11 @@ public class H2PlayerManager implements PlayerManager { public void joinServer(Player player) { //TODO в дальнейшем следует именно этому методу передать функции инсерта в БД H2Player h2Player = (H2Player) player; - playerList.add(h2Player); - h2Player.setOnline(true); + synchronized (lock) { + playerList.add(h2Player); + h2Player.setOnline(true); + lock.notify(); + } } @Override @@ -62,13 +79,14 @@ public class H2PlayerManager implements PlayerManager { h2playerDao.update(h2Player); } catch (SQLException e) { log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e); - playerList.remove(h2Player); + synchronized (lock) { + playerList.remove(h2Player); + } } finally { h2Player.setId(0); h2Player.setOnline(false); h2Player.setWorld(null); h2Player.getLoadedChunks().clear(); - h2Player.setSettings(null); } } @@ -116,20 +134,46 @@ public class H2PlayerManager implements PlayerManager { .findAny().orElse(new H2Player()); h2Player.setName(name); + boolean result; try { - h2playerDao.getByName(h2Player); + result = h2playerDao.getByName(h2Player); } catch (SQLException e) { log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e); return null; } - if (h2Player.getId() == 0) { - return null; - } else { + if (result) { + h2Player.setWorld(world); return h2Player; + } else { + return null; } } else { + h2Player.setWorld(world); return h2Player; } } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + while(getCountPlayers() == 0) { + synchronized (lock) { + try { + lock.wait(); + } catch (InterruptedException e) { + return; + } + } + } + + getBroadcastChannel().sendKeepAlive(); + + try { + Thread.sleep(keepAliveInterval); + } catch (InterruptedException e) { + return; + } + } + } }