fix: множество исправлений по H2PlayerManager (без тестов)
This commit is contained in:
@@ -8,12 +8,15 @@ import mc.core.network.BroadcastNetChannel;
|
|||||||
import mc.core.network.NetChannel;
|
import mc.core.network.NetChannel;
|
||||||
import mc.core.player.Player;
|
import mc.core.player.Player;
|
||||||
import mc.core.player.PlayerManager;
|
import mc.core.player.PlayerManager;
|
||||||
|
import mc.core.player.PlayerSettings;
|
||||||
import mc.core.world.World;
|
import mc.core.world.World;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -21,11 +24,21 @@ import static org.slf4j.helpers.MessageFormatter.format;
|
|||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class H2PlayerManager implements PlayerManager {
|
public class H2PlayerManager implements PlayerManager, Runnable {
|
||||||
@Setter
|
@Setter
|
||||||
@Autowired
|
@Autowired
|
||||||
private H2PlayerDAO h2playerDao;
|
private H2PlayerDAO h2playerDao;
|
||||||
private List<H2Player> playerList = new ArrayList<>();
|
private List<H2Player> 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
|
@Override
|
||||||
public Player createPlayer(String name, EntityLocation location, World world) {
|
public Player createPlayer(String name, EntityLocation location, World world) {
|
||||||
@@ -36,6 +49,7 @@ public class H2PlayerManager implements PlayerManager {
|
|||||||
h2Player.setLocation(location.clone());
|
h2Player.setLocation(location.clone());
|
||||||
h2Player.setLoadedChunks(new ArrayList<>());
|
h2Player.setLoadedChunks(new ArrayList<>());
|
||||||
h2Player.setWorld(world);
|
h2Player.setWorld(world);
|
||||||
|
h2Player.setSettings(new PlayerSettings());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
h2playerDao.insert(h2Player);
|
h2playerDao.insert(h2Player);
|
||||||
@@ -51,8 +65,11 @@ public class H2PlayerManager implements PlayerManager {
|
|||||||
public void joinServer(Player player) {
|
public void joinServer(Player player) {
|
||||||
//TODO в дальнейшем следует именно этому методу передать функции инсерта в БД
|
//TODO в дальнейшем следует именно этому методу передать функции инсерта в БД
|
||||||
H2Player h2Player = (H2Player) player;
|
H2Player h2Player = (H2Player) player;
|
||||||
|
synchronized (lock) {
|
||||||
playerList.add(h2Player);
|
playerList.add(h2Player);
|
||||||
h2Player.setOnline(true);
|
h2Player.setOnline(true);
|
||||||
|
lock.notify();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -62,13 +79,14 @@ public class H2PlayerManager implements PlayerManager {
|
|||||||
h2playerDao.update(h2Player);
|
h2playerDao.update(h2Player);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e);
|
log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e);
|
||||||
|
synchronized (lock) {
|
||||||
playerList.remove(h2Player);
|
playerList.remove(h2Player);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
h2Player.setId(0);
|
h2Player.setId(0);
|
||||||
h2Player.setOnline(false);
|
h2Player.setOnline(false);
|
||||||
h2Player.setWorld(null);
|
h2Player.setWorld(null);
|
||||||
h2Player.getLoadedChunks().clear();
|
h2Player.getLoadedChunks().clear();
|
||||||
h2Player.setSettings(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,20 +134,46 @@ public class H2PlayerManager implements PlayerManager {
|
|||||||
.findAny().orElse(new H2Player());
|
.findAny().orElse(new H2Player());
|
||||||
h2Player.setName(name);
|
h2Player.setName(name);
|
||||||
|
|
||||||
|
boolean result;
|
||||||
try {
|
try {
|
||||||
h2playerDao.getByName(h2Player);
|
result = h2playerDao.getByName(h2Player);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e);
|
log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (h2Player.getId() == 0) {
|
if (result) {
|
||||||
return null;
|
h2Player.setWorld(world);
|
||||||
} else {
|
|
||||||
return h2Player;
|
return h2Player;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
h2Player.setWorld(world);
|
||||||
return h2Player;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user