Giter Club home page Giter Club logo

minecraft-wrapper's Introduction

Outdated Repository

Wrapper.py has moved to a new repository. It features a total re-write, with better performance, Python 2.x and 3.x compatibility from the ground up, a new, sleek dashboard interface, and more.

This will remain online as an archived repository only.

An extremely huge thank-you to @suresttexas00 for maintaining the Wrapper.py project for so long! Wrapper would've been dead in the road long ago if it weren't for you.

Overview


Wrapper.py is an easy to use Minecraft server wrapper for adding extra functionality into the server without modifying the server jar file. It also comes with a relatively simple and straight-forward - yet powerful - plugin API that can be used to create Bukkit-like plugins with no server modding. The API works best when operated in proxy mode.

We also have a gitter channel: Join the chat at https://gitter.im/benbaptist/minecraft-wrapper

Wrapper.py Versions

NOTICE: Wrapper will Accept the minecraft server EULA on your behalf. 2

Features


Wrapper.py supports the following features:

  • Plugin system for adding extra features to a vanilla server.
  • Permissions system with group support.
  • Proxy mode operation allows you to add extra bukkit-like functionality to plugins:
    • Real / command interface.
    • Built in hub worlds / multi-server support!
      • Use the built-in /hub functionality with world configurations set up in the wrapper config, or
      • Implement your own customized version with the plugin API by calling the player.connect() method.
    • Limit entity breeding / spawning with entity controls.
    • Monitor, Modify, and change:
      • player chat.
      • player block /digging/placement.
      • player inventory.
      • .. and More!
  • Automatic Backups
    • Automatically delete the oldest backups once you reach a specified number of backups
    • Specify which folders and files get backed up
  • IRC bridge
    • Controlling server from IRC
    • Achievements, deaths, and whatnot appear on IRC
    • Chat between Minecraft server and IRC channels
  • Scheduled reboots
  • Web remote for controlling the server and the wrapper through your web browser
  • Shell scripts that are called upon certain events (similar to plugin events, but quicker and easier)
  • Minecraft 1.7 and later support
  • Colorized console logging.

Installation

Python Versions

Python 3.5 + is suggested, However...

Dependencies

Wrapper.py requires the following packages:

  • Python packages: pip, requests, cryptography, bcrypt, setuptools, pkg_resources
  • Tar is required for backups.
  • More...

Start Up

You only need to download Wrapper.py. The '\wrapper' folder is the source code and is just the extracted version of Wrapper.py. Wrapper.py is a Python-executable archive folder containing the sourcecode.

To start Wrapper, open a console where the Wrapper.py or /wrapper sourcecode are located and type the following into the console to start:

python Wrapper.py|/wrapper [--passphrase 'passphrase'] The passphrase must be 8 or more characters in length!

Once wrapper has started:

  • Open the wrapper.properties.json file and tune the file to your remaining preferences.

  • Tune and setup your server and server.properties accordingly.

  • Restart wrapper.

    [15:28:08] [Server thread/INFO]: Starting minecraft server version 1.12.2
    [15:28:08] [Server thread/INFO]: Loading properties
     ...
    [15:28:16] [Server thread/INFO]: Preparing spawn area: 94%
    [15:28:17] [Server thread/INFO]: Done (7.956s)! For help, type "help" or "?"
    [15:28:17] [Wrapper.py/INFO]: Server started
    [15:28:17] [Wrapper.py/INFO]: Proxy listening on *:25566
    

Operating wrapper

  • Any console command beginning with a slash (/) will be interpreted firstly as a Wrapper.py command.

  • Type /help to see a list of Wrapper.py commands.

  • To completely shutdown the wrapper, type /halt.

  • To enter passwords into the wrapper.properties.config file, use the /password console command to enter the applicable password: /password Web web-password <new password>

Please read our Doc page for additional information and review the issues page before submitting bug reports.
If you run into any bugs, please do report them!

If you have questions, please use our Gitter page instead of creating an issue.

API

The references for the wrapper plugin API are here: Wrapper.py Plugin API

New Permissions System

