Skip to content
This repository was archived by the owner on Feb 19, 2021. It is now read-only.

Commit d6d0f10

Browse files
committed
MCPI-Central integration.
1 parent badbfb8 commit d6d0f10

File tree

6 files changed

+147
-63
lines changed

6 files changed

+147
-63
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pack:
2727
chmod a+x ./deb/usr/bin/mcpil
2828
chmod a+x ./deb/usr/bin/mcpim
2929
@echo "Package: mcpil" > ./deb/DEBIAN/control
30-
@echo "Version: 0.5.0" >> ./deb/DEBIAN/control
30+
@echo "Version: 0.6.0" >> ./deb/DEBIAN/control
3131
@echo "Priority: optional" >> ./deb/DEBIAN/control
3232
@echo "Architecture: armhf" >> ./deb/DEBIAN/control
3333
@echo "Depends: libmcpi, mcpi-proxy, mcpi-central, libmodpi, python3" >> ./deb/DEBIAN/control
@@ -36,7 +36,7 @@ pack:
3636
@echo "Vcs-Browser: https://github.com/MCPI-Devs/proxy" >> ./deb/DEBIAN/control
3737
@echo "Vcs-Git: https://github.com/MCPI-Devs/proxy.git" >> ./deb/DEBIAN/control
3838
@echo "Description: Minecraft Pi Proxy to allow players to connect to remote servers.\n" >> ./deb/DEBIAN/control
39-
dpkg-deb -b ./deb/ ./mcpil_0.5.0-1.deb
39+
dpkg-deb -b ./deb/ ./mcpil_0.6.0-1.deb
4040

4141

4242
clean:

res/DEBIAN/postinst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/bin/bash
22

33
bspatch /opt/minecraft-pi/minecraft-pi /opt/minecraft-pi/minecraft-pe /opt/minecraft-pi/pi2pe.bsdiff
4+
chmod a+x /opt/minecraft-pi/minecraft-pe
5+
chmod a+rw /opt/minecraft-pi/data/images
46
rm -f /opt/minecraft-pi/pi2pe.bsdiff

screenshot.png

360 Bytes
Loading

src/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
all:
3+
cython mcpil.pyx --embed
4+
gcc -pthread -g -fwrapv -fPIC -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -I/usr/include/python3.7m mcpil.c -o mcpil.elf
5+
chmod a+x mcpil.elf

src/mcpil.py

Lines changed: 112 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,36 @@
2929
import time
3030
import glob
3131
import json
32-
from os import walk, remove, path, chdir, kill, rename, uname, geteuid, getenv
32+
import threading
33+
from os import *
3334
from tkinter import *
3435
from tkinter import ttk
3536
from tkinter import simpledialog
3637
from tkinter.filedialog import askopenfilename
3738
from shutil import copy2
39+
from mcpicentral import *
40+
from mcpip import *
41+
from mcpim import *
3842

3943
descriptions = ["Miecraft Pi Edition. v0.1.1. Default game mode: Creative.", "Minecraft Pocket Edition. v0.6.1. Default game mode: Survival."];
4044
binaries = ["/usr/bin/minecraft-pi.sh", "/usr/bin/minecraft-pe.sh"];
4145
home = getenv("HOME");
46+
api_client = APIClient(None);
47+
proxy = Proxy();
48+
mod_names = [];
4249

4350
def on_select_versions(event):
4451
global current_selection;
4552
try:
46-
description_text["text"] = descriptions[int(event.widget.curselection()[0])];
4753
current_selection = int(event.widget.curselection()[0]);
54+
description_text["text"] = descriptions[current_selection];
4855
except IndexError:
4956
pass;
5057
return 0;
5158

5259
def launch():
53-
global mcpi_pid;
5460
mcpi_process = subprocess.Popen([binaries[current_selection]]);
5561
time.sleep(2);
56-
mcpi_pid = mcpi_process.pid + 2;
5762
start_mods();
5863
return 0;
5964

@@ -95,27 +100,61 @@ def delete_mod():
95100
return 0;
96101

97102
def update_mods():
103+
global mod_names;
98104
mod_files = [];
99105
i = 0;
106+
basename = path.basename;
100107

101108
mod_files = glob.glob(f"{home}/.mcpil/mods/*.mcpi");
102109
mods.delete(0, END);
103110

104-
while i < len(mod_files):
105-
mods.insert(i, path.basename(mod_files[i].replace(".mcpi", "")));
111+
for mod in mod_files:
112+
mod_path = basename(mod.replace(".mcpi", ""));
113+
mods.insert(i, mod_path);
114+
mod_names.append(mod_path);
106115
i += 1;
107116
return 0;
108117

109-
def start_mods():
110-
global mods_process;
111-
mods_process = subprocess.Popen(["mcpim"]);
118+
def update_servers():
119+
i = 0;
120+
121+
for server in api_client.servers:
122+
servers.insert(i, server);
123+
i += 1;
112124
return 0;
113125

