Похоже s.hasPlayer()
всегда верно, что делает это так:
if(s.hasPlayer()){
spawnPlayer(p);
}
запускается на выполнение внутри spawnPlayer(Player)
метода, который для них вызывает метод бежать бесконечно, в результате чего StackOverflowError
.
Чтобы исправить это, вы могли бы подождать до вызова spawnPlayer(p)
:
if(s.hasPlayer()){
long timeToWait = 20L;//set the time to wait to 20 ticks (1 second)
Bukkit.getServer().getScheduler().runTaskLater(Arsenal.p, new Runnable(){
public void run(){
spawnPlayer(p);
}
},timeToWait);
}
Итак, вот что ваш код может выглядеть следующим образом:
private Location spawnPlayer(Player p) {
int r = new Random().nextInt(ServerManager.getInstance().getServer(p).getSpawns().size());
final Spawn s = ServerManager.getInstance().getServer(p).getSpawns().get(r);
if(s.hasPlayer()){
long timeToWait = 20L;//set the time to wait to 20 ticks (1 second)
Bukkit.getServer().getScheduler().runTaskLater(Arsenal.p, new Runnable(){
public void run(){
spawnPlayer(p);
}
},timeToWait);
}
else{
s.setPlayer(p);
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Arsenal.p, new Runnable() {
public void run() {
spawnClear--;
if (spawnClear == 0) {
s.setPlayer(null);
}
}
}, 0L, 20L);
}
return s.getLocation();
}
Другое затруднительное бы сделать это так s.hasPlayer()
не всегда например, используя ArrayList
, чтобы убедиться, что игрок еще не был порожден:
List<String> spawned = new ArrayList<String>();
private Location spawnPlayer(Player p){
int r = new Random().nextInt(ServerManager.getInstance().getServer(p).getSpawns().size());
final Spawn s = ServerManager.getInstance().getServer(p).getSpawns().get(r);
if(s.hasPlayer() && !spawned.contains(p.getName()){
spawned.add(p.getName());
spawnPlayer(p);
}
else{
//the rest of your code...
}
}
Мы понятия не имеем, что такое «ServerManager»? Что это метод 'getInstance()' дает. Что такое 'Spawn', что такое' Bukket'? Ну, в этом коде есть так много неизвестных. –
@RohitJain Я считаю, что это modecraft server mod (mod framework?). – childofsoong
Я бы посоветовал создать новый экземпляр «Случайный» в каждом вызове метода, хотя я не думаю, что это причина бесконечной рекурсии. Попробуйте создать один экземпляр «Случайный» вне метода и сохранить его в члене вашего класса. – Eran