diff options
author | jomo <github@jomo.tv> | 2014-07-14 05:16:48 +0200 |
---|---|---|
committer | jomo <github@jomo.tv> | 2014-07-14 05:16:48 +0200 |
commit | 7024fe4845070215eb8faf3d295977fe3e9e8890 (patch) | |
tree | 1eb172746722e3ce9e36d80a558da5ae7504e344 /damnspam.py | |
parent | 05a68efc43bcdf5aa2d2595f0ea74f45364647d3 (diff) |
damnspam
Diffstat (limited to 'damnspam.py')
-rw-r--r-- | damnspam.py | 164 |
1 files changed, 108 insertions, 56 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) +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 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 onTimeoutCommand(sender, args): +def onDammnspamCommand(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.") + if len(args) <= 2: + + if not str(sender.getGameMode()) == "CREATIVE": + msg(sender, "&cYou can only do this in Creative mode.") 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!") + + # /damnspam <secs> + 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 <off> <on> + 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 - 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) + + # add block to inputs + add_input(sender, target, timeout_off, timeout_on) saveInputs() - msg(sender, "&eSuccessfully set a timeout for this button") + msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower()) return True + else: - msg(sender, "&c/timeout <seconds>") + msg(sender, "&c/damnspam <seconds> &e(Buttons/Levers)") + msg(sender, "&c/damnspam <seconds after off> <seconds after on> &e(Levers only)") 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)) @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 |