summaryrefslogtreecommitdiff
path: root/serversigns.py
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2015-09-15 16:45:22 +0200
committerDico200 <dico.karssiens@gmail.com>2015-09-15 16:45:22 +0200
commit9bf7d626da0b5026522b2663bd68357e2366dd7d (patch)
treea3f93c72811fa0cf1e01c963afff67567a09fcf6 /serversigns.py
parentebfb4b4140525ffc9ad8e7ad5eba8377ee6299ec (diff)
Serversigns Replacement, accessible for everyone.
Untested. :accept:
Diffstat (limited to 'serversigns.py')
-rw-r--r--serversigns.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/serversigns.py b/serversigns.py
new file mode 100644
index 0000000..c7bc23c
--- /dev/null
+++ b/serversigns.py
@@ -0,0 +1,221 @@
+from helpers import *
+from basecommands import simplecommand, Validate
+import org.bukkit.Material as Material
+import java.util.UUID as UUID
+import org.bukkit.Material as Material
+import java.util.HashSet as JSet
+
+
+cmd_use_perm = "utils.svs.cmd"
+msg_use_perm = "utils.svs.msg"
+
+signs = open_json_file("serversigns", {}) # {("world", x, y, z): ["owner_id", "msg1", "msg2"]}
+
+lines = {} #Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""}
+
+transparent_blocks_set = JSet([Material.AIR, Material.GLASS, Material.STAINED_GLASS]) #used in sender.getTargetBlock()
+
+@simplecommand(cmd = "serversigns", aliases = ["svs", "signmsg"],
+ description = "Makes something happen when you right click certain signs",
+ usage = "[claim|unclaim|add <msg>|remove <line>|clear|info|help]",
+ helpNoargs = True,
+ senderLimit = 0)
+def svs_command(sender, command, label, args):
+ try:
+ arg1 = args[0].lower()
+ if arg1 not in ("add", "remove", "clear", "claim", "unclaim", "help"):
+ return "&4That argument could not be recognized, use &o/svs &4help for more information"
+
+ sender = server.getPlayer(sender.getName())
+ block = sender.getTargetBlock(transparent_blocks_set, 8)
+ info("Block type: " + str(block.getType()))
+ if block.getType() not in (Material.SIGN_POST, Material.WALL_SIGN):
+ return "&4You have to be looking at a sign to use that!"
+
+ loc = fromLoc(block.getLocation())
+ sign = getSign(loc)
+ arglen = len(args)
+ arg2 = args[1].lower() if arglen > 1 else None
+
+
+ if arg1 == "claim":
+ Validate.isAuthorized(sender, "utils.serversigns.claim")
+ target = sender
+ if arg2:
+ Validate.isAuthorized(sender, "utils.serversigns.admin")
+ target = server.getOfflinePlayer(arg2)
+ Validate.notNone(target, signsMsg("That player could not be found", '4'))
+
+ Validate.isPlayer(target)
+ uuid = uid(sender)
+ if sign != None:
+ if sign[0] == uuid:
+ return signsMsg(identifySign(loc, True) + " was already owned by that player", '4')
+ else:
+ sign[0] = uuid
+ else:
+ signs[loc] = [uuid]
+
+ return signsMsg("Claimed " + identifySign(loc))
+
+
+ elif arg1 == "unclaim":
+ Validate.isAuthorized(sender, "utils.serversigns.unclaim")
+ Validate.isTrue(canEdit(sign, sender), signsMsg("You cannot unclaim the %s!" % identifySign(loc)), '4')
+
+ if not (("-c" in args) and sender.hasPermission("utils.serversigns.admin")):
+ del signs[locAt]
+ return signsMsg("The %s was reset successfully" % identifySign(loc))
+ sign[0] = ""
+ return signsMsg("The %s had its owner removed successfully" % identifySign(loc))
+
+
+ elif arg1 == "help":
+ admin = sender.hasPermission("utils.serversigns.admin")
+
+ return
+
+
+ elif arg1 == "add":
+ Validate.isTrue(canEdit(sign, sender), signsMsg("You cannot edit the %s!" % identifySign(loc)), '4')
+ line = " ".join(args[1:])
+ Validate.isTrue(line != "" and line != None, signsMsg("You have to enter a message to add or accumulate!", '4'))
+ key = sender.getName()
+
+ Validate.isTrue(key in lines or line[:1] != "/" or sender.hasPermission("utils.serversigns.command"), signsMsg("You cannot add commands to a sign!", '4'))
+
+ if line[-2:] == "++":
+ if key not in lines:
+ lines[key] = ""
+ lines[key] += " " + line[:-2]
+ elif key in lines:
+ line = lines[key] + " " + line
+ sign.append(colorify(line) if line[0] != "/" else line)
+ return signsMsg("Added line \"%s&a\" to the %s" % (line, identifySign(loc)))
+
+
+ elif arg1 == "info":
+ Validate.notNone(sign, signsMsg("The %s has not been claimed" % identifySign(loc), '4'))
+ lines = ""
+ for id, line in enumerate(sign[1:]):
+ lines += ("\n &a%s: \"%s&a\"" % (id + 1, line))
+ msg = signsMsg("Some information about the %s:\n Owner: %s\n Lines: %s" % identifySign(loc), getOwner(sign), lines)
+
+
+ elif arg1 == "remove":
+ Validate.notNone(arg2, signsMsg("You have to enter the ID of the message to remove!", '4'))
+ try:
+ id = int(arg2)
+ except:
+ return signsMsg("The ID of the message has to be a number and can be found by using &o/svs info", '4')
+ Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (identifySign(loc), id), '4'))
+ sign.remove(id)
+ return signsMsg("Removed message with id %s from the %s" % (id, identifySign(loc)))
+ except:
+ error(trace())
+
+
+
+@hook.event("player.PlayerInteractEvent")
+def onClick(event):
+ if str(event.getAction()) != "RIGHT_CLICK_BLOCK":
+ return
+ block = event.getClickedBlock()
+ if block.getType() not in (Material.WALL_SIGN, Material.SIGN_POST):
+ return
+ sign = getSign(fromLoc(block.getLocation()))
+ if sign != None:
+ player = event.getPlayer()
+ for message in sign[1:]:
+ if message[:1] == "/":
+ server.dispatchCommand(player, message[1:])
+ else:
+ msg(player, message, usecolor = False)
+
+def fromLoc(bLoc): #Bukkit Location to ("world", x, y, z)
+ return (bLoc.getWorld().getName(), bLoc.getBlockX(), bLoc.getBlockY(), bLoc.getBlockZ())
+
+def equals(loc1, loc2):
+ for i in range(4):
+ if loc1[i] != loc2[i]:
+ return False
+ return True
+
+def getOwner(sign):
+ return retrieve_player(sign[0]).getName()
+
+def isOwner(sign, player):
+ return sign and sign[0] == uid(player)
+
+def canEdit(sign, player):
+ return player.hasPermission("utils.serversigns.admin") or isOwner(sign, player)
+
+def getSign(locAt):
+ for loc, sign in signs.iteritems():
+ if equals(locAt, loc):
+ return sign
+ return None
+
+def identifySign(loc, capital = False):
+ return "%sign at (%s) in %s" % ("S" if capital else "s", ",".join(loc[1:]), loc[0])
+
+def signsMsg(msg, colour = 'a'):
+ return "&c[Signs] &" + colour + msg
+
+
+
+
+
+
+"""
+def eventhook(event, priority = "normal"):
+
+ if "." not in event:
+ word = ""
+ for s in event:
+ if word != "" and s in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
+ break;
+ word += s.lower()
+ event = "%s.%s" % (word, event)
+
+ def decorator(function):
+
+ @hook.event(event, priority)
+ def hook(event):
+ try:
+ function(event)
+ except EventException, e:
+ pass
+
+ return hook
+
+ return decorator
+
+class EventException(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+
+""
+@eventhook("PlayerInteractEvent")
+def x(event):
+
+ p = event.getPlayer()
+ if p == None:
+ raise EventException(Stuff)
+""
+"""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+