001package fr.aumgn.dac2.stage; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import org.bukkit.Bukkit; 007import org.bukkit.entity.Player; 008import org.bukkit.event.HandlerList; 009import org.bukkit.event.Listener; 010 011import fr.aumgn.dac2.DAC; 012import fr.aumgn.dac2.arena.Arena; 013import fr.aumgn.dac2.exceptions.IncompleteArena; 014import fr.aumgn.dac2.exceptions.StageAlreadyRunning; 015 016public class Stages { 017 018 private final DAC dac; 019 private final List<Stage> stages; 020 021 public Stages(DAC dac) { 022 this.dac = dac; 023 this.stages = new ArrayList<Stage>(dac.getArenas().length()); 024 } 025 026 public Stage get(Arena arena) { 027 for (Stage stage : stages) { 028 if (stage.getArena() == arena) { 029 return stage; 030 } 031 } 032 033 return null; 034 } 035 036 public Stage get(Player player) { 037 for (Stage stage : stages) { 038 if (stage.contains(player)) { 039 return stage; 040 } 041 } 042 043 return null; 044 } 045 046 public void start(Stage stage) { 047 Arena arena = stage.getArena(); 048 if (get(stage.getArena()) != null) { 049 throw new StageAlreadyRunning(dac.getMessages()); 050 } 051 052 if (!arena.isComplete()) { 053 throw new IncompleteArena(dac, arena); 054 } 055 stages.add(stage); 056 registerListeners(stage); 057 stage.start(); 058 } 059 060 public void stop(Stage stage) { 061 unregisterListeners(stage); 062 stage.stop(false); 063 stages.remove(stage); 064 } 065 066 public void forceStop(Stage stage) { 067 unregisterListeners(stage); 068 stage.stop(true); 069 stages.remove(stage); 070 } 071 072 public void switchTo(Stage stage) { 073 Stage oldStage = get(stage.getArena()); 074 if (oldStage == null) { 075 stages.add(stage); 076 } else { 077 unregisterListeners(oldStage); 078 oldStage.stop(false); 079 int index = stages.indexOf(oldStage); 080 stages.set(index, stage); 081 } 082 083 registerListeners(stage); 084 stage.start(); 085 } 086 087 private void registerListeners(Stage stage) { 088 for (Listener listener : stage.getListeners()) { 089 Bukkit.getPluginManager() 090 .registerEvents(listener, dac.getPlugin()); 091 } 092 } 093 094 private void unregisterListeners(Stage stage) { 095 for (Listener listener : stage.getListeners()) { 096 HandlerList.unregisterAll(listener); 097 } 098 } 099}