EntitySelectorParser.java

net.minecraft.commands.arguments.selector.EntitySelectorParser

信息

  • 全限定名:net.minecraft.commands.arguments.selector.EntitySelectorParser
  • 类型:public class
  • 包:net.minecraft.commands.arguments.selector
  • 源码路径:src/main/java/net/minecraft/commands/arguments/selector/EntitySelectorParser.java
  • 起始行号:L34
  • 职责:

    TODO

字段/常量

  • SYNTAX_SELECTOR_START

    • 类型: char
    • 修饰符: public static final
    • 源码定位: L35
    • 说明:

      TODO

  • SYNTAX_OPTIONS_START

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L36
    • 说明:

      TODO

  • SYNTAX_OPTIONS_END

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L37
    • 说明:

      TODO

  • SYNTAX_OPTIONS_KEY_VALUE_SEPARATOR

    • 类型: char
    • 修饰符: public static final
    • 源码定位: L38
    • 说明:

      TODO

  • SYNTAX_OPTIONS_SEPARATOR

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L39
    • 说明:

      TODO

  • SYNTAX_NOT

    • 类型: char
    • 修饰符: public static final
    • 源码定位: L40
    • 说明:

      TODO

  • SYNTAX_TAG

    • 类型: char
    • 修饰符: public static final
    • 源码定位: L41
    • 说明:

      TODO

  • SELECTOR_NEAREST_PLAYER

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L42
    • 说明:

      TODO

  • SELECTOR_ALL_PLAYERS

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L43
    • 说明:

      TODO

  • SELECTOR_RANDOM_PLAYERS

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L44
    • 说明:

      TODO

  • SELECTOR_CURRENT_ENTITY

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L45
    • 说明:

      TODO

  • SELECTOR_ALL_ENTITIES

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L46
    • 说明:

      TODO

  • SELECTOR_NEAREST_ENTITY

    • 类型: char
    • 修饰符: private static final
    • 源码定位: L47
    • 说明:

      TODO

  • ERROR_INVALID_NAME_OR_UUID

    • 类型: SimpleCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L48
    • 说明:

      TODO

  • ERROR_UNKNOWN_SELECTOR_TYPE

    • 类型: DynamicCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L51
    • 说明:

      TODO

  • ERROR_SELECTORS_NOT_ALLOWED

    • 类型: SimpleCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L54
    • 说明:

      TODO

  • ERROR_MISSING_SELECTOR_TYPE

    • 类型: SimpleCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L57
    • 说明:

      TODO

  • ERROR_EXPECTED_END_OF_OPTIONS

    • 类型: SimpleCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L60
    • 说明:

      TODO

  • ERROR_EXPECTED_OPTION_VALUE

    • 类型: DynamicCommandExceptionType
    • 修饰符: public static final
    • 源码定位: L63
    • 说明:

      TODO

  • ORDER_NEAREST

    • 类型: BiConsumer<Vec3,List<?extends Entity>>
    • 修饰符: public static final
    • 源码定位: L66
    • 说明:

      TODO

  • ORDER_FURTHEST

    • 类型: BiConsumer<Vec3,List<?extends Entity>>
    • 修饰符: public static final
    • 源码定位: L69
    • 说明:

      TODO

  • ORDER_RANDOM

    • 类型: BiConsumer<Vec3,List<?extends Entity>>
    • 修饰符: public static final
    • 源码定位: L72
    • 说明:

      TODO

  • SUGGEST_NOTHING

    • 类型: BiFunction<SuggestionsBuilder,Consumer<SuggestionsBuilder>,CompletableFuture<Suggestions>>
    • 修饰符: public static final
    • 源码定位: L73
    • 说明:

      TODO

  • reader

    • 类型: StringReader
    • 修饰符: private final
    • 源码定位: L74
    • 说明:

      TODO

  • allowSelectors

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L75
    • 说明:

      TODO

  • maxResults

    • 类型: int
    • 修饰符: private
    • 源码定位: L76
    • 说明:

      TODO

  • includesEntities

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L77
    • 说明:

      TODO

  • worldLimited

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L78
    • 说明:

      TODO

  • distance

    • 类型: MinMaxBounds.Doubles
    • 修饰符: private
    • 源码定位: L79
    • 说明:

      TODO

  • level

    • 类型: MinMaxBounds.Ints
    • 修饰符: private
    • 源码定位: L80
    • 说明:

      TODO

  • x

    • 类型: Double
    • 修饰符: private
    • 源码定位: L81
    • 说明:

      TODO

  • y

    • 类型: Double
    • 修饰符: private
    • 源码定位: L82
    • 说明:

      TODO

  • z

    • 类型: Double
    • 修饰符: private
    • 源码定位: L83
    • 说明:

      TODO

  • deltaX

    • 类型: Double
    • 修饰符: private
    • 源码定位: L84
    • 说明:

      TODO

  • deltaY

    • 类型: Double
    • 修饰符: private
    • 源码定位: L85
    • 说明:

      TODO

  • deltaZ

    • 类型: Double
    • 修饰符: private
    • 源码定位: L86
    • 说明:

      TODO

  • rotX

    • 类型: MinMaxBounds.FloatDegrees
    • 修饰符: private
    • 源码定位: L87
    • 说明:

      TODO

  • rotY

    • 类型: MinMaxBounds.FloatDegrees
    • 修饰符: private
    • 源码定位: L88
    • 说明:

      TODO

  • predicates

    • 类型: List<Predicate<Entity>>
    • 修饰符: private final
    • 源码定位: L89
    • 说明:

      TODO

  • order

    • 类型: BiConsumer<Vec3,List<?extends Entity>>
    • 修饰符: private
    • 源码定位: L90
    • 说明:

      TODO

  • currentEntity

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L91
    • 说明:

      TODO

  • playerName

    • 类型: String
    • 修饰符: private
    • 源码定位: L92
    • 说明:

      TODO

  • startPosition

    • 类型: int
    • 修饰符: private
    • 源码定位: L93
    • 说明:

      TODO

  • entityUUID

    • 类型: UUID
    • 修饰符: private
    • 源码定位: L94
    • 说明:

      TODO

  • suggestions

    • 类型: BiFunction<SuggestionsBuilder,Consumer<SuggestionsBuilder>,CompletableFuture<Suggestions>>
    • 修饰符: private
    • 源码定位: L95
    • 说明:

      TODO

  • hasNameEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L96
    • 说明:

      TODO

  • hasNameNotEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L97
    • 说明:

      TODO

  • isLimited

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L98
    • 说明:

      TODO

  • isSorted

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L99
    • 说明:

      TODO

  • hasGamemodeEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L100
    • 说明:

      TODO

  • hasGamemodeNotEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L101
    • 说明:

      TODO

  • hasTeamEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L102
    • 说明:

      TODO

  • hasTeamNotEquals

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L103
    • 说明:

      TODO

  • type

    • 类型: EntityType<?>
    • 修饰符: private
    • 源码定位: L104
    • 说明:

      TODO

  • typeInverse

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L105
    • 说明:

      TODO

  • hasScores

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L106
    • 说明:

      TODO

  • hasAdvancements

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L107
    • 说明:

      TODO

  • usesSelectors

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L108
    • 说明:

      TODO

