├── .gitignore ├── README.md ├── pom.xml └── src └── main ├── java └── tv │ └── banko │ └── tutorialreloaded │ ├── Main.java │ ├── backpack │ ├── Backpack.java │ └── BackpackManager.java │ ├── commands │ ├── BackpackCommand.java │ └── TimerCommand.java │ ├── listeners │ ├── ExplosionListeners.java │ ├── JoinListener.java │ └── QuitListener.java │ ├── scoreboard │ ├── EntryName.java │ ├── ScoreboardBuilder.java │ └── TestScoreboard.java │ ├── timer │ └── Timer.java │ └── utils │ ├── Base64.java │ └── Config.java └── resources └── plugin.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/ 3 | 4 | *.iml 5 | *.ipr 6 | *.iws 7 | 8 | # IntelliJ 9 | out/ 10 | 11 | # Compiled class file 12 | *.class 13 | 14 | # Log file 15 | *.log 16 | 17 | # BlueJ files 18 | *.ctxt 19 | 20 | # Package Files # 21 | *.jar 22 | *.war 23 | *.nar 24 | *.ear 25 | *.zip 26 | *.tar.gz 27 | *.rar 28 | 29 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 30 | hs_err_pid* 31 | 32 | *~ 33 | 34 | # temporary files which can be created if a process still has a handle open of a deleted file 35 | .fuse_hidden* 36 | 37 | # KDE directory preferences 38 | .directory 39 | 40 | # Linux trash folder which might appear on any partition or disk 41 | .Trash-* 42 | 43 | # .nfs files are created when an open file is removed but is still being accessed 44 | .nfs* 45 | 46 | # General 47 | .DS_Store 48 | .AppleDouble 49 | .LSOverride 50 | 51 | # Icon must end with two \r 52 | Icon 53 | 54 | # Thumbnails 55 | ._* 56 | 57 | # Files that might appear in the root of a volume 58 | .DocumentRevisions-V100 59 | .fseventsd 60 | .Spotlight-V100 61 | .TemporaryItems 62 | .Trashes 63 | .VolumeIcon.icns 64 | .com.apple.timemachine.donotpresent 65 | 66 | # Directories potentially created on remote AFP share 67 | .AppleDB 68 | .AppleDesktop 69 | Network Trash Folder 70 | Temporary Items 71 | .apdisk 72 | 73 | # Windows thumbnail cache files 74 | Thumbs.db 75 | Thumbs.db:encryptable 76 | ehthumbs.db 77 | ehthumbs_vista.db 78 | 79 | # Dump file 80 | *.stackdump 81 | 82 | # Folder config file 83 | [Dd]esktop.ini 84 | 85 | # Recycle Bin used on file shares 86 | $RECYCLE.BIN/ 87 | 88 | # Windows Installer files 89 | *.cab 90 | *.msi 91 | *.msix 92 | *.msm 93 | *.msp 94 | 95 | # Windows shortcuts 96 | *.lnk 97 | 98 | target/ 99 | 100 | pom.xml.tag 101 | pom.xml.releaseBackup 102 | pom.xml.versionsBackup 103 | pom.xml.next 104 | 105 | release.properties 106 | dependency-reduced-pom.xml 107 | buildNumber.properties 108 | .mvn/timing.properties 109 | .mvn/wrapper/maven-wrapper.jar 110 | .flattened-pom.xml 111 | 112 | # Common working directory 113 | run/ 114 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DerBanko Coding Tutorial Project 2 | 3 | https://twitch.tv/DerBanko 4 | https://youtube.com/c/DerBanko 5 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | tv.banko 8 | tutorialreloaded 9 | 1.0-SNAPSHOT 10 | jar 11 | 12 | TutorialReloaded 13 | 14 | Coding Tutorial Live on Twitch 15 | 16 | 15 17 | UTF-8 18 | 19 | https://twitch.tv/DerBanko 20 | 21 | 22 | 23 | 24 | org.apache.maven.plugins 25 | maven-compiler-plugin 26 | 3.8.1 27 | 28 | ${java.version} 29 | ${java.version} 30 | 31 | 32 | 33 | org.apache.maven.plugins 34 | maven-shade-plugin 35 | 3.2.4 36 | 37 | 38 | package 39 | 40 | shade 41 | 42 | 43 | false 44 | C:\Users\Lucas\Desktop\Server\plugins 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | src/main/resources 53 | true 54 | 55 | 56 | 57 | 58 | 59 | 60 | spigotmc-repo 61 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/ 62 | 63 | 64 | sonatype 65 | https://oss.sonatype.org/content/groups/public/ 66 | 67 | 68 | 69 | 70 | 71 | org.spigotmc 72 | spigot 73 | 1.16.5-R0.1-SNAPSHOT 74 | provided 75 | 76 | 77 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/Main.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.plugin.PluginManager; 6 | import org.bukkit.plugin.java.JavaPlugin; 7 | import tv.banko.tutorialreloaded.backpack.BackpackManager; 8 | import tv.banko.tutorialreloaded.commands.BackpackCommand; 9 | import tv.banko.tutorialreloaded.commands.TimerCommand; 10 | import tv.banko.tutorialreloaded.listeners.ExplosionListeners; 11 | import tv.banko.tutorialreloaded.listeners.JoinListener; 12 | import tv.banko.tutorialreloaded.listeners.QuitListener; 13 | import tv.banko.tutorialreloaded.timer.Timer; 14 | import tv.banko.tutorialreloaded.utils.Config; 15 | 16 | public final class Main extends JavaPlugin { 17 | 18 | private static Main instance; 19 | 20 | private Timer timer; 21 | private Config config; 22 | private BackpackManager backpackManager; 23 | 24 | @Override 25 | public void onLoad() { 26 | instance = this; 27 | config = new Config(); 28 | } 29 | 30 | @Override 31 | public void onEnable() { 32 | Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "HALLO!"); 33 | 34 | PluginManager manager = Bukkit.getPluginManager(); 35 | manager.registerEvents(new JoinListener(), this); 36 | manager.registerEvents(new QuitListener(), this); 37 | manager.registerEvents(new ExplosionListeners(), this); 38 | 39 | getCommand("timer").setExecutor(new TimerCommand()); 40 | getCommand("backpack").setExecutor(new BackpackCommand()); 41 | 42 | timer = new Timer(); 43 | backpackManager = new BackpackManager(); 44 | } 45 | 46 | @Override 47 | public void onDisable() { 48 | timer.save(); 49 | backpackManager.save(); 50 | 51 | config.save(); 52 | } 53 | 54 | public static Main getInstance() { 55 | return instance; 56 | } 57 | 58 | public Config getConfiguration() { 59 | return config; 60 | } 61 | 62 | public Timer getTimer() { 63 | return timer; 64 | } 65 | 66 | public BackpackManager getBackpackManager() { 67 | return backpackManager; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/backpack/Backpack.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.backpack; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.inventory.Inventory; 5 | import tv.banko.tutorialreloaded.utils.Base64; 6 | 7 | import java.io.IOException; 8 | import java.util.UUID; 9 | 10 | public class Backpack { 11 | 12 | private final UUID uuid; 13 | private final Inventory inventory; 14 | 15 | public Backpack(UUID uuid) { 16 | this.uuid = uuid; 17 | this.inventory = Bukkit.createInventory(null, 27 /* vielfaches von 9 */, "Backpack"); 18 | } 19 | 20 | public Backpack(UUID uuid, String base64) throws IOException { 21 | this.uuid = uuid; 22 | this.inventory = Bukkit.createInventory(null, 27 /* vielfaches von 9 */, "Backpack"); 23 | this.inventory.setContents(Base64.itemStackArrayFromBase64(base64)); 24 | } 25 | 26 | public UUID getUuid() { 27 | return uuid; 28 | } 29 | 30 | public Inventory getInventory() { 31 | return inventory; 32 | } 33 | 34 | public String toBase64() { 35 | return Base64.itemStackArrayToBase64(inventory.getContents()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/backpack/BackpackManager.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.backpack; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | import tv.banko.tutorialreloaded.Main; 5 | import tv.banko.tutorialreloaded.utils.Base64; 6 | import tv.banko.tutorialreloaded.utils.Config; 7 | 8 | import java.io.IOException; 9 | import java.util.*; 10 | 11 | public class BackpackManager { 12 | 13 | private final Map map; 14 | 15 | public BackpackManager() { 16 | map = new HashMap<>(); 17 | 18 | load(); 19 | } 20 | 21 | public Backpack getBackpack(UUID uuid) { 22 | if(map.containsKey(uuid)) { 23 | return map.get(uuid); 24 | } 25 | 26 | Backpack backpack = new Backpack(uuid); 27 | map.put(uuid, backpack); 28 | return backpack; 29 | } 30 | 31 | public void setBackpack(UUID uuid, Backpack backpack) { 32 | map.put(uuid, backpack); 33 | } 34 | 35 | private void load() { 36 | Config config = Main.getInstance().getConfiguration(); 37 | 38 | List uuids = config.getConfig().getStringList("backpacks"); 39 | 40 | uuids.forEach(s -> { 41 | UUID uuid = UUID.fromString(s); 42 | String base64 = config.getConfig().getString("backpack." + s); 43 | 44 | try { 45 | map.put(uuid, new Backpack(uuid, base64)); 46 | } catch (IOException e) { 47 | e.printStackTrace(); 48 | } 49 | }); 50 | } 51 | 52 | public void save() { 53 | Config config = Main.getInstance().getConfiguration(); 54 | 55 | List uuids = new ArrayList<>(); 56 | 57 | for (UUID uuid : map.keySet()) { 58 | uuids.add(uuid.toString()); 59 | } 60 | 61 | config.getConfig().set("backpacks", uuids); 62 | map.forEach((uuid, backpack) -> config.getConfig().set("backpack." + uuid.toString(), backpack.toBase64())); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/commands/BackpackCommand.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.commands; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandExecutor; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Creeper; 7 | import org.bukkit.entity.Player; 8 | import tv.banko.tutorialreloaded.Main; 9 | import tv.banko.tutorialreloaded.backpack.Backpack; 10 | 11 | public class BackpackCommand implements CommandExecutor { 12 | 13 | @Override 14 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 15 | 16 | if(!(sender instanceof Player)) { 17 | return true; 18 | } 19 | 20 | Player player = (Player) sender; 21 | 22 | Backpack backpack = Main.getInstance().getBackpackManager().getBackpack(player.getUniqueId()); 23 | 24 | player.openInventory(backpack.getInventory()); 25 | return true; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/commands/TimerCommand.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.commands; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandExecutor; 6 | import org.bukkit.command.CommandSender; 7 | import tv.banko.tutorialreloaded.Main; 8 | import tv.banko.tutorialreloaded.timer.Timer; 9 | 10 | public class TimerCommand implements CommandExecutor { 11 | 12 | @Override 13 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 14 | 15 | if(args.length == 0) { 16 | sendUsage(sender); 17 | return true; 18 | } 19 | 20 | switch (args[0].toLowerCase()) { 21 | case "resume": { 22 | Timer timer = Main.getInstance().getTimer(); 23 | 24 | if (timer.isRunning()) { 25 | sender.sendMessage(ChatColor.RED + "Der Timer läuft bereits."); 26 | break; 27 | } 28 | 29 | timer.setRunning(true); 30 | sender.sendMessage(ChatColor.GRAY + "Der Timer wurde gestartet."); 31 | break; 32 | } 33 | case "pause": { 34 | Timer timer = Main.getInstance().getTimer(); 35 | 36 | if (!timer.isRunning()) { 37 | sender.sendMessage(ChatColor.RED + "Der Timer läuft nicht."); 38 | break; 39 | } 40 | 41 | timer.setRunning(false); 42 | sender.sendMessage(ChatColor.GRAY + "Der Timer wurde gestoppt."); 43 | break; 44 | } 45 | case "time": { 46 | if(args.length != 2) { 47 | sender.sendMessage(ChatColor.GRAY + "Verwendung" + ChatColor.DARK_GRAY + ": " + ChatColor.BLUE + 48 | "/timer time "); 49 | return true; 50 | } 51 | 52 | try { 53 | Timer timer = Main.getInstance().getTimer(); 54 | 55 | timer.setRunning(false); 56 | timer.setTime(Integer.parseInt(args[1])); 57 | sender.sendMessage(ChatColor.GRAY + "Die Zeit wurde auf " + args[1] + " gesetzt."); 58 | } catch (NumberFormatException e) { 59 | sender.sendMessage(ChatColor.RED + "Dein Parameter 2 muss eine Zahl sein."); 60 | } 61 | break; 62 | } 63 | case "reset": { 64 | Timer timer = Main.getInstance().getTimer(); 65 | 66 | timer.setRunning(false); 67 | timer.setTime(0); 68 | sender.sendMessage(ChatColor.GRAY + "Der Timer wurde zurückgesetzt."); 69 | break; 70 | } 71 | default: 72 | sendUsage(sender); 73 | break; 74 | } 75 | return false; 76 | } 77 | 78 | private void sendUsage(CommandSender sender) { 79 | sender.sendMessage(ChatColor.GRAY + "Verwendung" + ChatColor.DARK_GRAY + ": " + ChatColor.BLUE + 80 | "/timer resume, /timer pause, /timer time , /timer reset"); 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/listeners/ExplosionListeners.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.listeners; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Creeper; 5 | import org.bukkit.entity.EntityType; 6 | import org.bukkit.entity.TNTPrimed; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.block.BlockPlaceEvent; 10 | import org.bukkit.event.entity.EntityExplodeEvent; 11 | import org.bukkit.event.player.PlayerInteractEvent; 12 | 13 | import java.util.Objects; 14 | 15 | public class ExplosionListeners implements Listener { 16 | 17 | @EventHandler 18 | public void onEntityExplode(EntityExplodeEvent event) { 19 | 20 | if(!(event.getEntity() instanceof Creeper)) { 21 | return; 22 | } 23 | 24 | event.blockList().clear(); 25 | } 26 | 27 | @EventHandler 28 | public void onPlace(BlockPlaceEvent event) { 29 | 30 | if(!event.getBlockPlaced().getType().equals(Material.TNT)) { 31 | return; 32 | } 33 | 34 | event.getBlockPlaced().setType(Material.AIR); 35 | 36 | TNTPrimed tnt = (TNTPrimed) event.getBlockPlaced().getWorld().spawnEntity(event.getBlockPlaced().getLocation(), EntityType.PRIMED_TNT); 37 | tnt.setFuseTicks(0); 38 | } 39 | 40 | @EventHandler 41 | public void onInteract(PlayerInteractEvent event) { 42 | 43 | if(!event.hasItem()) { 44 | return; 45 | } 46 | 47 | if(!event.hasBlock()) { 48 | return; 49 | } 50 | 51 | if(!event.getPlayer().isOp()) { 52 | return; 53 | } 54 | 55 | if(!Objects.requireNonNull(event.getItem()).getType().equals(Material.FIRE_CHARGE)) { 56 | return; 57 | } 58 | 59 | TNTPrimed tnt = (TNTPrimed) Objects.requireNonNull(event.getClickedBlock()).getWorld().spawnEntity(event.getClickedBlock().getLocation(), EntityType.PRIMED_TNT); 60 | tnt.setIsIncendiary(true); 61 | tnt.setFuseTicks(0); 62 | tnt.setYield(1000); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/listeners/JoinListener.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.listeners; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.player.PlayerJoinEvent; 8 | import tv.banko.tutorialreloaded.scoreboard.TestScoreboard; 9 | 10 | public class JoinListener implements Listener { 11 | 12 | @EventHandler 13 | public void onJoin(PlayerJoinEvent event) { 14 | Player player = event.getPlayer(); 15 | 16 | event.setJoinMessage(ChatColor.GREEN.toString() + ChatColor.UNDERLINE + player.getName() + " hat den Server betreten."); 17 | 18 | player.sendMessage(ChatColor.GOLD + "Willkommen auf dem Server! \n\"Viel Spaß und viel Vergnügen (^:"); 19 | 20 | new TestScoreboard(player); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/listeners/QuitListener.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.listeners; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.player.PlayerQuitEvent; 8 | 9 | public class QuitListener implements Listener { 10 | 11 | @EventHandler 12 | public void onQuit(PlayerQuitEvent event) { 13 | Player player = event.getPlayer(); 14 | 15 | event.setQuitMessage(ChatColor.BLUE + "Sorry, dass " + player.getName() + " es hier nicht gefallen hat."); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/scoreboard/EntryName.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.scoreboard; 2 | 3 | import org.bukkit.ChatColor; 4 | 5 | public enum EntryName { 6 | 7 | ENTRY_0(0, ChatColor.DARK_PURPLE.toString()), 8 | ENTRY_1(1, ChatColor.DARK_GRAY.toString()), 9 | ENTRY_2(2, ChatColor.BOLD.toString()), 10 | ENTRY_3(3, ChatColor.DARK_RED.toString()), 11 | ENTRY_4(4, ChatColor.GRAY.toString()), 12 | ENTRY_5(5, ChatColor.DARK_GREEN.toString()), 13 | ENTRY_6(6, ChatColor.LIGHT_PURPLE.toString()), 14 | ENTRY_7(7, ChatColor.UNDERLINE.toString()); 15 | 16 | private final int entry; 17 | private final String entryName; 18 | 19 | EntryName(int entry, String entryName) { 20 | this.entry = entry; 21 | this.entryName = entryName; 22 | } 23 | 24 | public int getEntry() { 25 | return entry; 26 | } 27 | 28 | public String getEntryName() { 29 | return entryName; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/scoreboard/ScoreboardBuilder.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.scoreboard; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scoreboard.DisplaySlot; 6 | import org.bukkit.scoreboard.Objective; 7 | import org.bukkit.scoreboard.Scoreboard; 8 | import org.bukkit.scoreboard.Team; 9 | 10 | public abstract class ScoreboardBuilder { 11 | 12 | protected final Scoreboard scoreboard; 13 | protected final Objective objective; 14 | 15 | protected final Player player; 16 | 17 | public ScoreboardBuilder(Player player, String displayName) { 18 | this.player = player; 19 | 20 | if(player.getScoreboard().equals(Bukkit.getScoreboardManager().getMainScoreboard())) { 21 | player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); 22 | } 23 | 24 | this.scoreboard = player.getScoreboard(); 25 | 26 | if(this.scoreboard.getObjective("display") != null) { 27 | this.scoreboard.getObjective("display").unregister(); 28 | } 29 | 30 | this.objective = this.scoreboard.registerNewObjective("display", "dummy", displayName); 31 | this.objective.setDisplaySlot(DisplaySlot.SIDEBAR); 32 | 33 | createScoreboard(); 34 | } 35 | 36 | public abstract void createScoreboard(); 37 | 38 | public abstract void update(); 39 | 40 | public void setDisplayName(String displayName) { 41 | this.objective.setDisplayName(displayName); 42 | } 43 | 44 | public void setScore(String content, int score) { 45 | Team team = getTeamByScore(score); 46 | 47 | if(team == null) { 48 | return; 49 | } 50 | 51 | team.setPrefix(content); 52 | showScore(score); 53 | } 54 | 55 | public void removeScore(int score) { 56 | hideScore(score); 57 | } 58 | 59 | private EntryName getEntryNameByScore(int score) { 60 | for(EntryName name : EntryName.values()) { 61 | if(score == name.getEntry()) { 62 | return name; 63 | } 64 | } 65 | 66 | return null; 67 | } 68 | 69 | private Team getTeamByScore(int score) { 70 | EntryName name = getEntryNameByScore(score); 71 | 72 | if(name == null) { 73 | return null; 74 | } 75 | 76 | Team team = scoreboard.getEntryTeam(name.getEntryName()); 77 | 78 | if(team != null) { 79 | return team; 80 | } 81 | 82 | team = scoreboard.registerNewTeam(name.name()); 83 | team.addEntry(name.getEntryName()); 84 | return team; 85 | } 86 | 87 | private void showScore(int score) { 88 | EntryName name = getEntryNameByScore(score); 89 | 90 | if(name == null) { 91 | return; 92 | } 93 | 94 | if(objective.getScore(name.getEntryName()).isScoreSet()) { 95 | return; 96 | } 97 | 98 | objective.getScore(name.getEntryName()).setScore(score); 99 | } 100 | 101 | private void hideScore(int score) { 102 | EntryName name = getEntryNameByScore(score); 103 | 104 | if(name == null) { 105 | return; 106 | } 107 | 108 | if(!objective.getScore(name.getEntryName()).isScoreSet()) { 109 | return; 110 | } 111 | 112 | scoreboard.resetScores(name.getEntryName()); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/scoreboard/TestScoreboard.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.scoreboard; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | import tv.banko.tutorialreloaded.Main; 7 | 8 | public class TestScoreboard extends ScoreboardBuilder { 9 | 10 | private int socialId; 11 | 12 | public TestScoreboard(Player player) { 13 | super(player, ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + " twitch.tv/DerBanko "); 14 | socialId = 0; 15 | 16 | run(); 17 | } 18 | 19 | @Override 20 | public void createScoreboard() { 21 | setScore("test", 8); 22 | setScore(ChatColor.DARK_GRAY.toString(), 7); 23 | setScore(ChatColor.GRAY + "Dein Rang" + ChatColor.DARK_GRAY + ":", 6); 24 | 25 | if(player.isOp()) { 26 | setScore(ChatColor.RED + "Operator", 5); 27 | } else { 28 | setScore(ChatColor.GRAY + "Spieler", 5); 29 | } 30 | 31 | setScore(ChatColor.GRAY.toString(), 4); 32 | setScore(ChatColor.AQUA + "twitter.com/DerBanko", 3); 33 | setScore(ChatColor.RED.toString(), 2); 34 | setScore(ChatColor.RED + player.getAddress().getHostName(), 1); 35 | setScore(ChatColor.AQUA.toString(), 0); 36 | } 37 | 38 | @Override 39 | public void update() { 40 | 41 | } 42 | 43 | private void run() { 44 | new BukkitRunnable() { 45 | @Override 46 | public void run() { 47 | 48 | switch (socialId) { 49 | case 0: 50 | setScore(ChatColor.AQUA + "twitter.com/DerBanko", 3); 51 | break; 52 | case 1: 53 | setScore(ChatColor.DARK_PURPLE + "twitch.tv/DerBanko", 3); 54 | break; 55 | case 2: 56 | setScore(ChatColor.DARK_RED + "youtube.com/DerBanko", 3); 57 | break; 58 | } 59 | 60 | socialId++; 61 | 62 | if(socialId >= 3) { 63 | socialId = 0; 64 | } 65 | 66 | } 67 | }.runTaskTimer(Main.getInstance(), 20, 20); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/timer/Timer.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.timer; 2 | 3 | import net.md_5.bungee.api.ChatMessageType; 4 | import net.md_5.bungee.api.chat.TextComponent; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | import tv.banko.tutorialreloaded.Main; 10 | import tv.banko.tutorialreloaded.utils.Config; 11 | 12 | public class Timer { 13 | 14 | private boolean running; // true or false 15 | private int time; 16 | 17 | public Timer() { 18 | Config config = Main.getInstance().getConfiguration(); 19 | 20 | this.running = false; 21 | 22 | if (config.getConfig().contains("timer.time")) { 23 | this.time = config.getConfig().getInt("timer.time"); 24 | } else { 25 | this.time = 0; 26 | } 27 | 28 | run(); 29 | } 30 | 31 | public boolean isRunning() { 32 | return running; 33 | } 34 | 35 | public void setRunning(boolean running) { 36 | this.running = running; 37 | } 38 | 39 | public int getTime() { 40 | return time; 41 | } 42 | 43 | public void setTime(int time) { 44 | this.time = time; 45 | } 46 | 47 | public void sendActionBar() { 48 | for (Player player : Bukkit.getOnlinePlayers()) { 49 | 50 | if (!isRunning()) { 51 | player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(ChatColor.RED + 52 | "Timer ist pausiert")); 53 | continue; 54 | } 55 | 56 | player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(ChatColor.GOLD.toString() + 57 | ChatColor.BOLD + getTime())); 58 | } 59 | } 60 | 61 | public void save() { 62 | Config config = Main.getInstance().getConfiguration(); 63 | 64 | config.getConfig().set("timer.time", time); 65 | } 66 | 67 | private void run() { 68 | new BukkitRunnable() { 69 | @Override 70 | public void run() { 71 | 72 | sendActionBar(); 73 | 74 | if (!isRunning()) { 75 | return; 76 | } 77 | 78 | setTime(getTime() + 1); 79 | } 80 | }.runTaskTimer(Main.getInstance(), 20, 20); 81 | } 82 | } 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/utils/Base64.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.utils; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | import org.bukkit.util.io.BukkitObjectInputStream; 5 | import org.bukkit.util.io.BukkitObjectOutputStream; 6 | import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; 7 | 8 | import java.io.ByteArrayInputStream; 9 | import java.io.ByteArrayOutputStream; 10 | import java.io.IOException; 11 | 12 | public class Base64 { 13 | 14 | public static ItemStack[] itemStackArrayFromBase64(String data) throws IOException { 15 | try { 16 | ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); 17 | BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); 18 | ItemStack[] items = new ItemStack[dataInput.readInt()]; 19 | 20 | // Read the serialized inventory 21 | for (int i = 0; i < items.length; i++) { 22 | items[i] = (ItemStack) dataInput.readObject(); 23 | } 24 | 25 | dataInput.close(); 26 | return items; 27 | } catch (ClassNotFoundException e) { 28 | throw new IOException("Unable to decode class type.", e); 29 | } 30 | } 31 | 32 | public static String itemStackArrayToBase64(ItemStack[] items) throws IllegalStateException { 33 | try { 34 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 35 | BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); 36 | 37 | // Write the size of the inventory 38 | dataOutput.writeInt(items.length); 39 | 40 | // Save every element in the list 41 | for (ItemStack item : items) { 42 | dataOutput.writeObject(item); 43 | } 44 | 45 | // Serialize that array 46 | dataOutput.close(); 47 | return Base64Coder.encodeLines(outputStream.toByteArray()); 48 | } catch (Exception e) { 49 | throw new IllegalStateException("Unable to save item stacks.", e); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/tv/banko/tutorialreloaded/utils/Config.java: -------------------------------------------------------------------------------- 1 | package tv.banko.tutorialreloaded.utils; 2 | 3 | import org.bukkit.configuration.file.YamlConfiguration; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | 8 | public class Config { 9 | 10 | private final File file; 11 | private final YamlConfiguration config; 12 | 13 | public Config() { 14 | File dir = new File("./plugins/TutorialReloaded/"); 15 | 16 | if (!dir.exists()) { 17 | dir.mkdirs(); 18 | } 19 | 20 | this.file = new File(dir, "config.yml"); 21 | 22 | if (!file.exists()) { 23 | try { 24 | file.createNewFile(); 25 | } catch (IOException e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | 30 | this.config = YamlConfiguration.loadConfiguration(file); 31 | } 32 | 33 | public File getFile() { 34 | return file; 35 | } 36 | 37 | public YamlConfiguration getConfig() { 38 | return config; 39 | } 40 | 41 | public void save() { 42 | try { 43 | config.save(file); 44 | } catch (IOException e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: TutorialReloaded 2 | version: ${project.version} 3 | main: tv.banko.tutorialreloaded.Main 4 | api-version: 1.16 5 | authors: [ DerBanko, Chat ] 6 | description: Coding Tutorial Live on Twitch 7 | website: https://twitch.tv/DerBanko 8 | 9 | commands: 10 | timer: 11 | permission: tutorialreloaded.command.timer 12 | backpack: 13 | aliases: [ bp ] --------------------------------------------------------------------------------