diff --git a/src/com/dre/dungeonsxl/DConfig.java b/src/com/dre/dungeonsxl/DConfig.java index 69658c44..0019ab9e 100644 --- a/src/com/dre/dungeonsxl/DConfig.java +++ b/src/com/dre/dungeonsxl/DConfig.java @@ -28,6 +28,8 @@ public class DConfig { public int timeToNextPlay = 0; public int timeToNextLoot = 0; + public int timeUntilKickOfflinePlayer = -1; + //Spout public boolean spoutCraftOnly = false; public String spoutTexturepackURL; @@ -53,7 +55,7 @@ public class DConfig { Set list = configSetionClasses.getKeys(false); for (String className:list) { String name = className; - boolean hasDog = configSetionClasses.getBoolean(className+".hasdog"); + boolean hasDog = configSetionClasses.getBoolean(className+".dog"); /* Items */ List items = configSetionClasses.getStringList(className+".items"); @@ -131,25 +133,29 @@ public class DConfig { } /* Invited Players */ - if(configFile.contains("invitedplayers")){ - List invitedplayers = configFile.getStringList("invitedplayers"); + if(configFile.contains("invitedPlayers")){ + List invitedplayers = configFile.getStringList("invitedPlayers"); for(String i:invitedplayers){ this.invitedPlayers.add(i); } } /* Lobby */ - if(configFile.contains("islobbydisabled")){ - isLobbyDisabled = configFile.getBoolean("islobbydisabled"); + if(configFile.contains("isLobbyDisabled")){ + isLobbyDisabled = configFile.getBoolean("isLobbyDisabled"); } /* Times */ - if(configFile.contains("timetonextplay")){ - timeToNextPlay = configFile.getInt("timetonextplay"); + if(configFile.contains("timeToNextPlay")){ + timeToNextPlay = configFile.getInt("timeToNextPlay"); } - if(configFile.contains("timetonextloot")){ - timeToNextLoot = configFile.getInt("timetonextloot"); + if(configFile.contains("timeToNextLoot")){ + timeToNextLoot = configFile.getInt("timeToNextLoot"); + } + + if(configFile.contains("timeUntilKickOfflinePlayer")){ + timeUntilKickOfflinePlayer = configFile.getInt("timeUntilKickOfflinePlayer"); } /* Spout */ diff --git a/src/com/dre/dungeonsxl/DGSign.java b/src/com/dre/dungeonsxl/DGSign.java index 98a2a8ee..4972ce33 100644 --- a/src/com/dre/dungeonsxl/DGSign.java +++ b/src/com/dre/dungeonsxl/DGSign.java @@ -66,14 +66,14 @@ public class DGSign { if(dgroup!=null){ if(dgroup.isPlaying){ sign.setLine(0, strIsPlaying); - }else if(dgroup.players.size()>=this.maxPlayersPerGroup){ + }else if(dgroup.getPlayers().size()>=this.maxPlayersPerGroup){ sign.setLine(0, strFull); }else{ sign.setLine(0, strJoinGrp); } int j=1; Sign rowSign=sign; - for(Player player:dgroup.players){ + for(Player player:dgroup.getPlayers()){ if(j>3){ j=0; rowSign=(Sign) sign.getBlock().getRelative(0, -1, 0).getState(); @@ -233,11 +233,9 @@ public class DGSign { dgsign.update(); } }else if(topSign.getLine(0).equals(strJoinGrp)){ - if(DGroup.get(player)==null){ - if(!dgsign.dgroups[column].players.contains(player)){ - dgsign.dgroups[column].players.add(player); - dgsign.update(); - } + if(DGroup.get(player) == null){ + dgsign.dgroups[column].addPlayer(player); + dgsign.update(); } } diff --git a/src/com/dre/dungeonsxl/DGroup.java b/src/com/dre/dungeonsxl/DGroup.java index dbcf303e..96f281d7 100644 --- a/src/com/dre/dungeonsxl/DGroup.java +++ b/src/com/dre/dungeonsxl/DGroup.java @@ -8,28 +8,46 @@ import com.dre.dungeonsxl.game.GameWorld; public class DGroup { public static CopyOnWriteArrayList dgroups=new CopyOnWriteArrayList(); - //Variables - public CopyOnWriteArrayList players=new CopyOnWriteArrayList(); - public String dungeonname; - public GameWorld gworld; + private CopyOnWriteArrayList players=new CopyOnWriteArrayList(); + private String dungeonname; + private GameWorld gworld; public boolean isPlaying; - public DGroup(Player player, String dungeonname){ dgroups.add(this); - this.players.add(player); + this.getPlayers().add(player); this.isPlaying=false; - this.dungeonname=dungeonname; + this.setDungeonname(dungeonname); + } + + public void addPlayer(Player player){ + //Send message + for(Player groupPlayer : this.getPlayers()){ + P.p.msg(groupPlayer,P.p.language.get("Player_JoinGroup", player.getName())); + } + + //Add player + this.getPlayers().add(player); } public void removePlayer(Player player) { - this.players.remove(player); + this.getPlayers().remove(player); DGSign.updatePerGroup(this); + + //Send message + for(Player groupPlayer : this.getPlayers()){ + P.p.msg(groupPlayer,P.p.language.get("Player_LeftGroup", player.getName())); + } + + //Check group + if(this.isEmpty()){ + this.remove(); + } } public boolean isEmpty() { - return this.players.isEmpty(); + return this.getPlayers().isEmpty(); } public void remove() { @@ -39,8 +57,8 @@ public class DGroup { public void startGame(){ this.isPlaying=true; - gworld.startGame(); - for(Player player:players){ + getGworld().startGame(); + for(Player player:getPlayers()){ DPlayer dplayer=DPlayer.get(player); dplayer.respawn(); } @@ -51,7 +69,7 @@ public class DGroup { //Statics public static DGroup get(Player player){ for(DGroup dgroup:dgroups){ - if(dgroup.players.contains(player)){ + if(dgroup.getPlayers().contains(player)){ return dgroup; } } @@ -60,7 +78,7 @@ public class DGroup { public static DGroup get(GameWorld gworld){ for(DGroup dgroup:dgroups){ - if(dgroup.gworld==gworld){ + if(dgroup.getGworld()==gworld){ return dgroup; } } @@ -69,10 +87,36 @@ public class DGroup { public static void leaveGroup(Player player){ for(DGroup dgroup:dgroups){ - if(dgroup.players.contains(player)){ - dgroup.players.remove(player); + if(dgroup.getPlayers().contains(player)){ + dgroup.getPlayers().remove(player); } } } + //Getters and setters + + public CopyOnWriteArrayList getPlayers() { + return players; + } + + public void setPlayers(CopyOnWriteArrayList players) { + this.players = players; + } + + public GameWorld getGworld() { + return gworld; + } + + public void setGworld(GameWorld gworld) { + this.gworld = gworld; + } + + public String getDungeonname() { + return dungeonname; + } + + public void setDungeonname(String dungeonname) { + this.dungeonname = dungeonname; + } + } diff --git a/src/com/dre/dungeonsxl/DPlayer.java b/src/com/dre/dungeonsxl/DPlayer.java index 7b6e98ff..96bfe9c7 100644 --- a/src/com/dre/dungeonsxl/DPlayer.java +++ b/src/com/dre/dungeonsxl/DPlayer.java @@ -44,7 +44,7 @@ public class DPlayer { public GameCheckpoint checkpoint; public Wolf wolf; public int wolfRespawnTime=30; - public int offlineTime; + public long offlineTime; public CopyOnWriteArrayList respawnInventory=new CopyOnWriteArrayList(); public Inventory treasureInv = P.p.getServer().createInventory(player, 45, "Belohnungen"); @@ -101,10 +101,6 @@ public class DPlayer { } } - public void goOffline(){ - offlineTime=1; - } - public void leave(){ remove(this); @@ -120,9 +116,6 @@ public class DPlayer { DGroup dgroup=DGroup.get(this.player); if(dgroup!=null){ dgroup.removePlayer(this.player); - if(dgroup.isEmpty()){ - dgroup.remove(); - } } //Belohnung @@ -167,7 +160,7 @@ public class DPlayer { int i=0; Player groupplayer; do{ - groupplayer=dgroup.players.get(i); + groupplayer=dgroup.getPlayers().get(i); if(groupplayer!=null){ for(ItemStack istack:this.player.getInventory()){ if(istack!=null){ @@ -199,7 +192,7 @@ public class DPlayer { DGroup dgroup=DGroup.get(this.player); if(!dgroup.isPlaying){ if(dgroup!=null){ - for(Player player:dgroup.players){ + for(Player player:dgroup.getPlayers()){ DPlayer dplayer=get(player); if(!dplayer.isReady){ return; @@ -217,7 +210,7 @@ public class DPlayer { public void respawn(){ DGroup dgroup=DGroup.get(this.player); if(this.checkpoint==null){ - this.player.teleport(dgroup.gworld.locStart); + this.player.teleport(dgroup.getGworld().locStart); }else{ this.player.teleport(this.checkpoint.location); } @@ -242,7 +235,7 @@ public class DPlayer { DGroup dgroup=DGroup.get(this.player); if(dgroup!=null){ if(dgroup.isPlaying){ - for(Player player:dgroup.players){ + for(Player player:dgroup.getPlayers()){ DPlayer dplayer=get(player); if(!dplayer.isFinished){ p.msg(this.player, p.language.get("Player_WaitForOtherPlayers")); @@ -250,7 +243,7 @@ public class DPlayer { } } - for(Player player:dgroup.players){ + for(Player player:dgroup.getPlayers()){ DPlayer dplayer=get(player); dplayer.leave(); } @@ -431,9 +424,9 @@ public class DPlayer { DGroup dgroup=DGroup.get(dplayer.player); if(dplayer.checkpoint==null){ - dplayer.player.teleport(dgroup.gworld.locStart); + dplayer.player.teleport(dgroup.getGworld().locStart); if(dplayer.wolf!=null){ - dplayer.wolf.teleport(dgroup.gworld.locStart); + dplayer.wolf.teleport(dgroup.getGworld().locStart); } }else{ dplayer.player.teleport(dplayer.checkpoint.location); @@ -467,6 +460,13 @@ public class DPlayer { dplayer.wolfRespawnTime--; } } + + //Kick offline players + if(dplayer.offlineTime > 0){ + if(dplayer.offlineTime < System.currentTimeMillis()){ + dplayer.leave(); + } + } } } } diff --git a/src/com/dre/dungeonsxl/DPortal.java b/src/com/dre/dungeonsxl/DPortal.java index 53e0e793..1650140b 100644 --- a/src/com/dre/dungeonsxl/DPortal.java +++ b/src/com/dre/dungeonsxl/DPortal.java @@ -101,15 +101,15 @@ public class DPortal { else if(this.type.equals("todungeon")){ DGroup dgroup=DGroup.get(player); if(dgroup!=null){ - if(dgroup.gworld==null){ - dgroup.gworld=GameWorld.load(DGroup.get(player).dungeonname); + if(dgroup.getGworld()==null){ + dgroup.setGworld(GameWorld.load(DGroup.get(player).getDungeonname())); } - if(dgroup.gworld!=null){ + if(dgroup.getGworld()!=null){ /* Check Spout */ boolean spoutCheck = true; if(P.p.isSpoutEnabled){ - if(dgroup.gworld.config.spoutCraftOnly){ + if(dgroup.getGworld().config.spoutCraftOnly){ if(!Spout.getServer().getPlayer(player.getName()).isSpoutCraftEnabled()){ spoutCheck = false; } @@ -118,16 +118,16 @@ public class DPortal { /* Teleport Player */ if(spoutCheck){ - if(dgroup.gworld.locLobby==null){ - new DPlayer(player,dgroup.gworld.world,dgroup.gworld.world.getSpawnLocation(), false); + if(dgroup.getGworld().locLobby==null){ + new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().world.getSpawnLocation(), false); }else{ - new DPlayer(player,dgroup.gworld.world,dgroup.gworld.locLobby, false); + new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().locLobby, false); } }else{ p.msg(player,p.language.get("Error_SpoutCraftOnly")); } }else{ - p.msg(player,p.language.get("Error_DungeonNotExist",DGroup.get(player).dungeonname)); + p.msg(player,p.language.get("Error_DungeonNotExist",DGroup.get(player).getDungeonname())); } }else{ p.msg(player,p.language.get("Error_NotInGroup")); diff --git a/src/com/dre/dungeonsxl/LanguageReader.java b/src/com/dre/dungeonsxl/LanguageReader.java index dba0571c..18c84ba1 100644 --- a/src/com/dre/dungeonsxl/LanguageReader.java +++ b/src/com/dre/dungeonsxl/LanguageReader.java @@ -51,7 +51,11 @@ public class LanguageReader { defaults.put("Player_FinishedDungeon","&6Du hast den Dungeon erfolgreich beendet!"); defaults.put("Player_WaitForOtherPlayers","&6Noch auf Mitspieler warten..."); defaults.put("Player_LeaveGroup","&6Du hast deine Gruppe erfolgreich verlassen!"); - + defaults.put("Player_Offline","&6Spieler &4&v1&6 ging Offline. Er wird in &4&v2&6 Sekunden automatisch aus der Instanz geworfen!"); + defaults.put("Player_OfflineNever","&6Spieler &4&v1&6 ging Offline. Er wird &4nicht&6 automatisch aus der Instanz geworfen!"); + defaults.put("Player_LeftGroup","&6Spieler &4&v1&6 hat die Gruppe verlassen!"); + defaults.put("Player_JoinGroup","&6Spieler &4&v1&6 hat die Gruppe betreten!"); + /* Cmds */ defaults.put("Cmd_Chat_DungeonChat","&6Du bist nun im Dungeon-Chat"); defaults.put("Cmd_Chat_NormalChat","&6Du bist nun im öffentlichen Chat"); diff --git a/src/com/dre/dungeonsxl/commands/CMDTest.java b/src/com/dre/dungeonsxl/commands/CMDTest.java index 699e7804..9e798eda 100644 --- a/src/com/dre/dungeonsxl/commands/CMDTest.java +++ b/src/com/dre/dungeonsxl/commands/CMDTest.java @@ -28,16 +28,16 @@ public class CMDTest extends DCommand { if(EditWorld.exist(dungeonname)){ DGroup dgroup=new DGroup(player, dungeonname); if(dgroup!=null){ - if(dgroup.gworld==null){ - dgroup.gworld=GameWorld.load(DGroup.get(player).dungeonname); + if(dgroup.getGworld()==null){ + dgroup.setGworld(GameWorld.load(DGroup.get(player).getDungeonname())); } DPlayer newDPlayer; - if(dgroup.gworld.locLobby==null){ - newDPlayer=new DPlayer(player,dgroup.gworld.world,dgroup.gworld.world.getSpawnLocation(), false); + if(dgroup.getGworld().locLobby==null){ + newDPlayer=new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().world.getSpawnLocation(), false); }else{ - newDPlayer=new DPlayer(player,dgroup.gworld.world,dgroup.gworld.locLobby, false); + newDPlayer=new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().locLobby, false); } newDPlayer.isinTestMode=true; } diff --git a/src/com/dre/dungeonsxl/game/GameChest.java b/src/com/dre/dungeonsxl/game/GameChest.java index de20ef0b..0ff5deca 100644 --- a/src/com/dre/dungeonsxl/game/GameChest.java +++ b/src/com/dre/dungeonsxl/game/GameChest.java @@ -32,7 +32,7 @@ public class GameChest { public void addTreasure(DGroup dgroup){ if(dgroup!=null){ - for(Player player:dgroup.players){ + for(Player player:dgroup.getPlayers()){ DPlayer dplayer=DPlayer.get(player); if(dplayer!=null){ String msg=""; diff --git a/src/com/dre/dungeonsxl/listener/PlayerListener.java b/src/com/dre/dungeonsxl/listener/PlayerListener.java index 66279e04..95b49108 100644 --- a/src/com/dre/dungeonsxl/listener/PlayerListener.java +++ b/src/com/dre/dungeonsxl/listener/PlayerListener.java @@ -20,6 +20,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; @@ -111,12 +112,11 @@ public class PlayerListener implements Listener{ DPlayer dplayer=DPlayer.get(player); if(dplayer!=null){ - - - + //Check GameWorld Signs GameWorld gworld=GameWorld.get(player.getWorld()); if(gworld!=null){ + //Ready Sign for(Block blockReady:gworld.blocksReady){ if(blockReady.getLocation().distance(clickedBlock.getLocation())<1){ @@ -128,6 +128,8 @@ public class PlayerListener implements Listener{ }else{ p.msg(player,p.language.get("Error_Ready")); } + }else{ + dplayer.ready(); } } } @@ -135,13 +137,11 @@ public class PlayerListener implements Listener{ //End Sign for(Block blockEnd:gworld.blocksEnd){ if(blockEnd.getLocation().distance(clickedBlock.getLocation())<1){ - if(!dplayer.isFinished){ - if(event.getAction()==Action.LEFT_CLICK_BLOCK){ - dplayer.finish(); - return; - }else{ - p.msg(player,p.language.get("Error_Leftklick")); - } + if(event.getAction()==Action.LEFT_CLICK_BLOCK){ + dplayer.finish(); + return; + }else{ + p.msg(player,p.language.get("Error_Leftklick")); } } } @@ -227,13 +227,13 @@ public class PlayerListener implements Listener{ DGroup dgroup=DGroup.get(dplayer.player); if(dplayer.checkpoint==null){ - event.setRespawnLocation(dgroup.gworld.locStart); + event.setRespawnLocation(dgroup.getGworld().locStart); //Da einige Plugins einen anderen Respawn setzen wird ein Scheduler gestartet der den Player nach einer Sekunde teleportiert. - p.getServer().getScheduler().scheduleSyncDelayedTask(p, new RespawnRunnable(player,dgroup.gworld.locStart), 10); + p.getServer().getScheduler().scheduleSyncDelayedTask(p, new RespawnRunnable(player,dgroup.getGworld().locStart), 10); if(dplayer.wolf!=null){ - dplayer.wolf.teleport(dgroup.gworld.locStart); + dplayer.wolf.teleport(dgroup.getGworld().locStart); } }else{ event.setRespawnLocation(dplayer.checkpoint.location); @@ -287,6 +287,29 @@ public class PlayerListener implements Listener{ } @EventHandler(priority = EventPriority.HIGH) + public void onPlayerQuit(PlayerQuitEvent event){ + Player player = event.getPlayer(); + DPlayer dPlayer = DPlayer.get(player); + + if(dPlayer!=null){ + //Check GameWorld + GameWorld gWorld = GameWorld.get(player.getWorld()); + if(gWorld != null){ + int timeUntilKickOfflinePlayer = gWorld.config.timeUntilKickOfflinePlayer; + + if(timeUntilKickOfflinePlayer == 0){ + dPlayer.leave(); + } else if(timeUntilKickOfflinePlayer > 0){ + dPlayer.msg(p.language.get("Player_Offline",dPlayer.player.getName(),""+timeUntilKickOfflinePlayer)); + dPlayer.offlineTime = System.currentTimeMillis() + timeUntilKickOfflinePlayer*1000; + } else { + dPlayer.msg(p.language.get("Player_OfflineNeverKick",dPlayer.player.getName())); + } + } + } + } + + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerJoin(PlayerJoinEvent event){ Player player = event.getPlayer(); @@ -294,8 +317,14 @@ public class PlayerListener implements Listener{ DPlayer dplayer = DPlayer.get(event.getPlayer().getName()); if(dplayer != null){ dplayer.player = event.getPlayer(); + + //Check offlineTime + dplayer.offlineTime = 0; } + + + //Tutorial Mode if(p.mainConfig.tutorialActivated){ if(DPlayer.get(player) == null){ @@ -304,16 +333,16 @@ public class PlayerListener implements Listener{ if(p.mainConfig.tutorialStartGroup.equalsIgnoreCase(group)){ DGroup dgroup = new DGroup(player, p.mainConfig.tutorialDungeon); - if(dgroup.gworld == null){ - dgroup.gworld = GameWorld.load(DGroup.get(player).dungeonname); - dgroup.gworld.isTutorial = true; + if(dgroup.getGworld() == null){ + dgroup.setGworld(GameWorld.load(DGroup.get(player).getDungeonname())); + dgroup.getGworld().isTutorial = true; } - if(dgroup.gworld != null){ - if(dgroup.gworld.locLobby == null){ - new DPlayer(player,dgroup.gworld.world,dgroup.gworld.world.getSpawnLocation(), false); + if(dgroup.getGworld() != null){ + if(dgroup.getGworld().locLobby == null){ + new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().world.getSpawnLocation(), false); }else{ - new DPlayer(player,dgroup.gworld.world,dgroup.gworld.locLobby, false); + new DPlayer(player,dgroup.getGworld().world,dgroup.getGworld().locLobby, false); } }else{ p.msg(player,p.language.get("Error_TutorialNotExist"));