From 568b619122722cfc47b77e83ee1ce7ea8fbca9c0 Mon Sep 17 00:00:00 2001 From: jomo Date: Sun, 13 Jul 2014 16:34:31 +0200 Subject: [PATCH 01/30] use uuid in CG --- README.md | 4 ++++ chatgroups.py | 18 ++++++++++-------- reports.py | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 92c2e19..3a228c4 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,10 @@ If you want the server to load a file (*module*) on startup, add it to the `modu > AnswerBot. Hides stupid questions from chat and tells the sender about `/faq` or the like +* `damnspam.py` + + > Adds `/damnspam`, creates timeout for buttons/levers to mitigate button spam. + # Code styleguide & tips diff --git a/chatgroups.py b/chatgroups.py index 103061b..3c5c1b2 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -18,17 +18,18 @@ except Exception, e: def onChatgroupCommand(sender, args): try: plugHeader(sender, "ChatGroups") + sender_id = str(sender.getUniqueId()) if len(args) == 1 and args[0] == "leave": - if str(sender.getUniqueId()) in groups.keys(): + if sender_id in groups.keys(): groupchat(sender, "left the group", True) - group = groups[sender.getName()] - del(groups[sender.getName()]) + group = groups[sender_id] + del(groups[sender_id]) saveGroups() else: msg(sender, "&aYou can't leave no group, derp!") elif len(args) == 1 and args[0] == "info": - if str(sender.getUniqueId()) in groups.keys(): - group = groups[str(sender.getUniqueId())] + if sender_id in groups.keys(): + group = groups[sender_id] msg(sender, "&aCurrent chatgroup: %s" % group) users = [] for uid, ugroup in groups.iteritems(): @@ -41,7 +42,7 @@ def onChatgroupCommand(sender, args): else: msg(sender, "&aYou're in no chatgroup.") elif len(args) == 2 and args[0] == "join": - groups[str(sender.getUniqueId())] = args[1] + groups[sender_id] = args[1] groupchat(sender, "joined the group", True) saveGroups() msg(sender, "&aYour chatgroup is set to '%s'" % args[1]) @@ -96,9 +97,10 @@ def onChat(event): sender = event.getPlayer() msge = event.getMessage() if not event.isCancelled(): - if msge[:len(cg_key)] == cg_key and str(sender.getUniqueId()) in groups.keys(): + sender_id = str(sender.getUniqueId()) + if msge[:len(cg_key)] == cg_key and sender_id in groups.keys(): groupchat(sender, msge[1:]) event.setCancelled(True) - elif str(sender.getUniqueId()) in cg_toggle_list: + elif sender_id in cg_toggle_list: groupchat(sender, msge) event.setCancelled(True) diff --git a/reports.py b/reports.py index e715ac0..588681a 100644 --- a/reports.py +++ b/reports.py @@ -42,7 +42,7 @@ def deleteReport(sender, rep_id): msg(sender, "&aReport #%s deleted." % rep_id) reporter = server.getOfflinePlayer(report["player"]) plugHeader(reporter, "Report") - msg(reporter, "&aReport '&e%s&a" was resolved by %s." % (report["msg"], sender.getName())) + msg(reporter, "&aReport '&e%s&a' was resolved by %s." % (report["msg"], sender.getName())) else: msg(sender, "&cThat report does not exist!") From 23973651cc80389be3e7d0da42f07c9138466636 Mon Sep 17 00:00:00 2001 From: jomo Date: Sun, 13 Jul 2014 17:03:11 +0200 Subject: [PATCH 02/30] typo fix --- chatgroups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatgroups.py b/chatgroups.py index 3c5c1b2..18c56b1 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -1,6 +1,6 @@ #pylint: disable=F0401 from helpers import * -from java.utils.UUID import fromString as juuid +from java.util.UUID import fromString as juuid import simplejson as json chatgroups_filename = "plugins/redstoner-utils.py.dir/files/chatgroups.json" From 7981591fb7d83df3b9289903e76fc5a4a0d19570 Mon Sep 17 00:00:00 2001 From: jomo Date: Sun, 13 Jul 2014 17:10:14 +0200 Subject: [PATCH 03/30] using jython 2.7b2 --- README.md | 2 +- chatgroups.py | 2 +- cycle.py | 2 +- damnspam.py | 2 +- reports.py | 2 +- saylol.py | 2 +- tilehelper.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 70a7f8b..e03fbf9 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Detailed description: 0. Download [the latest spigot](http://ci.md-5.net/job/Spigot/lastStableBuild/artifact/Spigot-Server/target/spigot.jar) 0. Run it once inside redstoner, then shut it down again 0. Create a new directory (inside redstoner) called 'lib' -0. Download [jython](http://search.maven.org/remotecontent?filepath=org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar) and save it as 'jython.jar' inside lib +0. Download [jython](http://search.maven.org/remotecontent?filepath=org/python/jython-standalone/2.7-b2/jython-standalone-2.7-b2.jar) and save it as 'jython.jar' inside lib 0. Download [mysql-connector](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.zip), extract 'mysql-connector-java-X.X.XX-bin.jar ' and save it as 'mysql-connector.jar' inside lib 0. Download [PyPluginLoader](http://gserv.me/static/PyPluginLoader-0.3.5.jar) (we're using [this fork](https://github.com/gdude2002/Python-Plugin-Loader)) into the plugins directory diff --git a/chatgroups.py b/chatgroups.py index 18c56b1..4b79567 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -1,7 +1,7 @@ #pylint: disable=F0401 from helpers import * from java.util.UUID import fromString as juuid -import simplejson as json +import json chatgroups_filename = "plugins/redstoner-utils.py.dir/files/chatgroups.json" groups = {} diff --git a/cycle.py b/cycle.py index c35e9bc..53d372c 100644 --- a/cycle.py +++ b/cycle.py @@ -1,4 +1,4 @@ -import simplejson as json +import json from helpers import * cyclers_file = "plugins/redstoner-utils.py.dir/files/cycle.json" diff --git a/damnspam.py b/damnspam.py index ba3867e..cff15b2 100644 --- a/damnspam.py +++ b/damnspam.py @@ -1,6 +1,6 @@ #pylint: disable=F0401 from helpers import * -import simplejson as json +import json spam_filename = "plugins/redstoner-utils.py.dir/files/damnspam.json" inputs = [] diff --git a/reports.py b/reports.py index 588681a..24e0edb 100644 --- a/reports.py +++ b/reports.py @@ -1,5 +1,5 @@ from helpers import * -import simplejson as json +import json import time import thread diff --git a/saylol.py b/saylol.py index 1956bfd..0e5caff 100644 --- a/saylol.py +++ b/saylol.py @@ -1,4 +1,4 @@ -import simplejson as json +import json from time import time from helpers import * from random import randrange diff --git a/tilehelper.py b/tilehelper.py index af22d30..0018961 100644 --- a/tilehelper.py +++ b/tilehelper.py @@ -3,7 +3,7 @@ import org.bukkit.event.block.BlockPlaceEvent as BlockPlaceEvent import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent import org.bukkit.event.player.PlayerInteractEvent as PlayerInteractEvent import thread -import simplejson as json +import json from time import sleep from helpers import * From 2a0063560601e99960662cc554f1d438baca09ec Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 00:54:25 +0200 Subject: [PATCH 04/30] use json config for abot --- abot.py | 75 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/abot.py b/abot.py index b691113..9701b53 100644 --- a/abot.py +++ b/abot.py @@ -1,31 +1,64 @@ +import json from helpers import * from re import compile as reg_compile -rank_regex = "visitor|member|builder|trusted|helper|mod\\b|moderator|admin|owner|rank" +answers_filename = "plugins/redstoner-utils.py.dir/files/abot.json" +answers = [] -faq_regex = [ - # ranks - "\\b(how.*? (get\\b|be\\b|become)|who is|are you).*? (%s)|\\bwho owns.* server" % rank_regex, - # WE - "\\b(can|how|why).*? (have|haz|use|get|doesn|can'?t).*? (WorldEdit|WE\\b|W\\.E\\.\\b)", - # clearing plot - "\\b((why|how|who).*? (do|can)|how to).*?( /?p clear| clear.*? plot)", - # add someone to a plot, claim plot - "\\bhow.*? (get|claim|own|add).*? plot" -] +load_answers() + + +def load_answers(): + global answers + try: + answers = json.loads(open(answers_filename).read()) + except Exception, e: + error("Failed to load answers: %s" % e) + + # compile answers + for answer in answers: + answer["regex"] = [reg_compile(reg.lower()) for reg in answer["regex"]] + + +def list_answers(sender): + for answer in answers: + msg(sender, "&e{") + msg(sender, " &eregex:") + for regex in answer["regex"]: + msg(sender, " " + regex.pattern, basecolor="&a", usecolor=False) + msg(sender, " &epermission:") + msg(sender, " " + str(answer["hide-perm"]), basecolor="&a", usecolor=False) + msg(sender, " &emessage:") + msg(sender, " " + "\n ".join(answer["message"].split("\n"))) + msg(sender, "&e}") + + +@hook.command("abot") +def onAbotCommand(sender, args): + plugHeader(sender, "AnswerBot") + if sender.hasPermission("utils.abot.admin"): + if not args: + msg(sender, "&2/abot list &eList all answers and their regex") + msg(sender, "&2/abot reload &eReload the config file") + elif args[0] == "list": + list_answers(sender) + elif args[0] == "reload": + load_answers() + msg(sender, "&2Reloaded!") + else: + msg(sender) -faq_regex = [reg_compile(reg.lower()) for reg in faq_regex] @hook.event("player.AsyncPlayerChatEvent", "low") def onChat(event): sender = event.getPlayer() - if not sender.hasPermission("utils.ignore_abot"): - message = event.getMessage().lower() - for regex in faq_regex: + message = event.getMessage().lower() + for answer in answers: + for regex in answer["regex"]: if regex.search(message): - plugHeader(sender, "AnswerBot") - msg(sender, "&aLooks like you're asking something that's likely in our FAQ.") - msg(sender, "&aTake a look at &4&l/faq&a and read through the pages.\n ") # trailing space required - event.setCancelled(True) - log("(hidden) %s: '%s'" % (sender.getName(), message)) - break + if answer["hide-perm"] and not sender.hasPermission(answer["hide-perm"]): + plugHeader(sender, "AnswerBot") + msg(sender, answer["message"] + "\n ") + event.setCancelled(True) + log("(hidden) %s: '%s'" % (sender.getName(), message)) + break \ No newline at end of file From c9763953d46967d570eee7962f277012419f8d7d Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 00:56:46 +0200 Subject: [PATCH 05/30] can't call function before definition --- abot.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/abot.py b/abot.py index 9701b53..348aed1 100644 --- a/abot.py +++ b/abot.py @@ -5,8 +5,6 @@ from re import compile as reg_compile answers_filename = "plugins/redstoner-utils.py.dir/files/abot.json" answers = [] -load_answers() - def load_answers(): global answers @@ -61,4 +59,7 @@ def onChat(event): msg(sender, answer["message"] + "\n ") event.setCancelled(True) log("(hidden) %s: '%s'" % (sender.getName(), message)) - break \ No newline at end of file + break + + +load_answers() \ No newline at end of file From 8ee6d0f40a6aa37c3a86d832574b8eafa67a6bfc Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:00:06 +0200 Subject: [PATCH 06/30] getting the right name in pluginversions --- misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc.py b/misc.py index 4475560..e90f643 100644 --- a/misc.py +++ b/misc.py @@ -102,7 +102,7 @@ def onPluginversionsCommand(sender, args): plugins.sort(key=lambda pl: pl.getName()) msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:") for plugin in plugins: - msg(sender, "&6" + plugin.getName() + "&r: &e" + plugin.getDescription().getVersion()) + msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion()) return True # From 991030b3260992b7358ef4fb02037195f741eb2d Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:00:30 +0200 Subject: [PATCH 07/30] getting the right name in pluginversions --- misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc.py b/misc.py index e90f643..5328bc1 100644 --- a/misc.py +++ b/misc.py @@ -99,7 +99,7 @@ def onPlayerInteractEntity(event): def onPluginversionsCommand(sender, args): plugHeader(sender, "Plugin versions") plugins = list(server.getPluginManager().getPlugins()) - plugins.sort(key=lambda pl: pl.getName()) + plugins.sort(key=lambda pl: pl.getDescription().getName()) msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:") for plugin in plugins: msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion()) From 94932ce0bf2a60231fa0348647239d9391f37eb5 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:16:40 +0200 Subject: [PATCH 08/30] creating shared dict --- helpers.py | 3 +++ main.py | 41 ++++++----------------------------------- misc.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/helpers.py b/helpers.py index 219172e..735090b 100644 --- a/helpers.py +++ b/helpers.py @@ -6,6 +6,9 @@ import org.bukkit.entity.Player as Player import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause import org.bukkit.block as bblock + +shared = {} + server = bukkit.Bukkit.getServer() def log(text): diff --git a/main.py b/main.py index 1a4eba2..cacd12a 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,6 @@ __plugin_version__ = "3.0" __plugin_mainclass__ = "foobar" import sys -import thread from traceback import format_exc as print_traceback # damn pythonloader changed the PATH @@ -24,14 +23,14 @@ def onEnable(): @hook.disable def onDisable(): - mod["reports"].stopChecking() + shared["modules"]["reports"].stopChecking() log("RedstonerUtils disabled!") log("Loading RedstonerUtils...") # Import all modules, in this order -modules = [ +load_modules = [ "misc", "adminchat", "lagchunks", @@ -45,39 +44,11 @@ modules = [ "motd", "abot" ] -mod = {} -for module in modules: +shared["modules"] = {} +for module in load_modules: try: - mod[module] = __import__(module) + shared["modules"][module] = __import__(module) log("Module %s loaded." % module) except: error("Failed to import module %s:" % module) - error(print_traceback()) - - - -# -# /pyeval - run python ingame -# -# has to be in main.py so we can access the modules - -def evalThread(sender, code): - try: - msg(sender, "%s" % unicode(eval(code)), False, "a") - except Exception, e: - msg(sender, "%s: %s" % (e.__class__.__name__, e), False, "c") - thread.exit() - -@hook.command("pyeval") -def onPyevalCommand(sender, args): - if sender.hasPermission("utils.pyeval"): - if not checkargs(sender, args, 1, -1): - return True - msg(sender, "%s" % " ".join(args), False, "e") - try: - thread.start_new_thread(evalThread, (sender, " ".join(args))) - except Exception, e: - msg(sender, "&cInternal error: %s" % e) - else: - noperm(sender) - return True + error(print_traceback()) \ No newline at end of file diff --git a/misc.py b/misc.py index 5328bc1..e6dd84f 100644 --- a/misc.py +++ b/misc.py @@ -105,6 +105,7 @@ def onPluginversionsCommand(sender, args): msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion()) return True + # # /echo - essentials echo sucks and prints mail alerts sometimes # @@ -112,3 +113,30 @@ def onPluginversionsCommand(sender, args): @hook.command("echo") def onEchoCommand(sender, args): msg(sender, " ".join(args).replace("\\n", "\n")) + + +# +# /pyeval - run python ingame +# +# has to be in main.py so we can access the modules + +def evalThread(sender, code): + try: + msg(sender, "%s" % unicode(eval(code)), False, "a") + except Exception, e: + msg(sender, "%s: %s" % (e.__class__.__name__, e), False, "c") + thread.exit() + +@hook.command("pyeval") +def onPyevalCommand(sender, args): + if sender.hasPermission("utils.pyeval"): + if not checkargs(sender, args, 1, -1): + return True + msg(sender, "%s" % " ".join(args), False, "e") + try: + thread.start_new_thread(evalThread, (sender, " ".join(args))) + except Exception, e: + msg(sender, "&cInternal error: %s" % e) + else: + noperm(sender) + return True From fca2e7e1b2e9e3931d077c2ef0dd3e92ca56a8af Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:17:51 +0200 Subject: [PATCH 09/30] add mising import --- misc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misc.py b/misc.py index e6dd84f..b10cd7a 100644 --- a/misc.py +++ b/misc.py @@ -1,6 +1,7 @@ #pylint: disable=F0401 from helpers import * from time import time as now +import thread import org.bukkit.inventory.ItemStack as ItemStack # From 62b3f8a2706392c07011e8436e4aa3a967209ae9 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:20:11 +0200 Subject: [PATCH 10/30] fix basecolor in abot --- abot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abot.py b/abot.py index 348aed1..71f0644 100644 --- a/abot.py +++ b/abot.py @@ -23,9 +23,9 @@ def list_answers(sender): msg(sender, "&e{") msg(sender, " &eregex:") for regex in answer["regex"]: - msg(sender, " " + regex.pattern, basecolor="&a", usecolor=False) + msg(sender, " " + regex.pattern, basecolor="a", usecolor=False) msg(sender, " &epermission:") - msg(sender, " " + str(answer["hide-perm"]), basecolor="&a", usecolor=False) + msg(sender, " " + str(answer["hide-perm"]), basecolor="a", usecolor=False) msg(sender, " &emessage:") msg(sender, " " + "\n ".join(answer["message"].split("\n"))) msg(sender, "&e}") From bd5dcf193374b78682cc5c39bad477826c57656a Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:20:42 +0200 Subject: [PATCH 11/30] add noperm; return true --- abot.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/abot.py b/abot.py index 71f0644..d30f934 100644 --- a/abot.py +++ b/abot.py @@ -45,6 +45,9 @@ def onAbotCommand(sender, args): msg(sender, "&2Reloaded!") else: msg(sender) + else: + noperm(sender) + return True @hook.event("player.AsyncPlayerChatEvent", "low") From 879af23f9a7f632f90480d2e31307ec3adf373ae Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:25:12 +0200 Subject: [PATCH 12/30] logging groupchat messages --- chatgroups.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chatgroups.py b/chatgroups.py index 4b79567..9ab75da 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -66,6 +66,7 @@ def onCgtCommand(sender, args): msg(sender, "&8[&bCG&8] &e&oCG toggle: on") return True + def groupchat(sender, message, ann=False): #try: group = groups.get(str(sender.getUniqueId())) @@ -77,6 +78,7 @@ def groupchat(sender, message, ann=False): mesg = "&8[&bCG&8] &e&o%s&e&o %s" % (name, message) else: mesg = "&8[&bCG&8] &f%s&f: &6%s" % (name, message) + log("[ChatGroups] %s (%s): %s" % (sender, group, message)) for receiver in server.getOnlinePlayers(): groups.get(str(receiver.getUniqueId())) == group and msg(receiver, mesg) #except Exception, e: From 05a68efc43bcdf5aa2d2595f0ea74f45364647d3 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 01:26:42 +0200 Subject: [PATCH 13/30] clarify how to use CG --- chatgroups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatgroups.py b/chatgroups.py index 9ab75da..172b818 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -46,7 +46,7 @@ def onChatgroupCommand(sender, args): groupchat(sender, "joined the group", True) saveGroups() msg(sender, "&aYour chatgroup is set to '%s'" % args[1]) - msg(sender, "&aAnyone in the group sees chat that begins with &e%s" % cg_key) + msg(sender, "&aUse chat like '&e%s' to send messages to this group." % cg_key) else: msg(sender, "&e/chatgroup join ") msg(sender, "&e/chatgroup leave") From 89cb6d2d2efa99eee9ce6baa5da6449b06f64711 Mon Sep 17 00:00:00 2001 From: Dico Date: Mon, 14 Jul 2014 02:40:00 +0200 Subject: [PATCH 14/30] added forcefield module, will make whitelist option later --- README.md | 4 ++++ forcefield.py | 36 ++++++++++++++++++++++++++++++++++++ main.py | 3 ++- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 forcefield.py diff --git a/README.md b/README.md index 70a7f8b..d57f0c8 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,10 @@ If you want the server to load a file (*module*) on startup, add it to the `modu > Adds `/damnspam`, creates timeout for buttons/levers to mitigate button spam. +* `forcefield.py` + + > Adds '/forcefield', creates forcefield for players who want it. + # Code styleguide & tips ## Indentation diff --git a/forcefield.py b/forcefield.py new file mode 100644 index 0000000..35b57d4 --- /dev/null +++ b/forcefield.py @@ -0,0 +1,36 @@ +from helpers import * + +forcefield_permission = "utils.forcefield" +forcefield_prefix = "&8[&aFF&8]" +fd = 4 # forcefield distance + +forcefield_toggle = [] + +#forcefield toggle +@hook.command("forcefield") +def onActCommand(sender, args): + if not sender.hasPermission(forcefield_permission): + noperm(sender) + return True + UUID = str(sender.getUniqueId()) + if UUID in forcefield_toggle: + forcefield_toggle.remove(UUID) + msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) + else: + forcefield_toggle.append(UUID) + msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) + return True + + +@hook.event("player.PlayerMoveEvent") +def onMove(event): + player = event.getPlayer() + if not player.hasPermission(forcefield_permission): + for entity in player.getNearbyEntities(fd, fd, fd): + if isPlayer(entity) and str(entity.getUniqueId()) in forcefield_toggle: + event.setCancelled(True) + msg(sender, "%s &cYou are not allowed to get closer than %sm to %s" % (forcefield_prefix, fd, entity.getDisplayName())) + break + + + diff --git a/main.py b/main.py index 1a4eba2..59ac27a 100644 --- a/main.py +++ b/main.py @@ -43,7 +43,8 @@ modules = [ "mentio", "cycle", "motd", - "abot" + "abot", + "forcefield" ] mod = {} for module in modules: From 7024fe4845070215eb8faf3d295977fe3e9e8890 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:16:48 +0200 Subject: [PATCH 15/30] damnspam --- damnspam.py | 176 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 114 insertions(+), 62 deletions(-) diff --git a/damnspam.py b/damnspam.py index cff15b2..46c9a44 100644 --- a/damnspam.py +++ b/damnspam.py @@ -1,10 +1,11 @@ #pylint: disable=F0401 from helpers import * +from time import time as now import json -spam_filename = "plugins/redstoner-utils.py.dir/files/damnspam.json" -inputs = [] -accepted_inputs = ["WOOD_BUTTON", "STONE_BUTTON"] +spam_filename = "plugins/redstoner-utils.py.dir/files/damnspam.json" +inputs = {} # format "x;y;z;World" +accepted_inputs = ["WOOD_BUTTON", "STONE_BUTTON", "LEVER"] try: inputs = json.loads(open(spam_filename).read()) @@ -12,71 +13,122 @@ except Exception, e: error("Failed to load buttons and levers: %s" % e) -@hook.command("damnspam") -def onTimeoutCommand(sender, args): - global inputs - try: - plugHeader(sender, "DamnSpam") - if len(args) == 1: - timeout = args[0] - if not timeout.isdigit(): - msg(sender, "&cThe timeout has to be a digit.") - return True - tB = sender.getTargetBlock(None, 10) - if str(tB.getType()) not in accepted_inputs: - msg(sender, "&cPlease look at a button/lever while executing this command!") - return True - data = { - "type": str(tB.getType()), - "creator": str(sender.getUniqueId()), - "timeout": int(args[0]), - "x": int(tB.getX()), - "y": int(tB.getY()), - "z": int(tB.getZ()), - "next": 'NULL', - "last": 'NULL' - } - inputs.append(data) - saveInputs() - msg(sender, "&eSuccessfully set a timeout for this button") - return True - else: - msg(sender, "&c/timeout ") - except Exception, e: - error(e) - def saveInputs(): try: spam_file = open(spam_filename, "w") spam_file.write(json.dumps(inputs)) spam_file.close() except Exception, e: - error("Failed to save buttons and levers: " + str(e)) + error("Failed to save damnspam: " + str(e)) + + +def location_str(block): + return ";".join([block.getWorld().getName(),block.getX(),block.getY(),block.getZ()]) + + +def add_input(creator, block, timeout_off, timeout_on): + global inputs + inputs[location_str(block)] = { + "creator" : str(creator.getUniqueId()), + "timeout_off" : timeout_off, + "timeout_on" : timeout_on, + "last_time" : 0 + } + + +@hook.command("damnspam") +def onDammnspamCommand(sender, args): + global inputs + + try: + plugHeader(sender, "DamnSpam") + if len(args) <= 2: + + if not str(sender.getGameMode()) == "CREATIVE": + msg(sender, "&cYou can only do this in Creative mode.") + return True + + # /damnspam + if len(args) == 1: + timeout_on = args[0] + if not timeout_on.isdigit(): + msg(sender, "&cThe timeout must be a digit.") + return True + else: + timeout_on = int(timeout_on) + timeout_off = timeout_on + if not 0 <= timeout_on <= 60: + msg(sender, "&cThe timeout must be within 0-60.") + return True + + # /damnspam + elif len(args) == 2: + timeout_on = args[0] + timeout_off = args[1] + if not timeout_on.isdigit() or not timeout_off.isdigit(): + msg(sender, "&cThe timeout must be a digit.") + return True + else: + timeout_on = int(timeout_on) + timeout_off = int(timeout_off) + if not 0 <= timeout_on <= 60 or not 0 <= timeout_off <= 60: + msg(sender, "&cThe timeout must be within 0-60.") + return True + + # get the block we're looking at + target = sender.getTargetBlock(None, 10) + ttype = str(target.getType()) + if ttype not in accepted_inputs: + msg(sender, "&cPlease look at a button or lever while executing this command!") + return True + + # add block to inputs + add_input(sender, target, timeout_off, timeout_on) + saveInputs() + msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower()) + return True + + else: + msg(sender, "&c/damnspam &e(Buttons/Levers)") + msg(sender, "&c/damnspam &e(Levers only)") + except Exception, e: + error(e) + @hook.event("block.BlockBreakEvent", "normal") def onBreak(event): - try: - sender = event.getPlayer() - block = event.getBlock() - if str(block.getType()) in accepted_inputs: - for entry in inputs: - posX = int(entry["x"]) - posY = int(entry["y"]) - posZ = int(entry["z"]) - posX2 = block.getX() - posY2 = block.getY() - posZ2 = block.getZ() - if posX == posX2 and posY == posY2 and posZ == posZ2: - if sender.isSneaking(): - inputs.remove(entry) - saveInputs() - msg(sender, "&eSuccessfully removed the input!") - return True - else: - event.setCancelled(True) - msg(sender, "&cYou cannot destroy this input!") - msg(sender, "&7&lSneak&7 and break if you want to remove it.") - return True - break - except Exception, e: - error("BlockBreakEvent failed: " + str(e)) \ No newline at end of file + global inputs + + sender = event.getPlayer() + block = event.getBlock() + if str(block.getType()) in accepted_inputs: + pos_str = location_str(block) + if inputs.get(pos_str): + plugHeader(sender, "DamnSpam") + if sender.isSneaking(): + inputs.pop(pos_str) # remove + saveInputs() + msg(sender, "&eSuccessfully removed the input!") + return True + else: + event.setCancelled(True) + msg(sender, "&cYou cannot destroy this input!") + msg(sender, "&7&lSneak&7 and break if you want to remove it.") + return True + + +@hook.event("player.PlayerInteractEvent", "normal") +def onInteract(event): + if (str(event.getAction()) == "RIGHT_CLICK_BLOCK") and not event.isCancelled(): + sender = event.getPlayer() + block = event.getClickedBlock().getState() + btype = str(block.getType()).lower() + powered = (block.getData() & 0x8) == 0x8 if btype == "lever" else False # data > 7, but this is how bukkit does it + pos_str = location_str(block) + data = inputs.get(pos_str) + if data: + checktime = data["timeout_on"] if powered else data["timeout_off"] + if data["last_time"] + checktime < now(): + event.setCancelled(True) + plugHeader("DamnSpam") + msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) \ No newline at end of file From 60c5bb9672d458305bcd2c8a5222fc019711f62c Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:17:29 +0200 Subject: [PATCH 16/30] add damnspam to load_modules --- main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index a97930b..6ae1218 100644 --- a/main.py +++ b/main.py @@ -43,7 +43,8 @@ load_modules = [ "cycle", "motd", "abot", - "forcefield" + "forcefield", + "damnspam" ] shared["modules"] = {} for module in load_modules: From a33e9ef88f3ae33a6402b5b19f4c637ec53ce9b1 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:20:30 +0200 Subject: [PATCH 17/30] don't accept 0 args, remove try --- damnspam.py | 97 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/damnspam.py b/damnspam.py index 46c9a44..e617317 100644 --- a/damnspam.py +++ b/damnspam.py @@ -40,59 +40,56 @@ def add_input(creator, block, timeout_off, timeout_on): def onDammnspamCommand(sender, args): global inputs - try: - plugHeader(sender, "DamnSpam") - if len(args) <= 2: + plugHeader(sender, "DamnSpam") + if len(args) in range(2): - if not str(sender.getGameMode()) == "CREATIVE": - msg(sender, "&cYou can only do this in Creative mode.") - return True - - # /damnspam - if len(args) == 1: - timeout_on = args[0] - if not timeout_on.isdigit(): - msg(sender, "&cThe timeout must be a digit.") - return True - else: - timeout_on = int(timeout_on) - timeout_off = timeout_on - if not 0 <= timeout_on <= 60: - msg(sender, "&cThe timeout must be within 0-60.") - return True - - # /damnspam - elif len(args) == 2: - timeout_on = args[0] - timeout_off = args[1] - if not timeout_on.isdigit() or not timeout_off.isdigit(): - msg(sender, "&cThe timeout must be a digit.") - return True - else: - timeout_on = int(timeout_on) - timeout_off = int(timeout_off) - if not 0 <= timeout_on <= 60 or not 0 <= timeout_off <= 60: - msg(sender, "&cThe timeout must be within 0-60.") - return True - - # get the block we're looking at - target = sender.getTargetBlock(None, 10) - ttype = str(target.getType()) - if ttype not in accepted_inputs: - msg(sender, "&cPlease look at a button or lever while executing this command!") - return True - - # add block to inputs - add_input(sender, target, timeout_off, timeout_on) - saveInputs() - msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower()) + if not str(sender.getGameMode()) == "CREATIVE": + msg(sender, "&cYou can only do this in Creative mode.") return True - else: - msg(sender, "&c/damnspam &e(Buttons/Levers)") - msg(sender, "&c/damnspam &e(Levers only)") - except Exception, e: - error(e) + # /damnspam + if len(args) == 1: + timeout_on = args[0] + if not timeout_on.isdigit(): + msg(sender, "&cThe timeout must be a digit.") + return True + else: + timeout_on = int(timeout_on) + timeout_off = timeout_on + if not 0 <= timeout_on <= 60: + msg(sender, "&cThe timeout must be within 0-60.") + return True + + # /damnspam + elif len(args) == 2: + timeout_on = args[0] + timeout_off = args[1] + if not timeout_on.isdigit() or not timeout_off.isdigit(): + msg(sender, "&cThe timeout must be a digit.") + return True + else: + timeout_on = int(timeout_on) + timeout_off = int(timeout_off) + if not 0 <= timeout_on <= 60 or not 0 <= timeout_off <= 60: + msg(sender, "&cThe timeout must be within 0-60.") + return True + + # get the block we're looking at + target = sender.getTargetBlock(None, 10) + ttype = str(target.getType()) + if ttype not in accepted_inputs: + msg(sender, "&cPlease look at a button or lever while executing this command!") + return True + + # add block to inputs + add_input(sender, target, timeout_off, timeout_on) + saveInputs() + msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower()) + return True + + else: + msg(sender, "&c/damnspam &e(Buttons/Levers)") + msg(sender, "&c/damnspam &e(Levers only)") @hook.event("block.BlockBreakEvent", "normal") From f0e0045f706ec1e21608a47ee5f2f1c4dde92713 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:24:08 +0200 Subject: [PATCH 18/30] cannot join string with ints --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index e617317..f808116 100644 --- a/damnspam.py +++ b/damnspam.py @@ -23,7 +23,7 @@ def saveInputs(): def location_str(block): - return ";".join([block.getWorld().getName(),block.getX(),block.getY(),block.getZ()]) + return ";".join([block.getWorld().getName(), str(block.getX()), str(block.getY()), str(block.getZ())]) def add_input(creator, block, timeout_off, timeout_on): From 2979ecb44ebc283f0dbb7a5406fc4ab25a7575d2 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:25:57 +0200 Subject: [PATCH 19/30] range starts at 0 --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index f808116..52bb67e 100644 --- a/damnspam.py +++ b/damnspam.py @@ -41,7 +41,7 @@ def onDammnspamCommand(sender, args): global inputs plugHeader(sender, "DamnSpam") - if len(args) in range(2): + if len(args) in [1,2]: if not str(sender.getGameMode()) == "CREATIVE": msg(sender, "&cYou can only do this in Creative mode.") From 7dc4d6a88c0f08236cc7b7b87c55d964c2d9b458 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:27:59 +0200 Subject: [PATCH 20/30] I should stop using copy pasta --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index 52bb67e..a86dc97 100644 --- a/damnspam.py +++ b/damnspam.py @@ -118,7 +118,7 @@ def onBreak(event): def onInteract(event): if (str(event.getAction()) == "RIGHT_CLICK_BLOCK") and not event.isCancelled(): sender = event.getPlayer() - block = event.getClickedBlock().getState() + block = event.getClickedBlock() btype = str(block.getType()).lower() powered = (block.getData() & 0x8) == 0x8 if btype == "lever" else False # data > 7, but this is how bukkit does it pos_str = location_str(block) From 13b4c8c115a273c1cabcf3b3c7a9dd75ad2f6770 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:32:14 +0200 Subject: [PATCH 21/30] fix plugHeader, store last time --- damnspam.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/damnspam.py b/damnspam.py index a86dc97..576f00e 100644 --- a/damnspam.py +++ b/damnspam.py @@ -127,5 +127,7 @@ def onInteract(event): checktime = data["timeout_on"] if powered else data["timeout_off"] if data["last_time"] + checktime < now(): event.setCancelled(True) - plugHeader("DamnSpam") - msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) \ No newline at end of file + plugHeader(sender, "DamnSpam") + msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) + else: + inputs["last_time"] = int(now()) \ No newline at end of file From c51d703d1f56583a68837f450308f57ef78bb6a6 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:33:46 +0200 Subject: [PATCH 22/30] fix time check --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index 576f00e..99ff0f6 100644 --- a/damnspam.py +++ b/damnspam.py @@ -125,7 +125,7 @@ def onInteract(event): data = inputs.get(pos_str) if data: checktime = data["timeout_on"] if powered else data["timeout_off"] - if data["last_time"] + checktime < now(): + if data["last_time"] + checktime > now(): event.setCancelled(True) plugHeader(sender, "DamnSpam") msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) From 60c6b957f1cccc6b8e103355e96e7e35fba0d18c Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:42:23 +0200 Subject: [PATCH 23/30] need more caffeine --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index 99ff0f6..ae0c108 100644 --- a/damnspam.py +++ b/damnspam.py @@ -130,4 +130,4 @@ def onInteract(event): plugHeader(sender, "DamnSpam") msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) else: - inputs["last_time"] = int(now()) \ No newline at end of file + inputs[pos_str]["last_time"] = int(now()) \ No newline at end of file From 502aa3acc5315e1942a50c0c756e379b5dd9704c Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:42:44 +0200 Subject: [PATCH 24/30] better message formatting --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index ae0c108..b06848e 100644 --- a/damnspam.py +++ b/damnspam.py @@ -110,7 +110,7 @@ def onBreak(event): else: event.setCancelled(True) msg(sender, "&cYou cannot destroy this input!") - msg(sender, "&7&lSneak&7 and break if you want to remove it.") + msg(sender, "&c&nSneak&c and break if you want to remove it.") return True From 4df5a18831d301539aca5f1c3f30beb5a3c1e1ef Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 05:57:27 +0200 Subject: [PATCH 25/30] using floats for timeout --- damnspam.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/damnspam.py b/damnspam.py index b06848e..9f8698e 100644 --- a/damnspam.py +++ b/damnspam.py @@ -50,29 +50,29 @@ def onDammnspamCommand(sender, args): # /damnspam if len(args) == 1: timeout_on = args[0] - if not timeout_on.isdigit(): - msg(sender, "&cThe timeout must be a digit.") - return True - else: - timeout_on = int(timeout_on) + try: + timeout_on = round(float(timeout_on), 2) timeout_off = timeout_on if not 0 <= timeout_on <= 60: msg(sender, "&cThe timeout must be within 0-60.") return True + except ValueError: + msg(sender, "&cThe timeout must be a number") + return True # /damnspam elif len(args) == 2: timeout_on = args[0] timeout_off = args[1] - if not timeout_on.isdigit() or not timeout_off.isdigit(): - msg(sender, "&cThe timeout must be a digit.") - return True - else: - timeout_on = int(timeout_on) - timeout_off = int(timeout_off) + try: + timeout_on = round(float(timeout_on), 2) + timeout_off = round(float(timeout_off), 2) if not 0 <= timeout_on <= 60 or not 0 <= timeout_off <= 60: msg(sender, "&cThe timeout must be within 0-60.") return True + except ValueError: + msg(sender, "&cThe timeout must be a number") + return True # get the block we're looking at target = sender.getTargetBlock(None, 10) @@ -130,4 +130,4 @@ def onInteract(event): plugHeader(sender, "DamnSpam") msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime)) else: - inputs[pos_str]["last_time"] = int(now()) \ No newline at end of file + inputs[pos_str]["last_time"] = round(now(), 2) \ No newline at end of file From 4f13e417e9bc2a3e8837dafaeecf17c48bda60aa Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 06:01:21 +0200 Subject: [PATCH 26/30] check if player can build --- damnspam.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/damnspam.py b/damnspam.py index 9f8698e..be8afbc 100644 --- a/damnspam.py +++ b/damnspam.py @@ -1,6 +1,7 @@ #pylint: disable=F0401 from helpers import * from time import time as now +import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent import json spam_filename = "plugins/redstoner-utils.py.dir/files/damnspam.json" @@ -81,6 +82,12 @@ def onDammnspamCommand(sender, args): msg(sender, "&cPlease look at a button or lever while executing this command!") return True + test_event = BlockBreakEvent(target, sender) + server.getPluginManager().callEvent(test_event) + if test_event.isCancelled(): + msg(sender, "&cYou are not allowed to modify this button") + return True + # add block to inputs add_input(sender, target, timeout_off, timeout_on) saveInputs() From cf47df82ff8b40d6eb0772266a2fcdfd5f5b706d Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 14 Jul 2014 06:04:06 +0200 Subject: [PATCH 27/30] check for cancelled event --- damnspam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damnspam.py b/damnspam.py index be8afbc..0b10df7 100644 --- a/damnspam.py +++ b/damnspam.py @@ -105,7 +105,7 @@ def onBreak(event): sender = event.getPlayer() block = event.getBlock() - if str(block.getType()) in accepted_inputs: + if str(block.getType()) in accepted_inputs and not event.isCancelled(): pos_str = location_str(block) if inputs.get(pos_str): plugHeader(sender, "DamnSpam") From ffae4e7d302c0ca12129a332971ae4b06317bc9c Mon Sep 17 00:00:00 2001 From: Dico Date: Mon, 14 Jul 2014 13:08:15 +0200 Subject: [PATCH 28/30] Added forcefield whitelist and hopefully fixed some bugs --- forcefield.py | 89 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 15 deletions(-) diff --git a/forcefield.py b/forcefield.py index 35b57d4..7511260 100644 --- a/forcefield.py +++ b/forcefield.py @@ -1,36 +1,95 @@ -from helpers import * -forcefield_permission = "utils.forcefield" +from helpers import * +from java.util.UUID import fromString as juuid + +forcefield_permissions = ["utils.forcefield", "utils.forcefield.ignore"] forcefield_prefix = "&8[&aFF&8]" fd = 4 # forcefield distance forcefield_toggle = [] +forcefield_whitelist = {} +def forcefield_help(sender): + msg(sender, "%s &a&l/ForceField Help: \n&aYou can use the forcefield to keep players on distance." % forcefield_prefix) + msg(sender, "&2Commands:") + msg(sender, "&a1. &6/ff &ohelp &a: aliases: ?") + msg(sender, "&a2. &6/ff &o(toggle)") + msg(sender, "&a3. &6/ff &owhitelist (list) &a: aliases: wlist, wl") + msg(sender, "&a4. &6/ff wl &oclear") + msg(sender, "&a5. &6/ff wl &oadd &a: aliases: &o+") + msg(sender, "&a6. &6/ff wl &oremove &a: aliases: &odelete, rem, del, -") + #forcefield toggle @hook.command("forcefield") -def onActCommand(sender, args): - if not sender.hasPermission(forcefield_permission): +def onForceFieldCommand(sender, args): + if not sender.hasPermission(forcefield_permissions[0]): noperm(sender) return True - UUID = str(sender.getUniqueId()) - if UUID in forcefield_toggle: - forcefield_toggle.remove(UUID) - msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) + sender_id = str(sender.getUniqueId()) + args = args.lower() + if not args or args[0] == "toggle": #Toggle + if sender_id in forcefield_toggle: + forcefield_toggle.remove(sender_id) + msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) + else: + forcefield_toggle.append(sender_id) + msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) + elif args[0] in ["whitelist", "wl", "wlist"]: #Whitelist commands + if not args[1] or args[1] == "list": + msg(sender, "%s &aForceField Whitelist:") % forcefield_prefix + c=0 + for uid in forcefield_whitelist[sender_id]: + c+=1 + msg(sender, "&a%s. &f%s") % (c, juuid(uid)) + elif args[1] == "clear": + forcefield_whitelist[sender_id] = [] + msg(sender, "%s &aForceField Whitelist cleared.") + elif args[1] in ["add", "+"] + if not args[2:]: + msg(sender, "%s &cGive playernames to add to your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].append(uid) + elif args[1] in ["remove", "delete", "rem", "del", "-"]: + if not args[2:]: + msg(sender, "%s &cGive playernames to remove from your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].remove(uid) + elif args[0] in ["help", "?"]: #/forcefield help + forcefield_help(sender) else: - forcefield_toggle.append(UUID) - msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) + msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info.") return True +def setVelocityAway(player, entity): + player_loc = player.getLocation() + entity_loc = entity.getLocation() + dx = entity_loc.getX() - player_loc.getX() + dy = entity_loc.getY() - player_loc.getY() + dz = entity_loc.getZ() - player_loc.getZ() + negator = fd/2 + entity.setVelocity(negator/dx, negator/dy, negator/dz) @hook.event("player.PlayerMoveEvent") def onMove(event): player = event.getPlayer() - if not player.hasPermission(forcefield_permission): + player_id = str(player.getUniqueId()) + if player_id in forcefield_toggle: #player has forcefield, entity should be launched for entity in player.getNearbyEntities(fd, fd, fd): - if isPlayer(entity) and str(entity.getUniqueId()) in forcefield_toggle: - event.setCancelled(True) - msg(sender, "%s &cYou are not allowed to get closer than %sm to %s" % (forcefield_prefix, fd, entity.getDisplayName())) - break + if isPlayer(entity) and not entity.hasPermission(forcefield_permissions[1]) and not str(entity.getUniqueId()) in forcefield_whitelist[player_id]: + setVelocityAway(player, entity) + elif not player.hasPermission(forcefield_permissions[1]): #player should be launched, entity has forcefield + for entity in player.getNearbyEntities(fd, fd, fd): + entity_id = str(entity.getUniqueId()) + if isPlayer(entity) and entity_id in forcefield_toggle and not player_id in forcefield_whitelist[entity_id]: + if event.getFrom().distance(entity.getLocation()) > 4: + event.setCancelled(True) + msg(player, "&cYou may not get closer than %sm to %s due to their forcefield." % (fd, entity.getDisplayName())) + else: + setVelocityAway(entity, player) From cce3c028a458f3469faba78a6a8b4f7dca059d71 Mon Sep 17 00:00:00 2001 From: Dico Date: Mon, 14 Jul 2014 13:32:37 +0200 Subject: [PATCH 29/30] Fixing bugs --- forcefield.py | 79 +++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/forcefield.py b/forcefield.py index 7511260..dbe2138 100644 --- a/forcefield.py +++ b/forcefield.py @@ -1,4 +1,3 @@ - from helpers import * from java.util.UUID import fromString as juuid @@ -27,42 +26,45 @@ def onForceFieldCommand(sender, args): return True sender_id = str(sender.getUniqueId()) args = args.lower() - if not args or args[0] == "toggle": #Toggle - if sender_id in forcefield_toggle: - forcefield_toggle.remove(sender_id) - msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) + try: + if not args or args[0] == "toggle": #Toggle + if sender_id in forcefield_toggle: + forcefield_toggle.remove(sender_id) + msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) + else: + forcefield_toggle.append(sender_id) + msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) + elif args[0] in ["whitelist", "wl", "wlist"]: #Whitelist commands + if not args[1] or args[1] == "list": + msg(sender, "%s &aForceField Whitelist:") % forcefield_prefix + c=0 + for uid in forcefield_whitelist[sender_id]: + c+=1 + msg(sender, "&a%s. &f%s") % (c, juuid(uid)) + elif args[1] == "clear": + forcefield_whitelist[sender_id] = [] + msg(sender, "%s &aForceField Whitelist cleared.") + elif args[1] in ["add", "+"]: + if not args[2:]: + msg(sender, "%s &cGive playernames to add to your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].append(uid) + elif args[1] in ["remove", "delete", "rem", "del", "-"]: + if not args[2:]: + msg(sender, "%s &cGive playernames to remove from your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].remove(uid) + elif args[0] in ["help", "?"]: #/forcefield help + forcefield_help(sender) else: - forcefield_toggle.append(sender_id) - msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) - elif args[0] in ["whitelist", "wl", "wlist"]: #Whitelist commands - if not args[1] or args[1] == "list": - msg(sender, "%s &aForceField Whitelist:") % forcefield_prefix - c=0 - for uid in forcefield_whitelist[sender_id]: - c+=1 - msg(sender, "&a%s. &f%s") % (c, juuid(uid)) - elif args[1] == "clear": - forcefield_whitelist[sender_id] = [] - msg(sender, "%s &aForceField Whitelist cleared.") - elif args[1] in ["add", "+"] - if not args[2:]: - msg(sender, "%s &cGive playernames to add to your whitelist." % forcefield_prefix) - else: - for name in args[2:]: - uid = str(server.getPlayer(name).getUniqueId()) - forcefield_whitelist[sender_id].append(uid) - elif args[1] in ["remove", "delete", "rem", "del", "-"]: - if not args[2:]: - msg(sender, "%s &cGive playernames to remove from your whitelist." % forcefield_prefix) - else: - for name in args[2:]: - uid = str(server.getPlayer(name).getUniqueId()) - forcefield_whitelist[sender_id].remove(uid) - elif args[0] in ["help", "?"]: #/forcefield help - forcefield_help(sender) - else: - msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info.") - return True + msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info.") + return True + except Exception, exception: + error("Error in Forcefield module: \n %s" % exception) def setVelocityAway(player, entity): player_loc = player.getLocation() @@ -89,7 +91,4 @@ def onMove(event): event.setCancelled(True) msg(player, "&cYou may not get closer than %sm to %s due to their forcefield." % (fd, entity.getDisplayName())) else: - setVelocityAway(entity, player) - - - + setVelocityAway(entity, player) \ No newline at end of file From c4e206f44e7e8b3e07b683bbd12ab9bb4df0254e Mon Sep 17 00:00:00 2001 From: Dico Date: Mon, 14 Jul 2014 13:38:26 +0200 Subject: [PATCH 30/30] Unfixing fix --- forcefield.py | 73 ++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/forcefield.py b/forcefield.py index dbe2138..d6e5c4c 100644 --- a/forcefield.py +++ b/forcefield.py @@ -26,45 +26,42 @@ def onForceFieldCommand(sender, args): return True sender_id = str(sender.getUniqueId()) args = args.lower() - try: - if not args or args[0] == "toggle": #Toggle - if sender_id in forcefield_toggle: - forcefield_toggle.remove(sender_id) - msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) - else: - forcefield_toggle.append(sender_id) - msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) - elif args[0] in ["whitelist", "wl", "wlist"]: #Whitelist commands - if not args[1] or args[1] == "list": - msg(sender, "%s &aForceField Whitelist:") % forcefield_prefix - c=0 - for uid in forcefield_whitelist[sender_id]: - c+=1 - msg(sender, "&a%s. &f%s") % (c, juuid(uid)) - elif args[1] == "clear": - forcefield_whitelist[sender_id] = [] - msg(sender, "%s &aForceField Whitelist cleared.") - elif args[1] in ["add", "+"]: - if not args[2:]: - msg(sender, "%s &cGive playernames to add to your whitelist." % forcefield_prefix) - else: - for name in args[2:]: - uid = str(server.getPlayer(name).getUniqueId()) - forcefield_whitelist[sender_id].append(uid) - elif args[1] in ["remove", "delete", "rem", "del", "-"]: - if not args[2:]: - msg(sender, "%s &cGive playernames to remove from your whitelist." % forcefield_prefix) - else: - for name in args[2:]: - uid = str(server.getPlayer(name).getUniqueId()) - forcefield_whitelist[sender_id].remove(uid) - elif args[0] in ["help", "?"]: #/forcefield help - forcefield_help(sender) + if not args or args[0] == "toggle": #Toggle + if sender_id in forcefield_toggle: + forcefield_toggle.remove(sender_id) + msg(sender, "%s &aForceField toggle: &cOFF" % forcefield_prefix) else: - msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info.") - return True - except Exception, exception: - error("Error in Forcefield module: \n %s" % exception) + forcefield_toggle.append(sender_id) + msg(sender, "%s &aForceField toggle: &2ON" % forcefield_prefix) + elif args[0] in ["whitelist", "wl", "wlist"]: #Whitelist commands + if not args[1] or args[1] == "list": + msg(sender, "%s &aForceField Whitelist:") % forcefield_prefix + c=0 + for uid in forcefield_whitelist[sender_id]: + c+=1 + msg(sender, "&a%s. &f%s") % (c, juuid(uid)) + elif args[1] == "clear": + forcefield_whitelist[sender_id] = [] + msg(sender, "%s &aForceField Whitelist cleared.") + elif args[1] in ["add", "+"]: + if not args[2:]: + msg(sender, "%s &cGive playernames to add to your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].append(uid) + elif args[1] in ["remove", "delete", "rem", "del", "-"]: + if not args[2:]: + msg(sender, "%s &cGive playernames to remove from your whitelist." % forcefield_prefix) + else: + for name in args[2:]: + uid = str(server.getPlayer(name).getUniqueId()) + forcefield_whitelist[sender_id].remove(uid) + elif args[0] in ["help", "?"]: #/forcefield help + forcefield_help(sender) + else: + msg(sender, "%s &cInvalid syntax. Use &o/ff ? &cfor more info.") + return True def setVelocityAway(player, entity): player_loc = player.getLocation()