A file in the wrapper root directory "superOPs.txt" now augments the "Ops.json" file. Operators in the ops.json file can be assigned a higher (wrapper) OP level. The contents of the file are laid out just like server.properties (lines of <something>=<value>).

Sample superops.txt:

Suresttexas00=5
BenBaptist=9

Higher op levels are required to run sensitive wrapper commands like /perms.

Plugins

The modern event list is updated with each build: Wrapper events 3

Check the 'example-plugins' and 'stable-plugins' folders to see some example plugins. These are very useful for seeing how the API functions.

  • TEMPLATE.py and EXAMPLE.py are mostly just shells of a plugin to work off of. They contain useful tutorial comments.
  • zombie.py is a fun test plugin that leaves behind undead versions of people when killed by undead mobs.
  • speedboost.py gives everyone a speedboost when someone dies - similar to survival games.
  • poll.py allows players to vote for certain things on the server. It isn't very up-to-date at the moment, however.
  • Essentials is a plugin loosely based off of Essentials for Bukkit.
  • WorldEdit - is a plugin loosely based on the WorldEdit for Bukkit by sk89q
  • SmallBrother is a lightweight logging plugin based on the old Bukkit plugin, BigBrother
  • Open.py is a plugin that opens a window with nothing. This plugin was probably just a test plugin and may not work, but contains example code for accessing packets from the player api.

Tip:

If you want to see more error messages and other useful messages while developing plugins or debugging wrapper, look for the logging.json file and make changes to the "console" section:

...
        "console": {
            "stream": "ext://sys.stdout",
            "formatter": "standard",
            "class": "logging.StreamHandler",
            "filters": [
                "plugin"
            ],
            "level": "INFO" <-- Set to DEBUG for more detailed output
        },
...



1 - The old stable branch "master", version 0.7.6, build 83 has now been archived in the "Original" branch. The original version only supports minecraft versions up to 1.8.

2 - Using wrapper means you also accept the EULA, which will be set to true in the eula.txt file in your server folder. Mojang EULA

3 - The original Event list (Wrapper version 0.7.6) - 0.7.6 Wrapper list of events

minecraft-wrapper's People

Contributors

benbaptist avatar cougar avatar jasonbristol avatar katipo007 avatar melair avatar melaquin avatar mojotx avatar overjt avatar sasszem avatar suresttexas00 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

minecraft-wrapper's Issues

I left this for a while and started fresh

.. on a new machine. I started the wrapper.py file and this is what i get:

C:\Users\JRUSSELL\Desktop\vanilla>python Wrapper.py
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in run_module_as_main
"main", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in run_code
exec code in run_globals
File "Wrapper.py__main
.py", line 7, in
File "Wrapper.py\server.py", line 1, in
ImportError: No module named resource

C:\Users\JRUSSELL\Desktop\vanilla>pause
Press any key to continue . . .

Ignoring "hidden" directories in wrapper-plugins when loading.

For example I keep my wrapper-plugins directory in git, it would be good if the Wrapper would ignore any directory/file beginning with ".", standard for most UNIX style operating systems.

[14:45:54] [Wrapper.py/INFO] Loading plugin .git...
[14:45:54] [Wrapper.py/DEBUG] Traceback (most recent call last):
[14:45:54] [Wrapper.py/DEBUG] File "Wrapper.py/main.py", line 74, in loadPlugins
[14:45:54] [Wrapper.py/DEBUG] if os.path.isdir("wrapper-plugins/%s" % i): self.loadPlugin(i)
[14:45:54] [Wrapper.py/DEBUG] File "Wrapper.py/main.py", line 30, in loadPlugin
[14:45:54] [Wrapper.py/DEBUG] plugin = import_module(i)
[14:45:54] [Wrapper.py/DEBUG] File "/usr/lib/python2.7/importlib/init.py", line 30, in import_module
[14:45:54] [Wrapper.py/DEBUG] raise TypeError("relative imports require the 'package' argument")
[14:45:54] [Wrapper.py/DEBUG] TypeError: relative imports require the 'package' argument
[14:45:54] [Wrapper.py/DEBUG]
[14:45:54] [Wrapper.py/ERROR] Failed to import plugin '.git'

