summaryrefslogtreecommitdiff
path: root/blockplacemods.py
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2015-05-18 23:05:54 +0200
committerDico200 <dico.karssiens@gmail.com>2015-05-18 23:05:54 +0200
commitbd05374db0235afede64f9f3617142726c3117d3 (patch)
treeef5463c22bb77feb0150eebaa4a0f23fe025a1ab /blockplacemods.py
parent057b404b03d2998daf2b970766efebefbd6a5fa8 (diff)
blockplacemods update, basecommands fix
Added settings: piston, dropper, hopper changes to the framework made it so you can set the default contents for all slots in furnaces/droppers as well as furnaces.
Diffstat (limited to 'blockplacemods.py')
-rw-r--r--blockplacemods.py351
1 files changed, 260 insertions, 91 deletions
diff --git a/blockplacemods.py b/blockplacemods.py
index 39893d9..fd2f1aa 100644
--- a/blockplacemods.py
+++ b/blockplacemods.py
@@ -1,49 +1,93 @@
from helpers import *
-from basecommands import simplecommand
+from basecommands import simplecommand, Validate, CommandException
+from time import sleep
+from collections import deque
+import thread
import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent
import org.bukkit.block.Furnace as Furnace
import org.bukkit.inventory.ItemStack as ItemStack
import org.bukkit.Material as Material
+import org.bukkit.event.block.Action as Action
+import org.bukkit.block.BlockFace as BlockFace
+import org.bukkit.scheduler.BukkitRunnable as Runnable
-settingInformation = {
- "cauldron": [0,
+settingInformation = dict( #[setting type, identifying description, detailed description, aliases, (optional) max slot id], setting types: 0 = toggle, default on. 1 = Set your setting to held itemstack, 2 = toggle, default off
+ cauldron = [0,
"easy cauldron water level control",
- "Toggles whether cauldrons auto-fill upon placement and whether right clicking them with redstone dust or empty hand will cycle their water level"
+ "Toggles whether cauldrons auto-fill upon placement and whether right clicking them with redstone dust or empty hand will cycle their water level",
+ ["caul", "water"]
],
- "slab": [0,
+ slab = [0,
"automatically flipping placed slabs upside-down",
- "Toggles whether slabs/steps which you place should be automatically flipped upside-down"
+ "Toggles whether slabs/steps which you place should be automatically flipped upside-down",
+ ["step"]
],
- "furnace": [1,
+ furnace = [1,
"automatically filling furnaces upon placement",
- "Sets your preferred default furnace contents to your currently held itemstack. Use an empty hand to disable this feature. The command is &o/toggle furnace"
+ "Sets your preferred default furnace contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle dropper clear to clear all slots.",
+ ["cooker", "fillf"], 2
+ ],
+ #torch = [0,
+ # "removal of torches you place on redstone blocks",
+ # "Toggles whether redstone torches which you place on redstone blocks will be deleted after a short amount of delay.",
+ # ["redstonetorch", "tor"]
+ #],
+ piston = [2,
+ "rotating pistons, droppers and hoppers to face the block you place them against",
+ "Toggles whether pistons or sticky pistons which you place will be rotated to face the block which you placed them against.",
+ ["invert", "rp"]
+ ],
+ dropper = [1,
+ "automatically filling droppers upon placement",
+ "Sets your preferred default dropper contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle dropper clear to clear all slots.",
+ ["itemshooter", "filld"], 8
+ ],
+ hopper = [1,
+ "automatically filling hoppers upon placement",
+ "Sets your preferred default hopper contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle dropper clear to clear all slots.",
+ ["itemtransporter", "fillh"], 4
]
-}
+)
-defaultPlayerSettings = {
- "cauldron": [],
- "slab": [],
- "furnace": {}
+defaults = {
+ 0: [],
+ 1: {},
+ 2: []
}
-playerSettings = open_json_file("blockplacemods", defaultPlayerSettings)
+faces = {
+ BlockFace.DOWN : 0,
+ BlockFace.UP : 1,
+ BlockFace.NORTH : 2,
+ BlockFace.SOUTH : 3,
+ BlockFace.WEST : 4,
+ BlockFace.EAST : 5
+}
+playerSettings = open_json_file("blockplacemods", {})
-#for setting, default in enumerate(defaultPlayerSettings):
-# if playerSettings.get(setting) == None:
-# playerSettings[setting] = default
+for setting, details in settingInformation.iteritems():
+ if playerSettings.get(setting) == None:
+ playerSettings[setting] = defaults[details[0]]
def get(setting):
return playerSettings[setting]
-
def saveSettings():
save_json_file("blockplacemods", playerSettings)
-
+def getSettingDetails(arg):
+ try:
+ arg = arg.lower()
+ for setting, details in settingInformation.iteritems():
+ if setting == arg or arg in details[3]:
+ return (setting, details)
+ except:
+ error(trace())
+ raise CommandException(" &cThat setting could not be found.\n For command help, use &o/toggle &cor &o/set")
@simplecommand("toggle",
- aliases = ["set"],
+ aliases = ["setting", "set", "config"],
usage = "<setting> [value|info]",
description = "Toggles or sets your preferences for our redstone \nutilities. The following settings are available:\n" + ", ".join([x for x in settingInformation]),
senderLimit = 0,
@@ -51,58 +95,123 @@ def saveSettings():
helpSubcmd = True,
amax = 2)
def toggle_command(sender, command, label, args):
- setting = args[0].lower()
- info = settingInformation.get(setting)
- if info == None:
- return " &cThat setting could not be found.\n For command help, use &o/toggle &cor &o/set"
-
- values = get(setting)
- player = server.getPlayer(sender.getName())
- uuid = uid(player)
- arglen = len(args)
-
- if info[0] == 0: # Toggle
- enabled = uuid not in values
- new = None
- if arglen == 1:
- new = not enabled
- else:
- arg2 = args[1].lower()
- if arg2 == "info":
- return " &aSetting %s:\n &9%s\n &6Accepted arguments: None or one of the following:\n &oon, enable, off, disable, toggle, switch" % (setting, info[2])
- elif arg2 in ("toggle", "switch"):
+ try:
+ setting, details = getSettingDetails(args[0])
+ Validate.isAuthorized(sender, "utils.toggle." + setting, "that setting")
+
+ values = get(setting)
+ player = server.getPlayer(sender.getName())
+ uuid = uid(player)
+ arglen = len(args)
+
+ if details[0] in (0,2): # Toggle
+ default = details[0] == 0 # If True: toggle on if list doesn't contain the uuid
+
+ enabled = (uuid not in values) == default #Invert if details[0] == 2 (toggle disabled by default)
+ info("Enabled: " + str(enabled))
+ new = None
+ if arglen == 1:
new = not enabled
- elif arg2 in ("on", "enable"):
- new = True
- elif arg2 in ("off", "disable"):
- new = False
else:
- return " &cArgument '%s' was not recognized. \nTry one of the following: &oon, off, toggle" % arg2
- if enabled == new:
- return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", info[1])
- if new:
- values.remove(uuid)
- else:
- values.append(uuid)
- saveSettings()
- return (" &aEnabled " if new else " &aDisabled ") + info[1]
-
- elif info[0] == 1: # Save ItemStack in hand
- if arglen == 1:
- item = fromStack(player.getItemInHand())
- if 0 in (item[0], item[1]):
- if uuid in values:
+ arg2 = args[1].lower()
+ if arg2 == "info":
+ return " &aSetting %s:\n &9%s\n &6Accepted arguments: [on|enable|off|disable|toggle|switch|info]\n &6Aliases: %s" % (setting, details[2], ", ".join(details[3]))
+ elif arg2 in ("toggle", "switch"):
+ new = not enabled
+ elif arg2 in ("on", "enable"):
+ new = True == default
+ info("New: " + str(new))
+ elif arg2 in ("off", "disable"):
+ new = False == default
+ info("New: " + str(new))
+ else:
+ return " &cArgument '%s' was not recognized. \n Use &o/toggle %s info &cfor more information" % (arg2, setting)
+ if enabled == new:
+ return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", details[1])
+ if new == default:
+ values.remove(uuid)
+ else:
+ values.append(uuid)
+ saveSettings()
+ return (" &aEnabled " if new else " &aDisabled ") + details[1]
+
+
+ elif details[0] == 1: # Save ItemStack in hand
+ arg2 = args[1].lower() if arglen > 1 else ""
+ enabled = uuid in values
+
+ if arg2 == "clear":
+ if enabled:
del values[uuid]
- return " &aDisabled " + info[1]
- values[uuid] = item
+ return " &aDisabled " + details[1]
+
+ if arg2 == "details":
+ return " &aSetting %s:\n &9%s \n&6Accepted arguments: [<slot>|clear|details]" % (setting, details[2])
+
+ slot = int(arg2) if arg2.isdigit() else 0
+ if not (0 <= slot <= details[4]):
+ return " &cSlot number must be between 1 and %s!" % details[4]
+
+ item = fromStack(player.getItemInHand())
+ if item[0] == 0 or item[1] <= 0:
+ if enabled:
+ items = values[uuid]
+ if slot in items:
+ del items[slot]
+ saveSettings()
+ if len(items) == 0:
+ del values[uuid]
+ return " &aDisabled " + details[1]
+ return " &aCleared slot %s of setting %s" % (slot, setting)
+ return " &cSlot %s of setting %s was already cleared!" % (slot, setting)
+ return " &cAlready disabled: " + details[1]
+
+ if arglen == 2 and not arg2.isdigit():
+ return " &cArgument '%s' was not recognized. \nUse &o/toggle %s details &cfor more detailsrmation." % (arg2, setting)
+
+ if not enabled:
+ values[uuid] = {}
+ values[uuid][slot] = item
saveSettings()
- return " &aEnabled %s, with currently held itemstack" % info[1]
- arg2 = args[1].lower()
- if arg2 == "info":
- return " &aSetting %s:\n &9%s" % (setting, info[2])
- return " &cArgument '%s' was not recognized. \nUse /toggle %s info for more information." % (arg2, setting)
+ return ((" &aEnabled setting %s, S" % setting) if len(values[uuid]) == 1 else "&as") + "et itemstack in slot %s to item in hand" % (slot)
+
+ return None #This shouldn't happen
+ except CommandException, e:
+ raise e
+ except:
+ error(trace())
+
+"""
+ if info[0] in (0,2): # Toggle
+ default = info[0] == 0
+
+ enabled = (uuid not in values) == default #Invert if info[0] == 2 (toggle disabled by default)
+ info("Enabled": True)
+ new = None
+ if arglen == 1:
+ new = not enabled
+ else:
+ arg2 = args[1].lower()
+ if arg2 == "info":
+ return " &aSetting %s:\n &9%s\n &6Accepted arguments: [on|enable|off|disable|toggle|switch]\n &6Aliases: %s" % (setting, info[2], ", ".join(info[3]))
+ elif arg2 in ("toggle", "switch"):
+ new = not enabled
+ elif arg2 in ("on", "enable"):
+ new = True == default
+ elif arg2 in ("off", "disable"):
+ new = False == default
+ else:
+ return " &cArgument '%s' was not recognized. \nUse &o/toggle %s info &cfor more information" % (arg2, setting)
+ if enabled == new:
+ return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", info[1])
+ if new:
+ values.remove(uuid)
+ else:
+ values.append(uuid)
+ saveSettings()
+ return (" &aEnabled " if new else " &aDisabled ") + info[1]
+"""
- return None #This shouldn't happen
def fromStack(itemStack):
@@ -111,48 +220,108 @@ def toStack(lst):
return ItemStack(lst[0], lst[1], lst[2])
def isEnabled(toggleSetting, uuid):
- return uuid not in get(toggleSetting)
+ return (uuid not in get(toggleSetting)) == (settingInformation[toggleSetting][0] == 0) #Invert if off by default
@hook.event("block.BlockPlaceEvent", "monitor")
def on_block_place(event):
- if event.isCancelled():
- return
- player = event.getPlayer()
- if not is_creative(player):
- return
+ try:
+ if event.isCancelled():
+ return
+ player = event.getPlayer()
+ if not is_creative(player):
+ return
- uuid = uid(player)
- block = event.getBlockPlaced()
- material = str(block.getType())
+ uuid = uid(player)
+ block = event.getBlockPlaced()
+ material = block.getType()
- if isEnabled("slab", uuid) and material in ("WOOD_STEP", "STEP") and block.getData() < 8:
- block.setData(block.getData() + 8) # Flip upside down
- elif isEnabled("cauldron", uuid) and material == "CAULDRON":
- block.setData(3) #3 layers of water, 3 signal strength
+ if (material in (Material.WOOD_STEP, Material.STEP)
+ and isEnabled("slab", uuid)
+ and player.hasPermission("utils.toggle.slab")
+ and block.getData() < 8
+ ):
+ block.setData(block.getData() + 8) # Flip upside down
- elif material == "FURNACE":
- stack = get("furnace").get(uuid)
- if stack == None:
- return
- state = block.getState()
- state.getInventory().setSmelting(toStack(stack))
- state.update()
+
+ elif (material == Material.CAULDRON
+ and isEnabled("cauldron", uuid)
+ and player.hasPermission("utils.toggle.cauldron")
+ ):
+ block.setData(3) #3 layers of water, 3 signal strength
+
+
+ elif ((material == Material.FURNACE and player.hasPermission("utils.toggle.furnace"))
+ or (material == Material.DROPPER and player.hasPermission("utils.toggle.dropper"))
+ ):
+ stacks = get(str(material).lower()).get(uuid)
+ if stacks != None: # Enabled
+ state = block.getState()
+ inv = state.getInventory()
+ for slot, stack in stacks.iteritems():
+ inv.setItem(int(slot), toStack(stack))
+ state.update()
+
+ """
+ elif (material == Material.REDSTONE_TORCH_ON
+ and event.getBlockAgainst().getType() == Material.REDSTONE_BLOCK
+ and isEnabled("torch", uuid)
+ and player.hasPermission("utils.toggle.torch")
+ ):
+ torches_to_break.append(block)
+ """
+
+
+ if (material in (Material.PISTON_BASE, Material.PISTON_STICKY_BASE) #Not elif because for droppers it can do 2 things
+ and isEnabled("piston", uuid)
+ and player.hasPermission("utils.toggle.piston")
+ ):
+ block.setData(faces[block.getFace(event.getBlockAgainst())])
+ except:
+ error(trace())
@hook.event("player.PlayerInteractEvent", "monitor")
def on_interact(event):
player = event.getPlayer()
if (isEnabled("cauldron", uid(player))
- and is_creative(player)
- and str(event.getAction()) == "RIGHT_CLICK_BLOCK"
- and (not event.hasItem() or str(event.getItem().getType()) == "REDSTONE")
- and str(event.getClickedBlock().getType()) == "CAULDRON"
+ and player.hasPermission("utils.toggle.cauldron")
+ and is_creative(player)
+ and event.getAction() == Action.RIGHT_CLICK_BLOCK
+ and (not event.hasItem() or event.getItem().getType() == Material.REDSTONE)
+ and event.getClickedBlock().getType() == Material.CAULDRON
):
block = event.getClickedBlock()
event2 = BlockBreakEvent(block, player)
server.getPluginManager().callEvent(event2)
if not event2.isCancelled():
block.setData(block.getData() - 1 if block.getData() > 0 else 3)
+
+"""
+break_torches = True
+torches_to_break = deque()
+
+def stop_breaking_torches():
+ break_torches = False
+ info("Interrupted torch breaking thread")
+
+
+class torch_breaker(Runnable):
+
+ def run():
+
+ try:
+ if break_torches:
+ for i in range(len(torches_to_break)):
+ block = torches_to_break.popleft()
+ mat = block.getType()
+ if mat == Material.REDSTONE_TORCH_OFF:
+ block.setTypeId(0)
+ elif mat == Material.REDSTONE_TORCH_ON:
+ torches_to_break.append(block)
+ except:
+ error(trace())
+"""
+