Skip to content

Commit 86c1006

Browse files
author
minecraft server
committed
Wools
1 parent ef8e33b commit 86c1006

File tree

4 files changed

+100
-51
lines changed

4 files changed

+100
-51
lines changed

packet_decoder.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
PROTOCOL_VERSION = 28
1111

1212
class Packet:
13-
def __init__(self):
13+
def __init__(self, packet_type=0, **data):
1414
self.direction = 0
15-
self.ident = 0
16-
self.data = {}
15+
if type(packet_type) == str:
16+
packet_type = dict((v,k) for k,v in names.items())[packet_type] # Reverse lookup
17+
self.ident = packet_type
18+
self.data = data
1719

1820
def name(self):
1921
return names[self.ident]

plugins.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import acls, dotstrip
88
import player_cmd as cmd
99
import menu_test, testing
10-
import zone_create_menu, zone_cmds, acl_cmds, zone_confirm
10+
import zone_create_menu, zone_cmds, acl_cmds, zone_confirm, long_operations
1111

1212
# Set ordering here
1313

@@ -20,7 +20,8 @@
2020
# utility
2121
plugins.append(usernames) # The earlier the better, name the login packets sooner.
2222
plugins.append(schedule) # Should probably be before anything that depends on it
23-
plugins.append(persistent_store) # MUST be before anything that uses it
23+
plugins.append(persistent_store) # MUST be before anything that uses it in on_start
24+
plugins.append(long_operations)
2425
plugins.append(plugin_helpers) # Lots of things depend on this. Do it early.
2526
plugins.append(zones) # The earlier, the more up to date positions are
2627
plugins.append(cmd) # Should probably be before anything that depends on it

plugins/testing.py

+11-42
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,20 @@
22
""" Only ever used for temp testing of features. """
33

44
import player_cmd as cmd
5-
from zones import new_zone_hooks, new_zone, get_zones
65
from plugin_helpers import tell
6+
from long_operations import long_operation
7+
import time
78

89
def on_start():
9-
cmd.register('/testzone new ([^ ]+)', on_cmd)
10-
cmd.register('/testzone view', on_cmd2)
11-
re_name = r'(?:[^"][^ ]+|"(?:[^"]|\\")+")'
12-
cmd.register(r'/testacl (%s) ((?:add)|(?:rm)) ([^ ]+) ([^ ]+)' % re_name, on_cmd3)
10+
cmd.register('/test', on_cmd)
1311

14-
def on_cmd(message, user, name):
15-
offset = user.position
16-
offset = [axis+5 for axis in offset]
17-
if new_zone(name, ('cube', user.dimension, user.position, offset), user.username):
18-
tell(user, "Success")
19-
else:
20-
tell(user, "Failure")
12+
def on_cmd(message, user):
13+
tell(user, test(user))
2114

22-
def on_cmd2(message, user):
23-
flag = False
24-
for zone in user.zones:
25-
flag = True
26-
tell(user, "In zone: %s%s" % (zone['name'], zone['acls']))
27-
if not flag:
28-
tell(user, "In no zones.")
2915

30-
31-
def on_cmd3(message, user, zone, add_or_rm, username, rule):
32-
zone = zone.strip('"')
33-
try:
34-
acls = get_zones()[zone]['acls']
35-
except KeyError:
36-
tell(user, "No such zone")
37-
return
38-
user_acls = acls.setdefault(username, acls['EVERYONE'])
39-
if add_or_rm == 'add':
40-
if rule not in user_acls:
41-
user_acls.append(rule)
42-
elif add_or_rm == 'rm':
43-
try:
44-
user_acls.remove(rule)
45-
except ValueError:
46-
tell(user, "Rule not in list")
47-
return
48-
else:
49-
assert False
50-
51-
tell(user, 'Success')
52-
return
16+
@long_operation
17+
def test(user):
18+
yield "Hello"
19+
while 1:
20+
tell(user, time.time())
21+
yield

plugins/zone_confirm.py

