10
10
"""
11
11
12
12
import zones
13
+ from zones import get_zones
13
14
from player_cmd import register
14
- from helpers import ops
15
+ from helpers import ops , send_packet
15
16
from plugin_helpers import tell , ops_only
17
+ from packet_decoder import Packet
18
+ from long_operations import long_operation
16
19
17
20
def set_confirm (zone ):
18
21
zone ['confirmed' ] = False
@@ -21,6 +24,8 @@ def on_start():
21
24
zones .new_zone_hooks .append (set_confirm )
22
25
register ("/zone op help" , ophelp )
23
26
register ("/zone op wool (.*)" , zonewool )
27
+ register ("/zone op wool-all (.*)" , zonewoolall )
28
+ register ("/wool" , morewool )
24
29
register ("/zone op confirm (.*)" , zoneconfirm )
25
30
register ('/zone op modify "([^"]+)" ([^ ]+) (.*)' , zonemodify )
26
31
@@ -31,9 +36,11 @@ def ophelp(message, user):
31
36
"/zone op help - Obvious.\n "
32
37
"/zone op wool <zone> - 10x10x10 cube below player highlighted as follows:\n "
33
38
"__ 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 "
36
41
"__ 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 "
37
44
"/zone op confirm <zone> - Confirm zone.\n "
38
45
'/zone op modify "<zone>" <key> <value> - Advanced use. Quotes required.' )
39
46
@@ -47,9 +54,79 @@ def zoneconfirm(message, user, name):
47
54
tell (user , "Success" )
48
55
49
56
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
+
50
76
@ops_only
51
77
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
53
130
54
131
55
132
@ops_only
0 commit comments