内部类/嵌套类型

构造器

public EntitySelectorParser(StringReader reader, boolean allowSelectors) @ L110

  • 构造器名:EntitySelectorParser
  • 源码定位:L110
  • 修饰符:public

参数:

  • reader: StringReader
  • allowSelectors: boolean

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static <S> boolean allowSelectors(S source) @ L115

  • 方法名:allowSelectors
  • 源码定位:L115
  • 返回类型: boolean
  • 修饰符:public static

参数:

  • source: S

说明:

TODO

public static boolean allowSelectors(PermissionSetSupplier source) @ L119

  • 方法名:allowSelectors
  • 源码定位:L119
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • source: PermissionSetSupplier

说明:

TODO

public EntitySelector getSelector() @ L124

  • 方法名:getSelector
  • 源码定位:L124
  • 返回类型:EntitySelector
  • 修饰符:public

参数:

说明:

TODO

private AABB createAabb(double x, double y, double z) @ L161

  • 方法名:createAabb
  • 源码定位:L161
  • 返回类型:AABB
  • 修饰符:private

参数:

  • x: double
  • y: double
  • z: double

说明:

TODO

private void finalizePredicates() @ L174

  • 方法名:finalizePredicates
  • 源码定位:L174
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private Predicate<Entity> createRotationPredicate(MinMaxBounds.FloatDegrees range, ToFloatFunction<Entity> function) @ L188

  • 方法名:createRotationPredicate
  • 源码定位:L188
  • 返回类型:Predicate
  • 修饰符:private

参数:

  • range: MinMaxBounds.FloatDegrees
  • function: ToFloatFunction

说明:

TODO

protected void parseSelector() @ L197

  • 方法名:parseSelector
  • 源码定位:L197
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

protected void parseNameOrUUID() @ L263

  • 方法名:parseNameOrUUID
  • 源码定位:L263
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

protected void parseOptions() @ L287

  • 方法名:parseOptions
  • 源码定位:L287
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

public boolean shouldInvertValue() @ L329

  • 方法名:shouldInvertValue
  • 源码定位:L329
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean isTag() @ L340

  • 方法名:isTag
  • 源码定位:L340
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public StringReader getReader() @ L351

  • 方法名:getReader
  • 源码定位:L351
  • 返回类型:StringReader
  • 修饰符:public

参数:

说明:

TODO

public void addPredicate(Predicate<Entity> predicate) @ L355

  • 方法名:addPredicate
  • 源码定位:L355
  • 返回类型:void
  • 修饰符:public

参数:

  • predicate: Predicate

说明:

TODO

public void setWorldLimited() @ L359

  • 方法名:setWorldLimited
  • 源码定位:L359
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public MinMaxBounds.Doubles getDistance() @ L363

  • 方法名:getDistance
  • 源码定位:L363
  • 返回类型:MinMaxBounds.Doubles
  • 修饰符:public

参数:

说明:

TODO

public void setDistance(MinMaxBounds.Doubles distance) @ L367

  • 方法名:setDistance
  • 源码定位:L367
  • 返回类型:void
  • 修饰符:public

参数:

  • distance: MinMaxBounds.Doubles

说明:

TODO

public MinMaxBounds.Ints getLevel() @ L371

  • 方法名:getLevel
  • 源码定位:L371
  • 返回类型:MinMaxBounds.Ints
  • 修饰符:public

