Finished signal strength command

This commit is contained in:
Dico200
2015-10-20 01:01:53 +02:00
parent a637954ef7
commit 0676c535ad
+69 -50
View File
@@ -4,9 +4,13 @@ from time import time as now
from time import sleep from time import sleep
from sys import exc_info from sys import exc_info
import thread import thread
import org.bukkit.inventory.ItemStack as ItemStack import org.bukkit.inventory.ItemStack as ItemStack
import org.bukkit.Material as Material
from math import ceil
import org.bukkit.Bukkit as Bukkit import org.bukkit.Bukkit as Bukkit
from basecommands import simplecommand from basecommands import simplecommand, Validate
@@ -70,7 +74,6 @@ def cmd_event2(event):
""" Disabled while builder can't access Trusted """ Disabled while builder can't access Trusted
@hook.event("player.PlayerGameModeChangeEvent", "low") @hook.event("player.PlayerGameModeChangeEvent", "low")
def on_gamemode(event): def on_gamemode(event):
@@ -142,17 +145,24 @@ def on_sudo_command(sender, command, label, args):
return "&cPlayer %s not found!" % target return "&cPlayer %s not found!" % target
container_levels = dict(
FURNACE = [],
HOPPER = [],
CHEST = [],
)
""" """
Suggestion by Armadillo28, see thread: http://redstoner.com/forums/threads/2213-putting-the-correct-amount-of-items-in-a-container?page=1#reply-14507 Suggestion by Armadillo28, see thread: http://redstoner.com/forums/threads/2213-putting-the-correct-amount-of-items-in-a-container?page=1#reply-14507
Clarification on these formulas on http://minecraft.gamepedia.com/Redstone_Comparator#Containers
""" """
"""
def required_item_count(strength, slots, stack):
if strength == 0:
count = 0
elif strength == 1:
count = 1
else:
count = int(ceil(slots * stack / 14.0 * (strength - 1)))
resulting_strength = int(1 + 14.0 * count / stack / slots)
return count if resulting_strength == strength else None
@simplecommand("signalstrength", @simplecommand("signalstrength",
usage = "<signal strength> [item] [data]", usage = "<signal strength> [item] [data]",
aliases = ["ss", "level"], aliases = ["ss", "level"],
@@ -163,58 +173,67 @@ Suggestion by Armadillo28, see thread: http://redstoner.com/forums/threads/2213-
helpSubcmd = True, helpSubcmd = True,
senderLimit = 0) senderLimit = 0)
def on_signalstrength_command(sender, command, label, args): def on_signalstrength_command(sender, command, label, args):
values = []
try:
for i in range(len(args)):
values[i] = int(args[i])
except ValueError:
return "&cYou have to enter a number for the signal strength"
target_block = sender.getTargetBlock(None, 5) target_block = sender.getTargetBlock(None, 5)
Validate.notNone(target_block) Validate.notNone(target_block, "&cThat command can only be used when a container is targeted")
target_type = str(target_block.getType())
Validate.isTrue(target_type in container_levels)
levels = container_levels[target_type] try:
inv = target_block.getState().getInventory()
except AttributeError:
return "&cThat command can only be used when a container is targeted"
item_value = 1 #--------Check if all arguments are an int >= 0 and reassign args---------
item_type = Material.REDSTONE for i in range(len(args)):
item_data = 0 if not args[i].isdigit():
if len(values) > 1: return "&cThe %s has to be a number >= 0" % ("signal strength", "item", "data")[i]
item_type = Material.getMaterial(values[1]) args = [int(arg) for arg in args]
if item_type == None:
return "&cThat is not an item ID"
if len(values) == 3:
item_data = values[2]
if not (0 <= item_data <= 15):
return "&cThe data must be a number from 0 to a maximum of 15"
if values[1] in (items that stack up to 16):
item_value = 4
elif values[1] in (items that stack up to 1):
item_value = 64
target_strength = values[0] #---------Define the requested strength, item type and item data----------
strength = args[0]
Validate.isTrue(0 <= strength <= 15, "&cThe signal strength has to be a value from 0 to 15")
item_count = levels[target_strength] / item_value item_type = Material.REDSTONE if len(args) < 2 else Material.getMaterial(args[1])
Validate.notNone(item_type, "&cThat item id does not exist")
if int(item_count) * item_value < levels[target_strength] and (int(item_count) + 1) * item_value >= levels[target_strength + 1]: #if target_strength = 15, first check will always be false, so no IndexError item_data = 0 if len(args) < 3 else args[2]
return "&cThe desired signal strength could not be achieved with the requested item type" Validate.isTrue(0 <= item_data <= 15, "&cThe data has to be a value from 0 to 15")
item_count = int(item_count) #--------Get the stack size and required amount of items to achieve the desired signal strength---------
if item_count % 1 != 0: stack_size = item_type.getMaxStackSize()
item_count += 1 item_count = required_item_count(strength, inv.getSize(), stack_size)
Validate.notNone(item_count, "&cThe desired signal strength could not be achieved with the requested item type")
def stack(count): #------------Add the other side of the chest if target is a double chest--------------
return ItemStack(values[1]) target_blocks = [target_block]
target_type = target_block.getType()
full_stacks = int(item_count / item_value) if target_type in (Material.CHEST, Material.TRAPPED_CHEST):
for i in range(0, full_stacks) #amount of full stacks loc = target_block.getLocation()
target_block.setItem(i, ItemStack()) x = loc.getBlockX()
""" y = loc.getBlockY()
z = loc.getBlockZ()
world = loc.getWorld()
target_blocks += [
block for block in (
world.getBlockAt(x + 1, y, z),
world.getBlockAt(x - 1, y, z),
world.getBlockAt(x, y, z + 1),
world.getBlockAt(x, y, z - 1),
) if block.getType() == target_type
]
#----------------Insert items-------------
full_stack_count, remaining = divmod(item_count, stack_size)
inv.clear()
for block in target_blocks:
for i in range(full_stack_count):
inv.setItem(i, ItemStack(item_type, stack_size, item_data))
if remaining > 0:
inv.setItem(full_stack_count, ItemStack(item_type, remaining, item_data))
return "&aSuccesfully edited the targeted %s to give out a signal strenth of %s to comparators" % (str(target_type).lower().replace("_", " "), strength)