2014-01-22 1 views
0

부킷 키트 (bukkit arena) 플러그인을 만들고 있습니다. 그 상태에 대한 enum을 가진 Arena 클래스가 있습니다. 기본 상태는 Status.disabled입니다. 나는 on-Enable을 호출하는 방법을 가지고 있는데,이 방법은 경기장을 유휴 상태로 설정합니다. 문제는 모든 경기장에 대해이 메소드를 호출하면 경기장이 다시 사용 불가 상태로 표시된다는 것입니다. 여기 내 경기장 클래스의 일부입니다 다른 클래스에서 변수가 변경되지 않습니다

이제
public class Arena { 
    protected final Main main; 

    public static enum Status{ 
     Idle, 
     InLobby, 
     InCountdown, 
     InGame, 
     Disabled; 
    } 

    private Status status = Status.Disabled; 
    String name; 
    Location lobby; 
    Location start; 
    Location end; 
    List<Location> checkpoints = new ArrayList<Location>(); 
    int lives; 
    int time; 

    public Arena(Main main, String name, Location lobby, Location start, List<Location> checkpoints, Location end, int lives, int time) 
    { 
     this.main = main; 
     this.name = name; 
     this.lobby = lobby; 
     this.start = start; 
     this.checkpoints = checkpoints; 
     this.end = end; 
     this.lives = lives; 
     this.time = time; 
    } 

    public void setStatus(Status statuss){ 
     this.status = statuss; 
    } 

    public final Status getStatus(){ 
     return status; 
    } 

    public final void onEnable(){ 
     this.status = Status.Idle; 
     System.out.println(this.getStatus() + " Trying status set on OnEnable. This is made from an Arena class."); 
     //The message above says status is Idle... 
    } 
} 

, 여기 JavaPlugin 확장 내 메인 클래스 내 onEnable 방법입니다 :

ArenaManager manager; 
public void onEnable(){ 
    PluginDescriptionFile pdfFile; 
    pdfFile = this.getDescription(); 
    getLogger().info(pdfFile.getName() + pdfFile.getVersion() + " has been enabled!"); 
    manager = new ArenaManager(this); 
    PluginManager pm = this.getServer().getPluginManager(); 
    pm.registerEvents(new events(this), this); 
    getConfig().options().copyDefaults(true); 
    saveDefaultConfig(); 
    for(Arena arena : manager.getAllArenas()){ 
     arena.onEnable(); 
    } 
    getLogger().info("Plugin contains " + manager.getAllArenas().size() + " arena(s)!"); 
    foo(); 
} 

public void foo(){ 
    for(Arena a : manager.getAllArenas()){ 
     System.out.println("foo " + a.getStatus()); 
    } 
} 

"foo에"라는 나의 방법은 검사 모든 경기장의 상태. 경기장은 "foo"를 시도 할 때 장애인으로 나타납니다. 이것이 유용하다면, 각 경기장은 파일에 저장됩니다. 그래서 모든 경기장을 얻으려면, 나는 아우망 내거를 사용합니다.

public List<Arena> getAllArenas(){ 
    List<Arena> arenas = new ArrayList<Arena>(); 
    File[] allfiles = new File(main.getDataFolder() + File.separator + "Courses" + File.separator).listFiles(); 
    assert allfiles != null; 
    for(File f : allfiles){ 
     FileConfiguration con = YamlConfiguration.loadConfiguration(f); 
     String name = con.getString("Name"); 
     Arena a = getCourse(name); 
     arenas.add(a); 
    } 
    return arenas; 
} 

내가 (로그인에)에 PlayerInteractEvent에서뿐만 아니라 상태를 인쇄하려고했으나 경기장은 여전히 ​​불가능으로 표시하십시오 onEnable에 사용되는 arenamanager에서 방법이다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 그런데 콘솔에 오류가 없습니다. 도움말 : 한마디로

+0

정말 사용하는 코드입니까? 당신은'onEnable()'에서 무한 재귀를 가진 것처럼 보입니다. –

+0

'getCourse()'의 코드는 어디에 있나요? 'getCourse()'가하는 일에 따라'getAllAreans()'가 반환되는리스트를위한 새로운'Arena' 객체를 생성하는 것처럼 보입니다. 그래서 당신이'getAllArenas()'를 호출 할 때마다'Status'가'Disabled'로 설정된 새로운 객체를 생성하게됩니다. – mdewitt

+0

@ PM77-1 네, 그게 내가 onEnable에 사용하는 것입니다. 나는 자바를 처음 사용하므로 뭔가 잘못하고 있니? – user3091392

답변

2

주셔서 감사합니다 :

당신은 당신의 Status을 설정하는 데 사용 manager.getAllArenas()에서 반환되는 ListArena의 객체에 대한 참조를 저장하지 않는 때문에 status 변수가 변경되지 않습니다. 코드를보고 Arena 객체의 상태를 저장하는 방법을 찾고 싶습니다. 이 작업에는 몇 가지 다른 방법이 있지만 가장 적합한 것이 무엇인지 결정하도록하겠습니다.

긴 설명

은 다음과 같습니다 :

자바의 Object를 만들 때, 당신은 동일한 개체를 계속 사용하고 상태를 저장하려는 경우 (이를 참조) 어딘가에 개체를 보유해야합니다. 당신의 ArenaManager.onEnable() 방법에서

당신은 manager.getAllArenas()를 호출하고 Status.IdleArena 개체의 status 필드를 설정합니다. 여기 :

public void onEnable(){ 
    ... 
    for(Arena arena : manager.getAllArenas()){ 
     arena.onEnable(); 
    } 
    ... 
    foo(); 
} 

manager.getAllArenas()의 논리는 당신이 ArenaManager.onEnable() 방법 manager.getAllArenas()를 호출 할 때 루프에 대한 모든 Arena 객체를 종료 한 번, 그래서 당신은 어디에서나이 목록을 저장하지 본질적으로

1. Create new List<Arena> 
2. Get the name of all the Arena objects from File 
3. For every File object, create a new Arena object 
4. Add new Arena object to List created in step 1. 

입니다 Arena.onEnable() 메소드에서 Status을 설정합니다.

나중에 Arena.onEnable()foo() (으)로 전화하면. manager.getAllArenas()에 다시 전화 할 때 새로운 목록을 만들므로 for-loopstatus을 설정하지 않아이 목록이 영향을받지 않습니다. Status.Idle