@@ -49,7 +49,9 @@ def resolve(self, scope):
4949 pass
5050
5151class Ref (Resolvable ):
52- pass
52+
53+ def selector (self , where ):
54+ return ETagSelector (where )
5355
5456class Var (Ref ):
5557 def __init__ (self , nameref , * args ):
@@ -66,6 +68,16 @@ def __init__(self, loc):
6668 def resolve (self , scope ):
6769 return scope .memory (self .loc )
6870
71+ class EntityLocal (Ref ):
72+ def __init__ (self , name ):
73+ self .name = name
74+
75+ def resolve (self , scope ):
76+ return scope .entity_local (self .name )
77+
78+ def selector (self , where ):
79+ return Selector ('s' , where )
80+
6981class SimpleResolve (Resolvable ):
7082
7183 def __init__ (self , * args ):
@@ -101,14 +113,29 @@ def str_pairs(items):
101113
102114class Selector (Resolvable ):
103115
104- def __init__ (self , where ):
116+ def __init__ (self , type , where ):
117+ self .type = type
105118 self .where = where
106119
120+ def resolve_params (self , scope ):
121+ if not self .where :
122+ return {}
123+ return self .where .resolve (scope )
124+
107125 def resolve (self , scope ):
108- where = {} if not self .where else self .where .resolve (scope )
109- return make_selector ('e' , tag = scope .entity_tag , limit = 1 , ** where )
126+ return make_selector (self .type , ** self .resolve_params (scope ))
127+
128+ class ETagSelector (Selector ):
129+
130+ def __init__ (self , where ):
131+ super ().__init__ ('e' , where )
110132
111- EntityTag = Selector (None )
133+ def resolve_params (self , scope ):
134+ where = super ().resolve_params (scope )
135+ where .update (tag = scope .entity_tag , limit = 1 )
136+ return where
137+
138+ EntityTag = ETagSelector (None )
112139
113140class Path (Resolvable ):
114141
@@ -161,6 +188,10 @@ def resolve(self, scope):
161188 return 'execute %s run %s' % (self .chain .resolve (scope ),
162189 self .command .resolve (scope ))
163190
191+ def ensure_selector (sel_arg ):
192+ return sel_arg .as_selector () if isinstance (sel_arg , SelectorArgs ) \
193+ else sel_arg
194+
164195class ExecuteChain :
165196
166197 def __init__ (self ):
@@ -188,7 +219,7 @@ def if_where(cond):
188219 return ExecuteChain ().cond ('if' ).where (cond )
189220
190221 def where (self , select_arg ):
191- return self .add ('as' , Selector (select_arg ))
222+ return self .add ('as' , ensure_selector (select_arg ))
192223
193224 def cond (self , cond_type ):
194225 return ExecuteChain .Cond (self , cond_type )
@@ -203,7 +234,7 @@ def __init__(self, parent, cond_type):
203234 self .cond_type = cond_type
204235
205236 def where (self , select_arg ):
206- return self .add ('entity' , Selector (select_arg ))
237+ return self .add ('entity' , ensure_selector (select_arg ))
207238
208239 def score (self , target , t_objective , operator , source , s_objective ):
209240 return self .add ('score' , target , t_objective , operator , source ,
@@ -225,18 +256,20 @@ def __init__(self, parent, store_type):
225256 self .store_type = store_type
226257
227258 def score (self , name , objective ):
228- return self .add ('score' , name , objective )
259+ return self .add ('score' , ensure_selector ( name ) , objective )
229260
230- def entity (self , data_type ):
231- return self .add ('entity' , EntityTag , Path (data_type ), data_type , 1 )
261+ def entity (self , target , data_type ):
262+ return self .add ('entity' , ensure_selector (target ), \
263+ Path (data_type ), data_type , 1 )
232264
233265class DataGet (Command ):
234266
235- def __init__ (self , path ):
267+ def __init__ (self , target , path ):
268+ self .target = target
236269 self .path = Path (path )
237270
238271 def resolve (self , scope ):
239- return 'data get entity %s %s' % (EntityTag .resolve (scope ),
272+ return 'data get entity %s %s' % (self . target .resolve (scope ),
240273 self .path .resolve (scope ))
241274
242275class Function (Command ):
@@ -290,7 +323,7 @@ def __init__(self, varref, value, where=None):
290323 assert self .allows_negative or value >= 0
291324 self .var = varref
292325 self .value = value
293- self .selector = Selector (where )
326+ self .selector = varref . selector (where )
294327
295328 def resolve (self , scope ):
296329 return 'scoreboard players %s %s %s %d' % (
@@ -331,13 +364,13 @@ def __init__(self, left, right, where=None):
331364 assert isinstance (right , Ref )
332365 self .left = left
333366 self .right = right
334- self .selector = Selector (where )
367+ self .left_sel = left .selector (where )
368+ self .right_sel = right .selector (where )
335369
336370 def resolve (self , scope ):
337- selector = self .selector .resolve (scope )
338371 return 'scoreboard players operation %s %s %s %s %s' % (
339- selector , self .left .resolve (scope ), self .op ,
340- selector , self .right .resolve (scope ))
372+ self . left_sel . resolve ( scope ) , self .left .resolve (scope ), self .op ,
373+ self . right_sel . resolve ( scope ) , self .right .resolve (scope ))
341374
342375
343376class OpAssign (Operation ): op = '='
@@ -351,7 +384,16 @@ class OpIfGt(Operation): op = '>'
351384class OpSwap (Operation ): op = '><'
352385
353386class SelectorArgs (Resolvable ):
354- pass
387+
388+ def as_selector (self ):
389+ return ETagSelector (self )
390+
391+ class SimpleSelectorArgs (SelectorArgs ):
392+ def __init__ (self , args ):
393+ self .args = args
394+
395+ def resolve (self , scope ):
396+ return dict (self .args )
355397
356398class SelRange (SelectorArgs ):
357399 def __init__ (self , varref , min = None , max = None ):
@@ -361,6 +403,9 @@ def __init__(self, varref, min=None, max=None):
361403 self .min = min
362404 self .max = max
363405
406+ def as_selector (self ):
407+ return self .var .selector (self )
408+
364409 def resolve (self , scope ):
365410 name = self .var .resolve (scope )
366411 range = ''
0 commit comments