Merge branch 'dev' of https://github.com/RedstonerServer/redstoner-utils into dev
This commit is contained in:
3
calc.py
3
calc.py
@@ -59,7 +59,4 @@ def on_calc_command(sender, args):
|
|||||||
toggle(sender, calc_users, name = "Calc")
|
toggle(sender, calc_users, name = "Calc")
|
||||||
save_json_file("calc", calc_users)
|
save_json_file("calc", calc_users)
|
||||||
|
|
||||||
status = "enabled" if uid(sender) in calc_users else "disabled"
|
|
||||||
msg(sender, "&6We just &e%s&6 Chat Calculator for you!" % status)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
56
check.py
56
check.py
@@ -1,20 +1,45 @@
|
|||||||
import json
|
import json
|
||||||
import urllib2
|
import urllib2
|
||||||
import datetime
|
import datetime
|
||||||
|
import mysqlhack #pylint: disable = unused-import
|
||||||
|
from traceback import format_exc as print_traceback
|
||||||
|
from com.ziclix.python.sql import zxJDBC
|
||||||
|
from secrets import *
|
||||||
from helpers import *
|
from helpers import *
|
||||||
|
|
||||||
|
|
||||||
# receive info based on the user's IP. information provided by ipinfo.io
|
# receive info based on the user's IP. information provided by ipinfo.io
|
||||||
def ip_info(player):
|
def ip_info(player):
|
||||||
data = json.load(urllib2.urlopen("http://ipinfo.io%s/json" % str(player.getAddress().getAddress())))
|
if player.isOnline():
|
||||||
return data
|
return json.load(urllib2.urlopen("http://ipinfo.io%s/json" % str(player.getAddress().getAddress())))
|
||||||
|
else:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
# receive first join date based on the player data (may not be accurate)
|
# receive first join date based on the player data (may not be accurate)
|
||||||
def get_first_join(player):
|
def get_first_join(player):
|
||||||
first_join = int(player.getFirstPlayed())
|
first_join = int(player.getFirstPlayed())
|
||||||
dt = datetime.datetime.fromtimestamp(first_join/1000.0)
|
dt = datetime.datetime.fromtimestamp(first_join/1000.0)
|
||||||
return "%s-%s-%s %s:%s:%s" % (str(dt.year), str(dt.month), str(dt.day), str(dt.hour), str(dt.minute), str(dt.second))
|
return dt.strftime("%Y-%m-%d %H:%M")
|
||||||
|
|
||||||
|
|
||||||
|
# receive last seen date based on the player data
|
||||||
|
def get_last_seen(player):
|
||||||
|
last_seen = int(player.getLastPlayed())
|
||||||
|
dt = datetime.datetime.fromtimestamp(last_seen/1000.0)
|
||||||
|
return dt.strftime("%Y-%m-%d %H:%M")
|
||||||
|
|
||||||
|
|
||||||
|
# receive link and email from website
|
||||||
|
def get_website_data(player):
|
||||||
|
conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver")
|
||||||
|
curs = conn.cursor()
|
||||||
|
uuid = str(uid(player)).replace("-", "")
|
||||||
|
curs.execute("SELECT DISTINCT `id`, `email` FROM users WHERE `uuid` = ? LIMIT 1", (uuid,))
|
||||||
|
results = curs.fetchall()
|
||||||
|
curs.close()
|
||||||
|
conn.close()
|
||||||
|
return ("http://redstoner.com/users/%s" % results[0][0], results[0][1]) if results else (None, None)
|
||||||
|
|
||||||
|
|
||||||
# receive country based on the user's IP
|
# receive country based on the user's IP
|
||||||
@@ -23,9 +48,10 @@ def get_country(data):
|
|||||||
|
|
||||||
|
|
||||||
def get_all_names(player):
|
def get_all_names(player):
|
||||||
uuid = str(player.getUniqueId()).replace("-", "")
|
uuid = str(uid(player)).replace("-", "")
|
||||||
names = json.load(urllib2.urlopen("https://api.mojang.com/user/profiles/%s/names" % uuid))
|
names = json.load(urllib2.urlopen("https://api.mojang.com/user/profiles/%s/names" % uuid))
|
||||||
return ", ".join(names)
|
# [ {"name": "some_name"}, {"name": "other_name"} ]
|
||||||
|
return ", ".join([name["name"] for name in names])
|
||||||
|
|
||||||
|
|
||||||
# combines data
|
# combines data
|
||||||
@@ -36,29 +62,31 @@ def get_all_data(sender, player):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
msg(sender, "&7 -- Data provided by Redstoner")
|
msg(sender, "&7 -- Data provided by Redstoner")
|
||||||
msg(sender, "&6> UUID: &e%s" % str(player.getUniqueId()))
|
msg(sender, "&6> UUID: &e%s" % str(uid(player)))
|
||||||
msg(sender, "&6> First joined: &7(y-m-d h:m:s) &e%s" % get_first_join(player))
|
msg(sender, "&6> First joined: &7(y-m-d h:m:s) &e%s" % get_first_join(player))
|
||||||
msg(sender, "")
|
msg(sender, "&6> Last seen: &7(y-m-d h:m:s) &e%s" % get_last_seen(player))
|
||||||
|
website = get_website_data(player)
|
||||||
|
msg(sender, "&6> Website account: &e%s" % website[0])
|
||||||
|
msg(sender, "&6> email: &e%s" % website[1])
|
||||||
msg(sender, "&7 -- Data provided by ipinfo.io")
|
msg(sender, "&7 -- Data provided by ipinfo.io")
|
||||||
msg(sender, "&6> Country: &e%s" % get_country(data))
|
msg(sender, "&6> Country: &e%s" % get_country(data))
|
||||||
msg(sender, "&7 -- Data provided by Mojang")
|
msg(sender, "&7 -- Data provided by Mojang")
|
||||||
msg(sender, "&6> All ingame names used so far: &e%s" % get_all_names(player))
|
msg(sender, "&6> All ingame names used so far: &e%s" % get_all_names(player))
|
||||||
except Exception as e:
|
except:
|
||||||
# can throw exceptions such as timeouts when Mojang API is down
|
# can throw exceptions such as timeouts when Mojang API is down
|
||||||
warn(e)
|
warn(print_traceback())
|
||||||
|
msg(sender, "&cSorry, something went wrong while fetching data")
|
||||||
|
|
||||||
|
|
||||||
@hook.command("check", description="Displays useful stuff about a user", usage="/check <player>")
|
@hook.command("check", description="Displays useful stuff about a user", usage="/check <player>")
|
||||||
def on_hook_command(sender, args):
|
def on_hook_command(sender, args):
|
||||||
if sender.hasPermission("utils.check"):
|
if sender.hasPermission("utils.check"):
|
||||||
|
if not checkargs(sender, args, 1, 1):
|
||||||
|
return True
|
||||||
plugin_header(sender, "Check")
|
plugin_header(sender, "Check")
|
||||||
msg(sender, "&7Please notice that the data may not be fully accurate!")
|
msg(sender, "&7Please notice that the data may not be fully accurate!")
|
||||||
|
player = server.getOfflinePlayer(args[0]) if len(args) > 0 else None
|
||||||
player = server.getPlayer(args[0]) if len(args) > 0 else None
|
|
||||||
if player is not None and is_player(player):
|
|
||||||
get_all_data(sender, player)
|
get_all_data(sender, player)
|
||||||
else:
|
|
||||||
msg(sender, "&cLooks like this player is not online.")
|
|
||||||
else:
|
else:
|
||||||
msg(sender, "&4You don't have the required permissions to execute this command!")
|
msg(sender, "&4You don't have the required permissions to execute this command!")
|
||||||
return True
|
return True
|
||||||
@@ -35,7 +35,7 @@ def on_dammnspam_command(sender, args):
|
|||||||
msg(sender, "&c/damnspam <seconds> &e(Buttons/Levers)")
|
msg(sender, "&c/damnspam <seconds> &e(Buttons/Levers)")
|
||||||
msg(sender, "&c/damnspam <seconds after off> <seconds after on> &e(Levers only)")
|
msg(sender, "&c/damnspam <seconds after off> <seconds after on> &e(Levers only)")
|
||||||
return True
|
return True
|
||||||
|
#Gittestlol
|
||||||
if not is_creative(sender):
|
if not is_creative(sender):
|
||||||
msg(sender, "&cYou can only do this in Creative mode.")
|
msg(sender, "&cYou can only do this in Creative mode.")
|
||||||
return True
|
return True
|
||||||
|
|||||||
27
helpers.py
27
helpers.py
@@ -198,28 +198,15 @@ def save_json_file(filename, obj):
|
|||||||
error("Failed to write to %s: %s" % (filename, e))
|
error("Failed to write to %s: %s" % (filename, e))
|
||||||
|
|
||||||
|
|
||||||
def toggle(player, ls, add = None, name = "Toggle", on = "&a%s now on!", off = "&c%s now off!", already = "&c%s was already %s"):
|
def toggle(player, ls, name = "Toggle", add = None):
|
||||||
"""
|
"""
|
||||||
Toggle presence of a player's UUID in a list (ls)
|
Toggles presence of a player's UUID in a list
|
||||||
'add' controls if a player should be added(True) or removed(False)
|
If add is given, True explicitely adds it whereas False removes it
|
||||||
if 'add' is None, ls will simply be toggled for that player.
|
|
||||||
%s in on, off, and already is replaced with the name
|
|
||||||
when 'add' is given, but won't change anything, %s in 'already' is replaced with "ON" or "OFF"
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
pid = uid(player)
|
pid = uid(player)
|
||||||
enabled = pid in ls
|
if pid in ls or add == False:
|
||||||
|
|
||||||
# Do some checks and remove pid.
|
|
||||||
if enabled and add == False:
|
|
||||||
ls.remove(pid)
|
ls.remove(pid)
|
||||||
msg(player, on % name)
|
msg(player, "&a%s turned off!" % name)
|
||||||
|
elif add != False:
|
||||||
# Do some checks and append pid.
|
|
||||||
elif not enabled and add == True:
|
|
||||||
ls.append(pid)
|
ls.append(pid)
|
||||||
msg(player, off % name)
|
msg(player, "&a%s turned on!" % name)
|
||||||
|
|
||||||
# Already on/off (optional)
|
|
||||||
else:
|
|
||||||
msg(player, already % (name, " ON" if add else " OFF"))
|
|
||||||
23
main.py
23
main.py
@@ -9,6 +9,7 @@ from traceback import format_exc as print_traceback
|
|||||||
sys.path += ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7', '/usr/lib/pyshared/python2.7']
|
sys.path += ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7', '/usr/lib/pyshared/python2.7']
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# Library that adds a bunch of re-usable methods which are used in nearly all other modules
|
||||||
from helpers import *
|
from helpers import *
|
||||||
except:
|
except:
|
||||||
print("[RedstonerUtils] ERROR: Failed to import helpers:")
|
print("[RedstonerUtils] ERROR: Failed to import helpers:")
|
||||||
@@ -31,23 +32,43 @@ info("Loading RedstonerUtils...")
|
|||||||
|
|
||||||
# Import all modules, in this order
|
# Import all modules, in this order
|
||||||
shared["load_modules"] = [
|
shared["load_modules"] = [
|
||||||
|
# Collection of tiny utilities
|
||||||
"misc",
|
"misc",
|
||||||
|
# Adds chat for staff using /ac <text or ,<text>
|
||||||
"adminchat",
|
"adminchat",
|
||||||
|
# Adds /badge, allows to give players achievements
|
||||||
"badges",
|
"badges",
|
||||||
|
# Adds /calc, toggles automatic solving of Math expressions in chat
|
||||||
"calc",
|
"calc",
|
||||||
|
# Plugin to locate laggy chunks. /lc <n> lists chunks with more than n entities
|
||||||
"lagchunks",
|
"lagchunks",
|
||||||
|
# Adds /report and /rp, Stores reports with time and location
|
||||||
"reports",
|
"reports",
|
||||||
|
# Adds group-chat with /chatgroup and /cgt to toggle normal chat into group mode
|
||||||
"chatgroups",
|
"chatgroups",
|
||||||
|
# Adds /token, reads and writes from the database to generate pronouncable (and thus memorable) registration-tokens for the website
|
||||||
"webtoken",
|
"webtoken",
|
||||||
|
# Adds /lol, broadcasts random funyy messages. A bit like the splash text in the menu
|
||||||
"saylol",
|
"saylol",
|
||||||
|
# Shows the owner of a skull when right-clicked
|
||||||
"skullclick",
|
"skullclick",
|
||||||
|
# Adds /listen, highlights chat and plays a sound when your name was mentioned
|
||||||
"mentio",
|
"mentio",
|
||||||
|
# Adds /cycler, swaps the hotbar with inventory when player changes slot from right->left or left->right
|
||||||
"cycle",
|
"cycle",
|
||||||
|
# Adds /getmotd & /setmotd to update the motd on the fly (no reboot)
|
||||||
"motd",
|
"motd",
|
||||||
|
# AnswerBot. Hides stupid questions from chat and tells the sender about /faq or the like
|
||||||
"abot",
|
"abot",
|
||||||
|
# Adds '/forcefield', creates forcefield for players who want it.
|
||||||
"forcefield",
|
"forcefield",
|
||||||
|
# Adds /damnspam, creates timeout for buttons/levers to mitigate button spam.
|
||||||
"damnspam",
|
"damnspam",
|
||||||
"check"
|
# Adds /check, useful to lookup details about a player
|
||||||
|
"check",
|
||||||
|
# Adds /imout, displays fake leave/join messages
|
||||||
|
"imout"
|
||||||
|
# NOTICE: If you add something here, please add a small descriptive comment above!
|
||||||
]
|
]
|
||||||
shared["modules"] = {}
|
shared["modules"] = {}
|
||||||
for module in shared["load_modules"]:
|
for module in shared["load_modules"]:
|
||||||
|
|||||||
77
misc.py
77
misc.py
@@ -5,12 +5,12 @@ from sys import exc_info
|
|||||||
import thread
|
import thread
|
||||||
import org.bukkit.inventory.ItemStack as ItemStack
|
import org.bukkit.inventory.ItemStack as ItemStack
|
||||||
|
|
||||||
#
|
|
||||||
# Welcome new players
|
|
||||||
#
|
|
||||||
|
|
||||||
@hook.event("player.PlayerJoinEvent", "monitor")
|
@hook.event("player.PlayerJoinEvent", "monitor")
|
||||||
def on_join(event):
|
def on_join(event):
|
||||||
|
"""
|
||||||
|
Welcome new players
|
||||||
|
"""
|
||||||
player = event.getPlayer()
|
player = event.getPlayer()
|
||||||
|
|
||||||
# send welcome broadcast
|
# send welcome broadcast
|
||||||
@@ -23,7 +23,7 @@ def on_join(event):
|
|||||||
msg(player, " \n \n \n \n \n \n \n \n \n \n \n \n ")
|
msg(player, " \n \n \n \n \n \n \n \n \n \n \n \n ")
|
||||||
msg(player, " &4Welcome to the Redstoner Server!")
|
msg(player, " &4Welcome to the Redstoner Server!")
|
||||||
msg(player, " &6Before you ask us things, take a quick")
|
msg(player, " &6Before you ask us things, take a quick")
|
||||||
msg(player, " &6look at the &a&l/FAQ &6command.")
|
msg(player, " &6look at &a&nredstoner.com/info")
|
||||||
msg(player, " \n&6thank you and happy playing ;)")
|
msg(player, " \n&6thank you and happy playing ;)")
|
||||||
msg(player, " \n \n")
|
msg(player, " \n \n")
|
||||||
|
|
||||||
@@ -36,13 +36,12 @@ def on_join(event):
|
|||||||
player.teleport(player.getWorld().getSpawnLocation())
|
player.teleport(player.getWorld().getSpawnLocation())
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# /sudo - execute command/chat *as* a player/console
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
@hook.command("sudo")
|
@hook.command("sudo")
|
||||||
def on_sudo_command(sender, args):
|
def on_sudo_command(sender, args):
|
||||||
|
"""
|
||||||
|
/sudo
|
||||||
|
execute command/chat *as* a player/console
|
||||||
|
"""
|
||||||
if sender.hasPermission("utils.sudo"):
|
if sender.hasPermission("utils.sudo"):
|
||||||
plugin_header(sender, "Sudo")
|
plugin_header(sender, "Sudo")
|
||||||
if not checkargs(sender, args, 2, -1):
|
if not checkargs(sender, args, 2, -1):
|
||||||
@@ -71,13 +70,11 @@ def on_sudo_command(sender, args):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# /gm - custom gamemode command with extra perms for greater control
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
#@hook.command("gm")
|
#@hook.command("gm")
|
||||||
#def on_gm_command(sender, args):
|
#def on_gm_command(sender, args):
|
||||||
|
# """
|
||||||
|
# /gm - custom gamemode command with extra perms for greater control
|
||||||
|
# """
|
||||||
# if not is_player(sender):
|
# if not is_player(sender):
|
||||||
# msg(sender, "&cDerp! Can't run that from console!")
|
# msg(sender, "&cDerp! Can't run that from console!")
|
||||||
# return True
|
# return True
|
||||||
@@ -98,14 +95,14 @@ def on_sudo_command(sender, args):
|
|||||||
# return True
|
# return True
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Clicking redstone_sheep with shears will drop redstone + wool and makes a moo sound
|
|
||||||
#
|
|
||||||
|
|
||||||
last_shear = 0.0
|
last_shear = 0.0
|
||||||
|
|
||||||
@hook.event("player.PlayerInteractEntityEvent")
|
@hook.event("player.PlayerInteractEntityEvent")
|
||||||
def on_player_entity_interact(event):
|
def on_player_entity_interact(event):
|
||||||
|
"""
|
||||||
|
Clicking redstone_sheep with shears will drop redstone + wool
|
||||||
|
also makes a moo sound for the shearer
|
||||||
|
"""
|
||||||
global last_shear
|
global last_shear
|
||||||
if not event.isCancelled():
|
if not event.isCancelled():
|
||||||
shear_time = now()
|
shear_time = now()
|
||||||
@@ -120,12 +117,12 @@ def on_player_entity_interact(event):
|
|||||||
sender.playSound(entity.getLocation(), "mob.cow.say", 1, 1)
|
sender.playSound(entity.getLocation(), "mob.cow.say", 1, 1)
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# /pluginversions - print all plugins + versions; useful when updating plugins
|
|
||||||
#
|
|
||||||
|
|
||||||
@hook.command("pluginversions")
|
@hook.command("pluginversions")
|
||||||
def on_pluginversions_command(sender, args):
|
def on_pluginversions_command(sender, args):
|
||||||
|
"""
|
||||||
|
/pluginversions
|
||||||
|
print all plugins + versions; useful when updating plugins
|
||||||
|
"""
|
||||||
plugin_header(sender, "Plugin versions")
|
plugin_header(sender, "Plugin versions")
|
||||||
plugins = list(server.getPluginManager().getPlugins())
|
plugins = list(server.getPluginManager().getPlugins())
|
||||||
plugins.sort(key = lambda pl: pl.getDescription().getName())
|
plugins.sort(key = lambda pl: pl.getDescription().getName())
|
||||||
@@ -135,21 +132,20 @@ def on_pluginversions_command(sender, args):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# /echo - essentials echo sucks and prints mail alerts sometimes
|
|
||||||
#
|
|
||||||
|
|
||||||
@hook.command("echo")
|
@hook.command("echo")
|
||||||
def on_echo_command(sender, args):
|
def on_echo_command(sender, args):
|
||||||
|
"""
|
||||||
|
/echo
|
||||||
|
essentials echo sucks and prints mail alerts sometimes
|
||||||
|
"""
|
||||||
msg(sender, " ".join(args).replace("\\n", "\n"))
|
msg(sender, " ".join(args).replace("\\n", "\n"))
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# /pyeval - run python ingame
|
|
||||||
#
|
|
||||||
# has to be in main.py so we can access the modules
|
|
||||||
|
|
||||||
def eval_thread(sender, code):
|
def eval_thread(sender, code):
|
||||||
|
"""
|
||||||
|
/pyeval
|
||||||
|
run python ingame
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
result = eval(code)
|
result = eval(code)
|
||||||
msg(sender, ">>> %s: %s" % (colorify("&3") + type(result).__name__, colorify("&a") + unicode(result) + "\n "), usecolor = False)
|
msg(sender, ">>> %s: %s" % (colorify("&3") + type(result).__name__, colorify("&a") + unicode(result) + "\n "), usecolor = False)
|
||||||
@@ -165,6 +161,10 @@ def eval_thread(sender, code):
|
|||||||
|
|
||||||
@hook.command("pyeval")
|
@hook.command("pyeval")
|
||||||
def on_pyeval_command(sender, args):
|
def on_pyeval_command(sender, args):
|
||||||
|
"""
|
||||||
|
/pyeval
|
||||||
|
run python code ingame
|
||||||
|
"""
|
||||||
if sender.hasPermission("utils.pyeval"):
|
if sender.hasPermission("utils.pyeval"):
|
||||||
if not checkargs(sender, args, 1, -1):
|
if not checkargs(sender, args, 1, -1):
|
||||||
return True
|
return True
|
||||||
@@ -177,7 +177,22 @@ def on_pyeval_command(sender, args):
|
|||||||
|
|
||||||
@hook.command("modules")
|
@hook.command("modules")
|
||||||
def on_modules_command(sender, args):
|
def on_modules_command(sender, args):
|
||||||
|
"""
|
||||||
|
/modules
|
||||||
|
list all modules, unloaded modules in red
|
||||||
|
"""
|
||||||
plugin_header(sender, "Modules")
|
plugin_header(sender, "Modules")
|
||||||
for mod in shared["load_modules"]:
|
for mod in shared["load_modules"]:
|
||||||
color = "a" if mod in shared["modules"] else "c"
|
color = "a" if mod in shared["modules"] else "c"
|
||||||
msg(sender, "&" + color + mod)
|
msg(sender, "&" + color + mod)
|
||||||
|
|
||||||
|
|
||||||
|
@hook.event("player.PlayerTeleportEvent")
|
||||||
|
def on_player_teleport(event):
|
||||||
|
"""
|
||||||
|
Disable spectator teleportation
|
||||||
|
"""
|
||||||
|
player = event.getPlayer()
|
||||||
|
if not event.isCancelled() and str(event.getCause()) == "SPECTATE" and not player.hasPermission("utils.tp.spectate"):
|
||||||
|
event.setCancelled(True)
|
||||||
|
msg(event.getPlayer(), "&cSpectator teleportation is disabled")
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
#pylint: disable = F0401
|
#pylint: disable = F0401
|
||||||
|
"""
|
||||||
|
A library that makes use of the so called ClassPathHack for jython
|
||||||
|
to allow proper loading of mysql-connector.jar at runtime.
|
||||||
|
Import only, no methods.
|
||||||
|
"""
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
# this was going to be a PlotMe-like plugin "plotter"
|
"""
|
||||||
# but it seems like PlotMe is still beeing developed, so we don't need our own.
|
*Very basic* start of a custom plot-plugin like PlotMe
|
||||||
|
on hold because the PlotMe developer continued to develop PlotMe
|
||||||
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
"""
|
||||||
|
Code that was used once to create this awesome screenshot
|
||||||
|
- https://i.imgur.com/v4wg5kl.png
|
||||||
|
- https://i.imgur.com/tIZ3jmC.png
|
||||||
|
- https://www.reddit.com/r/Minecraft/comments/28le52/screenshot_of_all_players_that_joined_my_server/
|
||||||
|
"""
|
||||||
import net.minecraft.server.v1_7_R1.EntityPlayer as EntityPlayer
|
import net.minecraft.server.v1_7_R1.EntityPlayer as EntityPlayer
|
||||||
import net.minecraft.server.v1_7_R1.PacketPlayOutNamedEntitySpawn as PacketPlayOutNamedEntitySpawn
|
import net.minecraft.server.v1_7_R1.PacketPlayOutNamedEntitySpawn as PacketPlayOutNamedEntitySpawn
|
||||||
import net.minecraft.server.v1_7_R1.PlayerInteractManager as PlayerInteractManager
|
import net.minecraft.server.v1_7_R1.PlayerInteractManager as PlayerInteractManager
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#pylint: disable = F0401
|
#pylint: disable = F0401
|
||||||
|
"""
|
||||||
|
A plugin that automatically tiles (stacks) blocks inside a selected region in configurable directions.
|
||||||
|
"""
|
||||||
import org.bukkit.event.block.BlockPlaceEvent as BlockPlaceEvent
|
import org.bukkit.event.block.BlockPlaceEvent as BlockPlaceEvent
|
||||||
import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent
|
import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent
|
||||||
import org.bukkit.event.player.PlayerInteractEvent as PlayerInteractEvent
|
import org.bukkit.event.player.PlayerInteractEvent as PlayerInteractEvent
|
||||||
|
|||||||
Reference in New Issue
Block a user