summaryrefslogtreecommitdiff
path: root/damnspam.py
diff options
context:
space:
mode:
authorjomo <github@jomo.tv>2014-07-14 05:16:48 +0200
committerjomo <github@jomo.tv>2014-07-14 05:16:48 +0200
commit7024fe4845070215eb8faf3d295977fe3e9e8890 (patch)
tree1eb172746722e3ce9e36d80a558da5ae7504e344 /damnspam.py
parent05a68efc43bcdf5aa2d2595f0ea74f45364647d3 (diff)
damnspam
Diffstat (limited to 'damnspam.py')
-rw-r--r--damnspam.py164
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