参数:

说明:

TODO

public void setLevel(MinMaxBounds.Ints level) @ L375

  • 方法名:setLevel
  • 源码定位:L375
  • 返回类型:void
  • 修饰符:public

参数:

  • level: MinMaxBounds.Ints

说明:

TODO

public MinMaxBounds.FloatDegrees getRotX() @ L379

  • 方法名:getRotX
  • 源码定位:L379
  • 返回类型:MinMaxBounds.FloatDegrees
  • 修饰符:public

参数:

说明:

TODO

public void setRotX(MinMaxBounds.FloatDegrees rotX) @ L383

  • 方法名:setRotX
  • 源码定位:L383
  • 返回类型:void
  • 修饰符:public

参数:

  • rotX: MinMaxBounds.FloatDegrees

说明:

TODO

public MinMaxBounds.FloatDegrees getRotY() @ L387

  • 方法名:getRotY
  • 源码定位:L387
  • 返回类型:MinMaxBounds.FloatDegrees
  • 修饰符:public

参数:

说明:

TODO

public void setRotY(MinMaxBounds.FloatDegrees rotY) @ L391

  • 方法名:setRotY
  • 源码定位:L391
  • 返回类型:void
  • 修饰符:public

参数:

  • rotY: MinMaxBounds.FloatDegrees

说明:

TODO

public Double getX() @ L395

  • 方法名:getX
  • 源码定位:L395
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public Double getY() @ L399

  • 方法名:getY
  • 源码定位:L399
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public Double getZ() @ L403

  • 方法名:getZ
  • 源码定位:L403
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public void setX(double x) @ L407

  • 方法名:setX
  • 源码定位:L407
  • 返回类型:void
  • 修饰符:public

参数:

  • x: double

说明:

TODO

public void setY(double y) @ L411

  • 方法名:setY
  • 源码定位:L411
  • 返回类型:void
  • 修饰符:public

参数:

  • y: double

说明:

TODO

public void setZ(double z) @ L415

  • 方法名:setZ
  • 源码定位:L415
  • 返回类型:void
  • 修饰符:public

参数:

  • z: double

说明:

TODO

public void setDeltaX(double deltaX) @ L419

  • 方法名:setDeltaX
  • 源码定位:L419
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaX: double

说明:

TODO

public void setDeltaY(double deltaY) @ L423

  • 方法名:setDeltaY
  • 源码定位:L423
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaY: double

说明:

TODO

public void setDeltaZ(double deltaZ) @ L427

  • 方法名:setDeltaZ
  • 源码定位:L427
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaZ: double

说明:

TODO

public Double getDeltaX() @ L431

  • 方法名:getDeltaX
  • 源码定位:L431
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public Double getDeltaY() @ L435

  • 方法名:getDeltaY
  • 源码定位:L435
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public Double getDeltaZ() @ L439

  • 方法名:getDeltaZ
  • 源码定位:L439
  • 返回类型:Double
  • 修饰符:public

参数:

说明:

TODO

public void setMaxResults(int maxResults) @ L443

  • 方法名:setMaxResults
  • 源码定位:L443
  • 返回类型:void
  • 修饰符:public

参数:

  • maxResults: int

说明:

TODO

public void setIncludesEntities(boolean includesEntities) @ L447

  • 方法名:setIncludesEntities
  • 源码定位:L447
  • 返回类型:void
  • 修饰符:public

参数:

  • includesEntities: boolean

说明:

TODO

public BiConsumer<Vec3,List<?extends Entity>> getOrder() @ L451

  • 方法名:getOrder
  • 源码定位:L451
  • 返回类型:BiConsumer<Vec3,List<?extends Entity>>
  • 修饰符:public

参数:

说明:

TODO

public void setOrder(BiConsumer<Vec3,List<?extends Entity>> order) @ L455

  • 方法名:setOrder
  • 源码定位:L455
  • 返回类型:void
  • 修饰符:public

参数:

  • order: BiConsumer<Vec3,List<?extends Entity>>

说明:

TODO

public EntitySelector parse() @ L459

  • 方法名:parse
  • 源码定位:L459
  • 返回类型:EntitySelector
  • 修饰符:public

参数:

说明:

TODO

private static void fillSelectorSuggestions(SuggestionsBuilder builder) @ L477

  • 方法名:fillSelectorSuggestions
  • 源码定位:L477
  • 返回类型:void
  • 修饰符:private static

参数:

  • builder: SuggestionsBuilder

说明:

TODO

