public static function checkSelectors(array $args, CommandSender $sender, Player $player) { foreach ($args as $name => $value) { switch ($name) { case "x": case "y": case "z": if (isset($args["d" . $name])) { break; } $delta = 0; if ($value[0] === "~" and $sender instanceof Position) { $delta += $player->{$name}; } $actual = $sender->{$name}; if ((int) $delta !== (int) $actual) { return false; } break; case "r": if ($sender instanceof Position) { if ($sender->distance($player) > floatval($value)) { return false; } break; } return false; case "rm": if ($sender instanceof Position) { if ($sender->distance($player) < floatval($value)) { return false; } break; } return false; case "m": $mode = intval($value); if ($mode === -1) { break; // what is the point of adding this (in PC) when they can just safely leave this out? } if ($mode !== $player->getGamemode()) { return false; } break; case "name": if ($value !== $sender->getName()) { return false; } break; case "name!": if ($value === $sender->getName()) { return false; } break; // TODO argument "c" (count) // TODO argument "c" (count) case "rx": if ($player->yaw > floatval($value)) { return false; } break; case "rxm": if ($player->yaw < floatval($value)) { return false; } break; case "ry": if ($player->pitch > floatval($value)) { return false; } break; case "rym": if ($player->pitch < floatval($value)) { return false; } break; } } foreach (["x", "y", "z"] as $v) { if (isset($args["d" . $v])) { if (isset($args[$v])) { $from = (int) $args[$v]; } elseif ($sender instanceof Position) { // lower priority $from = $sender->{$v}; } else { continue; } $to = (int) $args["d" . $v]; $actual = $player->{$v}; if ($from <= $actual and $actual <= $to) { break; } return false; } } return true; }