114-
def kill_mods():
126+
def on_select_servers(event):
115127
try:
128+
if servers.get(int(event.widget.curselection()[0])) is not None:
129+
enable_server_button["state"] = NORMAL;
130+
else:
131+
enable_serverbutton["state"] = DISABLED;
132+
except IndexError:
133+
pass;
134+
return 0;
135+
136+
def enable_central_server():
137+
server_name = api_client.servers[int(servers.curselection()[0])];
138+
server = api_client.get_server(server_name);
139+
proxy.stop();
140+
proxy.set_option("src_addr", server["ip"]);
141+
proxy.set_option("src_port", int(server["port"]));
142+
proxy_thread = threading.Thread(target=proxy.run);
143+
proxy_thread.start();
144+
145+
#def start_mods():
146+
# global mods_process;
147+
# mods_process = subprocess.Popen(["mcpim"]).pid;
148+
# return 0;
149+
150+
def bye():
151+
proxy.stop();
152+
window.destroy();
153+
"""try:
116154
kill(mods_process.pid, signal.SIGTERM);
117155
except NameError:
118-
pass;
156+
pass;"""
157+
kill(getpid(), signal.SIGTERM);
119158
return 0;
120159

121160
def web_open(event):
@@ -126,7 +165,7 @@ def save_world():
126165
old_world_name = old_worldname_entry.get();
127166
new_world_name = new_worldname_entry.get();
128167
world_file = open(f"{home}/.minecraft/games/com.mojang/minecraftWorlds/{old_world_name}/level.dat", "rb+");
129-
new_world = world_file.read().replace(bytes([len(old_world_name)]) + bytes([0]) + bytes(old_world_name.encode()), bytes([len(new_world_name)]) + bytes([0]) + bytes(new_world_name.encode()));
168+
new_world = world_file.read().replace(bytes([len(old_world_name), 0x00]).join(bytes(old_world_name.encode())), bytes([len(old_world_name), 0x00]).join(bytes(old_world_name.encode())));
130169
world_file.seek(0);
131170
world_file.write(new_world);
132171
world_file.seek(0x16);
@@ -141,17 +180,35 @@ def set_default_worldname(event):
141180
return True;
142181

143182
def add_server():
144-
global proxy_process;
145183
server_addr = server_addr_entry.get();
146184
server_port = server_port_entry.get();
147-
proxy_process = subprocess.Popen(["mcpip", server_addr, server_port]);
185+
proxy.stop();
186+
proxy.set_option("src_addr", server_addr);
187+
proxy.set_option("src_port", int(server_port));
188+
proxy_thread = threading.Thread(target=proxy.run);
189+
proxy_thread.start();
148190
return 0;
149191

150-
def kill_proxy():
192+
def init():
193+
global launch_thread;
151194
try:
152-
kill(proxy_process.pid, signal.SIGTERM);
153-
except NameError:
195+
mkdir(f"{home}/.mcpil/");
196+
except FileExistsError:
197+
pass;
198+
199+
try:
200+
mkdir(f"{home}/.mcpil/mods");
201+
except FileExistsError:
202+
pass;
203+
204+
launch_thread = threading.Thread(target=launch);
205+
206+
try:
207+
api_client.servers = api_client.get_servers()["servers"];
208+
except:
209+
api_client.servers = [];
154210
pass;
211+
update_servers();
155212
return 0;
156213

157214
def play_tab(parent):
@@ -179,7 +236,7 @@ def play_tab(parent):
179236
versions_frame.pack(fill=BOTH, expand=True);
180237

181238
launch_frame = Frame(tab);
182-
launch_button = Button(launch_frame, text="Launch!", command=launch);
239+
launch_button = Button(launch_frame, text="Launch!", command=launch_thread.start);
183240
launch_button.pack(side=RIGHT, anchor=S);
184241
launch_frame.pack(fill=BOTH, expand=True);
185242
return tab;
@@ -306,14 +363,39 @@ def servers_tab(parent):
306363
buttons_frame.pack(fill=BOTH, expand=True);
307364
return tab;
308365

366+
def central_tab(parent):
367+
global servers;
368+
global enable_server_button;
369+
tab = Frame(parent);
370+
371+
title = Label(tab, text="MCPI Central");
372+
title.config(font=("", 24));
373+
title.pack();
374+
375+
public = Label(tab, text="Public servers");
376+
public.config(font=("", 10));
377+
public.pack();
378+
379+
servers_frame = Frame(tab);
380+
servers = Listbox(servers_frame, selectmode=SINGLE, width=22);
381+
servers.bind('<<ListboxSelect>>', on_select_servers);
382+
servers.pack(pady=16);
383+
servers_frame.pack();
384+
385+
buttons_frame = Frame(tab);
386+
enable_server_button = Button(buttons_frame, text="Enable server", command=enable_central_server, state=DISABLED);
387+
enable_server_button.pack(side=RIGHT, anchor=S);
388+
buttons_frame.pack(fill=BOTH, expand=True);
389+
return tab;
390+
309391
def about_tab(parent):
310392
tab = Frame(parent);
311393

312394
title = Label(tab, text="Minecraft Pi Launcher");
313395
title.config(font=("", 24));
314396
title.pack();
315397