private CompletableFuture<Suggestions> suggestNameOrSelector(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L486

  • 方法名:suggestNameOrSelector
  • 源码定位:L486
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestName(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L495

  • 方法名:suggestName
  • 源码定位:L495
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestSelector(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L501

  • 方法名:suggestSelector
  • 源码定位:L501
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestOpenOptions(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L508

  • 方法名:suggestOpenOptions
  • 源码定位:L508
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestOptionsKeyOrClose(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L513

  • 方法名:suggestOptionsKeyOrClose
  • 源码定位:L513
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestOptionsKey(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L519

  • 方法名:suggestOptionsKey
  • 源码定位:L519
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestOptionsNextOrClose(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L524

  • 方法名:suggestOptionsNextOrClose
  • 源码定位:L524
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

private CompletableFuture<Suggestions> suggestEquals(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L530

  • 方法名:suggestEquals
  • 源码定位:L530
  • 返回类型:CompletableFuture
  • 修饰符:private

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

public boolean isCurrentEntity() @ L535

  • 方法名:isCurrentEntity
  • 源码定位:L535
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setSuggestions(BiFunction<SuggestionsBuilder,Consumer<SuggestionsBuilder>,CompletableFuture<Suggestions>> suggestions) @ L539

  • 方法名:setSuggestions
  • 源码定位:L539
  • 返回类型:void
  • 修饰符:public

参数:

  • suggestions: BiFunction<SuggestionsBuilder,Consumer,CompletableFuture>

说明:

TODO

public CompletableFuture<Suggestions> fillSuggestions(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) @ L543

  • 方法名:fillSuggestions
  • 源码定位:L543
  • 返回类型:CompletableFuture
  • 修饰符:public

参数:

  • builder: SuggestionsBuilder
  • names: Consumer

说明:

TODO

public boolean hasNameEquals() @ L547

  • 方法名:hasNameEquals
  • 源码定位:L547
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasNameEquals(boolean hasNameEquals) @ L551

  • 方法名:setHasNameEquals
  • 源码定位:L551
  • 返回类型:void
  • 修饰符:public

参数:

  • hasNameEquals: boolean

说明:

TODO

public boolean hasNameNotEquals() @ L555

  • 方法名:hasNameNotEquals
  • 源码定位:L555
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasNameNotEquals(boolean hasNameNotEquals) @ L559

  • 方法名:setHasNameNotEquals
  • 源码定位:L559
  • 返回类型:void
  • 修饰符:public

参数:

  • hasNameNotEquals: boolean

说明:

TODO

public boolean isLimited() @ L563

  • 方法名:isLimited
  • 源码定位:L563
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setLimited(boolean limited) @ L567

  • 方法名:setLimited
  • 源码定位:L567
  • 返回类型:void
  • 修饰符:public

参数:

  • limited: boolean

说明:

TODO

public boolean isSorted() @ L571

  • 方法名:isSorted
  • 源码定位:L571
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setSorted(boolean sorted) @ L575

  • 方法名:setSorted
  • 源码定位:L575
  • 返回类型:void
  • 修饰符:public

参数:

  • sorted: boolean

说明:

TODO

public boolean hasGamemodeEquals() @ L579

  • 方法名:hasGamemodeEquals
  • 源码定位:L579
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasGamemodeEquals(boolean hasGamemodeEquals) @ L583

  • 方法名:setHasGamemodeEquals
  • 源码定位:L583
  • 返回类型:void
  • 修饰符:public

参数:

  • hasGamemodeEquals: boolean

说明:

TODO

public boolean hasGamemodeNotEquals() @ L587

  • 方法名:hasGamemodeNotEquals
  • 源码定位:L587
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasGamemodeNotEquals(boolean hasGamemodeNotEquals) @ L591

  • 方法名:setHasGamemodeNotEquals
  • 源码定位:L591
  • 返回类型:void
  • 修饰符:public

参数:

  • hasGamemodeNotEquals: boolean

说明:

TODO

public boolean hasTeamEquals() @ L595

  • 方法名:hasTeamEquals
  • 源码定位:L595
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasTeamEquals(boolean hasTeamEquals) @ L599

  • 方法名:setHasTeamEquals
  • 源码定位:L599
  • 返回类型:void
  • 修饰符:public

参数:

  • hasTeamEquals: boolean

说明:

TODO

public boolean hasTeamNotEquals() @ L603

  • 方法名:hasTeamNotEquals
  • 源码定位:L603
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasTeamNotEquals(boolean hasTeamNotEquals) @ L607

  • 方法名:setHasTeamNotEquals
  • 源码定位:L607
  • 返回类型:void
  • 修饰符:public

参数:

  • hasTeamNotEquals: boolean

说明:

TODO

public void limitToType(EntityType<?> type) @ L611

  • 方法名:limitToType
  • 源码定位:L611
  • 返回类型:void
  • 修饰符:public

参数:

  • type: EntityType<?>

说明:

TODO

public void setTypeLimitedInversely() @ L615

  • 方法名:setTypeLimitedInversely
  • 源码定位:L615
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public boolean isTypeLimited() @ L619

  • 方法名:isTypeLimited
  • 源码定位:L619
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean isTypeLimitedInversely() @ L623

  • 方法名:isTypeLimitedInversely
  • 源码定位:L623
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean hasScores() @ L627

  • 方法名:hasScores
  • 源码定位:L627
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasScores(boolean hasScores) @ L631

  • 方法名:setHasScores
  • 源码定位:L631
  • 返回类型:void
  • 修饰符:public

参数:

  • hasScores: boolean

说明:

TODO

public boolean hasAdvancements() @ L635

  • 方法名:hasAdvancements
  • 源码定位:L635
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setHasAdvancements(boolean hasAdvancements) @ L639

  • 方法名:setHasAdvancements
  • 源码定位:L639
  • 返回类型:void
  • 修饰符:public

参数:

  • hasAdvancements: boolean

说明:

TODO

代码

public class EntitySelectorParser {
    public static final char SYNTAX_SELECTOR_START = '@';
    private static final char SYNTAX_OPTIONS_START = '[';
    private static final char SYNTAX_OPTIONS_END = ']';
    public static final char SYNTAX_OPTIONS_KEY_VALUE_SEPARATOR = '=';
    private static final char SYNTAX_OPTIONS_SEPARATOR = ',';
    public static final char SYNTAX_NOT = '!';
    public static final char SYNTAX_TAG = '#';
    private static final char SELECTOR_NEAREST_PLAYER = 'p';
    private static final char SELECTOR_ALL_PLAYERS = 'a';
    private static final char SELECTOR_RANDOM_PLAYERS = 'r';
    private static final char SELECTOR_CURRENT_ENTITY = 's';
    private static final char SELECTOR_ALL_ENTITIES = 'e';
    private static final char SELECTOR_NEAREST_ENTITY = 'n';
    public static final SimpleCommandExceptionType ERROR_INVALID_NAME_OR_UUID = new SimpleCommandExceptionType(
        Component.translatable("argument.entity.invalid")
    );
    public static final DynamicCommandExceptionType ERROR_UNKNOWN_SELECTOR_TYPE = new DynamicCommandExceptionType(
        type -> Component.translatableEscape("argument.entity.selector.unknown", type)
    );
    public static final SimpleCommandExceptionType ERROR_SELECTORS_NOT_ALLOWED = new SimpleCommandExceptionType(
        Component.translatable("argument.entity.selector.not_allowed")
    );
    public static final SimpleCommandExceptionType ERROR_MISSING_SELECTOR_TYPE = new SimpleCommandExceptionType(
        Component.translatable("argument.entity.selector.missing")
    );
    public static final SimpleCommandExceptionType ERROR_EXPECTED_END_OF_OPTIONS = new SimpleCommandExceptionType(
        Component.translatable("argument.entity.options.unterminated")
    );
    public static final DynamicCommandExceptionType ERROR_EXPECTED_OPTION_VALUE = new DynamicCommandExceptionType(
        name -> Component.translatableEscape("argument.entity.options.valueless", name)
    );
    public static final BiConsumer<Vec3, List<? extends Entity>> ORDER_NEAREST = (p, c) -> c.sort(
        (a, b) -> Doubles.compare(a.distanceToSqr(p), b.distanceToSqr(p))
    );
    public static final BiConsumer<Vec3, List<? extends Entity>> ORDER_FURTHEST = (p, c) -> c.sort(
        (a, b) -> Doubles.compare(b.distanceToSqr(p), a.distanceToSqr(p))
    );
    public static final BiConsumer<Vec3, List<? extends Entity>> ORDER_RANDOM = (p, c) -> Collections.shuffle(c);
    public static final BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> SUGGEST_NOTHING = (b, s) -> b.buildFuture();
    private final StringReader reader;
    private final boolean allowSelectors;
    private int maxResults;
    private boolean includesEntities;
    private boolean worldLimited;
    private MinMaxBounds.@Nullable Doubles distance;
    private MinMaxBounds.@Nullable Ints level;
    private @Nullable Double x;
    private @Nullable Double y;
    private @Nullable Double z;
    private @Nullable Double deltaX;
    private @Nullable Double deltaY;
    private @Nullable Double deltaZ;
    private MinMaxBounds.@Nullable FloatDegrees rotX;
    private MinMaxBounds.@Nullable FloatDegrees rotY;
    private final List<Predicate<Entity>> predicates = new ArrayList<>();
    private BiConsumer<Vec3, List<? extends Entity>> order = EntitySelector.ORDER_ARBITRARY;
    private boolean currentEntity;
    private @Nullable String playerName;
    private int startPosition;
    private @Nullable UUID entityUUID;
    private BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> suggestions = SUGGEST_NOTHING;
    private boolean hasNameEquals;
    private boolean hasNameNotEquals;
    private boolean isLimited;
    private boolean isSorted;
    private boolean hasGamemodeEquals;
    private boolean hasGamemodeNotEquals;
    private boolean hasTeamEquals;
    private boolean hasTeamNotEquals;
    private @Nullable EntityType<?> type;
    private boolean typeInverse;
    private boolean hasScores;
    private boolean hasAdvancements;
    private boolean usesSelectors;
 
    public EntitySelectorParser(StringReader reader, boolean allowSelectors) {
        this.reader = reader;
        this.allowSelectors = allowSelectors;
    }
 
    public static <S> boolean allowSelectors(S source) {
        return source instanceof PermissionSetSupplier sender && sender.permissions().hasPermission(Permissions.COMMANDS_ENTITY_SELECTORS);
    }
 
    @Deprecated
    public static boolean allowSelectors(PermissionSetSupplier source) {
        return source.permissions().hasPermission(Permissions.COMMANDS_ENTITY_SELECTORS);
    }
 
    public EntitySelector getSelector() {
        AABB aabb;
        if (this.deltaX == null && this.deltaY == null && this.deltaZ == null) {
            if (this.distance != null && this.distance.max().isPresent()) {
                double maxRange = (Double)this.distance.max().get();
                aabb = new AABB(-maxRange, -maxRange, -maxRange, maxRange + 1.0, maxRange + 1.0, maxRange + 1.0);
            } else {
                aabb = null;
            }
        } else {
            aabb = this.createAabb(this.deltaX == null ? 0.0 : this.deltaX, this.deltaY == null ? 0.0 : this.deltaY, this.deltaZ == null ? 0.0 : this.deltaZ);
        }
 
        Function<Vec3, Vec3> position;
        if (this.x == null && this.y == null && this.z == null) {
            position = o -> o;
        } else {
            position = o -> new Vec3(this.x == null ? o.x : this.x, this.y == null ? o.y : this.y, this.z == null ? o.z : this.z);
        }
 
        return new EntitySelector(
            this.maxResults,
            this.includesEntities,
            this.worldLimited,
            List.copyOf(this.predicates),
            this.distance,
            position,
            aabb,
            this.order,
            this.currentEntity,
            this.playerName,
            this.entityUUID,
            this.type,
            this.usesSelectors
        );
    }
 
    private AABB createAabb(double x, double y, double z) {
        boolean xNeg = x < 0.0;
        boolean yNeg = y < 0.0;
        boolean zNeg = z < 0.0;
        double xMin = xNeg ? x : 0.0;
        double yMin = yNeg ? y : 0.0;
        double zMin = zNeg ? z : 0.0;
        double xMax = (xNeg ? 0.0 : x) + 1.0;
        double yMax = (yNeg ? 0.0 : y) + 1.0;
        double zMax = (zNeg ? 0.0 : z) + 1.0;
        return new AABB(xMin, yMin, zMin, xMax, yMax, zMax);
    }
 
    private void finalizePredicates() {
        if (this.rotX != null) {
            this.predicates.add(this.createRotationPredicate(this.rotX, Entity::getXRot));
        }
 
        if (this.rotY != null) {
            this.predicates.add(this.createRotationPredicate(this.rotY, Entity::getYRot));
        }
 
        if (this.level != null) {
            this.predicates.add(e -> e instanceof ServerPlayer serverPlayer && this.level.matches(serverPlayer.experienceLevel));
        }
    }
 
    private Predicate<Entity> createRotationPredicate(MinMaxBounds.FloatDegrees range, ToFloatFunction<Entity> function) {
        float min = Mth.wrapDegrees(range.min().orElse(0.0F));
        float max = Mth.wrapDegrees(range.max().orElse(359.0F));
        return e -> {
            float rotation = Mth.wrapDegrees(function.applyAsFloat(e));
            return min > max ? rotation >= min || rotation <= max : rotation >= min && rotation <= max;
        };
    }
 
    protected void parseSelector() throws CommandSyntaxException {
        this.usesSelectors = true;
        this.suggestions = this::suggestSelector;
        if (!this.reader.canRead()) {
            throw ERROR_MISSING_SELECTOR_TYPE.createWithContext(this.reader);
        } else {
            int start = this.reader.getCursor();
            char type = this.reader.read();
 
            if (switch (type) {
                case 'a' -> {
                    this.maxResults = Integer.MAX_VALUE;
                    this.includesEntities = false;
                    this.order = EntitySelector.ORDER_ARBITRARY;
                    this.limitToType(EntityType.PLAYER);
                    yield false;
                }
                default -> {
                    this.reader.setCursor(start);
                    throw ERROR_UNKNOWN_SELECTOR_TYPE.createWithContext(this.reader, "@" + type);
                }
                case 'e' -> {
                    this.maxResults = Integer.MAX_VALUE;
                    this.includesEntities = true;
                    this.order = EntitySelector.ORDER_ARBITRARY;
                    yield true;
                }
                case 'n' -> {
                    this.maxResults = 1;
                    this.includesEntities = true;
                    this.order = ORDER_NEAREST;
                    yield true;
                }
                case 'p' -> {
                    this.maxResults = 1;
                    this.includesEntities = false;
                    this.order = ORDER_NEAREST;
                    this.limitToType(EntityType.PLAYER);
                    yield false;
                }
                case 'r' -> {
                    this.maxResults = 1;
                    this.includesEntities = false;
                    this.order = ORDER_RANDOM;
                    this.limitToType(EntityType.PLAYER);
                    yield false;
                }
                case 's' -> {
                    this.maxResults = 1;
                    this.includesEntities = true;
                    this.currentEntity = true;
                    yield false;
                }
            }) {
                this.predicates.add(Entity::isAlive);
            }
 
            this.suggestions = this::suggestOpenOptions;
            if (this.reader.canRead() && this.reader.peek() == '[') {
                this.reader.skip();
                this.suggestions = this::suggestOptionsKeyOrClose;
                this.parseOptions();
            }
        }
    }
 
    protected void parseNameOrUUID() throws CommandSyntaxException {
        if (this.reader.canRead()) {
            this.suggestions = this::suggestName;
        }
 
        int start = this.reader.getCursor();
        String name = this.reader.readString();
 
        try {
            this.entityUUID = UUID.fromString(name);
            this.includesEntities = true;
        } catch (IllegalArgumentException var4) {
            if (name.isEmpty() || name.length() > 16) {
                this.reader.setCursor(start);
                throw ERROR_INVALID_NAME_OR_UUID.createWithContext(this.reader);
            }
 
            this.includesEntities = false;
            this.playerName = name;
        }
 
        this.maxResults = 1;
    }
 
    protected void parseOptions() throws CommandSyntaxException {
        this.suggestions = this::suggestOptionsKey;
        this.reader.skipWhitespace();
 
        while (this.reader.canRead() && this.reader.peek() != ']') {
            this.reader.skipWhitespace();
            int start = this.reader.getCursor();
            String key = this.reader.readString();
            EntitySelectorOptions.Modifier modifier = EntitySelectorOptions.get(this, key, start);
            this.reader.skipWhitespace();
            if (!this.reader.canRead() || this.reader.peek() != '=') {
                this.reader.setCursor(start);
                throw ERROR_EXPECTED_OPTION_VALUE.createWithContext(this.reader, key);
            }
 
            this.reader.skip();
            this.reader.skipWhitespace();
            this.suggestions = SUGGEST_NOTHING;
            modifier.handle(this);
            this.reader.skipWhitespace();
            this.suggestions = this::suggestOptionsNextOrClose;
            if (this.reader.canRead()) {
                if (this.reader.peek() != ',') {
                    if (this.reader.peek() != ']') {
                        throw ERROR_EXPECTED_END_OF_OPTIONS.createWithContext(this.reader);
                    }
                    break;
                }
 
                this.reader.skip();
                this.suggestions = this::suggestOptionsKey;
            }
        }
 
        if (this.reader.canRead()) {
            this.reader.skip();
            this.suggestions = SUGGEST_NOTHING;
        } else {
            throw ERROR_EXPECTED_END_OF_OPTIONS.createWithContext(this.reader);
        }
    }
 
    public boolean shouldInvertValue() {
        this.reader.skipWhitespace();
        if (this.reader.canRead() && this.reader.peek() == '!') {
            this.reader.skip();
            this.reader.skipWhitespace();
            return true;
        } else {
            return false;
        }
    }
 
    public boolean isTag() {
        this.reader.skipWhitespace();
        if (this.reader.canRead() && this.reader.peek() == '#') {
            this.reader.skip();
            this.reader.skipWhitespace();
            return true;
        } else {
            return false;
        }
    }
 
    public StringReader getReader() {
        return this.reader;
    }
 
    public void addPredicate(Predicate<Entity> predicate) {
        this.predicates.add(predicate);
    }
 
    public void setWorldLimited() {
        this.worldLimited = true;
    }
 
    public MinMaxBounds.@Nullable Doubles getDistance() {
        return this.distance;
    }
 
    public void setDistance(MinMaxBounds.Doubles distance) {
        this.distance = distance;
    }
 
    public MinMaxBounds.@Nullable Ints getLevel() {
        return this.level;
    }
 
    public void setLevel(MinMaxBounds.Ints level) {
        this.level = level;
    }
 
    public MinMaxBounds.@Nullable FloatDegrees getRotX() {
        return this.rotX;
    }
 
    public void setRotX(MinMaxBounds.FloatDegrees rotX) {
        this.rotX = rotX;
    }
 
    public MinMaxBounds.@Nullable FloatDegrees getRotY() {
        return this.rotY;
    }
 
    public void setRotY(MinMaxBounds.FloatDegrees rotY) {
        this.rotY = rotY;
    }
 
    public @Nullable Double getX() {
        return this.x;
    }
 
    public @Nullable Double getY() {
        return this.y;
    }
 
    public @Nullable Double getZ() {
        return this.z;
    }
 
    public void setX(double x) {
        this.x = x;
    }
 
    public void setY(double y) {
        this.y = y;
    }
 
    public void setZ(double z) {
        this.z = z;
    }
 
    public void setDeltaX(double deltaX) {
        this.deltaX = deltaX;
    }
 
    public void setDeltaY(double deltaY) {
        this.deltaY = deltaY;
    }
 
    public void setDeltaZ(double deltaZ) {
        this.deltaZ = deltaZ;
    }
 
    public @Nullable Double getDeltaX() {
        return this.deltaX;
    }
 
    public @Nullable Double getDeltaY() {
        return this.deltaY;
    }
 
    public @Nullable Double getDeltaZ() {
        return this.deltaZ;
    }
 
    public void setMaxResults(int maxResults) {
        this.maxResults = maxResults;
    }
 
    public void setIncludesEntities(boolean includesEntities) {
        this.includesEntities = includesEntities;
    }
 
    public BiConsumer<Vec3, List<? extends Entity>> getOrder() {
        return this.order;
    }
 
    public void setOrder(BiConsumer<Vec3, List<? extends Entity>> order) {
        this.order = order;
    }
 
    public EntitySelector parse() throws CommandSyntaxException {
        this.startPosition = this.reader.getCursor();
        this.suggestions = this::suggestNameOrSelector;
        if (this.reader.canRead() && this.reader.peek() == '@') {
            if (!this.allowSelectors) {
                throw ERROR_SELECTORS_NOT_ALLOWED.createWithContext(this.reader);
            }
 
            this.reader.skip();
            this.parseSelector();
        } else {
            this.parseNameOrUUID();
        }
 
        this.finalizePredicates();
        return this.getSelector();
    }
 
    private static void fillSelectorSuggestions(SuggestionsBuilder builder) {
        builder.suggest("@p", Component.translatable("argument.entity.selector.nearestPlayer"));
        builder.suggest("@a", Component.translatable("argument.entity.selector.allPlayers"));
        builder.suggest("@r", Component.translatable("argument.entity.selector.randomPlayer"));
        builder.suggest("@s", Component.translatable("argument.entity.selector.self"));
        builder.suggest("@e", Component.translatable("argument.entity.selector.allEntities"));
        builder.suggest("@n", Component.translatable("argument.entity.selector.nearestEntity"));
    }
 
    private CompletableFuture<Suggestions> suggestNameOrSelector(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        names.accept(builder);
        if (this.allowSelectors) {
            fillSelectorSuggestions(builder);
        }
 
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestName(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        SuggestionsBuilder sub = builder.createOffset(this.startPosition);
        names.accept(sub);
        return builder.add(sub).buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestSelector(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        SuggestionsBuilder sub = builder.createOffset(builder.getStart() - 1);
        fillSelectorSuggestions(sub);
        builder.add(sub);
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestOpenOptions(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        builder.suggest(String.valueOf('['));
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestOptionsKeyOrClose(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        builder.suggest(String.valueOf(']'));
        EntitySelectorOptions.suggestNames(this, builder);
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestOptionsKey(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        EntitySelectorOptions.suggestNames(this, builder);
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestOptionsNextOrClose(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        builder.suggest(String.valueOf(','));
        builder.suggest(String.valueOf(']'));
        return builder.buildFuture();
    }
 
    private CompletableFuture<Suggestions> suggestEquals(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        builder.suggest(String.valueOf('='));
        return builder.buildFuture();
    }
 
    public boolean isCurrentEntity() {
        return this.currentEntity;
    }
 
    public void setSuggestions(BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> suggestions) {
        this.suggestions = suggestions;
    }
 
    public CompletableFuture<Suggestions> fillSuggestions(SuggestionsBuilder builder, Consumer<SuggestionsBuilder> names) {
        return this.suggestions.apply(builder.createOffset(this.reader.getCursor()), names);
    }
 
    public boolean hasNameEquals() {
        return this.hasNameEquals;
    }
 
    public void setHasNameEquals(boolean hasNameEquals) {
        this.hasNameEquals = hasNameEquals;
    }
 
    public boolean hasNameNotEquals() {
        return this.hasNameNotEquals;
    }
 
    public void setHasNameNotEquals(boolean hasNameNotEquals) {
        this.hasNameNotEquals = hasNameNotEquals;
    }
 
    public boolean isLimited() {
        return this.isLimited;
    }
 
    public void setLimited(boolean limited) {
        this.isLimited = limited;
    }
 
    public boolean isSorted() {
        return this.isSorted;
    }
 
    public void setSorted(boolean sorted) {
        this.isSorted = sorted;
    }
 
    public boolean hasGamemodeEquals() {
        return this.hasGamemodeEquals;
    }
 
    public void setHasGamemodeEquals(boolean hasGamemodeEquals) {
        this.hasGamemodeEquals = hasGamemodeEquals;
    }
 
    public boolean hasGamemodeNotEquals() {
        return this.hasGamemodeNotEquals;
    }
 
    public void setHasGamemodeNotEquals(boolean hasGamemodeNotEquals) {
        this.hasGamemodeNotEquals = hasGamemodeNotEquals;
    }
 
    public boolean hasTeamEquals() {
        return this.hasTeamEquals;
    }
 
    public void setHasTeamEquals(boolean hasTeamEquals) {
        this.hasTeamEquals = hasTeamEquals;
    }
 
    public boolean hasTeamNotEquals() {
        return this.hasTeamNotEquals;
    }
 
    public void setHasTeamNotEquals(boolean hasTeamNotEquals) {
        this.hasTeamNotEquals = hasTeamNotEquals;
    }
 
    public void limitToType(EntityType<?> type) {
        this.type = type;
    }
 
    public void setTypeLimitedInversely() {
        this.typeInverse = true;
    }
 
    public boolean isTypeLimited() {
        return this.type != null;
    }
 
    public boolean isTypeLimitedInversely() {
        return this.typeInverse;
    }
 
    public boolean hasScores() {
        return this.hasScores;
    }
 
    public void setHasScores(boolean hasScores) {
        this.hasScores = hasScores;
    }
 
    public boolean hasAdvancements() {
        return this.hasAdvancements;
    }
 
    public void setHasAdvancements(boolean hasAdvancements) {
        this.hasAdvancements = hasAdvancements;
    }
}

引用的其他类

  • MinMaxBounds

    • 引用位置: 参数/字段/方法调用/返回值
    • 关联成员: Doubles.compare()
  • EntitySelector

    • 引用位置: 构造调用/返回值
    • 关联成员: EntitySelector()
  • EntitySelectorOptions

    • 引用位置: 方法调用
    • 关联成员: EntitySelectorOptions.get(), EntitySelectorOptions.suggestNames()
  • Component

    • 引用位置: 方法调用
    • 关联成员: Component.translatable(), Component.translatableEscape()
  • PermissionSetSupplier

    • 引用位置: 参数
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.wrapDegrees()
  • ToFloatFunction

    • 引用位置: 参数
  • Entity

    • 引用位置: 参数/字段/返回值
  • EntityType

    • 引用位置: 参数/字段
  • AABB

    • 引用位置: 构造调用/返回值
    • 关联成员: AABB()
  • Vec3

    • 引用位置: 参数/字段/构造调用/返回值
    • 关联成员: Vec3()