+81-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
"""
1111

1212
import zones
13+
from zones import get_zones
1314
from player_cmd import register
14-
from helpers import ops
15+
from helpers import ops, send_packet
1516
from plugin_helpers import tell, ops_only
17+
from packet_decoder import Packet
18+
from long_operations import long_operation
1619

1720
def set_confirm(zone):
1821
zone['confirmed'] = False
@@ -21,6 +24,8 @@ def on_start():
2124
zones.new_zone_hooks.append(set_confirm)
2225
register("/zone op help", ophelp)
2326
register("/zone op wool (.*)", zonewool)
27+
register("/zone op wool-all (.*)", zonewoolall)
28+
register("/wool", morewool)
2429
register("/zone op confirm (.*)", zoneconfirm)
2530
register('/zone op modify "([^"]+)" ([^ ]+) (.*)', zonemodify)
2631

@@ -31,9 +36,11 @@ def ophelp(message, user):
3136
"/zone op help - Obvious.\n"
3237
"/zone op wool <zone> - 10x10x10 cube below player highlighted as follows:\n"
3338
"__ green: In given zone.\n"
34-
"__ red: In zone besides one given.\n"
35-
"__ yellow: In given zone AND at least one other.\n"
39+
"__ yellow: In zone besides one given.\n"
40+
"__ red: In given zone AND at least one other.\n"
3641
"__ You will need to log out/in to reverse changes.\n"
42+
"/wool - Shortcut to re-run last wool command.\n"
43+
"/zone op wool-all <zone> - Does wool for an entire zone.\n"
3744
"/zone op confirm <zone> - Confirm zone.\n"
3845
'/zone op modify "<zone>" <key> <value> - Advanced use. Quotes required.')
3946

@@ -47,9 +54,79 @@ def zoneconfirm(message, user, name):
4754
tell(user, "Success")
4855

4956

57+
WOOL_ID = 35 # Wool
58+
IN_ZONE = 5 # green
59+
OTHER_ZONE = 4 # yellow
60+
CONFLICT = 14 # red
61+
62+
def wool_point(zone, user, (x,y,z)):
63+
block_metadata = None
64+
zones_here = zones.get_zones_at_point(user.dimension, (x,y,z))
65+
if zones_here == [zone]:
66+
block_metadata = IN_ZONE
67+
elif zone in zones_here:
68+
block_metadata = CONFLICT
69+
elif zones_here:
70+
block_metadata = OTHER_ZONE
71+
if block_metadata is not None:
72+
packet = Packet('Block change', x=x, y=y, z=z, id=WOOL_ID, metadata=block_metadata)
73+
send_packet(packet, user, False)
74+
75+
5076
@ops_only
5177
def zonewool(message, user, name):
52-
pass # TODO
78+
user.morewool = name
79+
try:
80+
zone = zones.get_zones()[name]
81+
except KeyError:
82+
tell(user, "Bad zone name")
83+
return
84+
base = [int(axis) for axis in user.position]
85+
for x in range(base[0]-5, base[0]+5):
86+
for y in range(base[1]-10, base[1]):
87+
for z in range(base[2]-5, base[2]+5):
88+
wool_point(zone, user, (x,y,z))
89+
tell(user, "Complete.")
90+
91+
92+
@ops_only
93+
@long_operation
94+
def zonewoolall(message, user, name):
95+
yield
96+
EDGE = 4 # extra blocks beyond edges
97+
user.morewool = name
98+
try:
99+
zone = zones.get_zones()[name]
100+
except KeyError:
101+
tell(user, "Bad zone name")
102+
return
103+
if zone['bounds_info'][0] == 'cube':
104+
box = zone['bounds_info'][2:]
105+
box = zip(*box)
106+
box = [sorted(axis) for axis in box]
107+
elif zone['bounds_info'][0] == 'cylinder':
108+
(x, y, z), r, h = zone['bounds_info'][2:]
109+
box = ((x-r, x+r), (y, y+h), (z-r, z+r))
110+
else:
111+
tell(user, "Unsupported zone type: %s" % zone['bounds_info'][0])
112+
return
113+
box = [(int(a)-EDGE, int(b)+1+EDGE) for a,b in box]
114+
for y in range(*box[1]):
115+
for x in range(*box[0]):
116+
yield
117+
for z in range(*box[2]):
118+
wool_point(zone, user, (x,y,z))
119+
complete = float(y-box[1][0])/(box[1][1]-box[1][0])
120+
if complete < 1:
121+
tell(user, 'Wooling %s...%.2f%% complete' % (name, 100 * complete))
122+
tell(user, 'Complete.')
123+
124+
125+
def morewool(message, user):
126+
if hasattr(user, 'morewool'):
127+
return zonewool(message, user, user.morewool)
128+
else:
129+
return False
53130

54131

55132
@ops_only

0 commit comments

Comments
 (0)