316-
version = Label(tab, text="v0.5.0");
398+
version = Label(tab, text="v0.6.0");
317399
version.config(font=("", 10));
318400
version.pack();
319401

@@ -329,49 +411,40 @@ def about_tab(parent):
329411

330412
def main(args):
331413
if "arm" not in uname()[4] and "aarch" not in uname()[4]:
332-
sys.stdout.write("Error: Minecraft Pi Launcher must run on a Raspberry Pi.\n");
414+
sys.stderr.write("Error: Minecraft Pi Launcher must run on a Raspberry Pi.\n");
333415
return -1;
334416

335417
global mods_process;
336-
337-
if __debug__ == True:
338-
print("Debug!");
339-
340-
if not path.isdir(f"{home}/.mcpil/"):
341-
os.mkdir(f"{home}/.mcpil/");
342-
os.mkdir(f"{home}/.mcpil/mods/");
343-
344-
if not path.isdir(f"{home}/.mcpil/mods/"):
345-
os.mkdir(f"{home}/.mcpil/mods/");
346-
347-
if not path.exists(f"{home}/.mcpil/username.txt"):
348-
config_file = open(f"{home}/.mcpil/username.txt", "w");
349-
config_file.seek(0);
350-
config_file.write("StevePi");
351-
config_file.close();
418+
global window;
352419

353420
window = Tk();
354421
window.title("MCPI Laucher");
355422
window.geometry("480x348");
356423
window.resizable(False, False);
357424
window.iconphoto(True, PhotoImage(file="/usr/share/icons/hicolor/48x48/apps/mcpil.png"));
358425

426+
init_thread = threading.Thread(target=init);
427+
init_thread.start();
428+
359429
tabs = ttk.Notebook(window);
360430
tabs.add(play_tab(tabs), text="Play");
361431
tabs.add(settings_tab(tabs), text="Settings");
362432
tabs.add(mods_tab(tabs), text="Mods");
363433
tabs.add(worlds_tab(tabs), text="Worlds");
364434
tabs.add(servers_tab(tabs), text="Servers");
435+
tabs.add(central_tab(tabs), text="Central");
365436
tabs.add(about_tab(tabs), text="About");
366437
tabs.pack(fill=BOTH, expand=True);
367438

368439
if len(args) > 1:
369440
install_mod(args[1]);
370441

371-
atexit.register(kill_mods);
372-
atexit.register(kill_proxy);
442+
window.wm_protocol("WM_DELETE_WINDOW", bye);
373443

374-
window.mainloop();
444+
try:
445+
window.mainloop();
446+
except KeyboardInterrupt:
447+
bye();
375448
return 0;
376449

377450
if __name__ == "__main__":

src/mcpim.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def compile_mods(file_name):
5050
mod_file.close();
5151
return 0;
5252

53-
def main(args):
53+
def start_mods(args=[]):
5454
if len(args) > 1:
5555
compile_mods(args[1]);
5656
return 0;
@@ -61,27 +61,31 @@ def main(args):
6161
i = 0;
6262
j = None;
6363

64-
while j is None:
65-
try:
66-
minecraft.Minecraft.create();
67-
mod_files = glob.glob(f"{home}/.mcpil/mods/*.mcpi");
68-
while i < len(mod_files):
69-
mod_file = open(mod_files[i], "rb");
70-
mod_code = zlib.decompress(mod_file.read()).decode("utf-8");
71-
mod_file.close();
72-
mod_name = f"""{home}/.mcpil/mods/.{path.basename(mod_files[i]).replace(".mcpi", ".py")}""";
73-
mod_file = open(mod_name, "w");
74-
mod_file.write(mod_code);
75-
mod_file.close();
76-
subprocess.Popen(["python3", mod_name]);
77-
time.sleep(5);
78-
remove(mod_name);
79-
i += 1;
80-
atexit.register(kill_mods);
81-
j = 1;
82-
except ConnectionRefusedError:
83-
pass;
64+
try:
65+
while j is None:
66+
try:
67+
minecraft.Minecraft.create();
68+
mod_files = glob.glob(f"{home}/.mcpil/mods/*.mcpi");
69+
while i < len(mod_files):
70+
mod_file = open(mod_files[i], "rb");
71+
mod_code = zlib.decompress(mod_file.read()).decode("utf-8");
72+
mod_file.close();
73+
mod_name = f"""{home}/.mcpil/mods/.{path.basename(mod_files[i]).replace(".mcpi", ".py")}""";
74+
mod_file = open(mod_name, "w");
75+
mod_file.write(mod_code);
76+
mod_file.close();
77+
subprocess.Popen(["python3", mod_name]);
78+
time.sleep(5);
79+
remove(mod_name);
80+
i += 1;
81+
atexit.register(kill_mods);
82+
j = 1;
83+
except ConnectionRefusedError:
84+
pass;
85+
except KeyboardInterrupt:
86+
kill_mods();
87+
pass;
8488
return 0;
8589

8690
if __name__ == "__main__":
87-
sys.exit(main(sys.argv));
91+
sys.exit(start_mods(sys.argv));

0 commit comments

Comments
 (0)