How to get UUIDs

I've created my plugin to store peoples "/sethome", but right now it saves their home in the storage container indexed by their username.. usernames which might change in some future version. I want to store their info under the UUID. However, I only see a player api method called lookupUUID that returns the username.. but I already have the name from player.username, so I am scratching my head as to why I need lookupUUID(uuid)??? Where do I get UUID's of the player in question (who is typing /home or /sethome ?

Proxy mode changes the UUIDs...

Which means that if i implement wrapper on an existing server, players will be treated as new players when they login... starting back out at the spawn point, bed spawns lost, no XP, lost inventories, and achievements starting over. Is there a way to work around this?

This is not just a wrapper issue, I guess its just the way proxies work because I have the same issue with my bungeecord worlds if I tried to bungeecord to a vanilla jar (works fine with spigot because it's designed to bo configued with bungeecord).

invalid encoding for python3.x..?

When I open the file, it says "Specify file encoding";
"The file's encoding in invalid for python3.x". IDLE will convert it to UTF-8. What is the current encoding of the file?"
PREFILLED DEFAULT [cp1252]{cursor}

I opened the file with 7zip and extracted it. the Pyfiles inside open fine. How do I get this thing running??

Windows can be a bitch. Renamed for future searching

This mostly works pretty well; thanks for your hard work! This was the only real product I have access to on a windows platform.

The server starts fine, but I can only access the server from my LAN because:
[2014-12-01 15:07:45] [Wrapper.py/ERROR] Proxy mode could not be started because you do not have one or more of the following modules installed: pycrypt and requests

Your readme file states:
web mode and proxy mode require the following: pkg_resources , requests , and pycrypto .

I am on a windows machine.. are these Linux components or are they plugins that I need? How do I get these components?

Fix <1.6 compatiblity

Adding support for 1.7 broke 1.6 compatibility.

I need to be able to read the stdout from 1.6, since I can't do that normally.

almost none of the essentials example plugin commands work (using build 61)

I tried for this example "/spawn":

C:\Users\JRUSSELL\Desktop\vanilla>python Wrapper.py
[12:09:41] [Wrapper.py/INFO] Wrapper.py started - Version 0.7.4 (development bui
ld #61)
[12:09:41] [Wrapper.py/INFO] Loading plugins...
[12:09:41] [Wrapper.py/INFO] Loading plugin Essentials.py...
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered permission 'essentials.war
p' with default value: True
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered permission 'essentials.mot
d' with default value: True
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered permission 'essentials.get
pos' with default value: True
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'setwarp'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'warp'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'motd'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'setmotd'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'echo'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'blowblowblow'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'killall'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'gm'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'getpos'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'heal'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'echoaction'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'powertool'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'i'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'spawn'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'block'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered command 'whois'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered event 'player.login'
[12:09:41] [Wrapper.py/DEBUG] [Essentials] Registered event 'player.dig'
[12:09:41] [Wrapper.py/INFO] Starting server...
[12:09:46] [Server thread/INFO]: Starting minecraft server version 1.8.1
[12:09:46] [Server thread/INFO]: Loading properties
[12:09:46] [Server thread/INFO]: Default game type: ADVENTURE
[12:09:46] [Server thread/INFO]: Generating keypair
[12:09:46] [Server thread/INFO]: Starting Minecraft server on 127.0.0.1:25565
[12:09:46] [Server thread/INFO]: Using default channel type
[12:09:46] [Server thread/WARN]: **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE
!
[12:09:46] [Server thread/WARN]: The server will make no attempt to authenticate
usernames. Beware.
[12:09:46] [Server thread/WARN]: While this makes the game possible to play with
out internet access, it also opens up the ability for hackers to connect with an
y username they choose.
[12:09:46] [Server thread/WARN]: To change this, set "online-mode" to "true" in
the server.properties file.
[12:09:46] [Server thread/INFO]: Preparing level "AllTheWorld"
[12:09:46] [Server thread/INFO]: Preparing start region for level 0
[12:09:47] [Server thread/INFO]: Done (0.957s)! For help, type "help" or "?"
[12:09:47] [Wrapper.py/INFO] Server started
[12:11:10] [Wrapper.py/INFO] SurestTexas00 logged in (UUID: xxxxxxxx-xxxx-xxxx-x
xxx-xxxxxxxxxxxx | IP: 184.18.6.142)
[12:11:11] [Server thread/INFO]: SurestTexas00[/127.0.0.1:61349] logged in with
entity id 50 at (-4.493749745287395, 65.0, 67.61178580243106)
{'player': <api.player.Player instance at 0x02989170>}
[12:11:11] [Server thread/INFO]: SurestTexas00 joined the game
[12:11:34] [Wrapper.py/INFO] SurestTexas00 executed: /help
op suresttexas00
[12:11:50] [Server thread/INFO]: Opped suresttexas00
[12:12:00] [Wrapper.py/INFO] SurestTexas00 executed: /help
[12:12:14] [Wrapper.py/INFO] SurestTexas00 executed: /time set 0
[12:12:14] [Server thread/INFO]: [SurestTexas00: Set the time to 0]
[12:12:30] [Wrapper.py/INFO] SurestTexas00 executed: /help 2
[12:12:42] [Wrapper.py/INFO] SurestTexas00 executed: /help 3
[12:12:54] [Wrapper.py/INFO] SurestTexas00 executed: /help 4
[12:13:02] [Wrapper.py/INFO] SurestTexas00 executed: /help 5
[12:13:13] [Wrapper.py/INFO] SurestTexas00 executed: /help 6
[12:13:34] [Wrapper.py/INFO] SurestTexas00 executed: /help 7
[12:15:33] [Wrapper.py/INFO] SurestTexas00 executed: /gamerule doDaylightCycle f
alse
[12:15:33] [Server thread/INFO]: [SurestTexas00: Game rule has been updated]
[12:16:54] [Wrapper.py/INFO] SurestTexas00 executed: /spawn
[12:16:54] [Wrapper.py/ERROR] Plugin 'com.benbaptist.plugins.essentials' errored
out when executing command: ' /{'callback': <bound method Main.s
pawn of <Essentials.Main instance at 0x02929210>>, 'permission': 'essentials.spa
wn'}':
[12:16:54] [Wrapper.py/ERROR] Traceback (most recent call last):
[12:16:54] [Wrapper.py/ERROR] File "Wrapper.py__main__.py", line 340, in play
erCommand
[12:16:54] [Wrapper.py/ERROR] if player.hasPermission(command["permission"])
:
[12:16:54] [Wrapper.py/ERROR] File "src/api/player.py", line 110, in hasPermis
sion
[12:16:54] [Wrapper.py/ERROR] if uuid in self.permissions["users"]:
[12:16:54] [Wrapper.py/ERROR] File "Wrapper.py\storage.py", line 22, in geti
tem

[12:16:54] [Wrapper.py/ERROR] return self.data[index]
[12:16:54] [Wrapper.py/ERROR] KeyError: 'users'
[12:16:54] [Wrapper.py/ERROR]

wrapper.py crash log

[20:27:30] [Wrapper.py/DEBUG] plugin 'TwitchPlays-' registered event 'player.death'
[20:27:30] [Wrapper.py/ERROR] Wrapper.py crashed - stopping sever to be safe
[20:27:30] [Wrapper.py/ERROR] Traceback (most recent call last):
[20:27:30] [Wrapper.py/ERROR] File "/home/benbaptist/minecraft/TuxShow/src/main.py", line 151, in
[20:27:30] [Wrapper.py/ERROR] t = threading.Thread(target=wrapper.start(), args=())
[20:27:30] [Wrapper.py/ERROR] File "/home/benbaptist/minecraft/TuxShow/src/main.py", line 103, in start
[20:27:30] [Wrapper.py/ERROR] self.server.startServer()
[20:27:30] [Wrapper.py/ERROR] File "src/server.py", line 125, in startServer
[20:27:30] [Wrapper.py/ERROR] self.wrapper.callEvent("timer.second", {})
[20:27:30] [Wrapper.py/ERROR] File "/home/benbaptist/minecraft/TuxShow/src/main.py", line 58, in callEvent
[20:27:30] [Wrapper.py/ERROR] plugin = self.plugins[pluginID]
[20:27:30] [Wrapper.py/ERROR] KeyError: 'GamemodeRegion-'
[20:27:30] [Wrapper.py/ERROR]

Bad file descriptor

I dont know what this is about. It does not seem to cause me any problems:

When the player exits:

C:\Users\JRUSSELL\Desktop\vanilla>python Wrapper
[16:05:13] [Wrapper.py/INFO] Wrapper.py started - Version 0.7.5 (development bui
ld #70)
[16:05:13] [Wrapper.py/INFO] Loading plugins...
[16:05:13] [Wrapper.py/INFO] Loading plugin simple.py...
[16:05:13] [Wrapper.py/DEBUG] [Simple Plugin] Registered command 'spawn'
[16:05:13] [Wrapper.py/DEBUG] [Simple Plugin] Registered command 'sethome'
[16:05:13] [Wrapper.py/DEBUG] [Simple Plugin] Registered command 'home'
[16:05:13] [Wrapper.py/DEBUG] [Simple Plugin] Registered command 'simple'
[16:05:13] [Wrapper.py/DEBUG] [Simple Plugin] Registered command 'ophelp'
[16:05:13] [Wrapper.py/INFO] Starting server...
[16:05:18] [Server thread/INFO]: Starting minecraft server version 1.8.1
[16:05:18] [Server thread/INFO]: Loading properties
[16:05:18] [Server thread/INFO]: Default game type: ADVENTURE
[16:05:18] [Server thread/INFO]: Generating keypair
[16:05:18] [Server thread/INFO]: Starting Minecraft server on 127.0.0.1:25565
[16:05:18] [Server thread/INFO]: Using default channel type
[16:05:18] [Server thread/WARN]: **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE
!
[16:05:18] [Server thread/WARN]: The server will make no attempt to authenticate
usernames. Beware.
[16:05:18] [Server thread/WARN]: While this makes the game possible to play with
out internet access, it also opens up the ability for hackers to connect with an
y username they choose.
[16:05:18] [Server thread/WARN]: To change this, set "online-mode" to "true" in
the server.properties file.
[16:05:18] [Server thread/INFO]: Preparing level "AllTheWorld"
[16:05:18] [Server thread/INFO]: Preparing start region for level 0
[16:05:19] [Server thread/INFO]: Done (1.060s)! For help, type "help" or "?"
[16:05:19] [Wrapper.py/INFO] Server started
[16:06:18] [Wrapper.py/INFO] SurestTexas00 logged in (UUID: 4f953255-6775-4dc6-a
612-fb4230588eff | IP: 184.18.6.142)
[16:06:18] [Server thread/INFO]: SurestTexas00[/127.0.0.1:56424] logged in with
entity id 122 at (233.3528345205924, 64.0, -58.97286743864844)
[16:06:18] [Server thread/INFO]: SurestTexas00 joined the game
[16:07:07] [Wrapper.py/INFO] SurestTexas00 executed: /sethome
[16:08:26] [Wrapper.py/INFO] SurestTexas00 executed: /spawn
[16:08:26] [Server thread/INFO]: Teleported SurestTexas00 to 228.5, 65.0, -59.5
[16:08:44] [Wrapper.py/INFO] SurestTexas00 executed: /simple help
Last packet IDs (Server->Client) before disconnection:
[('0x15', 7), ('0x12', 9), ('0x16', 6), ('0x19', 4), ('0x1a', 6), ('0x17', 9), (
'0x19', 4), ('0x17', 9), ('0x19', 4), ('0x0', 6)]
Failed to grab packet (SERVER)
Traceback (most recent call last):
File "Wrapper\proxy.py", line 757, in handle
id, original = self.packet.grabPacket()
File "Wrapper\proxy.py", line 817, in grabPacket
dataLength = self.unpack_varInt()
File "Wrapper\proxy.py", line 841, in unpack_varInt
val = struct.unpack('B', self.recv(1))[0]
File "Wrapper\proxy.py", line 999, in recv
d = self.socket.recv(length)
File "C:\Python27\lib\socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

Last packet IDs (Server->Client) before disconnection:
[('0x15', 7), ('0x12', 9), ('0x16', 6), ('0x19', 4), ('0x1a', 6), ('0x17', 9), (
'0x19', 4), ('0x17', 9), ('0x19', 4), ('0x0', 6)]
[16:09:04] [Server thread/INFO]: SurestTexas00 lost connection: TranslatableComp
onent{key='disconnect.genericReason', args=[Internal Exception: java.io.IOExcept
ion: An existing connection was forcibly closed by the remote host], siblings=[]
, style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=nu
ll, obfuscated=null, clickEvent=null, hoverEvent=null, insertion=null}}
[16:09:04] [Server thread/INFO]: SurestTexas00 left the game

self.<data>.Save() problem

More information on the save issue:
After using /sethome, I can TP to that home using /home. However, the data does not save to the disk. The end result is that homes.json is completely blank.. not even the initial {} that is started out with before executing sethome.

WRAPPER
[2015-01-08 12:49:37] [Wrapper.py/INFO] Plugins reloaded
[2015-01-08 12:50:24] [Wrapper.py/INFO] SurestTexas00 executed: /sethome
[2015-01-08 12:50:24] [Simple Plugin/DEBUG] sethome used '4f953255-6775-4dc6-a612-fb4230588eff' as the UUID for that command
[2015-01-08 12:50:24] [Simple Plugin/DEBUG] sethome set a home for '4f953255-6775-4dc6-a612-fb4230588eff' AKA 'SurestTexas00' at '(233.3528345205924, 64.0, -58.97286743864844)'

SERVER
[12:49:37] [Wrapper.py/INFO] Plugins reloaded
[12:50:24] [Wrapper.py/INFO] SurestTexas00 executed: /sethome
Exception in thread Thread-17:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 810, in *bootstrap_inner
self.run()
File "C:\Python27\lib\threading.py", line 763, in run
self.__target(_self.__args, _self.__kwargs)
File "Wrapper\storage.py", line 39, in periodicSave
self.save()
File "Wrapper\storage.py", line 56, in save
f.write(json.dumps(self.data))
File "C:\Python27\lib\json__init
.py", line 243, in dumps
return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 270, in iterencode
return _iterencode(o, 0)
TypeError: keys must be a string

Plugin code snippets:


def onEnable(self):
    # DATA
    self.homes = self.api.getStorage("homes", True)
    self.opmail = self.api.getStorage("opmail", True)

    # DEFAULTS
    if "homes" not in self.homes: 
        self.homes["homes"] = {}
    if "opmailbox" not in self.opmail: 
        self.opmail["opmailbox"] = {}

def onDisable(self):
    self.homes.save()
    self.opmail.save()

def _sethome(self, player, args):
    name = player.uuid
    humanname = player.username
    self.log.debug("sethome used '%s' as the UUID for that command" % name)
    if len(args) == 0:
        player.message({"text": "Home set!", "color": "gold"})
        self.homes["homes"][name] = player.getPosition()
        self.log.debug("sethome set a home for '%s' AKA '%s' at '%s'" % (name, humanname, (self.homes["homes"][name])))
    else:
        player.message({"text": "sethome does not take any arguments!", "color": "red"})

it seems it does this when it cnanot connect

[19:17:32] [Wrapper.py/ERROR] Socket error while sending -- disconnected
[19:17:32] [Wrapper.py/ERROR] Wrapper.py crashed - stopping sever to be safe
[19:17:32] [Wrapper.py/ERROR] Traceback (most recent call last):
[19:17:32] [Wrapper.py/ERROR] File "Wrapper.py", line 672, in
[19:17:32] [Wrapper.py/ERROR] server.startServer()
[19:17:32] [Wrapper.py/ERROR] File "Wrapper.py", line 533, in startServer
[19:17:32] [Wrapper.py/ERROR] self.handle()
[19:17:32] [Wrapper.py/ERROR] File "Wrapper.py", line 384, in handle
[19:17:32] [Wrapper.py/ERROR] self.parse()
[19:17:32] [Wrapper.py/ERROR] File "Wrapper.py", line 240, in parse
[19:17:32] [Wrapper.py/ERROR] self.send('PRIVMSG %s :%s' % (channel, message))
[19:17:32] [Wrapper.py/ERROR] File "Wrapper.py", line 212, in send
[19:17:32] [Wrapper.py/ERROR] self.sock.send('%s\n' % string)
[19:17:32] [Wrapper.py/ERROR] AttributeError: 'bool' object has no attribute 'send'
[19:17:32] [Wrapper.py/ERROR

/help

Is there a way to intercept the Minecraft command help (I assume register indentical self.api.registerCommand("help", self._myroutine) )...
but then do somthing like:

def _help(self, player, args):
    player.message("\simple help - get help with simple plugin (home/spawn/etc)")
    self.minecraft.#make minecraft print rest of default help#

or

def _help(self, player, args):
    #code to decide if they already passed an argmument like "simple" or "mc"
    #IF they did mc, then print out the default MC help function
    #If they did simple, then print my menu

    #make the menu display this if there were no args (val==0)
    player.message("\help simple - get help with simple plugin (home/spawn/etc)")
    player.message("\help mc - get help with minecraft commands (tell/me/etc)")
    self.minecraft.#make minecraft print rest of default help#

python ? - "__init__"

What does def init(self, api, log) do? What has to be in this definition? specifically, in the plugin code..

Like the essentials example, the init is:
def init(self, api, log):
self.api = api
self.minecraft = api.minecraft
self.log = log
self.powertool = []

yet the code also uses the player... if they dont need a self.player= api.player, why is the self.minecraft = api.minecraft there?

problem with self.data.save()

I narrowed this error to being caused by the plugin statement self.data.save()

C:\Users\JRUSSELL\Desktop\vanilla>python Wrapper.py
[18:41:21] [Wrapper.py/INFO] Wrapper.py started - Version 0.7.4 (development bui
ld #61)
[18:41:21] [Wrapper.py/INFO] Loading plugins...
[18:41:21] [Wrapper.py/INFO] Loading plugin Essentials.py...
[18:41:21] [Wrapper.py/DEBUG] [Essentials] Registered all of its commands.................
[18:41:21] [Wrapper.py/DEBUG] [Essentials] Registered all its events
[18:41:21] [Wrapper.py/INFO] Starting server...
[18:41:25] [Server thread/INFO]: Starting minecraft server version 1.8.1
....
[18:41:27] [Server thread/INFO]: Preparing spawn area: 95%
[18:41:27] [Server thread/INFO]: Done (1.144s)! For help, type "help" or "?"
[18:41:27] [Wrapper.py/INFO] Server started
[18:41:55] [Wrapper.py/INFO] SurestTexas00 logged in ...
[18:41:55] [Server thread/INFO]: SurestTexas00[/127.0.0.1:52940] logged in with
entity id 69 at (-4.190475225733941, 64.0, 59.36807096897444)
{'player': <api.player.Player instance at 0x02953DF0>}
[18:41:55] [Server thread/INFO]: SurestTexas00 joined the game
Last packet IDs (Server->Client) before disconnection:
[('0x19', 4), ('0x15', 7), ('0x1c', 7), ('0x19', 4), ('0x17', 9), ('0x19', 4), (
'0x17', 9), ('0x19', 4), ('0x17', 9), ('0x19', 4)]
Failed to grab packet (SERVER)
Traceback (most recent call last):
File "Wrapper.py\proxy.py", line 757, in handle
id, original = self.packet.grabPacket()
File "Wrapper.py\proxy.py", line 817, in grabPacket
dataLength = self.unpack_varInt()
File "Wrapper.py\proxy.py", line 841, in unpack_varInt
val = struct.unpack('B', self.recv(1))[0]
File "Wrapper.py\proxy.py", line 987, in recv
d = self.socket.recv(length)
File "C:\Python27\lib\socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

Last packet IDs (Server->Client) before disconnection:
[('0x19', 4), ('0x15', 7), ('0x1c', 7), ('0x19', 4), ('0x17', 9), ('0x19', 4), (
'0x17', 9), ('0x19', 4), ('0x17', 9), ('0x19', 4)]
[18:42:09] [Server thread/INFO]: SurestTexas00 lost connection: TranslatableComp
onent{key='disconnect.genericReason', args=[Internal Exception: java.io.IOExcept
ion: An existing connection was forcibly closed by the remote host], siblings=[]
, style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=nu
ll, obfuscated=null, clickEvent=null, hoverEvent=null, insertion=null}}
[18:42:09] [Server thread/INFO]: SurestTexas00 left the game

Some Linux based dependencies - Tar, MKdir, etc

My second issue (again probably stemming from Windows usage) is that the world saving function appears to not be working because it is attempting (from what I see at the console) to "tar" the files (it says " "tar" not recognized as {operable command} ..."). The backup folder only contains a text file containing the names of the backups.

The basic "system" works for windows (I downloaded this because it was windows capat., per "http://minecraft.gamepedia.com/Programs_and_editors/Server_wrappers"

it appears (I am not a programmer however) according to the code that it is running Linux shell commands (Tar and MkDir) versus the Windows versions (copy/xcopy, MD). Is there a way to make the code check for the OS and use the appropriate shell commands (also, the options would be different for Tar versus Copy)?

I can't see the other players

I was testing the development version and I found a bug.
When the proxy mode is active, the player list is empty and I can not see the other players.

Do not have module "resource" that is needed after build 61

The last working build was 61. This error continues to plague me:
I have tracked this down as starting with build 62...What was done in that build that would cause this?
(started from windows batch file):

C:\Users\JRUSSELL\Desktop\vanilla>python Wrapper.py
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in run_module_as_main
"main", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in run_code
exec code in run_globals
File "Wrapper.py__main
.py", line 7, in
File "Wrapper.py\server.py", line 1, in
ImportError: No module named resource

C:\Users\JRUSSELL\Desktop\vanilla>pause
Press any key to continue . . .

Exception when clients log off a server (in proxy mode).

As in the title, a client clicks "Disconnect" and this occurs...

Commit: 5abdf20

[15:59:01] [Server thread/INFO]: Melair left the game
error client->server, blah
Traceback (most recent call last):
File "Wrapper.py/proxy.py", line 422, in handle
self.close()
File "Wrapper.py/proxy.py", line 187, in close
self.server.close()
File "Wrapper.py/proxy.py", line 476, in close
if Config.debug:
NameError: global name 'Config' is not defined

error server->client, blah

self.proxy.getClientByServerUUID(data["uuid"]).uuid,

Is something that needs attention?

[2015-01-11 13:41:45] [Wrapper.py/DEBUG] Could not parse packet, connection may crumble:
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] Traceback (most recent call last):
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] File "Wrapper\proxy.py", line 777, in handle
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] if self.parse(id, original) and self.safe:
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] File "Wrapper\proxy.py", line 629, in parse
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] self.proxy.getClientByServerUUID(data["uuid"]).uuid,
[2015-01-11 13:41:45] [Wrapper.py/DEBUG] AttributeError: 'UUID' object has no attribute 'uuid'
[2015-01-11 13:41:45] [Wrapper.py/DEBUG]

scripts.py and permissions.py missing from src/ in repo

I've come to try to finally submit some pull requests to you, while trying to generate a new Wrapper.py file I discovered that the src directory in the repo doesn't seem to include scripts.py or permissions.py.

Additionally Wrapper.py includes a lot of junk, including py~ files which I assume are backups created by your editor. Not sure how you are actually meant to generate Wrapper.py, but for my testing it was simply "zip Wrapper.py *.py".

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.