/* * Copyright 2011 Tyler Blair. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and contributors and should not be interpreted as representing official policies, * either expressed or implied, of anybody else. */ package com.griefcraft.modules.credits; import com.griefcraft.lwc.LWC; import com.griefcraft.scripting.JavaModule; import com.griefcraft.scripting.event.LWCCommandEvent; import com.griefcraft.util.Colors; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class CreditsModule extends JavaModule { /** * How many lines to send when they first use /lwc credits */ private static final int FIRST_SEND = 2; /** * How often to send messages */ private static final long UPDATE_INTERVAL = 1150L; /** * The credits list */ private String[] credits; /** * Players to send to and the credits index */ private final Map<CommandSender, Integer> scrolling = Collections.synchronizedMap(new HashMap<CommandSender, Integer>()); private class CreditsTask implements Runnable { public void run() { while (LWC.ENABLED) { synchronized (scrolling) { Iterator<Map.Entry<CommandSender, Integer>> iter = scrolling.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<CommandSender, Integer> entry = iter.next(); CommandSender sender = entry.getKey(); int index = entry.getValue(); // Done! if (index >= credits.length) { iter.remove(); continue; } // if they're a player, and not online, don't send if ((sender instanceof Player) && !((Player) sender).isOnline()) { iter.remove(); continue; } // if it's 0, we should bulk send the first few if (index == 0) { for (int i = 0; i < FIRST_SEND; i++) { if (index >= credits.length) { break; } sender.sendMessage(credits[index]); index++; } } else { sender.sendMessage(credits[index]); index++; } // update the index entry.setValue(index); } } try { Thread.sleep(UPDATE_INTERVAL); } catch (Exception e) { } } } } @Override public void load(LWC lwc) { credits = new String[]{ Colors.Green + "LWC, a Protection mod developed by Hidendra ....", "Serving Minecraft loyally since September 2010 ....", " ", Colors.Red + "Core contributions", "angelsl", "morganm", " ", Colors.Red + "Translations", Colors.Green + "German - " + Colors.White + "Dawodo", Colors.Green + "Polish - " + Colors.White + "Geoning, dudsonowa, and andrewkm", Colors.Green + "French - " + Colors.White + "cehel", Colors.Green + "Dutch - " + Colors.White + "Madzero and aoa2003", Colors.Green + "Czech - " + Colors.White + "hofec", Colors.Green + "Swedish - " + Colors.White + "christley", Colors.Green + "Russian - " + Colors.White + "IlyaGulya", Colors.Green + "Spanish - " + Colors.White + "Raul \"RME\" Martinez and David \"DME\" Martinez", Colors.Green + "Danish - " + Colors.White + "TCarlsen, cannafix", Colors.Green + "Italian - " + Colors.White + "portaro", Colors.Green + "Hungarian - " + Colors.White + "dretax", " ", Colors.Red + "Donations", Colors.Gray + "(chronological order)", "darknavi", "Vetyver", "pablo0713", Colors.Red + "IrishSailor & Land of Legend server X2", "aidan", Colors.Bold + Colors.Gold + "MonsterTKE X3", "wokka", "Andreoli3", Colors.Bold + Colors.Gold + "andrewkm X3", "Eric King", "Twizz", "spunkiie", "RustyDagger", "Sam (Nodex servers)", "doomkidkiller", "untergrundbiber", "Northland Gaming", "imaxorz & the Shade Crest server", "schlex", "TnT", "jakez", "jkcclemens", "drayshak", "DMarby", "Afforess", "RagnaCraft", "Christopher Dziomba", "Grant McFerrin", "Matthew Kemmerer", "Daniel Tung", "Sway", "ZachBora", "jordan1986", " ", Colors.Red + "And....", Colors.LightBlue + "Old Griefcraft server -- love you guys!", "jobsti", "Joy", "KaneHart", "Kainzo (finds issues before I have a chance to look)", "& the rest of the HEROCRAFT team", "Bryan (CursedChild)", "Ken (i_pk_pjers_i)", "SeeD419", "Lim-Dul", "arensirb", "RustyDagger", "HotelErotica", "andrewkm", "Moo0", "Dawodo", "xPaw", "Samkio", "msleeper", "Taco", "Acrobat", "SquallSeeD31", "Wahrheit", "Kerazene", "spunkiie", "Zalastri", "MonsterTKE", "Tyrope", "krinsdeath", "VADemon", "armed_troop", "DeadFred", "ProjectInfinity", "KHobbits", "TnT", " ", Colors.Yellow + "To everyone else and anyone I missed....", "LWC would not be the awesome plugin it is today if not also for those not listed", " ", Colors.Blue + "THANK YOU!" }; // not using the bukkit scheduler because tick rates vary from server to server // on one server, it'll send every second, while on another, every 5 seconds! CreditsTask task = new CreditsTask(); new Thread(task).start(); // lwc.getPlugin().getServer().getScheduler().scheduleSyncRepeatingTask(lwc.getPlugin(), task, 10, 10); } @Override public void onCommand(LWCCommandEvent event) { if (event.isCancelled()) { return; } if (!event.hasFlag("about", "credits", "thanks")) { return; } CommandSender sender = event.getSender(); if (!scrolling.containsKey(sender)) { scrolling.put(sender, 0); } else { scrolling.remove(sender); } event.setCancelled(true); } }