1: <?php
2: namespace aliuly\common;
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24: use aliuly\common\mc;
25:
26: use aliuly\common\selectors\BaseSelector;
27: use aliuly\common\selectors\All;
28: use aliuly\common\selectors\AllEntity;
29: use aliuly\common\selectors\Random;
30:
31: use pocketmine\Player;
32: use pocketmine\Server;
33: use pocketmine\entity\Entity;
34: use pocketmine\command\CommandSender;
35:
36: 37: 38: 39: 40: 41:
42: abstract class CmdSelector {
43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
54: static public function expandSelectors(Server $server, CommandSender $sender, $cmdline, $max= 100) {
55: $tokens = preg_split('/\s+/',$cmdline);
56:
57: $res = [ $tokens ];
58: $ret = false;
59:
60: foreach ($tokens as $argc=>$argv){
61: if (!$argc) continue;
62: if (substr($argv,0,1) !== "@" ) continue;
63:
64: $selector = substr($argv, 1);
65: $sargs = [];
66: if(($i = strpos($selector, "[")) !== false){
67: foreach (explode(",",substr($selector,$i+1,-1)) as $kv) {
68: $kvp = explode("=",$kv,2);
69: if (count($kvp) != 2) {
70: $sender->sendMessage(mc::_("Selector: invalid argument %1%",$kv));
71: continue;
72: }
73: $sargs[$kvp[0]] = strtolower($kvp[1]);
74: }
75: $selector = substr($selector,0,$i);
76: }
77: $results = self::dispatchSelector($server, $sender , $selector, $sargs);
78: if (!is_array($results) || count($results) == 0) continue;
79: $ret = true;
80: $new = [];
81:
82: foreach ($res as $i) {
83: foreach ($results as $j) {
84: $tmpLine = $i;
85: $tmpLine[$argc] = $j;
86: $new[] = $tmpLine;
87: if (count($new) > $max) break;
88: }
89: if (count($new) > $max) break;
90: }
91: $res = $new;
92: }
93: if (!$ret) return false;
94: $new = [];
95: foreach ($res as $i) {
96: $new[] = implode(" ",$i);
97: }
98: return $new;
99: }
100:
101: static protected function dispatchSelector(Server $server, CommandSender $sender,$selector,array $args) {
102: switch ($selector) {
103: case "a":
104: return All::select($server, $sender , $args);
105: case "e":
106: return AllEntity::select($server, $sender, $args);
107: case "r":
108: return Random::select($server, $sender, $args);
109:
110: }
111: return null;
112: }
113: }
114: