├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── build-logic ├── build.gradle.kts ├── settings.gradle.kts └── src │ └── main │ └── kotlin │ ├── easyarmorstands.base.gradle.kts │ └── easyarmorstands.publish.gradle.kts ├── easyarmorstands-api ├── build.gradle.kts └── src │ └── main │ └── java │ └── me │ └── m56738 │ └── easyarmorstands │ └── api │ ├── ArmorStandPart.java │ ├── ArmorStandSize.java │ ├── Axis.java │ ├── EasyArmorStands.java │ ├── EasyArmorStandsHolder.java │ ├── editor │ ├── EyeRay.java │ ├── Session.java │ ├── SessionManager.java │ ├── Snapper.java │ ├── button │ │ ├── AxisMoveButton.java │ │ ├── AxisMoveButtonBuilder.java │ │ ├── AxisRotateButton.java │ │ ├── AxisRotateButtonBuilder.java │ │ ├── AxisScaleButton.java │ │ ├── AxisScaleButtonBuilder.java │ │ ├── BoundingBoxButton.java │ │ ├── Button.java │ │ ├── ButtonResult.java │ │ ├── ButtonResultImpl.java │ │ ├── MenuButton.java │ │ ├── MenuButtonProvider.java │ │ ├── MoveButton.java │ │ ├── MoveButtonBuilder.java │ │ ├── PointButton.java │ │ ├── ScaleButton.java │ │ └── ScaleButtonBuilder.java │ ├── context │ │ ├── AddContext.java │ │ ├── ClickContext.java │ │ ├── EnterContext.java │ │ ├── ExitContext.java │ │ ├── RemoveContext.java │ │ └── UpdateContext.java │ ├── node │ │ ├── ElementNode.java │ │ ├── ElementSelectionNode.java │ │ ├── MenuNode.java │ │ ├── Node.java │ │ ├── NodeProvider.java │ │ └── ResettableNode.java │ ├── tool │ │ ├── AxisMoveTool.java │ │ ├── AxisMoveToolSession.java │ │ ├── AxisRotateTool.java │ │ ├── AxisRotateToolSession.java │ │ ├── AxisScaleTool.java │ │ ├── AxisScaleToolSession.java │ │ ├── AxisTool.java │ │ ├── AxisToolSession.java │ │ ├── LocationMoveTool.java │ │ ├── LocationPitchRotateTool.java │ │ ├── LocationYawRotateTool.java │ │ ├── MoveTool.java │ │ ├── MoveToolSession.java │ │ ├── OrientedTool.java │ │ ├── PositionedTool.java │ │ ├── ScalarScaleTool.java │ │ ├── ScalarToolSession.java │ │ ├── ScaleTool.java │ │ ├── ScaleToolSession.java │ │ ├── SimpleAxisMoveTool.java │ │ ├── Tool.java │ │ ├── ToolContext.java │ │ ├── ToolContextImpl.java │ │ ├── ToolProvider.java │ │ └── ToolSession.java │ └── util │ │ ├── ToolMenuManager.java │ │ └── ToolMenuMode.java │ ├── element │ ├── ConfigurableEntityElement.java │ ├── DestroyableElement.java │ ├── EditableElement.java │ ├── Element.java │ ├── ElementDiscoveryEntry.java │ ├── ElementDiscoverySource.java │ ├── ElementReference.java │ ├── ElementSpawnRequest.java │ ├── ElementType.java │ ├── EntityElement.java │ ├── EntityElementProvider.java │ ├── EntityElementProviderRegistry.java │ ├── EntityElementReference.java │ ├── EntityElementType.java │ ├── MenuElement.java │ ├── NamedElement.java │ └── SelectableElement.java │ ├── event │ ├── element │ │ └── EntityElementInitializeEvent.java │ ├── player │ │ ├── PlayerCreateElementEvent.java │ │ ├── PlayerDestroyElementEvent.java │ │ ├── PlayerDiscoverElementEvent.java │ │ ├── PlayerEditElementEvent.java │ │ └── PlayerEditPropertyEvent.java │ └── session │ │ ├── SessionEvent.java │ │ ├── SessionStartEvent.java │ │ └── SessionStopEvent.java │ ├── history │ └── EntityReplacementListener.java │ ├── menu │ ├── ColorPickerContext.java │ ├── Menu.java │ ├── MenuClick.java │ ├── MenuClickInterceptor.java │ ├── MenuCloseListener.java │ ├── MenuContext.java │ ├── MenuFactory.java │ ├── MenuFactoryBuilder.java │ ├── MenuProvider.java │ ├── MenuSlot.java │ ├── MenuSlotContext.java │ ├── MenuSlotFactory.java │ ├── MenuSlotType.java │ └── MenuSlotTypeRegistry.java │ ├── particle │ ├── BoundingBoxParticle.java │ ├── CircleParticle.java │ ├── ColoredParticle.java │ ├── LineParticle.java │ ├── Particle.java │ ├── ParticleColor.java │ ├── ParticleProvider.java │ └── PointParticle.java │ ├── property │ ├── ElementPropertyRegistry.java │ ├── ImmutableProperty.java │ ├── ImmutablePropertyContainer.java │ ├── PendingChange.java │ ├── PendingChangeImpl.java │ ├── Property.java │ ├── PropertyContainer.java │ ├── PropertyMap.java │ ├── PropertyRegistry.java │ ├── PropertyWrapperContainer.java │ ├── UnknownPropertyException.java │ ├── UnknownPropertyTypeException.java │ └── type │ │ ├── ArmorStandPropertyTypes.java │ │ ├── EntityPropertyTypes.java │ │ ├── EnumKeyedPropertyType.java │ │ ├── KeyedPropertyType.java │ │ ├── PropertyType.java │ │ ├── PropertyTypeRegistry.java │ │ └── PropertyTypeTypeToken.java │ ├── region │ ├── RegionPrivilegeChecker.java │ └── RegionPrivilegeManager.java │ └── util │ ├── BoundingBox.java │ ├── BoundingBoxImpl.java │ ├── BoundingBoxProvider.java │ ├── EasConversion.java │ ├── EasFormat.java │ ├── EasMath.java │ ├── ItemTemplate.java │ ├── PositionProvider.java │ ├── PositionProviderImpl.java │ ├── RotationProvider.java │ └── RotationProviderImpl.java ├── easyarmorstands-bentobox ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── bentobox │ │ ├── BentoBoxActionEvent.java │ │ ├── BentoBoxAddon.java │ │ ├── BentoBoxAddonFactory.java │ │ └── BentoBoxPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-display-api ├── build.gradle.kts └── src │ └── main │ └── java │ └── me │ └── m56738 │ └── easyarmorstands │ └── display │ └── api │ └── property │ └── type │ ├── BlockDisplayPropertyTypes.java │ ├── DisplayPropertyTypes.java │ ├── InteractionPropertyTypes.java │ ├── ItemDisplayPropertyTypes.java │ └── TextDisplayPropertyTypes.java ├── easyarmorstands-display ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── display │ │ ├── DisplayAddon.java │ │ ├── DisplayAddonFactory.java │ │ ├── DisplayListener.java │ │ ├── adapter │ │ ├── LegacyTextDisplayAdapter.java │ │ ├── PaperTextDisplayAdapter.java │ │ └── TextDisplayAdapter.java │ │ ├── command │ │ ├── BlockDataArgumentParser.java │ │ ├── DisplayCommands.java │ │ └── value │ │ │ └── DisplayScaleAxisCommand.java │ │ ├── editor │ │ ├── DisplayOffsetProvider.java │ │ ├── DisplayRotationProvider.java │ │ ├── box │ │ │ ├── DisplayBoxEditor.java │ │ │ └── InteractionBoxEditor.java │ │ ├── node │ │ │ ├── DisplayBoxNode.java │ │ │ ├── DisplayMenuNode.java │ │ │ ├── DisplayRootNode.java │ │ │ ├── DisplayShearNode.java │ │ │ └── InteractionRootNode.java │ │ └── tool │ │ │ ├── DisplayAxisRotateTool.java │ │ │ ├── DisplayAxisScaleTool.java │ │ │ └── DisplayScaleTool.java │ │ ├── element │ │ ├── DisplayElement.java │ │ ├── DisplayElementProvider.java │ │ ├── DisplayElementType.java │ │ ├── DisplayToolProvider.java │ │ ├── InteractionElement.java │ │ ├── InteractionElementProvider.java │ │ ├── InteractionElementType.java │ │ ├── InteractionToolProvider.java │ │ └── TextDisplayElementType.java │ │ ├── menu │ │ ├── BlockDisplaySlot.java │ │ ├── DisplayBoxSlotFactory.java │ │ ├── DisplayBoxSlotType.java │ │ ├── DisplaySpawnSlotType.java │ │ └── InteractionSpawnSlotType.java │ │ └── property │ │ ├── button │ │ └── TextBackgroundToggleButton.java │ │ ├── display │ │ ├── DefaultDisplayPropertyTypes.java │ │ ├── DisplayBillboardProperty.java │ │ ├── DisplayBrightnessProperty.java │ │ ├── DisplayGlowColorProperty.java │ │ ├── DisplayHeightProperty.java │ │ ├── DisplayLeftRotationProperty.java │ │ ├── DisplayRightRotationProperty.java │ │ ├── DisplayScaleProperty.java │ │ ├── DisplayTranslationProperty.java │ │ ├── DisplayViewRangeProperty.java │ │ ├── DisplayWidthProperty.java │ │ ├── block │ │ │ └── BlockDisplayBlockProperty.java │ │ ├── interaction │ │ │ ├── InteractionHeightProperty.java │ │ │ ├── InteractionResponsiveProperty.java │ │ │ └── InteractionWidthProperty.java │ │ ├── item │ │ │ ├── ItemDisplayItemProperty.java │ │ │ └── ItemDisplayTransformProperty.java │ │ └── text │ │ │ ├── TextDisplayAlignmentProperty.java │ │ │ ├── TextDisplayBackgroundProperty.java │ │ │ ├── TextDisplayLineWidthProperty.java │ │ │ ├── TextDisplaySeeThroughProperty.java │ │ │ ├── TextDisplayShadowProperty.java │ │ │ └── TextDisplayTextProperty.java │ │ └── type │ │ ├── BlockDataPropertyType.java │ │ ├── BrightnessPropertyType.java │ │ ├── GlowColorPropertyType.java │ │ └── TextBackgroundTogglePropertyType.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-fancyholograms ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── fancyholograms │ │ ├── FancyHologramsAddon.java │ │ ├── FancyHologramsAddonFactory.java │ │ ├── FancyHologramsListener.java │ │ ├── editor │ │ └── node │ │ │ └── HologramRootNode.java │ │ ├── element │ │ ├── HologramElement.java │ │ ├── HologramElementDiscoveryEntry.java │ │ ├── HologramElementDiscoverySource.java │ │ ├── HologramElementReference.java │ │ ├── HologramElementType.java │ │ └── HologramToolProvider.java │ │ └── property │ │ ├── HologramDataProperty.java │ │ ├── HologramLocationProperty.java │ │ ├── block │ │ └── BlockHologramBlockProperty.java │ │ ├── display │ │ ├── DisplayHologramBillboardProperty.java │ │ └── DisplayHologramScaleProperty.java │ │ ├── item │ │ └── ItemHologramItemProperty.java │ │ ├── text │ │ ├── TextHologramAlignmentProperty.java │ │ ├── TextHologramBackgroundProperty.java │ │ ├── TextHologramSeeThroughProperty.java │ │ ├── TextHologramShadowProperty.java │ │ └── TextHologramTextProperty.java │ │ └── type │ │ ├── HologramDataPropertyType.java │ │ └── TextHologramTextPropertyType.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-griefdefender ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── griefdefender │ │ ├── GriefDefenderAddon.java │ │ ├── GriefDefenderAddonFactory.java │ │ └── GriefDefenderPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-griefprevention ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── griefprevention │ │ ├── GriefPreventionAddon.java │ │ ├── GriefPreventionAddonFactory.java │ │ └── GriefPreventionPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-headdatabase ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── headdatabase │ │ ├── HeadDatabaseAddon.java │ │ ├── HeadDatabaseAddonFactory.java │ │ ├── HeadDatabaseListener.java │ │ ├── HeadDatabaseSlot.java │ │ ├── HeadDatabaseSlotFactory.java │ │ └── HeadDatabaseSlotType.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-huskclaims ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── huskclaims │ │ ├── HuskClaimsAddon.java │ │ ├── HuskClaimsAddonFactory.java │ │ └── HuskClaimsPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-lands ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── lands │ │ ├── LandsAddon.java │ │ ├── LandsAddonFactory.java │ │ └── LandsPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-plotsquared ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── plotsquared │ │ └── v6 │ │ ├── PlotSquaredAddon.java │ │ ├── PlotSquaredAddonFactory.java │ │ └── PlotSquaredPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-plugin ├── build.gradle.kts └── src │ ├── main │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ ├── EasyArmorStandsPlugin.java │ │ │ ├── adapter │ │ │ └── EntityPlaceAdapter.java │ │ │ ├── addon │ │ │ ├── Addon.java │ │ │ ├── AddonFactory.java │ │ │ └── AddonManager.java │ │ │ ├── api │ │ │ └── EasyArmorStandsInitializer.java │ │ │ ├── capability │ │ │ ├── Capability.java │ │ │ ├── CapabilityLoader.java │ │ │ ├── CapabilityProvider.java │ │ │ ├── Priority.java │ │ │ ├── component │ │ │ │ └── ComponentCapability.java │ │ │ ├── egg │ │ │ │ └── SpawnEggCapability.java │ │ │ ├── entityai │ │ │ │ └── EntityAICapability.java │ │ │ ├── entityscale │ │ │ │ └── EntityScaleCapability.java │ │ │ ├── entitysize │ │ │ │ └── EntitySizeCapability.java │ │ │ ├── entitytag │ │ │ │ └── EntityTagCapability.java │ │ │ ├── entitytype │ │ │ │ └── EntityTypeCapability.java │ │ │ ├── equipment │ │ │ │ └── EquipmentCapability.java │ │ │ ├── glow │ │ │ │ └── GlowCapability.java │ │ │ ├── handswap │ │ │ │ ├── SwapHandItemsCapability.java │ │ │ │ └── SwapHandItemsListener.java │ │ │ ├── invulnerability │ │ │ │ └── InvulnerabilityCapability.java │ │ │ ├── item │ │ │ │ └── ItemCapability.java │ │ │ ├── itemcolor │ │ │ │ └── ItemColorCapability.java │ │ │ ├── lock │ │ │ │ └── LockCapability.java │ │ │ ├── lookup │ │ │ │ └── LookupCapability.java │ │ │ ├── persistence │ │ │ │ └── PersistenceCapability.java │ │ │ ├── silent │ │ │ │ └── SilentCapability.java │ │ │ ├── spawn │ │ │ │ └── SpawnCapability.java │ │ │ ├── tick │ │ │ │ └── TickCapability.java │ │ │ ├── tool │ │ │ │ └── ToolCapability.java │ │ │ └── visibility │ │ │ │ └── VisibilityCapability.java │ │ │ ├── clipboard │ │ │ ├── Clipboard.java │ │ │ ├── ClipboardListener.java │ │ │ └── ClipboardManager.java │ │ │ ├── color │ │ │ ├── ColorAxis.java │ │ │ ├── ColorAxisChangeSlot.java │ │ │ ├── ColorAxisChangeSlotFactory.java │ │ │ ├── ColorAxisChangeSlotType.java │ │ │ ├── ColorAxisSlot.java │ │ │ ├── ColorAxisSlotFactory.java │ │ │ ├── ColorAxisSlotType.java │ │ │ ├── ColorIndicatorSlot.java │ │ │ ├── ColorIndicatorSlotFactory.java │ │ │ ├── ColorIndicatorSlotType.java │ │ │ ├── ColorPickerAxisTag.java │ │ │ ├── ColorPickerColorTag.java │ │ │ ├── ColorPickerContextImpl.java │ │ │ ├── ColorPresetSlot.java │ │ │ ├── ColorPresetSlotFactory.java │ │ │ ├── ColorPresetSlotType.java │ │ │ └── ColorSlot.java │ │ │ ├── command │ │ │ ├── ClipboardCommands.java │ │ │ ├── GlobalCommands.java │ │ │ ├── HistoryCommands.java │ │ │ ├── PropertyCommands.java │ │ │ ├── SessionCommands.java │ │ │ ├── annotation │ │ │ │ └── PropertyPermission.java │ │ │ ├── parser │ │ │ │ └── NodeValueArgumentParser.java │ │ │ ├── processor │ │ │ │ ├── ClipboardInjector.java │ │ │ │ ├── ClipboardProcessor.java │ │ │ │ ├── ElementInjector.java │ │ │ │ ├── ElementProcessor.java │ │ │ │ ├── ElementSelectionInjector.java │ │ │ │ ├── ElementSelectionProcessor.java │ │ │ │ ├── GroupProcessor.java │ │ │ │ ├── PropertyPermissionBuilderModifier.java │ │ │ │ ├── PropertyPermissionPredicate.java │ │ │ │ ├── SessionInjector.java │ │ │ │ ├── SessionProcessor.java │ │ │ │ └── ValueNodeInjector.java │ │ │ ├── requirement │ │ │ │ ├── CommandRequirement.java │ │ │ │ ├── CommandRequirementBuilderModifier.java │ │ │ │ ├── CommandRequirementPostProcessor.java │ │ │ │ ├── ElementRequirement.java │ │ │ │ ├── ElementSelectionRequirement.java │ │ │ │ ├── RequireElement.java │ │ │ │ ├── RequireElementSelection.java │ │ │ │ ├── RequireSession.java │ │ │ │ └── SessionRequirement.java │ │ │ ├── sender │ │ │ │ ├── CommandSenderMapper.java │ │ │ │ ├── EasCommandSender.java │ │ │ │ └── EasPlayer.java │ │ │ ├── util │ │ │ │ └── ElementSelection.java │ │ │ └── value │ │ │ │ ├── PitchCommand.java │ │ │ │ ├── PositionCommand.java │ │ │ │ ├── PropertyCommand.java │ │ │ │ ├── ScaleAxisCommand.java │ │ │ │ ├── ValueCommand.java │ │ │ │ └── YawCommand.java │ │ │ ├── config │ │ │ ├── EasConfig.java │ │ │ ├── EditorButtonConfig.java │ │ │ ├── EditorConfig.java │ │ │ ├── EditorDiscoveryConfig.java │ │ │ ├── EditorMenuConfig.java │ │ │ ├── EditorScaleConfig.java │ │ │ ├── EditorSelectionConfig.java │ │ │ ├── EditorSelectionGroupConfig.java │ │ │ ├── LimitConfig.java │ │ │ ├── LimitScaleConfig.java │ │ │ ├── MessageConfig.java │ │ │ ├── UpdateCheckConfig.java │ │ │ ├── integration │ │ │ │ ├── IntegrationConfig.java │ │ │ │ ├── IntegrationEntryConfig.java │ │ │ │ ├── lands │ │ │ │ │ ├── LandsConfig.java │ │ │ │ │ └── LandsFlagConfig.java │ │ │ │ └── towny │ │ │ │ │ └── TownyConfig.java │ │ │ ├── serializer │ │ │ │ ├── ColorSerializer.java │ │ │ │ ├── DecimalFormatSerializer.java │ │ │ │ ├── EasSerializers.java │ │ │ │ ├── ItemTemplateSerializer.java │ │ │ │ ├── KeySerializer.java │ │ │ │ ├── MaterialSerializer.java │ │ │ │ ├── MenuFactorySerializer.java │ │ │ │ ├── MenuSlotFactorySerializer.java │ │ │ │ ├── MenuSlotTypeSerializer.java │ │ │ │ ├── MessageStyleSerializer.java │ │ │ │ ├── MiniMessageSerializer.java │ │ │ │ └── PropertyTypeSerializer.java │ │ │ └── version │ │ │ │ ├── Transformations.java │ │ │ │ ├── Version.java │ │ │ │ ├── game │ │ │ │ ├── GameVersionTransformation.java │ │ │ │ ├── ReplaceTransformAction.java │ │ │ │ └── v1_13 │ │ │ │ │ └── ItemStackTransformAction_v1_13.java │ │ │ │ └── override │ │ │ │ ├── BeforeMinorVersionCondition.java │ │ │ │ └── VersionOverrideCondition.java │ │ │ ├── context │ │ │ └── ChangeContext.java │ │ │ ├── editor │ │ │ ├── EntityPositionProvider.java │ │ │ ├── EntityRotationProvider.java │ │ │ ├── EntityYawRotationProvider.java │ │ │ ├── OffsetProvider.java │ │ │ ├── ZeroOffsetProvider.java │ │ │ ├── armorstand │ │ │ │ ├── ArmorStandOffsetProvider.java │ │ │ │ ├── ArmorStandPartOffsetProvider.java │ │ │ │ ├── ArmorStandPartRotationProvider.java │ │ │ │ ├── ArmorStandRotationProvider.java │ │ │ │ ├── button │ │ │ │ │ ├── ArmorStandPartButton.java │ │ │ │ │ └── ArmorStandPositionButton.java │ │ │ │ ├── node │ │ │ │ │ ├── ArmorStandPartNode.java │ │ │ │ │ ├── ArmorStandPositionNode.java │ │ │ │ │ └── ArmorStandRootNode.java │ │ │ │ └── tool │ │ │ │ │ └── ArmorStandPoseTool.java │ │ │ ├── box │ │ │ │ ├── AbstractBoundingBoxEditorSession.java │ │ │ │ ├── BoundingBoxEditor.java │ │ │ │ ├── BoundingBoxEditorSession.java │ │ │ │ ├── BoxCenterPositionProvider.java │ │ │ │ └── BoxSidePositionProvider.java │ │ │ ├── button │ │ │ │ ├── AxisMoveButtonBuilderImpl.java │ │ │ │ ├── AxisMoveButtonImpl.java │ │ │ │ ├── AxisRotateButtonBuilderImpl.java │ │ │ │ ├── AxisRotateButtonImpl.java │ │ │ │ ├── AxisScaleButtonBuilderImpl.java │ │ │ │ ├── AxisScaleButtonImpl.java │ │ │ │ ├── AxisToolButton.java │ │ │ │ ├── BoxResizeButton.java │ │ │ │ ├── MoveButtonBuilderImpl.java │ │ │ │ ├── MoveButtonImpl.java │ │ │ │ ├── NodeFactoryButton.java │ │ │ │ ├── ScaleButtonBuilderImpl.java │ │ │ │ └── ScaleButtonImpl.java │ │ │ ├── node │ │ │ │ ├── AxisLineToolNode.java │ │ │ │ ├── AxisMoveToolNode.java │ │ │ │ ├── AxisRotateToolNode.java │ │ │ │ ├── AxisScaleToolNode.java │ │ │ │ ├── BoxResizeToolManager.java │ │ │ │ ├── ElementSelectionNodeImpl.java │ │ │ │ ├── EntityElementDiscoveryEntry.java │ │ │ │ ├── EntityElementDiscoverySource.java │ │ │ │ ├── MoveToolNode.java │ │ │ │ ├── NodeFactory.java │ │ │ │ ├── PropertyMenuNode.java │ │ │ │ ├── ScaleToolNode.java │ │ │ │ ├── SimpleEntityNode.java │ │ │ │ ├── ToolMenuModeSwitcher.java │ │ │ │ ├── ToolNode.java │ │ │ │ └── ValueNode.java │ │ │ └── tool │ │ │ │ ├── AbstractToolSession.java │ │ │ │ ├── BoxMoveTool.java │ │ │ │ ├── BoxResizeTool.java │ │ │ │ ├── BoxToolProvider.java │ │ │ │ └── DelegateToolProvider.java │ │ │ ├── element │ │ │ ├── ArmorStandElement.java │ │ │ ├── ArmorStandElementProvider.java │ │ │ ├── ArmorStandElementType.java │ │ │ ├── ArmorStandPartToolProvider.java │ │ │ ├── ArmorStandToolProvider.java │ │ │ ├── ElementSpawnRequestImpl.java │ │ │ ├── EntityElementListener.java │ │ │ ├── EntityElementProviderRegistryImpl.java │ │ │ ├── EntityElementReferenceImpl.java │ │ │ ├── SimpleEntityElement.java │ │ │ ├── SimpleEntityElementProvider.java │ │ │ ├── SimpleEntityElementType.java │ │ │ └── SimpleEntityToolProvider.java │ │ │ ├── group │ │ │ ├── Group.java │ │ │ ├── GroupMember.java │ │ │ ├── GroupPositionProvider.java │ │ │ ├── node │ │ │ │ └── GroupRootNode.java │ │ │ ├── property │ │ │ │ ├── GroupPendingChange.java │ │ │ │ ├── GroupProperty.java │ │ │ │ └── GroupPropertyContainer.java │ │ │ └── tool │ │ │ │ ├── GroupAxisMoveTool.java │ │ │ │ ├── GroupAxisRotateTool.java │ │ │ │ ├── GroupMoveTool.java │ │ │ │ ├── GroupScalarToolSession.java │ │ │ │ ├── GroupToolProvider.java │ │ │ │ └── GroupToolSession.java │ │ │ ├── history │ │ │ ├── ChangeKey.java │ │ │ ├── ChangeTracker.java │ │ │ ├── History.java │ │ │ ├── HistoryManager.java │ │ │ └── action │ │ │ │ ├── Action.java │ │ │ │ ├── ElementCreateAction.java │ │ │ │ ├── ElementDestroyAction.java │ │ │ │ ├── ElementPresenceAction.java │ │ │ │ ├── GroupAction.java │ │ │ │ └── PropertyAction.java │ │ │ ├── item │ │ │ ├── ItemRenderer.java │ │ │ ├── SimpleItemTemplate.java │ │ │ ├── StyleItemRenderer.java │ │ │ └── TranslatorItemRenderer.java │ │ │ ├── menu │ │ │ ├── ColorPickerMenuContext.java │ │ │ ├── ColorPicketContextWrapper.java │ │ │ ├── ElementMenuContext.java │ │ │ ├── MenuImpl.java │ │ │ ├── MenuListener.java │ │ │ ├── MenuProviderImpl.java │ │ │ ├── MenuSlotTypeRegistryImpl.java │ │ │ ├── SimpleMenuContext.java │ │ │ ├── factory │ │ │ │ ├── MenuFactoryBuilderImpl.java │ │ │ │ └── MenuFactoryImpl.java │ │ │ └── slot │ │ │ │ ├── ArmorStandPartSlot.java │ │ │ │ ├── ArmorStandPartSlotFactory.java │ │ │ │ ├── ArmorStandPartSlotType.java │ │ │ │ ├── ArmorStandPositionResetAction.java │ │ │ │ ├── ArmorStandPositionSlotFactory.java │ │ │ │ ├── ArmorStandPositionSlotType.java │ │ │ │ ├── ArmorStandSpawnSlotType.java │ │ │ │ ├── BackgroundSlot.java │ │ │ │ ├── BackgroundSlotFactory.java │ │ │ │ ├── BackgroundSlotType.java │ │ │ │ ├── ColorPickerSlot.java │ │ │ │ ├── ColorPickerSlotFactory.java │ │ │ │ ├── ColorPickerSlotType.java │ │ │ │ ├── DestroySlot.java │ │ │ │ ├── DestroySlotFactory.java │ │ │ │ ├── DestroySlotType.java │ │ │ │ ├── EntityCopySlot.java │ │ │ │ ├── EntityCopySlotFactory.java │ │ │ │ ├── EntityCopySlotType.java │ │ │ │ ├── FallbackSlotFactory.java │ │ │ │ ├── FallbackSlotType.java │ │ │ │ ├── ItemPropertySlot.java │ │ │ │ ├── NodeSlot.java │ │ │ │ ├── PropertySlotFactory.java │ │ │ │ ├── PropertySlotType.java │ │ │ │ ├── SpawnSlot.java │ │ │ │ └── SpawnSlotFactory.java │ │ │ ├── message │ │ │ ├── Message.java │ │ │ ├── MessageManager.java │ │ │ └── MessageStyle.java │ │ │ ├── particle │ │ │ ├── EditorParticle.java │ │ │ ├── GizmoAdapter.java │ │ │ ├── GizmoCircleParticle.java │ │ │ ├── GizmoLineParticle.java │ │ │ ├── GizmoParticle.java │ │ │ ├── GizmoParticleProvider.java │ │ │ ├── GizmoPointParticle.java │ │ │ └── LineBoundingBoxParticle.java │ │ │ ├── permission │ │ │ ├── Child.java │ │ │ ├── Children.java │ │ │ ├── Description.java │ │ │ └── Permissions.java │ │ │ ├── property │ │ │ ├── PermissionCheckedPropertyContainer.java │ │ │ ├── PermissionCheckedPropertyWrapper.java │ │ │ ├── TrackedPendingChangeWrapper.java │ │ │ ├── TrackedPropertyContainer.java │ │ │ ├── TrackedPropertyWrapper.java │ │ │ ├── armorstand │ │ │ │ ├── ArmorStandArmsProperty.java │ │ │ │ ├── ArmorStandBasePlateProperty.java │ │ │ │ ├── ArmorStandCanTickProperty.java │ │ │ │ ├── ArmorStandGravityProperty.java │ │ │ │ ├── ArmorStandInvulnerabilityProperty.java │ │ │ │ ├── ArmorStandLockProperty.java │ │ │ │ ├── ArmorStandMarkerProperty.java │ │ │ │ ├── ArmorStandPoseProperty.java │ │ │ │ ├── ArmorStandSizeProperty.java │ │ │ │ └── ArmorStandVisibilityProperty.java │ │ │ ├── button │ │ │ │ ├── BooleanToggleButton.java │ │ │ │ ├── ComponentButton.java │ │ │ │ ├── EnumToggleButton.java │ │ │ │ ├── GravityToggleButton.java │ │ │ │ ├── OptionalComponentButton.java │ │ │ │ ├── PropertyButton.java │ │ │ │ └── ToggleButton.java │ │ │ ├── entity │ │ │ │ ├── EntityAIProperty.java │ │ │ │ ├── EntityCustomNameProperty.java │ │ │ │ ├── EntityCustomNameVisibleProperty.java │ │ │ │ ├── EntityEquipmentProperty.java │ │ │ │ ├── EntityGlowingProperty.java │ │ │ │ ├── EntityLocationProperty.java │ │ │ │ ├── EntityScaleProperty.java │ │ │ │ ├── EntitySilentProperty.java │ │ │ │ └── EntityTagsProperty.java │ │ │ └── type │ │ │ │ ├── BooleanPropertyType.java │ │ │ │ ├── BooleanTogglePropertyType.java │ │ │ │ ├── ComponentPropertyType.java │ │ │ │ ├── ConfigurablePropertyType.java │ │ │ │ ├── DefaultPropertyTypes.java │ │ │ │ ├── DoublePropertyType.java │ │ │ │ ├── EnumPropertyType.java │ │ │ │ ├── EnumTogglePropertyType.java │ │ │ │ ├── EulerAnglePropertyType.java │ │ │ │ ├── FloatPropertyType.java │ │ │ │ ├── GravityPropertyType.java │ │ │ │ ├── IntegerPropertyType.java │ │ │ │ ├── ItemPropertyType.java │ │ │ │ ├── LocationPropertyType.java │ │ │ │ ├── OptionalComponentPropertyType.java │ │ │ │ ├── PropertyTypeRegistryImpl.java │ │ │ │ ├── QuaternionfcPropertyType.java │ │ │ │ ├── StringSetPropertyType.java │ │ │ │ └── Vector3fcPropertyType.java │ │ │ ├── region │ │ │ ├── RegionListener.java │ │ │ └── RegionListenerManager.java │ │ │ ├── session │ │ │ ├── EyeRayImpl.java │ │ │ ├── MenuButtonProviderImpl.java │ │ │ ├── NodeProviderImpl.java │ │ │ ├── NodeStack.java │ │ │ ├── SessionImpl.java │ │ │ ├── SessionListener.java │ │ │ ├── SessionManagerImpl.java │ │ │ ├── SessionSnapper.java │ │ │ └── context │ │ │ │ ├── AddContextImpl.java │ │ │ │ ├── ClickContextImpl.java │ │ │ │ ├── EnterContextImpl.java │ │ │ │ ├── ExitContextImpl.java │ │ │ │ ├── RemoveContextImpl.java │ │ │ │ └── UpdateContextImpl.java │ │ │ ├── update │ │ │ ├── SpigotVersionFetcher.java │ │ │ ├── UpdateListener.java │ │ │ └── UpdateManager.java │ │ │ └── util │ │ │ ├── AlignAxis.java │ │ │ ├── ArmorStandPartInfo.java │ │ │ ├── Cursor2D.java │ │ │ ├── Cursor3D.java │ │ │ ├── EasMath.java │ │ │ ├── JOMLMapper.java │ │ │ ├── NativeComponentMapper.java │ │ │ ├── PropertyCopier.java │ │ │ ├── ReflectionUtil.java │ │ │ └── Util.java │ └── resources │ │ ├── config.yml │ │ ├── me │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── messages.properties │ │ ├── menu │ │ ├── color_picker.yml │ │ ├── entity │ │ │ ├── default.yml │ │ │ ├── display.yml │ │ │ ├── item_holder.yml │ │ │ ├── living.yml │ │ │ └── type │ │ │ │ ├── armor_stand.yml │ │ │ │ ├── block_display.yml │ │ │ │ ├── interaction.yml │ │ │ │ ├── item_display.yml │ │ │ │ └── text_display.yml │ │ ├── fancyholograms │ │ │ ├── block.yml │ │ │ ├── item.yml │ │ │ └── text.yml │ │ └── spawn.yml │ │ ├── plugin.yml │ │ └── properties.yml │ ├── v1_10_2 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── entitytag │ │ │ └── v1_10_2 │ │ │ └── EntityTagCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_11 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── itemcolor │ │ │ └── v1_11 │ │ │ │ └── ItemColorCapabilityProvider.java │ │ │ └── spawn │ │ │ └── v1_11 │ │ │ └── SpawnCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_12 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── entitysize │ │ │ └── v1_12 │ │ │ │ └── EntitySizeCapabilityProvider.java │ │ │ └── lookup │ │ │ └── v1_12 │ │ │ └── LookupCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_12_paper │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── tick │ │ │ └── v1_12_paper │ │ │ └── TickCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_13 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── item │ │ │ └── v1_13 │ │ │ │ └── ItemCapabilityProvider.java │ │ │ └── persistence │ │ │ └── v1_13 │ │ │ └── PersistenceCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_14 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── tool │ │ │ └── v1_14 │ │ │ └── ToolCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_15_2 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── equipment │ │ │ └── v1_15_2 │ │ │ └── EquipmentCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_16 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── lock │ │ │ └── v1_16 │ │ │ └── LockCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_16_paper │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── component │ │ │ └── v1_16_paper │ │ │ └── ComponentCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_18 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── visibility │ │ │ └── v1_18 │ │ │ └── VisibilityCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_18_paper │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── entitytype │ │ │ └── v1_18_paper │ │ │ └── EntityTypeCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_19_4 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── entitytype │ │ │ └── v1_19_4 │ │ │ └── EntityTypeCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_20_2 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── egg │ │ │ └── v1_20_2 │ │ │ │ └── SpawnEggCapabilityProvider.java │ │ │ └── spawn │ │ │ └── v1_20_2 │ │ │ └── SpawnCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_20_6 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ └── entityscale │ │ │ └── v1_20_6 │ │ │ └── EntityScaleCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_8 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── component │ │ │ └── v1_8 │ │ │ │ └── ComponentCapabilityProvider.java │ │ │ ├── entitytype │ │ │ └── v1_8 │ │ │ │ └── EntityTypeCapabilityProvider.java │ │ │ ├── equipment │ │ │ └── v1_8 │ │ │ │ └── EquipmentCapabilityProvider.java │ │ │ ├── invulnerability │ │ │ └── v1_8 │ │ │ │ └── InvulnerabilityCapabilityProvider.java │ │ │ ├── item │ │ │ └── v1_8 │ │ │ │ └── ItemCapabilityProvider.java │ │ │ ├── itemcolor │ │ │ └── v1_8 │ │ │ │ └── ItemColorCapabilityProvider.java │ │ │ ├── lock │ │ │ └── v1_8 │ │ │ │ └── LockCapabilityProvider.java │ │ │ ├── lookup │ │ │ └── v1_8 │ │ │ │ └── LookupCapabilityProvider.java │ │ │ ├── spawn │ │ │ └── v1_8 │ │ │ │ └── SpawnCapabilityProvider.java │ │ │ └── tool │ │ │ └── v1_8 │ │ │ └── ToolCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ ├── v1_9 │ ├── java │ │ └── me │ │ │ └── m56738 │ │ │ └── easyarmorstands │ │ │ └── capability │ │ │ ├── entityai │ │ │ └── v1_9 │ │ │ │ └── EntityAICapabilityProvider.java │ │ │ ├── equipment │ │ │ └── v1_9 │ │ │ │ └── EquipmentCapabilityProvider.java │ │ │ ├── glow │ │ │ └── v1_9 │ │ │ │ └── GlowCapabilityProvider.java │ │ │ ├── handswap │ │ │ └── v1_9 │ │ │ │ └── SwapHandItemsCapabilityProvider.java │ │ │ └── invulnerability │ │ │ └── v1_9 │ │ │ └── InvulnerabilityCapabilityProvider.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── me.m56738.easyarmorstands.capability.CapabilityProvider │ └── v1_9_spigot │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── capability │ │ └── silent │ │ └── v1_9_spigot │ │ └── SilentCapabilityProvider.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.capability.CapabilityProvider ├── easyarmorstands-residence ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── residence │ │ ├── ResidenceAddon.java │ │ ├── ResidenceAddonFactory.java │ │ └── ResidencePrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-towny ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── towny │ │ ├── TownyAddon.java │ │ ├── TownyAddonFactory.java │ │ └── TownyPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-traincarts ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── traincarts │ │ ├── TrainCartsAddon.java │ │ ├── TrainCartsAddonFactory.java │ │ ├── TrainCartsModelListingSlot.java │ │ ├── TrainCartsModelListingSlotFactory.java │ │ └── TrainCartsModelListingSlotType.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-worldguard-v6 ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── worldguard │ │ └── v6 │ │ ├── WorldGuardAddon.java │ │ ├── WorldGuardAddonFactory.java │ │ └── WorldGuardPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── easyarmorstands-worldguard-v7 ├── build.gradle.kts └── src │ └── main │ ├── java │ └── me │ │ └── m56738 │ │ └── easyarmorstands │ │ └── worldguard │ │ └── v7 │ │ ├── WorldGuardAddon.java │ │ ├── WorldGuardAddonFactory.java │ │ └── WorldGuardPrivilegeChecker.java │ └── resources │ └── META-INF │ └── services │ └── me.m56738.easyarmorstands.addon.AddonFactory ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | on: 2 | - push 3 | - pull_request 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | with: 11 | submodules: 'true' 12 | - uses: actions/setup-java@v4 13 | with: 14 | java-version: '17' 15 | distribution: 'temurin' 16 | - uses: gradle/actions/setup-gradle@v4 17 | - name: Build 18 | run: ./gradlew build 19 | - name: Publish 20 | run: ./gradlew publish publishAllPublicationsToHangar 21 | env: 22 | ORG_GRADLE_PROJECT_MGDevUsername: ${{ secrets.MAVEN_USERNAME }} 23 | ORG_GRADLE_PROJECT_MGDevPassword: ${{ secrets.MAVEN_PASSWORD }} 24 | HANGAR_API_TOKEN: ${{ secrets.HANGAR_API_TOKEN }} 25 | if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} 26 | - uses: actions/upload-artifact@v4 27 | with: 28 | name: Package 29 | path: easyarmorstands-plugin/build/EasyArmorStands-*.jar 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .gradle/ 3 | build/ 4 | out/ 5 | run/ 6 | -------------------------------------------------------------------------------- /build-logic/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | } 4 | 5 | repositories { 6 | gradlePluginPortal() 7 | } 8 | -------------------------------------------------------------------------------- /build-logic/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "build-logic" 2 | -------------------------------------------------------------------------------- /build-logic/src/main/kotlin/easyarmorstands.publish.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.gradle.api.credentials.PasswordCredentials 2 | 3 | plugins { 4 | id("java-library") 5 | id("maven-publish") 6 | } 7 | 8 | java { 9 | withSourcesJar() 10 | withJavadocJar() 11 | } 12 | 13 | publishing { 14 | repositories { 15 | maven("https://ci.mg-dev.eu/plugin/repository/everything") { 16 | name = "MGDev" 17 | credentials(PasswordCredentials::class) 18 | authentication { 19 | create("basic") 20 | } 21 | } 22 | } 23 | 24 | publications { 25 | create("maven") { 26 | from(components["java"]) 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/ArmorStandSize.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api; 2 | 3 | import org.bukkit.entity.ArmorStand; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | import java.util.Locale; 7 | 8 | public enum ArmorStandSize { 9 | SMALL(0.25, 0.9875), 10 | NORMAL(0.5, 1.975); 11 | 12 | private final double width; 13 | private final double height; 14 | 15 | ArmorStandSize(double width, double height) { 16 | this.width = width; 17 | this.height = height; 18 | } 19 | 20 | public static @NotNull ArmorStandSize get(@NotNull ArmorStand entity) { 21 | return entity.isSmall() ? SMALL : NORMAL; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return name().toLowerCase(Locale.ROOT); 27 | } 28 | 29 | public boolean isSmall() { 30 | return this == SMALL; 31 | } 32 | 33 | public double getWidth() { 34 | return width; 35 | } 36 | 37 | public double getHeight() { 38 | return height; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/EasyArmorStandsHolder.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api; 2 | 3 | class EasyArmorStandsHolder { 4 | static EasyArmorStands instance; 5 | } 6 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/SessionManager.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public interface SessionManager { 9 | @Contract(pure = true) 10 | @Nullable Session getSession(@NotNull Player player); 11 | 12 | @NotNull Session startSession(@NotNull Player player); 13 | 14 | void stopSession(@NotNull Session session); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/Snapper.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.joml.Vector3d; 7 | 8 | @ApiStatus.NonExtendable 9 | public interface Snapper { 10 | @Contract(pure = true) 11 | double snapOffset(double offset); 12 | 13 | default void snapOffset(@NotNull Vector3d offset) { 14 | offset.x = snapOffset(offset.x); 15 | offset.y = snapOffset(offset.y); 16 | offset.z = snapOffset(offset.z); 17 | } 18 | 19 | @Contract(pure = true) 20 | double snapPosition(double position); 21 | 22 | default void snapPosition(@NotNull Vector3d position) { 23 | position.x = snapPosition(position.x); 24 | position.y = snapPosition(position.y); 25 | position.z = snapPosition(position.z); 26 | } 27 | 28 | @Contract(pure = true) 29 | double snapAngle(double angle); 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/AxisMoveButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface AxisMoveButton extends MenuButton { 9 | @NotNull Node createNode(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/AxisRotateButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface AxisRotateButton extends MenuButton { 9 | @NotNull Node createNode(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/AxisScaleButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface AxisScaleButton extends MenuButton { 9 | @NotNull Node createNode(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/ButtonResultImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.joml.Vector3dc; 5 | 6 | class ButtonResultImpl implements ButtonResult { 7 | private final Vector3dc position; 8 | private final int priority; 9 | 10 | ButtonResultImpl(Vector3dc position, int priority) { 11 | this.position = position; 12 | this.priority = priority; 13 | } 14 | 15 | @Override 16 | public @NotNull Vector3dc position() { 17 | return position; 18 | } 19 | 20 | @Override 21 | public int priority() { 22 | return priority; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/MenuButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import net.kyori.adventure.text.Component; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.jetbrains.annotations.Nullable; 7 | import org.joml.Vector3dc; 8 | 9 | public interface MenuButton { 10 | @NotNull Button getButton(); 11 | 12 | @NotNull Component getName(); 13 | 14 | void onClick(@NotNull Session session, @Nullable Vector3dc cursor); 15 | 16 | default boolean isAlwaysFocused() { 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/MenuButtonProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface MenuButtonProvider { 9 | @Contract(pure = true) 10 | @NotNull MoveButtonBuilder move(); 11 | 12 | @Contract(pure = true) 13 | @NotNull AxisMoveButtonBuilder axisMove(); 14 | 15 | @Contract(pure = true) 16 | @NotNull ScaleButtonBuilder scale(); 17 | 18 | @Contract(pure = true) 19 | @NotNull AxisScaleButtonBuilder axisScale(); 20 | 21 | @Contract(pure = true) 22 | @NotNull AxisRotateButtonBuilder axisRotate(); 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/MoveButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface MoveButton extends MenuButton { 9 | @NotNull Node createNode(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/button/ScaleButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface ScaleButton extends MenuButton { 9 | @NotNull Node createNode(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/context/AddContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.context; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | 5 | @ApiStatus.NonExtendable 6 | public interface AddContext { 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/context/ClickContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.context; 2 | 3 | import me.m56738.easyarmorstands.api.editor.EyeRay; 4 | import org.bukkit.block.Block; 5 | import org.bukkit.entity.Entity; 6 | import org.jetbrains.annotations.ApiStatus; 7 | import org.jetbrains.annotations.Contract; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | @ApiStatus.NonExtendable 12 | public interface ClickContext { 13 | @Contract(pure = true) 14 | @NotNull EyeRay eyeRay(); 15 | 16 | @Contract(pure = true) 17 | @NotNull Type type(); 18 | 19 | @Contract(pure = true) 20 | @Nullable Entity entity(); 21 | 22 | @Contract(pure = true) 23 | @Nullable Block block(); 24 | 25 | enum Type { 26 | LEFT_CLICK, 27 | RIGHT_CLICK, 28 | SWAP_HANDS 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/context/ExitContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.context; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | 5 | @ApiStatus.NonExtendable 6 | public interface ExitContext { 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/context/RemoveContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.context; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | 5 | @ApiStatus.NonExtendable 6 | public interface RemoveContext { 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/context/UpdateContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.context; 2 | 3 | import me.m56738.easyarmorstands.api.editor.EyeRay; 4 | import net.kyori.adventure.text.ComponentLike; 5 | import org.jetbrains.annotations.ApiStatus; 6 | import org.jetbrains.annotations.Contract; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.joml.Vector2dc; 9 | 10 | @ApiStatus.NonExtendable 11 | public interface UpdateContext { 12 | @Contract(pure = true) 13 | @NotNull EyeRay eyeRay(); 14 | 15 | @Contract(pure = true) 16 | @NotNull EyeRay eyeRay(@NotNull Vector2dc cursor); 17 | 18 | void setActionBar(@NotNull ComponentLike actionBar); 19 | 20 | void setTitle(@NotNull ComponentLike title); 21 | 22 | void setSubtitle(@NotNull ComponentLike subtitle); 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/node/ElementNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public interface ElementNode extends Node { 8 | @Contract(pure = true) 9 | @NotNull Element getElement(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/node/ElementSelectionNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.element.ElementDiscoverySource; 4 | import me.m56738.easyarmorstands.api.element.SelectableElement; 5 | import org.jetbrains.annotations.ApiStatus; 6 | import org.jetbrains.annotations.Contract; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Unmodifiable; 9 | 10 | import java.util.List; 11 | 12 | @ApiStatus.NonExtendable 13 | public interface ElementSelectionNode extends Node { 14 | @Contract(pure = true) 15 | double getRange(); 16 | 17 | void setRange(double range); 18 | 19 | void addSource(@NotNull ElementDiscoverySource source); 20 | 21 | void removeSource(@NotNull ElementDiscoverySource source); 22 | 23 | @Unmodifiable 24 | @NotNull 25 | Iterable getSources(); 26 | 27 | boolean selectElement(@NotNull SelectableElement element); 28 | 29 | boolean selectElements(@NotNull List elements); 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/node/NodeProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.node; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface NodeProvider { 9 | @Contract(pure = true) 10 | @NotNull ElementSelectionNode elementSelectionNode(); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/node/ResettableNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.node; 2 | 3 | public interface ResettableNode extends Node { 4 | void reset(); 5 | } 6 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisMoveTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisMoveTool extends AxisTool { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisMoveToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisMoveToolSession extends AxisToolSession { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisRotateTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import org.bukkit.Location; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface AxisRotateTool extends AxisTool { 9 | static @NotNull AxisRotateTool ofYaw(@NotNull ToolContext context, @NotNull PropertyContainer properties, @NotNull Property locationProperty) { 10 | return new LocationYawRotateTool(context, properties, locationProperty); 11 | } 12 | 13 | static @NotNull AxisRotateTool ofPitch(@NotNull ToolContext context, @NotNull PropertyContainer properties, @NotNull Property locationProperty) { 14 | return new LocationPitchRotateTool(context, properties, locationProperty); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisRotateToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisRotateToolSession extends AxisToolSession { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisScaleTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisScaleTool extends AxisTool { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisScaleToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisScaleToolSession extends AxisToolSession { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.Axis; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public interface AxisTool extends PositionedTool, OrientedTool { 8 | @Contract(pure = true) 9 | @NotNull Axis getAxis(); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/AxisToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface AxisToolSession extends ScalarToolSession { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/MoveTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import org.bukkit.Location; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface MoveTool extends PositionedTool, OrientedTool { 9 | static @NotNull MoveTool of( 10 | @NotNull ToolContext context, 11 | @NotNull PropertyContainer properties, 12 | @NotNull Property locationProperty) { 13 | return new LocationMoveTool(context, properties, locationProperty); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/MoveToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Snapper; 4 | import org.bukkit.entity.Player; 5 | import org.jetbrains.annotations.Contract; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.joml.Vector3d; 8 | import org.joml.Vector3dc; 9 | 10 | public interface MoveToolSession extends ToolSession { 11 | void setChange(@NotNull Vector3dc change); 12 | 13 | @Contract(pure = true) 14 | void snapChange(@NotNull Vector3d change, @NotNull Snapper context); 15 | 16 | @Contract(pure = true) 17 | @NotNull Vector3dc getPosition(); 18 | 19 | void setPosition(@NotNull Vector3dc position); 20 | 21 | default boolean canSetPosition(Player player) { 22 | return true; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/OrientedTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.util.RotationProvider; 4 | 5 | public interface OrientedTool extends Tool, RotationProvider { 6 | } 7 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/PositionedTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.util.PositionProvider; 4 | 5 | public interface PositionedTool extends Tool, PositionProvider { 6 | } 7 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ScalarToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Snapper; 4 | import org.bukkit.entity.Player; 5 | import org.jetbrains.annotations.Contract; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface ScalarToolSession extends ToolSession { 9 | void setChange(double change); 10 | 11 | @Contract(pure = true) 12 | double snapChange(double change, @NotNull Snapper context); 13 | 14 | default boolean canSetValue(Player player) { 15 | return true; 16 | } 17 | 18 | default void setValue(double value) { 19 | setChange(value); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ScaleTool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import org.bukkit.Location; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface ScaleTool extends PositionedTool, OrientedTool { 9 | static @NotNull ScaleTool of( 10 | @NotNull ToolContext context, 11 | @NotNull PropertyContainer properties, 12 | @NotNull Property locationProperty, 13 | @NotNull Property scaleProperty, 14 | double minScale, 15 | double maxScale) { 16 | return new ScalarScaleTool(context, properties, locationProperty, scaleProperty, minScale, maxScale); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ScaleToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | public interface ScaleToolSession extends ScalarToolSession { 4 | } 5 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/Tool.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public interface Tool { 8 | @NotNull S start(); 9 | 10 | @Contract(pure = true) 11 | default boolean canUse(@NotNull Player player) { 12 | return true; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ToolContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.util.PositionProvider; 4 | import me.m56738.easyarmorstands.api.util.RotationProvider; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public interface ToolContext { 8 | static @NotNull ToolContext of( 9 | @NotNull PositionProvider positionProvider, 10 | @NotNull RotationProvider rotationProvider) { 11 | return new ToolContextImpl(positionProvider, rotationProvider); 12 | } 13 | 14 | @NotNull PositionProvider position(); 15 | 16 | @NotNull RotationProvider rotation(); 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ToolContextImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.util.PositionProvider; 4 | import me.m56738.easyarmorstands.api.util.RotationProvider; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | class ToolContextImpl implements ToolContext { 8 | private final @NotNull PositionProvider positionProvider; 9 | private final @NotNull RotationProvider rotationProvider; 10 | 11 | ToolContextImpl( 12 | @NotNull PositionProvider positionProvider, 13 | @NotNull RotationProvider rotationProvider) { 14 | this.positionProvider = positionProvider; 15 | this.rotationProvider = rotationProvider; 16 | } 17 | 18 | @Override 19 | public @NotNull PositionProvider position() { 20 | return positionProvider; 21 | } 22 | 23 | @Override 24 | public @NotNull RotationProvider rotation() { 25 | return rotationProvider; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/tool/ToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.tool; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface ToolSession { 8 | void revert(); 9 | 10 | void commit(@Nullable Component description); 11 | 12 | @Contract(pure = true) 13 | boolean isValid(); 14 | 15 | @Contract(pure = true) 16 | default @Nullable Component getStatus() { 17 | return null; 18 | } 19 | 20 | @Contract(pure = true) 21 | @Nullable Component getDescription(); 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/editor/util/ToolMenuMode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.editor.util; 2 | 3 | import net.kyori.adventure.text.Component; 4 | 5 | public enum ToolMenuMode { 6 | LOCAL(Component.translatable("easyarmorstands.node.local")), 7 | GLOBAL(Component.translatable("easyarmorstands.node.global")), 8 | SCALE(Component.translatable("easyarmorstands.node.scale")); 9 | 10 | private final Component name; 11 | 12 | ToolMenuMode(Component name) { 13 | this.name = name; 14 | } 15 | 16 | public Component getName() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/ConfigurableEntityElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.property.PropertyRegistry; 4 | import org.bukkit.entity.Entity; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * An element which allows registering properties into it. 9 | * 10 | * @see me.m56738.easyarmorstands.api.event.element.EntityElementInitializeEvent EntityElementInitializeEvent 11 | */ 12 | public interface ConfigurableEntityElement extends EntityElement { 13 | @Override 14 | @NotNull PropertyRegistry getProperties(); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/DestroyableElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * An element which can be destroyed. 9 | */ 10 | public interface DestroyableElement extends Element { 11 | /** 12 | * Destroys this element. 13 | */ 14 | void destroy(); 15 | 16 | /** 17 | * Checks whether a player is allowed to destroy this element. 18 | * 19 | * @param player the player 20 | * @return whether the element may be destroyed 21 | */ 22 | @Contract(pure = true) 23 | boolean canDestroy(@NotNull Player player); 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/ElementDiscoveryEntry.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | /** 6 | * A discovered selectable element. 7 | *

8 | * Must implement {@link Object#equals equals} and {@link Object#hashCode hashCode}. 9 | * Discovering and comparing entries should be as fast as possible. 10 | *

11 | * This is used to deduplicate discovered elements. 12 | */ 13 | public interface ElementDiscoveryEntry { 14 | /** 15 | * Attempts to create an element instance representing this entry. 16 | *

17 | * May return {@code null}. 18 | * 19 | * @return the discovered element or {@code null} 20 | */ 21 | @Nullable SelectableElement getElement(); 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/ElementDiscoverySource.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.util.BoundingBox; 4 | import org.bukkit.World; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.function.Consumer; 8 | 9 | /** 10 | * A source which can discover elements inside a bounding box. 11 | * 12 | * @see me.m56738.easyarmorstands.api.editor.node.ElementSelectionNode#addSource(ElementDiscoverySource) Registering sources 13 | */ 14 | public interface ElementDiscoverySource { 15 | /** 16 | * Returns entries for all potential elements inside the provided bounding box. 17 | *

18 | * Should be as fast as possible and not perform any expensive checks. 19 | * 20 | * @param world the queried world 21 | * @param box the queried bounding box 22 | * @param consumer a consumer which should be called for each potential element 23 | */ 24 | void discover(@NotNull World world, @NotNull BoundingBox box, @NotNull Consumer<@NotNull ElementDiscoveryEntry> consumer); 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/EntityElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import org.bukkit.entity.Entity; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * An element which represents an entity. 9 | */ 10 | public interface EntityElement extends Element { 11 | /** 12 | * Returns the entity represented by this element. 13 | * 14 | * @return the entity 15 | */ 16 | @Contract(pure = true) 17 | @NotNull E getEntity(); 18 | 19 | @Override 20 | @NotNull EntityElementType getType(); 21 | 22 | @Override 23 | default @NotNull EntityElementReference getReference() { 24 | return EntityElementReference.of(getType(), getEntity()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/EntityElementProviderRegistry.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.EasyArmorStands; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | /** 7 | * Registry for {@link EntityElementProvider entity element providers}. 8 | * 9 | * @see EasyArmorStands#entityElementProviderRegistry() 10 | */ 11 | public interface EntityElementProviderRegistry { 12 | /** 13 | * Registers an element provider. 14 | * 15 | * @param provider the provider 16 | */ 17 | void register(@NotNull EntityElementProvider provider); 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/EntityElementReference.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.EasyArmorStands; 4 | import org.bukkit.entity.Entity; 5 | import org.jetbrains.annotations.Contract; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | import java.util.UUID; 10 | 11 | public interface EntityElementReference extends ElementReference { 12 | static EntityElementReference of(EntityElementType type, E entity) { 13 | return EasyArmorStands.get().createReference(type, entity); 14 | } 15 | 16 | @Override 17 | @NotNull EntityElementType getType(); 18 | 19 | @Override 20 | @Nullable EntityElement getElement(); 21 | 22 | @Contract(pure = true) 23 | @NotNull UUID getId(); 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/EntityElementType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 4 | import org.bukkit.entity.Entity; 5 | import org.bukkit.entity.EntityType; 6 | import org.jetbrains.annotations.Contract; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public interface EntityElementType extends ElementType { 11 | @Contract(pure = true) 12 | @NotNull EntityType getEntityType(); 13 | 14 | @Contract(pure = true) 15 | @NotNull Class getEntityClass(); 16 | 17 | @Contract(pure = true) 18 | @Nullable EntityElement getElement(@NotNull E entity); 19 | 20 | @Override 21 | @Nullable EntityElement createElement(@NotNull PropertyContainer properties); 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/MenuElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | /** 7 | * An element which is able to show a menu. 8 | */ 9 | public interface MenuElement extends EditableElement { 10 | /** 11 | * Opens the menu. 12 | * 13 | * @param player the player 14 | */ 15 | void openMenu(@NotNull Player player); 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/NamedElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * An element which has a name. 9 | */ 10 | public interface NamedElement extends Element { 11 | /** 12 | * Returns the name of the element. 13 | * 14 | * @return the name 15 | */ 16 | @Contract(pure = true) 17 | @NotNull Component getName(); 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/element/SelectableElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.element; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import me.m56738.easyarmorstands.api.editor.button.Button; 5 | import me.m56738.easyarmorstands.api.editor.node.Node; 6 | import org.jetbrains.annotations.Contract; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * An element which can be selected in the editor. 11 | */ 12 | public interface SelectableElement extends EditableElement, NamedElement { 13 | /** 14 | * Creates a button which allows selecting the element. 15 | * 16 | * @param session the session 17 | * @return a button 18 | */ 19 | @Contract(pure = true) 20 | @NotNull Button createButton(@NotNull Session session); 21 | 22 | /** 23 | * Creates a node which allows editing the element. 24 | * 25 | * @param session the session 26 | * @return a node 27 | */ 28 | @Contract(pure = true) 29 | @NotNull Node createNode(@NotNull Session session); 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/event/session/SessionEvent.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.event.session; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import org.bukkit.event.player.PlayerEvent; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public abstract class SessionEvent extends PlayerEvent { 8 | private final Session session; 9 | 10 | public SessionEvent(@NotNull Session session) { 11 | super(session.player()); 12 | this.session = session; 13 | } 14 | 15 | public @NotNull Session getSession() { 16 | return session; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/event/session/SessionStartEvent.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.event.session; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import org.bukkit.event.HandlerList; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * Called when a session is started. 9 | */ 10 | public class SessionStartEvent extends SessionEvent { 11 | private static final HandlerList handlerList = new HandlerList(); 12 | 13 | public SessionStartEvent(@NotNull Session session) { 14 | super(session); 15 | } 16 | 17 | public static @NotNull HandlerList getHandlerList() { 18 | return handlerList; 19 | } 20 | 21 | @Override 22 | public @NotNull HandlerList getHandlers() { 23 | return handlerList; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/event/session/SessionStopEvent.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.event.session; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import org.bukkit.event.HandlerList; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * Called when a session is stopped. 9 | */ 10 | public class SessionStopEvent extends SessionEvent { 11 | private static final HandlerList handlerList = new HandlerList(); 12 | 13 | public SessionStopEvent(@NotNull Session session) { 14 | super(session); 15 | } 16 | 17 | public static @NotNull HandlerList getHandlerList() { 18 | return handlerList; 19 | } 20 | 21 | @Override 22 | public @NotNull HandlerList getHandlers() { 23 | return handlerList; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/history/EntityReplacementListener.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.history; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.UUID; 6 | 7 | public interface EntityReplacementListener { 8 | /** 9 | * When an entity is spawned, it has a random UUID. 10 | * For example, to undo a destroy action, we spawn a replacement entity. 11 | * All references to the old UUID must be updated to the new UUID. 12 | * 13 | * @param oldId The UUID of the entity which was replaced. 14 | * @param newId The UUID of the replacement. 15 | */ 16 | void onEntityReplaced(@NotNull UUID oldId, @NotNull UUID newId); 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/ColorPickerContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.bukkit.Color; 4 | import org.bukkit.inventory.ItemStack; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public interface ColorPickerContext { 8 | @NotNull ItemStack item(); 9 | 10 | @NotNull Color getColor(); 11 | 12 | void setColor(@NotNull Color color); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuClickInterceptor.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | public interface MenuClickInterceptor { 6 | void interceptClick(@NotNull MenuClick click); 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuCloseListener.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | public interface MenuCloseListener { 7 | void onClose(@NotNull Player player, @NotNull Menu menu); 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | 5 | @ApiStatus.NonExtendable 6 | public interface MenuContext extends MenuSlotContext { 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | public interface MenuFactory { 4 | Menu createMenu(MenuContext context); 5 | } 6 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuFactoryBuilder.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | public interface MenuFactoryBuilder { 7 | @Nullable 8 | MenuSlotFactory setSlot(int slot, @Nullable MenuSlotFactory factory); 9 | 10 | void setTitleTemplate(@NotNull String titleTemplate); 11 | 12 | void setHeight(int height); 13 | 14 | void setBackground(@Nullable MenuSlotFactory background); 15 | 16 | @NotNull 17 | MenuFactory build(); 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import me.m56738.easyarmorstands.api.element.Element; 5 | import org.bukkit.entity.Player; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface MenuProvider { 9 | @NotNull 10 | Menu createColorPicker(@NotNull Player player, @NotNull ColorPickerContext context); 11 | 12 | @NotNull 13 | MenuFactoryBuilder menuFactoryBuilder(); 14 | 15 | @NotNull 16 | MenuContext context(@NotNull Player player); 17 | 18 | @NotNull 19 | MenuContext context(@NotNull Player player, @NotNull Element element); 20 | 21 | MenuContext context(@NotNull Session session, @NotNull Element element); 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuSlot.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import java.util.Locale; 8 | 9 | public interface MenuSlot { 10 | @Nullable ItemStack getItem(Locale locale); 11 | 12 | void onClick(@NotNull MenuClick click); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuSlotFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | public interface MenuSlotFactory { 7 | @Nullable MenuSlot createSlot(@NotNull MenuSlotContext context); 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import net.kyori.adventure.key.Keyed; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.spongepowered.configurate.ConfigurationNode; 6 | import org.spongepowered.configurate.serialize.SerializationException; 7 | 8 | public interface MenuSlotType extends Keyed { 9 | @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException; 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/menu/MenuSlotTypeRegistry.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.menu; 2 | 3 | import net.kyori.adventure.key.Key; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface MenuSlotTypeRegistry { 8 | void register(@NotNull MenuSlotType type); 9 | 10 | @Nullable MenuSlotType getOrNull(@NotNull Key key); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/BoundingBoxParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import me.m56738.easyarmorstands.api.util.BoundingBox; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface BoundingBoxParticle extends ColoredParticle { 9 | @NotNull BoundingBox getBoundingBox(); 10 | 11 | void setBoundingBox(@NotNull BoundingBox box); 12 | 13 | double getLineWidth(); 14 | 15 | void setLineWidth(double lineWidth); 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/CircleParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import me.m56738.easyarmorstands.api.Axis; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.joml.Quaterniondc; 7 | import org.joml.Vector3dc; 8 | 9 | @ApiStatus.NonExtendable 10 | public interface CircleParticle extends ColoredParticle { 11 | @NotNull Vector3dc getCenter(); 12 | 13 | void setCenter(@NotNull Vector3dc center); 14 | 15 | @NotNull Axis getAxis(); 16 | 17 | void setAxis(@NotNull Axis axis); 18 | 19 | double getWidth(); 20 | 21 | void setWidth(double width); 22 | 23 | @NotNull Quaterniondc getRotation(); 24 | 25 | void setRotation(@NotNull Quaterniondc rotation); 26 | 27 | double getRadius(); 28 | 29 | void setRadius(double radius); 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/ColoredParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | @ApiStatus.NonExtendable 7 | public interface ColoredParticle extends Particle { 8 | @NotNull ParticleColor getColor(); 9 | 10 | void setColor(@NotNull ParticleColor color); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/Particle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.jetbrains.annotations.ApiStatus; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface Particle { 9 | @Deprecated 10 | default void show(@NotNull Player player) { 11 | } 12 | 13 | @Deprecated 14 | default void update() { 15 | } 16 | 17 | @Deprecated 18 | default void hide(@NotNull Player player) { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/ParticleProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.Contract; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | @ApiStatus.NonExtendable 8 | public interface ParticleProvider { 9 | @Contract(value = "-> new", pure = true) 10 | @NotNull PointParticle createPoint(); 11 | 12 | @Contract(value = "-> new", pure = true) 13 | @NotNull LineParticle createLine(); 14 | 15 | @Contract(value = "-> new", pure = true) 16 | @NotNull CircleParticle createCircle(); 17 | 18 | @Contract(value = "-> new", pure = true) 19 | @NotNull BoundingBoxParticle createAxisAlignedBox(); 20 | 21 | @Contract(pure = true) 22 | boolean isVisibleThroughWalls(); 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/particle/PointParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.particle; 2 | 3 | import org.jetbrains.annotations.ApiStatus; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Quaterniondc; 6 | import org.joml.Vector3dc; 7 | 8 | @ApiStatus.NonExtendable 9 | public interface PointParticle extends ColoredParticle { 10 | double getSize(); 11 | 12 | void setSize(double size); 13 | 14 | @NotNull Vector3dc getPosition(); 15 | 16 | void setPosition(@NotNull Vector3dc position); 17 | 18 | @NotNull Quaterniondc getRotation(); 19 | 20 | void setRotation(@NotNull Quaterniondc rotation); 21 | 22 | boolean isBillboard(); 23 | 24 | void setBillboard(boolean billboard); 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/ElementPropertyRegistry.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | 5 | class ElementPropertyRegistry extends PropertyRegistry { 6 | private final Element element; 7 | 8 | ElementPropertyRegistry(Element element) { 9 | this.element = element; 10 | } 11 | 12 | @Override 13 | public boolean isValid() { 14 | return element.isValid(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/ImmutablePropertyContainer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | class ImmutablePropertyContainer extends PropertyWrapperContainer { 7 | ImmutablePropertyContainer(PropertyContainer container) { 8 | super(container); 9 | } 10 | 11 | @Override 12 | protected @NotNull Property wrap(@NotNull Property property) { 13 | PropertyType type = property.getType(); 14 | return new ImmutableProperty<>(type, property.getValue()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/PendingChange.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | public interface PendingChange { 4 | boolean execute(); 5 | } 6 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/PendingChangeImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | class PendingChangeImpl implements PendingChange { 4 | private final Property property; 5 | private final T value; 6 | 7 | PendingChangeImpl(Property property, T value) { 8 | this.property = property; 9 | this.value = value; 10 | } 11 | 12 | @Override 13 | public boolean execute() { 14 | return property.setValue(value); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/UnknownPropertyException.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | public class UnknownPropertyException extends RuntimeException { 7 | private final @NotNull PropertyType type; 8 | 9 | public UnknownPropertyException(@NotNull PropertyType type) { 10 | super(type.key().asString()); 11 | this.type = type; 12 | } 13 | 14 | public @NotNull PropertyType getType() { 15 | return type; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/UnknownPropertyTypeException.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property; 2 | 3 | import io.leangen.geantyref.TypeToken; 4 | import net.kyori.adventure.key.Key; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public class UnknownPropertyTypeException extends RuntimeException { 9 | private final @NotNull Key key; 10 | private final @Nullable TypeToken type; 11 | 12 | public UnknownPropertyTypeException(@NotNull Key key, @Nullable TypeToken type) { 13 | super(key.asString()); 14 | this.key = key; 15 | this.type = type; 16 | } 17 | 18 | public @NotNull Key getKey() { 19 | return key; 20 | } 21 | 22 | public @Nullable TypeToken getType() { 23 | return type; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/type/EnumKeyedPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property.type; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.EnumMap; 6 | import java.util.Objects; 7 | import java.util.function.Function; 8 | 9 | public final class EnumKeyedPropertyType, V> implements KeyedPropertyType { 10 | private final EnumMap> map; 11 | 12 | public EnumKeyedPropertyType(Class type, Function> provider) { 13 | map = new EnumMap<>(type); 14 | for (K key : type.getEnumConstants()) { 15 | map.put(key, Objects.requireNonNull(provider.apply(key), "Property type for key: " + key)); 16 | } 17 | } 18 | 19 | @Override 20 | public @NotNull PropertyType get(@NotNull K key) { 21 | return Objects.requireNonNull(map.get(key)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/type/KeyedPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property.type; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | public interface KeyedPropertyType { 6 | @NotNull PropertyType get(@NotNull K key); 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/property/type/PropertyTypeTypeToken.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.property.type; 2 | 3 | import io.leangen.geantyref.TypeToken; 4 | 5 | class PropertyTypeTypeToken extends TypeToken> { 6 | static final PropertyTypeTypeToken INSTANCE = new PropertyTypeTypeToken(); 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/region/RegionPrivilegeChecker.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.region; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import org.bukkit.Location; 6 | import org.bukkit.entity.Player; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public interface RegionPrivilegeChecker { 10 | boolean isAllowed(Player player, Location location); 11 | 12 | default boolean isAllowed(Player player, Location location, boolean silent) { 13 | return isAllowed(player, location); 14 | } 15 | 16 | boolean canBypass(Player player); 17 | 18 | void sendCreateError(@NotNull Player player, @NotNull PropertyContainer properties); 19 | 20 | void sendDestroyError(@NotNull Player player, @NotNull Element element); 21 | 22 | void sendEditError(@NotNull Player player, @NotNull Element element); 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/region/RegionPrivilegeManager.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.region; 2 | 3 | import org.bukkit.plugin.Plugin; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | public interface RegionPrivilegeManager { 7 | void registerPrivilegeChecker(@NotNull Plugin plugin, @NotNull RegionPrivilegeChecker privilegeChecker); 8 | 9 | void unregisterPrivilegeChecker(@NotNull RegionPrivilegeChecker privilegeChecker); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/BoundingBoxProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.jetbrains.annotations.Contract; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | public interface BoundingBoxProvider { 7 | @Contract(pure = true) 8 | @NotNull BoundingBox getBoundingBox(); 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/EasConversion.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.bukkit.util.Vector; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Vector3d; 6 | import org.joml.Vector3dc; 7 | 8 | public final class EasConversion { 9 | private EasConversion() { 10 | } 11 | 12 | public static @NotNull Vector3d fromBukkit(@NotNull Vector vector) { 13 | return new Vector3d(vector.getX(), vector.getY(), vector.getZ()); 14 | } 15 | 16 | public static @NotNull Vector toBukkit(@NotNull Vector3dc vector) { 17 | return new Vector(vector.x(), vector.y(), vector.z()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/EasMath.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | public final class EasMath { 4 | private EasMath() { 5 | } 6 | 7 | public static double wrapDegrees(double degrees) { 8 | degrees %= 360; 9 | if (degrees > 180) { 10 | degrees -= 360; 11 | } else if (degrees < -180) { 12 | degrees += 360; 13 | } 14 | return degrees; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/ItemTemplate.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; 4 | import org.bukkit.inventory.ItemStack; 5 | 6 | import java.util.Locale; 7 | 8 | public interface ItemTemplate { 9 | ItemStack render(Locale locale); 10 | 11 | ItemStack render(Locale locale, TagResolver resolver); 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/PositionProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.jetbrains.annotations.Contract; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Vector3dc; 6 | 7 | public interface PositionProvider { 8 | @Contract(pure = true) 9 | static @NotNull PositionProvider of(@NotNull Vector3dc position) { 10 | return new PositionProviderImpl(position); 11 | } 12 | 13 | @Contract(pure = true) 14 | @NotNull Vector3dc getPosition(); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/PositionProviderImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.joml.Vector3d; 5 | import org.joml.Vector3dc; 6 | 7 | class PositionProviderImpl implements PositionProvider { 8 | private final Vector3dc position; 9 | 10 | PositionProviderImpl(Vector3dc position) { 11 | this.position = new Vector3d(position); 12 | } 13 | 14 | @Override 15 | public @NotNull Vector3dc getPosition() { 16 | return position; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/RotationProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.jetbrains.annotations.Contract; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Quaterniondc; 6 | 7 | public interface RotationProvider { 8 | @Contract(pure = true) 9 | static @NotNull RotationProvider of(@NotNull Quaterniondc rotation) { 10 | if (rotation.equals(identity().getRotation())) { 11 | return identity(); 12 | } 13 | return new RotationProviderImpl(rotation); 14 | } 15 | 16 | @Contract(pure = true) 17 | static @NotNull RotationProvider identity() { 18 | return RotationProviderImpl.IDENTITY; 19 | } 20 | 21 | @Contract(pure = true) 22 | @NotNull Quaterniondc getRotation(); 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-api/src/main/java/me/m56738/easyarmorstands/api/util/RotationProviderImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api.util; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.joml.Quaterniond; 5 | import org.joml.Quaterniondc; 6 | 7 | class RotationProviderImpl implements RotationProvider { 8 | static final RotationProviderImpl IDENTITY = new RotationProviderImpl(new Quaterniond()); 9 | 10 | private final Quaterniondc rotation; 11 | 12 | RotationProviderImpl(Quaterniondc rotation) { 13 | this.rotation = new Quaterniond(rotation); 14 | } 15 | 16 | @Override 17 | public @NotNull Quaterniondc getRotation() { 18 | return rotation; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-bentobox/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.bentobox) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-bentobox/src/main/java/me/m56738/easyarmorstands/bentobox/BentoBoxActionEvent.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.bentobox; 2 | 3 | import org.bukkit.event.Cancellable; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class BentoBoxActionEvent extends Event implements Cancellable { 8 | private static final HandlerList HANDLER_LIST = new HandlerList(); 9 | 10 | private boolean cancelled; 11 | 12 | @Override 13 | public HandlerList getHandlers() { 14 | return HANDLER_LIST; 15 | } 16 | 17 | public static HandlerList getHandlerList() { 18 | return HANDLER_LIST; 19 | } 20 | 21 | @Override 22 | public boolean isCancelled() { 23 | return cancelled; 24 | } 25 | 26 | @Override 27 | public void setCancelled(boolean cancel) { 28 | cancelled = cancel; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-bentobox/src/main/java/me/m56738/easyarmorstands/bentobox/BentoBoxAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.bentobox; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.Addon; 5 | import me.m56738.easyarmorstands.api.EasyArmorStands; 6 | 7 | public class BentoBoxAddon implements Addon { 8 | private BentoBoxPrivilegeChecker privilegeChecker; 9 | 10 | @Override 11 | public String name() { 12 | return "BentoBox"; 13 | } 14 | 15 | @Override 16 | public void enable() { 17 | privilegeChecker = new BentoBoxPrivilegeChecker(); 18 | EasyArmorStands.get().regionPrivilegeManager().registerPrivilegeChecker(EasyArmorStandsPlugin.getInstance(), privilegeChecker); 19 | } 20 | 21 | @Override 22 | public void disable() { 23 | if (privilegeChecker != null) { 24 | EasyArmorStands.get().regionPrivilegeManager().unregisterPrivilegeChecker(privilegeChecker); 25 | privilegeChecker = null; 26 | } 27 | } 28 | 29 | @Override 30 | public void reload() { 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /easyarmorstands-bentobox/src/main/java/me/m56738/easyarmorstands/bentobox/BentoBoxAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.bentobox; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class BentoBoxAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.bentoBox.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("BentoBox") != null; 16 | } 17 | 18 | @Override 19 | public BentoBoxAddon create() { 20 | return new BentoBoxAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-bentobox/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.bentobox.BentoBoxAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-display-api/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | id("easyarmorstands.publish") 4 | } 5 | 6 | dependencies { 7 | compileOnly("org.spigotmc:spigot-api:1.19.4-R0.1-SNAPSHOT") { 8 | isTransitive = false 9 | } 10 | api(project(":easyarmorstands-api")) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-display-api/src/main/java/me/m56738/easyarmorstands/display/api/property/type/BlockDisplayPropertyTypes.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.api.property.type; 2 | 3 | import io.leangen.geantyref.TypeToken; 4 | import me.m56738.easyarmorstands.api.EasyArmorStands; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import net.kyori.adventure.key.Key; 7 | import net.kyori.adventure.key.KeyPattern; 8 | import org.bukkit.block.data.BlockData; 9 | 10 | public class BlockDisplayPropertyTypes { 11 | public static final PropertyType BLOCK = get("block_display/block", BlockData.class); 12 | 13 | private BlockDisplayPropertyTypes() { 14 | } 15 | 16 | private static PropertyType get(@KeyPattern.Value String name, TypeToken type) { 17 | return EasyArmorStands.get().propertyTypeRegistry().get(Key.key("easyarmorstands", name), type); 18 | } 19 | 20 | private static PropertyType get(@KeyPattern.Value String name, Class type) { 21 | return get(name, TypeToken.get(type)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-display-api/src/main/java/me/m56738/easyarmorstands/display/api/property/type/InteractionPropertyTypes.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.api.property.type; 2 | 3 | import io.leangen.geantyref.TypeToken; 4 | import me.m56738.easyarmorstands.api.EasyArmorStands; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import net.kyori.adventure.key.Key; 7 | import net.kyori.adventure.key.KeyPattern; 8 | 9 | public class InteractionPropertyTypes { 10 | public static final PropertyType RESPONSIVE = get("interaction/responsive", Boolean.class); 11 | 12 | private InteractionPropertyTypes() { 13 | } 14 | 15 | private static PropertyType get(@KeyPattern.Value String name, TypeToken type) { 16 | return EasyArmorStands.get().propertyTypeRegistry().get(Key.key("easyarmorstands", name), type); 17 | } 18 | 19 | private static PropertyType get(@KeyPattern.Value String name, Class type) { 20 | return get(name, TypeToken.get(type)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-display/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-display-api")) 7 | compileOnly(project(":easyarmorstands-plugin")) 8 | compileOnly("org.spigotmc:spigot-api:1.19.4-R0.1-SNAPSHOT") { 9 | isTransitive = false 10 | } 11 | compileOnly(libs.brigadier) 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/DisplayAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display; 2 | 3 | import me.m56738.easyarmorstands.addon.AddonFactory; 4 | import me.m56738.easyarmorstands.capability.Priority; 5 | import me.m56738.easyarmorstands.util.ReflectionUtil; 6 | 7 | public class DisplayAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return true; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return ReflectionUtil.hasClass("org.bukkit.entity.ItemDisplay"); 16 | } 17 | 18 | @Override 19 | public Priority getPriority() { 20 | return Priority.HIGHEST; 21 | } 22 | 23 | @Override 24 | public DisplayAddon create() { 25 | return new DisplayAddon(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/adapter/TextDisplayAdapter.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.adapter; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import org.bukkit.entity.TextDisplay; 5 | 6 | public abstract class TextDisplayAdapter { 7 | private static final TextDisplayAdapter instance = initialize(); 8 | 9 | public static TextDisplayAdapter getInstance() { 10 | return instance; 11 | } 12 | 13 | private static TextDisplayAdapter initialize() { 14 | TextDisplayAdapter adapter = PaperTextDisplayAdapter.getInstance(); 15 | if (adapter != null) { 16 | return adapter; 17 | } else { 18 | return LegacyTextDisplayAdapter.getInstance(); 19 | } 20 | } 21 | 22 | public abstract Component getText(TextDisplay entity); 23 | 24 | public abstract void setText(TextDisplay entity, Component text); 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/element/DisplayElementProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.element; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.api.element.EntityElementProvider; 5 | import org.bukkit.entity.Display; 6 | import org.bukkit.entity.Entity; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public class DisplayElementProvider implements EntityElementProvider { 11 | private final DisplayElementType type; 12 | 13 | public DisplayElementProvider(DisplayElementType type) { 14 | this.type = type; 15 | } 16 | 17 | @Override 18 | public @Nullable Element getElement(@NotNull Entity entity) { 19 | if (type.getEntityClass().isInstance(entity)) { 20 | return type.getElement(type.getEntityClass().cast(entity)); 21 | } 22 | return null; 23 | } 24 | 25 | public DisplayElementType getType() { 26 | return type; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/element/InteractionElementProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.element; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.api.element.EntityElementProvider; 5 | import org.bukkit.entity.Entity; 6 | import org.bukkit.entity.Interaction; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public class InteractionElementProvider implements EntityElementProvider { 11 | private final InteractionElementType type; 12 | 13 | public InteractionElementProvider(InteractionElementType type) { 14 | this.type = type; 15 | } 16 | 17 | @Override 18 | public @Nullable Element getElement(@NotNull Entity entity) { 19 | if (entity instanceof Interaction) { 20 | return type.getElement((Interaction) entity); 21 | } 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/element/TextDisplayElementType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.element; 2 | 3 | import me.m56738.easyarmorstands.api.property.PropertyMap; 4 | import me.m56738.easyarmorstands.display.api.property.type.TextDisplayPropertyTypes; 5 | import net.kyori.adventure.text.Component; 6 | import org.bukkit.entity.EntityType; 7 | import org.bukkit.entity.TextDisplay; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.Optional; 11 | 12 | public class TextDisplayElementType extends DisplayElementType { 13 | public TextDisplayElementType() { 14 | super(EntityType.TEXT_DISPLAY, TextDisplay.class); 15 | } 16 | 17 | @Override 18 | public void applyDefaultProperties(@NotNull PropertyMap properties) { 19 | super.applyDefaultProperties(properties); 20 | properties.put(TextDisplayPropertyTypes.TEXT, Component.text("Text")); 21 | properties.put(TextDisplayPropertyTypes.BACKGROUND, Optional.empty()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/menu/DisplayBoxSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.menu; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class DisplayBoxSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "display/box"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new DisplayBoxSlotFactory( 22 | node.node("item").get(SimpleItemTemplate.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/property/display/DisplayHeightProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.property.display; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 5 | import me.m56738.easyarmorstands.display.api.property.type.DisplayPropertyTypes; 6 | import org.bukkit.entity.Display; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class DisplayHeightProperty implements Property { 10 | private final Display entity; 11 | 12 | public DisplayHeightProperty(Display entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return DisplayPropertyTypes.BOX_HEIGHT; 19 | } 20 | 21 | @Override 22 | public @NotNull Float getValue() { 23 | return entity.getDisplayHeight(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Float value) { 28 | entity.setDisplayHeight(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/property/display/DisplayViewRangeProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.property.display; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 5 | import me.m56738.easyarmorstands.display.api.property.type.DisplayPropertyTypes; 6 | import org.bukkit.entity.Display; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class DisplayViewRangeProperty implements Property { 10 | private final Display entity; 11 | 12 | public DisplayViewRangeProperty(Display entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return DisplayPropertyTypes.VIEW_RANGE; 19 | } 20 | 21 | @Override 22 | public @NotNull Float getValue() { 23 | return entity.getViewRange(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Float value) { 28 | entity.setViewRange(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/java/me/m56738/easyarmorstands/display/property/display/DisplayWidthProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.display.property.display; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 5 | import me.m56738.easyarmorstands.display.api.property.type.DisplayPropertyTypes; 6 | import org.bukkit.entity.Display; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class DisplayWidthProperty implements Property { 10 | private final Display entity; 11 | 12 | public DisplayWidthProperty(Display entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return DisplayPropertyTypes.BOX_WIDTH; 19 | } 20 | 21 | @Override 22 | public @NotNull Float getValue() { 23 | return entity.getDisplayWidth(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Float value) { 28 | entity.setDisplayWidth(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-display/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.display.DisplayAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-fancyholograms/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | compileOnly(project(":easyarmorstands-plugin")) 7 | compileOnly(project(":easyarmorstands-display")) 8 | compileOnly(project(":easyarmorstands-display-api")) 9 | compileOnly("org.spigotmc:spigot-api:1.19.4-R0.1-SNAPSHOT") { 10 | isTransitive = false 11 | } 12 | compileOnly(libs.fancyholograms) 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-fancyholograms/src/main/java/me/m56738/easyarmorstands/fancyholograms/FancyHologramsAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.fancyholograms; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class FancyHologramsAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.fancyHolograms.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("FancyHolograms") != null; 16 | } 17 | 18 | @Override 19 | public FancyHologramsAddon create() { 20 | return new FancyHologramsAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-fancyholograms/src/main/java/me/m56738/easyarmorstands/fancyholograms/FancyHologramsListener.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.fancyholograms; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.ElementSelectionNode; 4 | import me.m56738.easyarmorstands.api.event.session.SessionStartEvent; 5 | import me.m56738.easyarmorstands.fancyholograms.element.HologramElementDiscoverySource; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | 9 | public class FancyHologramsListener implements Listener { 10 | private final HologramElementDiscoverySource discoverySource; 11 | 12 | public FancyHologramsListener(HologramElementDiscoverySource discoverySource) { 13 | this.discoverySource = discoverySource; 14 | } 15 | 16 | @EventHandler 17 | public void onSessionStart(SessionStartEvent event) { 18 | ElementSelectionNode node = event.getSession().findNode(ElementSelectionNode.class); 19 | if (node != null) { 20 | node.addSource(discoverySource); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-fancyholograms/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.fancyholograms.FancyHologramsAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-griefdefender/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.griefdefender.api) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-griefdefender/src/main/java/me/m56738/easyarmorstands/griefdefender/GriefDefenderAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.griefdefender; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class GriefDefenderAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.griefDefender.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("GriefDefender") != null; 16 | } 17 | 18 | @Override 19 | public GriefDefenderAddon create() { 20 | return new GriefDefenderAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-griefdefender/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.griefdefender.GriefDefenderAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-griefprevention/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.griefprevention) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-griefprevention/src/main/java/me/m56738/easyarmorstands/griefprevention/GriefPreventionAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.griefprevention; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class GriefPreventionAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.griefPrevention.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("GriefPrevention") != null; 16 | } 17 | 18 | @Override 19 | public GriefPreventionAddon create() { 20 | return new GriefPreventionAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-griefprevention/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.griefprevention.GriefPreventionAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | compileOnly(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.headdatabase.api) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/src/main/java/me/m56738/easyarmorstands/headdatabase/HeadDatabaseAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.headdatabase; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.Addon; 5 | import me.m56738.easyarmorstands.api.EasyArmorStands; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class HeadDatabaseAddon implements Addon { 9 | private HeadDatabaseListener listener; 10 | 11 | @Override 12 | public String name() { 13 | return "HeadDatabase"; 14 | } 15 | 16 | @Override 17 | public void enable() { 18 | EasyArmorStandsPlugin plugin = EasyArmorStandsPlugin.getInstance(); 19 | EasyArmorStands.get().menuSlotTypeRegistry().register(new HeadDatabaseSlotType()); 20 | listener = new HeadDatabaseListener(plugin); 21 | plugin.getServer().getPluginManager().registerEvents(listener, plugin); 22 | } 23 | 24 | @Override 25 | public void disable() { 26 | HandlerList.unregisterAll(listener); 27 | } 28 | 29 | @Override 30 | public void reload() { 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/src/main/java/me/m56738/easyarmorstands/headdatabase/HeadDatabaseAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.headdatabase; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class HeadDatabaseAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.headDatabase.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("HeadDatabase") != null; 16 | } 17 | 18 | @Override 19 | public HeadDatabaseAddon create() { 20 | return new HeadDatabaseAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/src/main/java/me/m56738/easyarmorstands/headdatabase/HeadDatabaseSlotFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.headdatabase; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotContext; 5 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 6 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class HeadDatabaseSlotFactory implements MenuSlotFactory { 10 | private final SimpleItemTemplate itemTemplate; 11 | 12 | public HeadDatabaseSlotFactory(SimpleItemTemplate itemTemplate) { 13 | this.itemTemplate = itemTemplate; 14 | } 15 | 16 | @Override 17 | public MenuSlot createSlot(@NotNull MenuSlotContext context) { 18 | if (context.permissions().test("headdb.open")) { 19 | return new HeadDatabaseSlot(itemTemplate, context.resolver()); 20 | } else { 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/src/main/java/me/m56738/easyarmorstands/headdatabase/HeadDatabaseSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.headdatabase; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class HeadDatabaseSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "headdatabase"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new HeadDatabaseSlotFactory( 22 | node.node("item").get(SimpleItemTemplate.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-headdatabase/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.headdatabase.HeadDatabaseAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-huskclaims/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.huskclaims.bukkit) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-huskclaims/src/main/java/me/m56738/easyarmorstands/huskclaims/HuskClaimsAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.huskclaims; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class HuskClaimsAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.huskClaims.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("HuskClaims") != null; 16 | } 17 | 18 | @Override 19 | public HuskClaimsAddon create() { 20 | return new HuskClaimsAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-huskclaims/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.huskclaims.HuskClaimsAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-lands/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.lands.api) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-lands/src/main/java/me/m56738/easyarmorstands/lands/LandsAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.lands; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import me.m56738.easyarmorstands.util.ReflectionUtil; 6 | import org.bukkit.Bukkit; 7 | 8 | public class LandsAddonFactory implements AddonFactory { 9 | @Override 10 | public boolean isEnabled() { 11 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.lands.enabled; 12 | } 13 | 14 | @Override 15 | public boolean isAvailable() { 16 | return Bukkit.getPluginManager().getPlugin("Lands") != null 17 | && ReflectionUtil.hasClass("me.angeschossen.lands.api.LandsIntegration"); 18 | } 19 | 20 | @Override 21 | public LandsAddon create() { 22 | return new LandsAddon(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-lands/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.lands.LandsAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-plotsquared/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.plotsquared.core) { 11 | exclude("net.kyori", "adventure-api") 12 | } 13 | compileOnly(libs.plotsquared.bukkit) { 14 | isTransitive = false 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-plotsquared/src/main/java/me/m56738/easyarmorstands/plotsquared/v6/PlotSquaredAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.plotsquared.v6; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class PlotSquaredAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.plotSquared.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("PlotSquared") != null; 16 | } 17 | 18 | @Override 19 | public PlotSquaredAddon create() { 20 | return new PlotSquaredAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-plotsquared/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.plotsquared.v6.PlotSquaredAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/addon/Addon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.addon; 2 | 3 | public interface Addon { 4 | String name(); 5 | 6 | void enable(); 7 | 8 | void disable(); 9 | 10 | void reload(); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/addon/AddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.addon; 2 | 3 | import me.m56738.easyarmorstands.capability.Priority; 4 | 5 | public interface AddonFactory { 6 | boolean isEnabled(); 7 | 8 | boolean isAvailable(); 9 | 10 | default Priority getPriority() { 11 | return Priority.NORMAL; 12 | } 13 | 14 | T create(); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/api/EasyArmorStandsInitializer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.api; 2 | 3 | public class EasyArmorStandsInitializer { 4 | public static void initialize(EasyArmorStands instance) { 5 | EasyArmorStandsHolder.instance = instance; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/Capability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.TYPE) 10 | public @interface Capability { 11 | String name(); 12 | 13 | boolean optional() default false; 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/CapabilityProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability; 2 | 3 | import org.bukkit.plugin.Plugin; 4 | 5 | public interface CapabilityProvider { 6 | boolean isSupported(); 7 | 8 | Priority getPriority(); 9 | 10 | T create(Plugin plugin); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/Priority.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability; 2 | 3 | public enum Priority { 4 | HIGHEST, 5 | HIGH, 6 | NORMAL, 7 | LOW, 8 | FALLBACK 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/egg/SpawnEggCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.egg; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | import org.bukkit.inventory.ItemStack; 6 | 7 | @Capability(name = "Spawn eggs", optional = true) 8 | public interface SpawnEggCapability { 9 | ItemStack createSpawnEgg(Entity entity); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/entityai/EntityAICapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.entityai; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.LivingEntity; 5 | 6 | @Capability(name = "Entity AI", optional = true) 7 | public interface EntityAICapability { 8 | boolean hasAI(LivingEntity entity); 9 | 10 | void setAI(LivingEntity entity, boolean value); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/entityscale/EntityScaleCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.entityscale; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.LivingEntity; 5 | 6 | @Capability(name = "Entity scale", optional = true) 7 | public interface EntityScaleCapability { 8 | boolean hasScale(LivingEntity entity); 9 | 10 | double getEffectiveScale(LivingEntity entity); 11 | 12 | double getScale(LivingEntity entity); 13 | 14 | void setScale(LivingEntity entity, double scale); 15 | 16 | void resetScale(LivingEntity entity); 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/entitysize/EntitySizeCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.entitysize; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | @Capability(name = "Entity size", optional = true) 7 | public interface EntitySizeCapability { 8 | double getWidth(Entity entity); 9 | 10 | double getHeight(Entity entity); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/entitytag/EntityTagCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.entitytag; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | import java.util.Set; 7 | 8 | @Capability(name = "Entity tags", optional = true) 9 | public interface EntityTagCapability { 10 | Set getTags(Entity entity); 11 | 12 | boolean addTag(Entity entity, String tag); 13 | 14 | boolean removeTag(Entity entity, String tag); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/entitytype/EntityTypeCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.entitytype; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import net.kyori.adventure.text.Component; 5 | import org.bukkit.entity.EntityType; 6 | 7 | @Capability(name = "Entity type") 8 | public interface EntityTypeCapability { 9 | Component getName(EntityType type); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/equipment/EquipmentCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.equipment; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.inventory.EntityEquipment; 5 | import org.bukkit.inventory.EquipmentSlot; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | @Capability(name = "Entity equipment") 9 | public interface EquipmentCapability { 10 | EquipmentSlot getOffHand(); 11 | 12 | EquipmentSlot[] getHands(); 13 | 14 | ItemStack getItem(EntityEquipment equipment, EquipmentSlot slot); 15 | 16 | void setItem(EntityEquipment equipment, EquipmentSlot slot, ItemStack item); 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/glow/GlowCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.glow; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | @Capability(name = "Glowing entities", optional = true) 7 | public interface GlowCapability { 8 | boolean isGlowing(Entity entity); 9 | 10 | void setGlowing(Entity entity, boolean glowing); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/handswap/SwapHandItemsCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.handswap; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import net.kyori.adventure.text.Component; 5 | 6 | @Capability(name = "Swap hand items", optional = true) 7 | public interface SwapHandItemsCapability { 8 | Component key(); 9 | 10 | void addListener(SwapHandItemsListener listener); 11 | 12 | void removeListener(SwapHandItemsListener listener); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/handswap/SwapHandItemsListener.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.handswap; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | @FunctionalInterface 6 | public interface SwapHandItemsListener { 7 | boolean handleSwap(Player player); 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/invulnerability/InvulnerabilityCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.invulnerability; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | @Capability(name = "Entity invulnerability", optional = true) 7 | public interface InvulnerabilityCapability { 8 | boolean isInvulnerable(Entity entity); 9 | 10 | void setInvulnerable(Entity entity, boolean invulnerable); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/item/ItemCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.item; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.DyeColor; 5 | import org.bukkit.inventory.ItemStack; 6 | 7 | @Capability(name = "Items") 8 | public interface ItemCapability { 9 | ItemStack createColor(DyeColor color); 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/itemcolor/ItemColorCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.itemcolor; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.Color; 5 | import org.bukkit.inventory.meta.ItemMeta; 6 | 7 | @Capability(name = "Item colors") 8 | public interface ItemColorCapability { 9 | boolean hasColor(ItemMeta meta); 10 | 11 | Color getColor(ItemMeta meta); 12 | 13 | boolean setColor(ItemMeta meta, Color color); 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/lock/LockCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.lock; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.ArmorStand; 5 | 6 | @Capability(name = "Equipment lock", optional = true) 7 | public interface LockCapability { 8 | boolean isLocked(ArmorStand armorStand); 9 | 10 | void setLocked(ArmorStand armorStand, boolean locked); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/lookup/LookupCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.lookup; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.Chunk; 5 | import org.bukkit.entity.Entity; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | import java.util.UUID; 9 | 10 | @Capability(name = "Entity lookup") 11 | public interface LookupCapability { 12 | Entity getEntity(UUID uuid, @Nullable Chunk expectedChunk); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/persistence/PersistenceCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.persistence; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | @Capability(name = "Entity persistence", optional = true) 7 | public interface PersistenceCapability { 8 | void setPersistent(Entity entity, boolean persistent); 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/silent/SilentCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.silent; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | 6 | @Capability(name = "Silent entities", optional = true) 7 | public interface SilentCapability { 8 | boolean isSilent(Entity entity); 9 | 10 | void setSilent(Entity entity, boolean silent); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/spawn/SpawnCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.spawn; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.Location; 5 | import org.bukkit.entity.Entity; 6 | 7 | import java.util.function.Consumer; 8 | 9 | @Capability(name = "Entity spawning") 10 | public interface SpawnCapability { 11 | T spawnEntity(Location location, Class type, Consumer configure); 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/tick/TickCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.tick; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.ArmorStand; 5 | 6 | @Capability(name = "Armor stand ticking", optional = true) 7 | public interface TickCapability { 8 | boolean canTick(ArmorStand armorStand); 9 | 10 | void setCanTick(ArmorStand armorStand, boolean canTick); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/tool/ToolCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.tool; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.inventory.ItemStack; 5 | 6 | @Capability(name = "Tool detection", optional = true) 7 | public interface ToolCapability { 8 | boolean isTool(ItemStack item); 9 | 10 | void configureTool(ItemStack item); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/capability/visibility/VisibilityCapability.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.capability.visibility; 2 | 3 | import me.m56738.easyarmorstands.capability.Capability; 4 | import org.bukkit.entity.Entity; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.plugin.Plugin; 7 | 8 | @Capability(name = "Entity visibility", optional = true) 9 | public interface VisibilityCapability { 10 | void hideEntity(Player player, Plugin plugin, Entity entity); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/clipboard/ClipboardManager.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.clipboard; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | public class ClipboardManager { 9 | private final Map clipboards = new HashMap<>(); 10 | 11 | public Clipboard getClipboard(Player player) { 12 | return clipboards.computeIfAbsent(player, Clipboard::new); 13 | } 14 | 15 | public void remove(Player player) { 16 | clipboards.remove(player); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorAxisSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class ColorAxisSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "color_picker/axis"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new ColorAxisSlotFactory( 22 | node.node("axis").get(ColorAxis.class), 23 | node.node("item").get(SimpleItemTemplate.class)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorIndicatorSlot.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.ColorPickerContext; 4 | import me.m56738.easyarmorstands.api.menu.MenuClick; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.Locale; 9 | 10 | public class ColorIndicatorSlot implements ColorSlot { 11 | private final ColorPickerContext context; 12 | 13 | public ColorIndicatorSlot(ColorPickerContext context) { 14 | this.context = context; 15 | } 16 | 17 | @Override 18 | public ItemStack getItem(Locale locale) { 19 | return context.item(); 20 | } 21 | 22 | @Override 23 | public void onClick(@NotNull MenuClick click) { 24 | click.close(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorIndicatorSlotFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.ColorPickerContext; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 5 | import me.m56738.easyarmorstands.api.menu.MenuSlotContext; 6 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public class ColorIndicatorSlotFactory implements MenuSlotFactory { 11 | @Override 12 | public @Nullable MenuSlot createSlot(@NotNull MenuSlotContext context) { 13 | ColorPickerContext colorPickerContext = context.colorPicker(); 14 | if (colorPickerContext != null) { 15 | return new ColorIndicatorSlot(colorPickerContext); 16 | } else { 17 | return null; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorIndicatorSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import net.kyori.adventure.key.Key; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.spongepowered.configurate.ConfigurationNode; 8 | import org.spongepowered.configurate.serialize.SerializationException; 9 | 10 | public class ColorIndicatorSlotType implements MenuSlotType { 11 | public static final Key KEY = Key.key("easyarmorstands", "color_picker/indicator"); 12 | 13 | @Override 14 | public @NotNull Key key() { 15 | return KEY; 16 | } 17 | 18 | @Override 19 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 20 | return new ColorIndicatorSlotFactory(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorPickerAxisTag.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.ColorPickerContext; 4 | import net.kyori.adventure.text.Component; 5 | import net.kyori.adventure.text.minimessage.tag.Inserting; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public class ColorPickerAxisTag implements Inserting { 9 | private final ColorPickerContext context; 10 | private final ColorAxis axis; 11 | 12 | public ColorPickerAxisTag(ColorPickerContext context, ColorAxis axis) { 13 | this.context = context; 14 | this.axis = axis; 15 | } 16 | 17 | @Override 18 | public @NotNull Component value() { 19 | return Component.text(axis.get(context.getColor())); 20 | } 21 | 22 | @Override 23 | public boolean allowsChildren() { 24 | return false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorPickerColorTag.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.ColorPickerContext; 4 | import me.m56738.easyarmorstands.util.Util; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.minimessage.tag.Inserting; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class ColorPickerColorTag implements Inserting { 10 | private final ColorPickerContext context; 11 | 12 | public ColorPickerColorTag(ColorPickerContext context) { 13 | this.context = context; 14 | } 15 | 16 | @Override 17 | public @NotNull Component value() { 18 | return Util.formatColor(context.getColor()); 19 | } 20 | 21 | @Override 22 | public boolean allowsChildren() { 23 | return false; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/color/ColorSlot.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.color; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 4 | 5 | public interface ColorSlot extends MenuSlot { 6 | } 7 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/annotation/PropertyPermission.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.annotation; 2 | 3 | import net.kyori.adventure.key.KeyPattern; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Target(ElementType.METHOD) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface PropertyPermission { 13 | @KeyPattern 14 | String value(); 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/processor/ClipboardInjector.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.processor; 2 | 3 | import me.m56738.easyarmorstands.clipboard.Clipboard; 4 | import me.m56738.easyarmorstands.command.sender.EasCommandSender; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.checkerframework.checker.nullness.qual.Nullable; 7 | import org.incendo.cloud.context.CommandContext; 8 | import org.incendo.cloud.injection.ParameterInjector; 9 | import org.incendo.cloud.util.annotation.AnnotationAccessor; 10 | 11 | import static me.m56738.easyarmorstands.command.processor.ClipboardProcessor.clipboardKey; 12 | 13 | public class ClipboardInjector implements ParameterInjector { 14 | @Override 15 | public @Nullable Clipboard create(@NonNull CommandContext context, @NonNull AnnotationAccessor annotationAccessor) { 16 | return context.getOrDefault(clipboardKey(), null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/processor/ElementInjector.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.processor; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.command.sender.EasCommandSender; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.checkerframework.checker.nullness.qual.Nullable; 7 | import org.incendo.cloud.context.CommandContext; 8 | import org.incendo.cloud.injection.ParameterInjector; 9 | import org.incendo.cloud.util.annotation.AnnotationAccessor; 10 | 11 | import static me.m56738.easyarmorstands.command.processor.ElementProcessor.elementKey; 12 | 13 | public class ElementInjector implements ParameterInjector { 14 | @Override 15 | public @Nullable Element create(@NonNull CommandContext context, @NonNull AnnotationAccessor annotationAccessor) { 16 | return context.getOrDefault(elementKey(), null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/processor/ElementSelectionInjector.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.processor; 2 | 3 | import me.m56738.easyarmorstands.command.sender.EasCommandSender; 4 | import me.m56738.easyarmorstands.command.util.ElementSelection; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.checkerframework.checker.nullness.qual.Nullable; 7 | import org.incendo.cloud.context.CommandContext; 8 | import org.incendo.cloud.injection.ParameterInjector; 9 | import org.incendo.cloud.util.annotation.AnnotationAccessor; 10 | 11 | import static me.m56738.easyarmorstands.command.processor.ElementSelectionProcessor.elementSelectionKey; 12 | 13 | public class ElementSelectionInjector implements ParameterInjector { 14 | @Override 15 | public @Nullable ElementSelection create(@NonNull CommandContext context, @NonNull AnnotationAccessor annotationAccessor) { 16 | return context.getOrDefault(elementSelectionKey(), null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/processor/PropertyPermissionBuilderModifier.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.processor; 2 | 3 | import me.m56738.easyarmorstands.command.annotation.PropertyPermission; 4 | import me.m56738.easyarmorstands.command.sender.EasCommandSender; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.incendo.cloud.Command; 7 | import org.incendo.cloud.annotations.BuilderModifier; 8 | 9 | public class PropertyPermissionBuilderModifier implements BuilderModifier { 10 | @Override 11 | public Command.@NonNull Builder modifyBuilder(@NonNull PropertyPermission annotation, Command.Builder builder) { 12 | return builder.permission(PropertyPermissionPredicate.createPermission(annotation.value())); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/processor/SessionInjector.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.processor; 2 | 3 | import me.m56738.easyarmorstands.command.sender.EasCommandSender; 4 | import me.m56738.easyarmorstands.session.SessionImpl; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.checkerframework.checker.nullness.qual.Nullable; 7 | import org.incendo.cloud.context.CommandContext; 8 | import org.incendo.cloud.injection.ParameterInjector; 9 | import org.incendo.cloud.util.annotation.AnnotationAccessor; 10 | 11 | import static me.m56738.easyarmorstands.command.processor.SessionProcessor.sessionKey; 12 | 13 | public class SessionInjector implements ParameterInjector { 14 | @Override 15 | public @Nullable SessionImpl create(@NonNull CommandContext context, @NonNull AnnotationAccessor annotationAccessor) { 16 | return context.getOrDefault(sessionKey(), null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/requirement/RequireElement.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.requirement; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.METHOD) 10 | public @interface RequireElement { 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/requirement/RequireElementSelection.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.requirement; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.METHOD) 10 | public @interface RequireElementSelection { 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/command/requirement/RequireSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.command.requirement; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.METHOD) 10 | public @interface RequireSession { 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EasConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import me.m56738.easyarmorstands.config.integration.IntegrationConfig; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class EasConfig { 8 | public UpdateCheckConfig updateCheck = new UpdateCheckConfig(); 9 | public EditorConfig editor = new EditorConfig(); 10 | public MessageConfig message = new MessageConfig(); 11 | public IntegrationConfig integration = new IntegrationConfig(); 12 | public LimitConfig limits = new LimitConfig(); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorButtonConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class EditorButtonConfig { 7 | public double range; 8 | public double threshold; 9 | public int interpolationTicks; 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class EditorConfig { 8 | public EditorDiscoveryConfig discovery; 9 | public EditorMenuConfig menu; 10 | public EditorButtonConfig button; 11 | public EditorScaleConfig scale; 12 | public EditorSelectionConfig selection; 13 | public SimpleItemTemplate tool; 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorDiscoveryConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class EditorDiscoveryConfig { 7 | public int limit; 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorMenuConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class EditorMenuConfig { 8 | public MenuSlotFactory background; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorScaleConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class EditorScaleConfig { 7 | public double minDistance; 8 | public double maxDistance; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorSelectionConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class EditorSelectionConfig { 7 | public double range; 8 | public EditorSelectionGroupConfig group; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/EditorSelectionGroupConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class EditorSelectionGroupConfig { 7 | public int limit; 8 | public double range; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/LimitConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class LimitConfig { 7 | public LimitScaleConfig entity; 8 | public LimitScaleConfig displayEntity; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/LimitScaleConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.joml.Math; 4 | import org.joml.Vector3f; 5 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 6 | 7 | @ConfigSerializable 8 | public class LimitScaleConfig { 9 | public double minScale; 10 | public double maxScale; 11 | 12 | public double clampScale(double scale) { 13 | return Math.clamp(minScale, maxScale, scale); 14 | } 15 | 16 | public float clampScale(float scale) { 17 | return Math.clamp((float) minScale, (float) maxScale, scale); 18 | } 19 | 20 | public void clampScale(Vector3f scale) { 21 | scale.set(clampScale(scale.x()), clampScale(scale.y()), clampScale(scale.z())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/MessageConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import io.leangen.geantyref.TypeToken; 4 | import me.m56738.easyarmorstands.message.MessageStyle; 5 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 6 | 7 | import java.util.Map; 8 | 9 | @ConfigSerializable 10 | public class MessageConfig { 11 | public Map format; 12 | public boolean serverSideTranslation; 13 | 14 | public static TypeToken> formatType() { 15 | return new TypeToken>() { 16 | }; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/UpdateCheckConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class UpdateCheckConfig { 7 | public boolean enabled; 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/integration/IntegrationEntryConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.integration; 2 | 3 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 4 | 5 | @ConfigSerializable 6 | public class IntegrationEntryConfig { 7 | public boolean enabled; 8 | } 9 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/integration/lands/LandsConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.integration.lands; 2 | 3 | import me.m56738.easyarmorstands.config.integration.IntegrationEntryConfig; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class LandsConfig extends IntegrationEntryConfig { 8 | public LandsFlagConfig flag; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/integration/lands/LandsFlagConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.integration.lands; 2 | 3 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class LandsFlagConfig { 8 | public String displayName; 9 | public String description; 10 | public boolean display; 11 | public SimpleItemTemplate icon; 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/integration/towny/TownyConfig.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.integration.towny; 2 | 3 | import me.m56738.easyarmorstands.config.integration.IntegrationEntryConfig; 4 | import org.spongepowered.configurate.objectmapping.ConfigSerializable; 5 | 6 | @ConfigSerializable 7 | public class TownyConfig extends IntegrationEntryConfig { 8 | public boolean allowWilderness; 9 | } 10 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/serializer/DecimalFormatSerializer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.serializer; 2 | 3 | import org.spongepowered.configurate.serialize.ScalarSerializer; 4 | import org.spongepowered.configurate.serialize.SerializationException; 5 | 6 | import java.lang.reflect.Type; 7 | import java.text.DecimalFormat; 8 | import java.util.function.Predicate; 9 | 10 | public class DecimalFormatSerializer extends ScalarSerializer { 11 | public DecimalFormatSerializer() { 12 | super(DecimalFormat.class); 13 | } 14 | 15 | @Override 16 | public DecimalFormat deserialize(Type type, Object obj) throws SerializationException { 17 | return new DecimalFormat(obj.toString()); 18 | } 19 | 20 | @Override 21 | protected Object serialize(DecimalFormat item, Predicate> typeSupported) { 22 | return item.toPattern(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/serializer/KeySerializer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.serializer; 2 | 3 | import net.kyori.adventure.key.Key; 4 | import org.spongepowered.configurate.serialize.ScalarSerializer; 5 | import org.spongepowered.configurate.serialize.SerializationException; 6 | 7 | import java.lang.reflect.Type; 8 | import java.util.function.Predicate; 9 | 10 | @SuppressWarnings("PatternValidation") 11 | public class KeySerializer extends ScalarSerializer { 12 | public KeySerializer() { 13 | super(Key.class); 14 | } 15 | 16 | @Override 17 | public Key deserialize(Type type, Object value) throws SerializationException { 18 | return Key.key(value.toString()); 19 | } 20 | 21 | @Override 22 | protected Object serialize(Key item, Predicate> typeSupported) { 23 | return item.asString(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/serializer/MaterialSerializer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.serializer; 2 | 3 | import org.bukkit.Material; 4 | import org.spongepowered.configurate.serialize.ScalarSerializer; 5 | import org.spongepowered.configurate.serialize.SerializationException; 6 | 7 | import java.lang.reflect.Type; 8 | import java.util.function.Predicate; 9 | 10 | public class MaterialSerializer extends ScalarSerializer { 11 | public MaterialSerializer() { 12 | super(Material.class); 13 | } 14 | 15 | @Override 16 | public Material deserialize(Type type, Object value) throws SerializationException { 17 | String name = value.toString(); 18 | Material material = Material.matchMaterial(name); 19 | if (material == null) { 20 | throw new SerializationException("Unknown material: " + name); 21 | } 22 | return material; 23 | } 24 | 25 | @Override 26 | protected Object serialize(Material item, Predicate> typeSupported) { 27 | return item.name(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/version/override/BeforeMinorVersionCondition.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.version.override; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | import java.util.regex.Matcher; 6 | import java.util.regex.Pattern; 7 | 8 | public class BeforeMinorVersionCondition implements VersionOverrideCondition { 9 | private static final Pattern PATTERN = Pattern.compile("^1\\.(\\d+).*"); 10 | private final int minor; 11 | 12 | public BeforeMinorVersionCondition(int minor) { 13 | this.minor = minor; 14 | } 15 | 16 | @Override 17 | public boolean testCondition() { 18 | Matcher matcher = PATTERN.matcher(Bukkit.getBukkitVersion()); 19 | if (matcher.matches()) { 20 | int currentMinor = Integer.parseInt(matcher.group(1)); 21 | return currentMinor < minor; 22 | } 23 | return false; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/config/version/override/VersionOverrideCondition.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.config.version.override; 2 | 3 | public interface VersionOverrideCondition { 4 | boolean testCondition(); 5 | } 6 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/EntityRotationProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import me.m56738.easyarmorstands.api.property.type.EntityPropertyTypes; 6 | import me.m56738.easyarmorstands.api.util.RotationProvider; 7 | import me.m56738.easyarmorstands.util.EasMath; 8 | import org.bukkit.Location; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.joml.Quaterniond; 11 | import org.joml.Quaterniondc; 12 | 13 | public class EntityRotationProvider implements RotationProvider { 14 | private final Property property; 15 | private final Quaterniond rotation = new Quaterniond(); 16 | 17 | public EntityRotationProvider(PropertyContainer properties) { 18 | this.property = properties.get(EntityPropertyTypes.LOCATION); 19 | } 20 | 21 | @Override 22 | public @NotNull Quaterniondc getRotation() { 23 | return EasMath.getEntityRotation(property.getValue(), rotation); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/OffsetProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor; 2 | 3 | import org.joml.Vector3dc; 4 | 5 | public interface OffsetProvider { 6 | static OffsetProvider zero() { 7 | return ZeroOffsetProvider.INSTANCE; 8 | } 9 | 10 | Vector3dc getOffset(); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/ZeroOffsetProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor; 2 | 3 | import me.m56738.easyarmorstands.util.Util; 4 | import org.joml.Vector3dc; 5 | 6 | class ZeroOffsetProvider implements OffsetProvider { 7 | static final ZeroOffsetProvider INSTANCE = new ZeroOffsetProvider(); 8 | 9 | private ZeroOffsetProvider() { 10 | } 11 | 12 | @Override 13 | public Vector3dc getOffset() { 14 | return Util.ZERO; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/box/AbstractBoundingBoxEditorSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.box; 2 | 3 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 4 | import net.kyori.adventure.text.Component; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public abstract class AbstractBoundingBoxEditorSession implements BoundingBoxEditorSession { 8 | private final PropertyContainer properties; 9 | 10 | protected AbstractBoundingBoxEditorSession(PropertyContainer properties) { 11 | this.properties = properties; 12 | } 13 | 14 | @Override 15 | public void commit(@Nullable Component description) { 16 | properties.commit(description); 17 | } 18 | 19 | @Override 20 | public boolean isValid() { 21 | return properties.isValid(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/box/BoundingBoxEditor.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.box; 2 | 3 | import me.m56738.easyarmorstands.api.util.BoundingBox; 4 | import org.bukkit.entity.Player; 5 | 6 | public interface BoundingBoxEditor { 7 | BoundingBox getBoundingBox(); 8 | 9 | boolean canMove(Player player); 10 | 11 | boolean canResize(Player player); 12 | 13 | BoundingBoxEditorSession start(); 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/box/BoundingBoxEditorSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.box; 2 | 3 | import me.m56738.easyarmorstands.api.util.BoundingBox; 4 | import net.kyori.adventure.text.Component; 5 | import org.jetbrains.annotations.Contract; 6 | import org.jetbrains.annotations.Nullable; 7 | import org.joml.Vector3dc; 8 | 9 | public interface BoundingBoxEditorSession { 10 | BoundingBox getBoundingBox(); 11 | 12 | boolean setCenter(Vector3dc center); 13 | 14 | float getWidth(); 15 | 16 | boolean setWidth(float width); 17 | 18 | float getHeight(); 19 | 20 | boolean setHeight(float height); 21 | 22 | void revert(); 23 | 24 | void commit(@Nullable Component description); 25 | 26 | @Contract(pure = true) 27 | boolean isValid(); 28 | } 29 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/box/BoxCenterPositionProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.box; 2 | 3 | import me.m56738.easyarmorstands.api.util.PositionProvider; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Vector3d; 6 | import org.joml.Vector3dc; 7 | 8 | public class BoxCenterPositionProvider implements PositionProvider { 9 | private final BoundingBoxEditor editor; 10 | private final Vector3d center = new Vector3d(); 11 | 12 | public BoxCenterPositionProvider(BoundingBoxEditor editor) { 13 | this.editor = editor; 14 | } 15 | 16 | @Override 17 | public @NotNull Vector3dc getPosition() { 18 | return editor.getBoundingBox().getCenter(center); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/button/NodeFactoryButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.button; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import me.m56738.easyarmorstands.api.editor.button.Button; 5 | import me.m56738.easyarmorstands.api.editor.button.MenuButton; 6 | import me.m56738.easyarmorstands.api.editor.node.Node; 7 | import me.m56738.easyarmorstands.editor.node.NodeFactory; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | import org.joml.Vector3dc; 11 | 12 | public interface NodeFactoryButton extends MenuButton, Button, NodeFactory { 13 | @Override 14 | default @NotNull Button getButton() { 15 | return this; 16 | } 17 | 18 | @Override 19 | default void onClick(@NotNull Session session, @Nullable Vector3dc cursor) { 20 | Node node = createNode(); 21 | if (node != null) { 22 | session.pushNode(node, cursor); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/node/AxisMoveToolNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.Axis; 4 | import me.m56738.easyarmorstands.api.editor.Session; 5 | import me.m56738.easyarmorstands.api.editor.tool.AxisMoveToolSession; 6 | import me.m56738.easyarmorstands.api.particle.ParticleColor; 7 | import net.kyori.adventure.text.Component; 8 | import org.joml.Quaterniondc; 9 | import org.joml.Vector3dc; 10 | 11 | public class AxisMoveToolNode extends AxisLineToolNode { 12 | public AxisMoveToolNode(Session session, AxisMoveToolSession toolSession, Component name, ParticleColor color, double length, Vector3dc position, Quaterniondc rotation, Axis axis) { 13 | super(session, toolSession, name, color, length, position, rotation, axis); 14 | } 15 | 16 | @Override 17 | protected double getChange(double currentOffset, double initialOffset) { 18 | return currentOffset - initialOffset; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/node/NodeFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | 5 | public interface NodeFactory { 6 | Node createNode(); 7 | } 8 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/node/PropertyMenuNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import me.m56738.easyarmorstands.api.editor.node.MenuNode; 5 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 6 | import org.jetbrains.annotations.Contract; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class PropertyMenuNode extends MenuNode { 10 | private final PropertyContainer properties; 11 | 12 | public PropertyMenuNode(Session session, PropertyContainer properties) { 13 | super(session); 14 | this.properties = properties; 15 | } 16 | 17 | @Override 18 | public boolean isValid() { 19 | return properties.isValid(); 20 | } 21 | 22 | @Contract(pure = true) 23 | public @NotNull PropertyContainer properties() { 24 | return properties; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/node/ValueNode.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.node; 2 | 3 | import me.m56738.easyarmorstands.api.editor.node.Node; 4 | import net.kyori.adventure.text.Component; 5 | import org.bukkit.command.CommandSender; 6 | import org.incendo.cloud.parser.ArgumentParser; 7 | 8 | public interface ValueNode extends Node { 9 | Component getName(); 10 | 11 | Component formatValue(T value); 12 | 13 | ArgumentParser getParser(); 14 | 15 | default boolean canSetValue() { 16 | return true; 17 | } 18 | 19 | void setValue(T value); 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/editor/tool/AbstractToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.editor.tool; 2 | 3 | import me.m56738.easyarmorstands.api.editor.tool.ToolSession; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import net.kyori.adventure.text.Component; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public abstract class AbstractToolSession implements ToolSession { 9 | private final PropertyContainer properties; 10 | 11 | public AbstractToolSession(PropertyContainer properties) { 12 | this.properties = properties; 13 | } 14 | 15 | @Override 16 | public void commit(@Nullable Component description) { 17 | properties.commit(description); 18 | } 19 | 20 | @Override 21 | public boolean isValid() { 22 | return properties.isValid(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/element/ArmorStandElementProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.element; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.api.element.EntityElementProvider; 5 | import org.bukkit.entity.ArmorStand; 6 | import org.bukkit.entity.Entity; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public class ArmorStandElementProvider implements EntityElementProvider { 11 | private final ArmorStandElementType type; 12 | 13 | public ArmorStandElementProvider(ArmorStandElementType type) { 14 | this.type = type; 15 | } 16 | 17 | @Override 18 | public @Nullable Element getElement(@NotNull Entity entity) { 19 | if (entity instanceof ArmorStand) { 20 | return type.getElement((ArmorStand) entity); 21 | } 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/element/SimpleEntityElementProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.element; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.api.element.EntityElementProvider; 5 | import me.m56738.easyarmorstands.util.Util; 6 | import org.bukkit.entity.Entity; 7 | import org.bukkit.entity.Player; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class SimpleEntityElementProvider implements EntityElementProvider { 11 | @Override 12 | public Element getElement(@NotNull Entity entity) { 13 | if (entity instanceof Player && !entity.hasMetadata("NPC")) { 14 | return null; 15 | } 16 | return new SimpleEntityElementType<>(entity.getType(), Util.getEntityClass(entity)).getElement(entity); 17 | } 18 | 19 | @Override 20 | public @NotNull Priority getPriority() { 21 | return Priority.LOWEST; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/group/GroupPositionProvider.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.group; 2 | 3 | import me.m56738.easyarmorstands.api.util.PositionProvider; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.joml.Vector3dc; 6 | 7 | public class GroupPositionProvider implements PositionProvider { 8 | private final Group group; 9 | 10 | public GroupPositionProvider(Group group) { 11 | this.group = group; 12 | } 13 | 14 | @Override 15 | public @NotNull Vector3dc getPosition() { 16 | return group.getAveragePosition(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/group/property/GroupPendingChange.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.group.property; 2 | 3 | import me.m56738.easyarmorstands.api.property.PendingChange; 4 | 5 | import java.util.List; 6 | 7 | public class GroupPendingChange implements PendingChange { 8 | private final List changes; 9 | 10 | public GroupPendingChange(List changes) { 11 | this.changes = changes; 12 | } 13 | 14 | @Override 15 | public boolean execute() { 16 | boolean changed = false; 17 | for (PendingChange change : changes) { 18 | if (change.execute()) { 19 | changed = true; 20 | } 21 | } 22 | return changed; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/group/tool/GroupScalarToolSession.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.group.tool; 2 | 3 | import me.m56738.easyarmorstands.api.editor.tool.ScalarToolSession; 4 | import me.m56738.easyarmorstands.api.editor.tool.Tool; 5 | import org.bukkit.entity.Player; 6 | 7 | import java.util.List; 8 | 9 | public abstract class GroupScalarToolSession extends GroupToolSession implements ScalarToolSession { 10 | protected GroupScalarToolSession(List> tools) { 11 | super(tools); 12 | } 13 | 14 | @Override 15 | public boolean canSetValue(Player player) { 16 | for (ScalarToolSession session : sessions) { 17 | if (!session.canSetValue(player)) { 18 | return false; 19 | } 20 | } 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/history/action/Action.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.history.action; 2 | 3 | import me.m56738.easyarmorstands.api.history.EntityReplacementListener; 4 | import me.m56738.easyarmorstands.context.ChangeContext; 5 | import net.kyori.adventure.text.Component; 6 | 7 | public interface Action extends EntityReplacementListener { 8 | boolean execute(ChangeContext context); 9 | 10 | boolean undo(ChangeContext context); 11 | 12 | Component describe(); 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/history/action/ElementCreateAction.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.history.action; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.context.ChangeContext; 5 | import me.m56738.easyarmorstands.message.Message; 6 | import net.kyori.adventure.text.Component; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class ElementCreateAction extends ElementPresenceAction { 10 | public ElementCreateAction(@NotNull Element element) { 11 | super(element); 12 | } 13 | 14 | @Override 15 | public boolean execute(ChangeContext context) { 16 | return create(context); 17 | } 18 | 19 | @Override 20 | public boolean undo(ChangeContext context) { 21 | return destroy(context); 22 | } 23 | 24 | @Override 25 | public Component describe() { 26 | return Message.component("easyarmorstands.history.create-element", getType().getDisplayName()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/history/action/ElementDestroyAction.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.history.action; 2 | 3 | import me.m56738.easyarmorstands.api.element.Element; 4 | import me.m56738.easyarmorstands.context.ChangeContext; 5 | import me.m56738.easyarmorstands.message.Message; 6 | import net.kyori.adventure.text.Component; 7 | 8 | public class ElementDestroyAction extends ElementPresenceAction { 9 | public ElementDestroyAction(Element element) { 10 | super(element); 11 | } 12 | 13 | @Override 14 | public boolean execute(ChangeContext context) { 15 | return destroy(context); 16 | } 17 | 18 | @Override 19 | public boolean undo(ChangeContext context) { 20 | return create(context); 21 | } 22 | 23 | @Override 24 | public Component describe() { 25 | return Message.component("easyarmorstands.history.destroy-element", getType().getDisplayName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/item/ItemRenderer.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.item; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; 5 | import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; 6 | import net.kyori.adventure.translation.Translator; 7 | 8 | import java.util.Locale; 9 | 10 | public interface ItemRenderer { 11 | static ItemRenderer item() { 12 | return TranslatorItemRenderer.INSTANCE; 13 | } 14 | 15 | static ItemRenderer item(Translator translator) { 16 | return new TranslatorItemRenderer(TranslatableComponentRenderer.usingTranslationSource(translator)); 17 | } 18 | 19 | static ItemRenderer button() { 20 | return StyleItemRenderer.BUTTON; 21 | } 22 | 23 | Component renderName(String input, Locale locale, TagResolver resolver); 24 | 25 | Component renderLore(String input, Locale locale, TagResolver resolver); 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/ColorPickerMenuContext.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu; 2 | 3 | import me.m56738.easyarmorstands.api.menu.ColorPickerContext; 4 | import me.m56738.easyarmorstands.command.sender.EasPlayer; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public class ColorPickerMenuContext extends SimpleMenuContext { 8 | private final ColorPickerContext context; 9 | 10 | public ColorPickerMenuContext(EasPlayer player, ColorPickerContext context) { 11 | super(player); 12 | this.context = context; 13 | } 14 | 15 | @Override 16 | public @Nullable ColorPickerContext colorPicker() { 17 | return context; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/MenuSlotTypeRegistryImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotTypeRegistry; 5 | import net.kyori.adventure.key.Key; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | public class MenuSlotTypeRegistryImpl implements MenuSlotTypeRegistry { 13 | private final Map types = new HashMap<>(); 14 | 15 | @Override 16 | public void register(@NotNull MenuSlotType type) { 17 | types.put(type.key(), type); 18 | } 19 | 20 | @Override 21 | public @Nullable MenuSlotType getOrNull(@NotNull Key key) { 22 | return types.get(key); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/ArmorStandPositionSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class ArmorStandPositionSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "armor_stand/position"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new ArmorStandPositionSlotFactory( 22 | node.node("item").get(SimpleItemTemplate.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/BackgroundSlotFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotContext; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public class BackgroundSlotFactory implements MenuSlotFactory { 9 | private final SimpleItemTemplate itemTemplate; 10 | 11 | public BackgroundSlotFactory(SimpleItemTemplate itemTemplate) { 12 | this.itemTemplate = itemTemplate; 13 | } 14 | 15 | @Override 16 | public BackgroundSlot createSlot(@NotNull MenuSlotContext context) { 17 | return new BackgroundSlot(itemTemplate, context.resolver()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/BackgroundSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class BackgroundSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "background"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new BackgroundSlotFactory(node.node("item").get(SimpleItemTemplate.class)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/DestroySlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class DestroySlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "destroy"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new DestroySlotFactory(node.node("item").get(SimpleItemTemplate.class)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/EntityCopySlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class EntityCopySlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "copy"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new EntityCopySlotFactory( 22 | node.node("button").get(SimpleItemTemplate.class), 23 | node.node("item").get(SimpleItemTemplate.class)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/FallbackSlotFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotContext; 5 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | public class FallbackSlotFactory implements MenuSlotFactory { 10 | @Override 11 | public @Nullable MenuSlot createSlot(@NotNull MenuSlotContext context) { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/FallbackSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import net.kyori.adventure.key.Key; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.spongepowered.configurate.ConfigurationNode; 8 | import org.spongepowered.configurate.serialize.SerializationException; 9 | 10 | public class FallbackSlotType implements MenuSlotType { 11 | private final Key key; 12 | 13 | public FallbackSlotType(Key key) { 14 | this.key = key; 15 | } 16 | 17 | @Override 18 | public @NotNull Key key() { 19 | return key; 20 | } 21 | 22 | @Override 23 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 24 | return new FallbackSlotFactory(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/menu/slot/PropertySlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.menu.slot; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class PropertySlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "property"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | PropertyType type = node.node("property").get(PropertyType.type()); 22 | return new PropertySlotFactory<>(type); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/message/MessageStyle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.message; 2 | 3 | public enum MessageStyle { 4 | TITLE, 5 | SUCCESS, 6 | WARNING, 7 | ERROR, 8 | HINT, 9 | CHAT_BUTTON, 10 | HOVER, 11 | BUTTON_NAME, 12 | BUTTON_DESCRIPTION 13 | } 14 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/particle/EditorParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.particle; 2 | 3 | import me.m56738.easyarmorstands.api.particle.Particle; 4 | 5 | public interface EditorParticle extends Particle { 6 | void showGizmo(); 7 | 8 | void updateGizmo(); 9 | 10 | void hideGizmo(); 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/particle/GizmoParticle.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.particle; 2 | 3 | import me.m56738.gizmo.api.Gizmo; 4 | 5 | public class GizmoParticle implements EditorParticle { 6 | private final Gizmo gizmo; 7 | 8 | public GizmoParticle(Gizmo gizmo) { 9 | this.gizmo = gizmo; 10 | } 11 | 12 | @Override 13 | public void showGizmo() { 14 | gizmo.show(); 15 | } 16 | 17 | @Override 18 | public void updateGizmo() { 19 | gizmo.update(); 20 | } 21 | 22 | @Override 23 | public void hideGizmo() { 24 | gizmo.hide(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/permission/Child.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.permission; 2 | 3 | import org.intellij.lang.annotations.MagicConstant; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Repeatable; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | 11 | @Target(ElementType.FIELD) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Repeatable(Children.class) 14 | @interface Child { 15 | @MagicConstant(valuesFromClass = Permissions.class) 16 | String value(); 17 | } 18 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/permission/Children.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.permission; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.FIELD) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | @interface Children { 11 | Child[] value(); 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/permission/Description.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.permission; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.FIELD) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | @interface Description { 11 | String value(); 12 | } 13 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/armorstand/ArmorStandArmsProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.armorstand; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.ArmorStandPropertyTypes; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import org.bukkit.entity.ArmorStand; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class ArmorStandArmsProperty implements Property { 10 | private final ArmorStand entity; 11 | 12 | public ArmorStandArmsProperty(ArmorStand entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return ArmorStandPropertyTypes.ARMS; 19 | } 20 | 21 | @Override 22 | public @NotNull Boolean getValue() { 23 | return entity.hasArms(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Boolean value) { 28 | entity.setArms(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/armorstand/ArmorStandGravityProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.armorstand; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.ArmorStandPropertyTypes; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import org.bukkit.entity.ArmorStand; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class ArmorStandGravityProperty implements Property { 10 | private final ArmorStand entity; 11 | 12 | public ArmorStandGravityProperty(ArmorStand entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return ArmorStandPropertyTypes.GRAVITY; 19 | } 20 | 21 | @Override 22 | public @NotNull Boolean getValue() { 23 | return entity.hasGravity(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Boolean value) { 28 | entity.setGravity(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/armorstand/ArmorStandMarkerProperty.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.armorstand; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.type.ArmorStandPropertyTypes; 5 | import me.m56738.easyarmorstands.api.property.type.PropertyType; 6 | import org.bukkit.entity.ArmorStand; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class ArmorStandMarkerProperty implements Property { 10 | private final ArmorStand entity; 11 | 12 | public ArmorStandMarkerProperty(ArmorStand entity) { 13 | this.entity = entity; 14 | } 15 | 16 | @Override 17 | public @NotNull PropertyType getType() { 18 | return ArmorStandPropertyTypes.MARKER; 19 | } 20 | 21 | @Override 22 | public @NotNull Boolean getValue() { 23 | return entity.isMarker(); 24 | } 25 | 26 | @Override 27 | public boolean setValue(@NotNull Boolean value) { 28 | entity.setMarker(value); 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/button/BooleanToggleButton.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.button; 2 | 3 | import me.m56738.easyarmorstands.api.property.Property; 4 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | 7 | public class BooleanToggleButton extends ToggleButton { 8 | public BooleanToggleButton(Property property, PropertyContainer container, SimpleItemTemplate item) { 9 | super(property, container, item); 10 | } 11 | 12 | @Override 13 | public Boolean getNextValue() { 14 | return !property.getValue(); 15 | } 16 | 17 | @Override 18 | public Boolean getPreviousValue() { 19 | return getNextValue(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/BooleanTogglePropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 4 | import me.m56738.easyarmorstands.api.property.Property; 5 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 6 | import me.m56738.easyarmorstands.property.button.BooleanToggleButton; 7 | import net.kyori.adventure.key.Key; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | public class BooleanTogglePropertyType extends BooleanPropertyType { 12 | public BooleanTogglePropertyType(@NotNull Key key) { 13 | super(key); 14 | } 15 | 16 | @Override 17 | public @Nullable MenuSlot createSlot(@NotNull Property property, @NotNull PropertyContainer container) { 18 | return new BooleanToggleButton(property, container, buttonTemplate); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/EnumTogglePropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlot; 4 | import me.m56738.easyarmorstands.api.property.Property; 5 | import me.m56738.easyarmorstands.api.property.PropertyContainer; 6 | import me.m56738.easyarmorstands.property.button.EnumToggleButton; 7 | import net.kyori.adventure.key.Key; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | public class EnumTogglePropertyType> extends EnumPropertyType { 12 | public EnumTogglePropertyType(@NotNull Key key, Class type) { 13 | super(key, type); 14 | } 15 | 16 | @Override 17 | public @Nullable MenuSlot createSlot(@NotNull Property property, @NotNull PropertyContainer container) { 18 | return new EnumToggleButton<>(property, container, buttonTemplate, values); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/EulerAnglePropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.util.Util; 4 | import net.kyori.adventure.key.Key; 5 | import net.kyori.adventure.text.Component; 6 | import org.bukkit.util.EulerAngle; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class EulerAnglePropertyType extends ConfigurablePropertyType { 10 | public EulerAnglePropertyType(@NotNull Key key) { 11 | super(key, EulerAngle.class); 12 | } 13 | 14 | @Override 15 | public @NotNull Component getValueComponent(@NotNull EulerAngle value) { 16 | return Util.formatAngle(value); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/IntegerPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import net.kyori.adventure.key.Key; 4 | import net.kyori.adventure.text.Component; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public class IntegerPropertyType extends ConfigurablePropertyType { 8 | public IntegerPropertyType(@NotNull Key key) { 9 | super(key, Integer.class); 10 | } 11 | 12 | @Override 13 | public @NotNull Component getValueComponent(@NotNull Integer value) { 14 | return Component.text(value); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/LocationPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.util.Util; 4 | import net.kyori.adventure.key.Key; 5 | import net.kyori.adventure.text.Component; 6 | import org.bukkit.Location; 7 | import org.bukkit.entity.Player; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class LocationPropertyType extends ConfigurablePropertyType { 11 | public LocationPropertyType(@NotNull Key key) { 12 | super(key, Location.class); 13 | } 14 | 15 | @Override 16 | public @NotNull Component getValueComponent(@NotNull Location value) { 17 | return Util.formatLocation(value); 18 | } 19 | 20 | @Override 21 | public @NotNull Location cloneValue(@NotNull Location value) { 22 | return value.clone(); 23 | } 24 | 25 | @Override 26 | public boolean canCopy(@NotNull Player player) { 27 | return false; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/QuaternionfcPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.util.Util; 4 | import net.kyori.adventure.key.Key; 5 | import net.kyori.adventure.text.Component; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.joml.Quaterniond; 8 | import org.joml.Quaternionf; 9 | import org.joml.Quaternionfc; 10 | 11 | public class QuaternionfcPropertyType extends ConfigurablePropertyType { 12 | public QuaternionfcPropertyType(@NotNull Key key) { 13 | super(key, Quaternionfc.class); 14 | } 15 | 16 | @Override 17 | public @NotNull Component getValueComponent(@NotNull Quaternionfc value) { 18 | return Util.formatAngle(Util.toEuler(new Quaterniond(value))); 19 | } 20 | 21 | @Override 22 | public @NotNull Quaternionfc cloneValue(@NotNull Quaternionfc value) { 23 | return new Quaternionf(value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/property/type/Vector3fcPropertyType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.property.type; 2 | 3 | import me.m56738.easyarmorstands.util.Util; 4 | import net.kyori.adventure.key.Key; 5 | import net.kyori.adventure.text.Component; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.joml.Vector3d; 8 | import org.joml.Vector3f; 9 | import org.joml.Vector3fc; 10 | 11 | public class Vector3fcPropertyType extends ConfigurablePropertyType { 12 | public Vector3fcPropertyType(@NotNull Key key) { 13 | super(key, Vector3fc.class); 14 | } 15 | 16 | @Override 17 | public @NotNull Component getValueComponent(@NotNull Vector3fc value) { 18 | return Util.formatOffset(new Vector3d(value)); 19 | } 20 | 21 | @Override 22 | public @NotNull Vector3fc cloneValue(@NotNull Vector3fc value) { 23 | return new Vector3f(value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/session/NodeProviderImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.session; 2 | 3 | import me.m56738.easyarmorstands.api.editor.Session; 4 | import me.m56738.easyarmorstands.api.editor.node.ElementSelectionNode; 5 | import me.m56738.easyarmorstands.api.editor.node.NodeProvider; 6 | import me.m56738.easyarmorstands.editor.node.ElementSelectionNodeImpl; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | class NodeProviderImpl implements NodeProvider { 10 | private final Session session; 11 | 12 | NodeProviderImpl(Session session) { 13 | this.session = session; 14 | } 15 | 16 | @Override 17 | public @NotNull ElementSelectionNode elementSelectionNode() { 18 | return new ElementSelectionNodeImpl(session); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/session/context/AddContextImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.session.context; 2 | 3 | import me.m56738.easyarmorstands.api.editor.context.AddContext; 4 | 5 | public class AddContextImpl implements AddContext { 6 | public static final AddContextImpl INSTANCE = new AddContextImpl(); 7 | 8 | private AddContextImpl() { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/session/context/ExitContextImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.session.context; 2 | 3 | import me.m56738.easyarmorstands.api.editor.context.ExitContext; 4 | 5 | public class ExitContextImpl implements ExitContext { 6 | public static final ExitContextImpl INSTANCE = new ExitContextImpl(); 7 | 8 | private ExitContextImpl() { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/session/context/RemoveContextImpl.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.session.context; 2 | 3 | import me.m56738.easyarmorstands.api.editor.context.RemoveContext; 4 | 5 | public class RemoveContextImpl implements RemoveContext { 6 | public static final RemoveContextImpl INSTANCE = new RemoveContextImpl(); 7 | 8 | private RemoveContextImpl() { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/java/me/m56738/easyarmorstands/util/ReflectionUtil.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.util; 2 | 3 | public final class ReflectionUtil { 4 | private ReflectionUtil() { 5 | } 6 | 7 | public static boolean hasClass(String name) { 8 | try { 9 | Class.forName(name); 10 | return true; 11 | } catch (Throwable e) { 12 | return false; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/entity/display.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | height: 4 4 | parent: entity/default 5 | slots: 6 | easyarmorstands:copy: 7 | enabled: false 8 | easyarmorstands:display/billboard: 9 | column: 4 10 | config: 11 | property: easyarmorstands:display/billboard 12 | row: 1 13 | type: easyarmorstands:property 14 | easyarmorstands:display/box: 15 | column: 8 16 | config: 17 | item: 18 | description: 19 | - 20 | - 21 | name: 22 | type: black_stained_glass 23 | row: 3 24 | type: easyarmorstands:display/box 25 | easyarmorstands:display/content: 26 | column: 1 27 | row: 2 28 | type: easyarmorstands:property 29 | easyarmorstands:entity/custom_name: 30 | enabled: false 31 | easyarmorstands:entity/silent: 32 | enabled: false 33 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/entity/type/block_display.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: entity/display 4 | slots: 5 | easyarmorstands:display/content: 6 | config: 7 | property: easyarmorstands:block_display/block 8 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/entity/type/interaction.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | height: 1 4 | parent: entity/default 5 | slots: 6 | easyarmorstands:copy: 7 | enabled: false 8 | easyarmorstands:entity/custom_name: 9 | enabled: false 10 | easyarmorstands:entity/glowing: 11 | enabled: false 12 | easyarmorstands:entity/silent: 13 | enabled: false 14 | easyarmorstands:interaction/responsive: 15 | column: 0 16 | config: 17 | property: easyarmorstands:interaction/responsive 18 | row: 0 19 | type: easyarmorstands:property 20 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/entity/type/item_display.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: 4 | - entity/display 5 | - entity/item_holder 6 | slots: 7 | easyarmorstands:display/content: 8 | config: 9 | property: easyarmorstands:item_display/item 10 | easyarmorstands:item_display/transform: 11 | column: 5 12 | config: 13 | property: easyarmorstands:item_display/transform 14 | row: 1 15 | type: easyarmorstands:property 16 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/entity/type/text_display.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: entity/display 4 | slots: 5 | easyarmorstands:display/content: 6 | config: 7 | property: easyarmorstands:text_display/text 8 | easyarmorstands:entity/glowing: 9 | enabled: false 10 | easyarmorstands:text_display/alignment: 11 | column: 5 12 | config: 13 | property: easyarmorstands:text_display/alignment 14 | row: 1 15 | type: easyarmorstands:property 16 | easyarmorstands:text_display/background: 17 | column: 6 18 | config: 19 | property: easyarmorstands:text_display/background 20 | row: 1 21 | type: easyarmorstands:property 22 | easyarmorstands:text_display/see_through: 23 | column: 7 24 | config: 25 | property: easyarmorstands:text_display/see_through 26 | row: 1 27 | type: easyarmorstands:property 28 | easyarmorstands:text_display/shadow: 29 | column: 8 30 | config: 31 | property: easyarmorstands:text_display/shadow 32 | row: 1 33 | type: easyarmorstands:property 34 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/fancyholograms/block.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: entity/type/block_display 4 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/fancyholograms/item.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: entity/type/item_display 4 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/main/resources/menu/fancyholograms/text.yml: -------------------------------------------------------------------------------- 1 | _version: 2 | game: 1.19.4 3 | parent: entity/type/text_display 4 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_10_2/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entitytag.v1_10_2.EntityTagCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_11/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.itemcolor.v1_11.ItemColorCapabilityProvider 2 | me.m56738.easyarmorstands.capability.spawn.v1_11.SpawnCapabilityProvider 3 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_12/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entitysize.v1_12.EntitySizeCapabilityProvider 2 | me.m56738.easyarmorstands.capability.lookup.v1_12.LookupCapabilityProvider 3 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_12_paper/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.tick.v1_12_paper.TickCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_13/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.item.v1_13.ItemCapabilityProvider 2 | me.m56738.easyarmorstands.capability.persistence.v1_13.PersistenceCapabilityProvider 3 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_14/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.tool.v1_14.ToolCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_15_2/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.equipment.v1_15_2.EquipmentCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_16/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.lock.v1_16.LockCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_16_paper/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.component.v1_16_paper.ComponentCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_18/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.visibility.v1_18.VisibilityCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_18_paper/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entitytype.v1_18_paper.EntityTypeCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_19_4/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entitytype.v1_19_4.EntityTypeCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_20_2/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.egg.v1_20_2.SpawnEggCapabilityProvider 2 | me.m56738.easyarmorstands.capability.spawn.v1_20_2.SpawnCapabilityProvider 3 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_20_6/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entityscale.v1_20_6.EntityScaleCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_8/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.component.v1_8.ComponentCapabilityProvider 2 | me.m56738.easyarmorstands.capability.entitytype.v1_8.EntityTypeCapabilityProvider 3 | me.m56738.easyarmorstands.capability.equipment.v1_8.EquipmentCapabilityProvider 4 | me.m56738.easyarmorstands.capability.invulnerability.v1_8.InvulnerabilityCapabilityProvider 5 | me.m56738.easyarmorstands.capability.item.v1_8.ItemCapabilityProvider 6 | me.m56738.easyarmorstands.capability.itemcolor.v1_8.ItemColorCapabilityProvider 7 | me.m56738.easyarmorstands.capability.lock.v1_8.LockCapabilityProvider 8 | me.m56738.easyarmorstands.capability.lookup.v1_8.LookupCapabilityProvider 9 | me.m56738.easyarmorstands.capability.spawn.v1_8.SpawnCapabilityProvider 10 | me.m56738.easyarmorstands.capability.tool.v1_8.ToolCapabilityProvider 11 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_9/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.entityai.v1_9.EntityAICapabilityProvider 2 | me.m56738.easyarmorstands.capability.equipment.v1_9.EquipmentCapabilityProvider 3 | me.m56738.easyarmorstands.capability.glow.v1_9.GlowCapabilityProvider 4 | me.m56738.easyarmorstands.capability.handswap.v1_9.SwapHandItemsCapabilityProvider 5 | me.m56738.easyarmorstands.capability.invulnerability.v1_9.InvulnerabilityCapabilityProvider 6 | -------------------------------------------------------------------------------- /easyarmorstands-plugin/src/v1_9_spigot/resources/META-INF/services/me.m56738.easyarmorstands.capability.CapabilityProvider: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.capability.silent.v1_9_spigot.SilentCapabilityProvider 2 | -------------------------------------------------------------------------------- /easyarmorstands-residence/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.residence) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-residence/src/main/java/me/m56738/easyarmorstands/residence/ResidenceAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.residence; 2 | 3 | import com.bekvon.bukkit.residence.Residence; 4 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 5 | import me.m56738.easyarmorstands.addon.Addon; 6 | import me.m56738.easyarmorstands.api.EasyArmorStands; 7 | 8 | public class ResidenceAddon implements Addon { 9 | private ResidencePrivilegeChecker privilegeChecker; 10 | 11 | @Override 12 | public String name() { 13 | return "Residence"; 14 | } 15 | 16 | @Override 17 | public void enable() { 18 | privilegeChecker = new ResidencePrivilegeChecker(Residence.getInstance()); 19 | EasyArmorStands.get().regionPrivilegeManager().registerPrivilegeChecker(EasyArmorStandsPlugin.getInstance(), privilegeChecker); 20 | } 21 | 22 | @Override 23 | public void disable() { 24 | EasyArmorStands.get().regionPrivilegeManager().unregisterPrivilegeChecker(privilegeChecker); 25 | } 26 | 27 | @Override 28 | public void reload() { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-residence/src/main/java/me/m56738/easyarmorstands/residence/ResidenceAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.residence; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class ResidenceAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.residence.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("Residence") != null; 16 | } 17 | 18 | @Override 19 | public ResidenceAddon create() { 20 | return new ResidenceAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-residence/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.residence.ResidenceAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-towny/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.towny) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-towny/src/main/java/me/m56738/easyarmorstands/towny/TownyAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.towny; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import org.bukkit.Bukkit; 6 | 7 | public class TownyAddonFactory implements AddonFactory { 8 | @Override 9 | public boolean isEnabled() { 10 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.towny.enabled; 11 | } 12 | 13 | @Override 14 | public boolean isAvailable() { 15 | return Bukkit.getPluginManager().getPlugin("Towny") != null; 16 | } 17 | 18 | @Override 19 | public TownyAddon create() { 20 | return new TownyAddon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /easyarmorstands-towny/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.towny.TownyAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-traincarts/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | compileOnly(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.traincarts) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-traincarts/src/main/java/me/m56738/easyarmorstands/traincarts/TrainCartsAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.traincarts; 2 | 3 | import me.m56738.easyarmorstands.addon.Addon; 4 | import me.m56738.easyarmorstands.api.EasyArmorStands; 5 | 6 | public class TrainCartsAddon implements Addon { 7 | @Override 8 | public String name() { 9 | return "TrainCarts"; 10 | } 11 | 12 | @Override 13 | public void enable() { 14 | EasyArmorStands.get().menuSlotTypeRegistry().register(new TrainCartsModelListingSlotType()); 15 | } 16 | 17 | @Override 18 | public void disable() { 19 | } 20 | 21 | @Override 22 | public void reload() { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-traincarts/src/main/java/me/m56738/easyarmorstands/traincarts/TrainCartsAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.traincarts; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import me.m56738.easyarmorstands.util.ReflectionUtil; 6 | import org.bukkit.Bukkit; 7 | 8 | public class TrainCartsAddonFactory implements AddonFactory { 9 | @Override 10 | public boolean isEnabled() { 11 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.trainCarts.enabled; 12 | } 13 | 14 | @Override 15 | public boolean isAvailable() { 16 | return Bukkit.getPluginManager().getPlugin("Train_Carts") != null 17 | && ReflectionUtil.hasClass("com.bergerkiller.bukkit.tc.attachments.ui.models.listing.DialogResult"); 18 | } 19 | 20 | @Override 21 | public TrainCartsAddon create() { 22 | return new TrainCartsAddon(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-traincarts/src/main/java/me/m56738/easyarmorstands/traincarts/TrainCartsModelListingSlotType.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.traincarts; 2 | 3 | import me.m56738.easyarmorstands.api.menu.MenuSlotFactory; 4 | import me.m56738.easyarmorstands.api.menu.MenuSlotType; 5 | import me.m56738.easyarmorstands.item.SimpleItemTemplate; 6 | import net.kyori.adventure.key.Key; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.spongepowered.configurate.ConfigurationNode; 9 | import org.spongepowered.configurate.serialize.SerializationException; 10 | 11 | public class TrainCartsModelListingSlotType implements MenuSlotType { 12 | public static final Key KEY = Key.key("easyarmorstands", "traincarts/model_browser"); 13 | 14 | @Override 15 | public @NotNull Key key() { 16 | return KEY; 17 | } 18 | 19 | @Override 20 | public @NotNull MenuSlotFactory load(@NotNull ConfigurationNode node) throws SerializationException { 21 | return new TrainCartsModelListingSlotFactory( 22 | node.node("item").get(SimpleItemTemplate.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-traincarts/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.traincarts.TrainCartsAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v6/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly(libs.bukkit) { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.worldguard.v6) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v6/src/main/java/me/m56738/easyarmorstands/worldguard/v6/WorldGuardAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.worldguard.v6; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.Addon; 5 | import me.m56738.easyarmorstands.api.EasyArmorStands; 6 | import me.m56738.easyarmorstands.api.region.RegionPrivilegeChecker; 7 | 8 | public class WorldGuardAddon implements Addon { 9 | private RegionPrivilegeChecker privilegeChecker; 10 | 11 | @Override 12 | public String name() { 13 | return "WorldGuard"; 14 | } 15 | 16 | @Override 17 | public void enable() { 18 | privilegeChecker = new WorldGuardPrivilegeChecker(); 19 | EasyArmorStands.get().regionPrivilegeManager().registerPrivilegeChecker(EasyArmorStandsPlugin.getInstance(), privilegeChecker); 20 | } 21 | 22 | @Override 23 | public void disable() { 24 | EasyArmorStands.get().regionPrivilegeManager().unregisterPrivilegeChecker(privilegeChecker); 25 | } 26 | 27 | @Override 28 | public void reload() { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v6/src/main/java/me/m56738/easyarmorstands/worldguard/v6/WorldGuardAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.worldguard.v6; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import me.m56738.easyarmorstands.util.ReflectionUtil; 6 | import org.bukkit.Bukkit; 7 | 8 | public class WorldGuardAddonFactory implements AddonFactory { 9 | @Override 10 | public boolean isEnabled() { 11 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.worldGuard.enabled; 12 | } 13 | 14 | @Override 15 | public boolean isAvailable() { 16 | return Bukkit.getPluginManager().getPlugin("WorldGuard") != null && 17 | ReflectionUtil.hasClass("com.sk89q.worldguard.bukkit.WGBukkit"); 18 | } 19 | 20 | @Override 21 | public WorldGuardAddon create() { 22 | return new WorldGuardAddon(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v6/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.worldguard.v6.WorldGuardAddonFactory 2 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v7/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("easyarmorstands.base") 3 | } 4 | 5 | dependencies { 6 | implementation(project(":easyarmorstands-plugin")) 7 | compileOnly("org.bukkit:bukkit:1.13-R0.1-SNAPSHOT") { 8 | isTransitive = false 9 | } 10 | compileOnly(libs.worldguard.v7) 11 | } 12 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v7/src/main/java/me/m56738/easyarmorstands/worldguard/v7/WorldGuardAddon.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.worldguard.v7; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.Addon; 5 | import me.m56738.easyarmorstands.api.EasyArmorStands; 6 | import me.m56738.easyarmorstands.api.region.RegionPrivilegeChecker; 7 | 8 | public class WorldGuardAddon implements Addon { 9 | private RegionPrivilegeChecker privilegeChecker; 10 | 11 | @Override 12 | public String name() { 13 | return "WorldGuard"; 14 | } 15 | 16 | @Override 17 | public void enable() { 18 | privilegeChecker = new WorldGuardPrivilegeChecker(); 19 | EasyArmorStands.get().regionPrivilegeManager().registerPrivilegeChecker(EasyArmorStandsPlugin.getInstance(), privilegeChecker); 20 | } 21 | 22 | @Override 23 | public void disable() { 24 | EasyArmorStands.get().regionPrivilegeManager().unregisterPrivilegeChecker(privilegeChecker); 25 | } 26 | 27 | @Override 28 | public void reload() { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v7/src/main/java/me/m56738/easyarmorstands/worldguard/v7/WorldGuardAddonFactory.java: -------------------------------------------------------------------------------- 1 | package me.m56738.easyarmorstands.worldguard.v7; 2 | 3 | import me.m56738.easyarmorstands.EasyArmorStandsPlugin; 4 | import me.m56738.easyarmorstands.addon.AddonFactory; 5 | import me.m56738.easyarmorstands.util.ReflectionUtil; 6 | import org.bukkit.Bukkit; 7 | 8 | public class WorldGuardAddonFactory implements AddonFactory { 9 | @Override 10 | public boolean isEnabled() { 11 | return EasyArmorStandsPlugin.getInstance().getConfiguration().integration.worldGuard.enabled; 12 | } 13 | 14 | @Override 15 | public boolean isAvailable() { 16 | return Bukkit.getPluginManager().getPlugin("WorldGuard") != null && 17 | ReflectionUtil.hasClass("com.sk89q.worldguard.protection.regions.RegionContainer"); 18 | } 19 | 20 | @Override 21 | public WorldGuardAddon create() { 22 | return new WorldGuardAddon(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /easyarmorstands-worldguard-v7/src/main/resources/META-INF/services/me.m56738.easyarmorstands.addon.AddonFactory: -------------------------------------------------------------------------------- 1 | me.m56738.easyarmorstands.worldguard.v7.WorldGuardAddonFactory 2 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | version=2.6.0-SNAPSHOT 2 | minecraftVersion=1.8-1.21.5 3 | 4 | org.gradle.parallel=true 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/56738/EasyArmorStands/b233db1d56cb43a0b5cf8af4214ee5b375d7c302/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "EasyArmorStands" 2 | 3 | pluginManagement { 4 | includeBuild("build-logic") 5 | } 6 | 7 | include("easyarmorstands-api") 8 | include("easyarmorstands-bentobox") 9 | include("easyarmorstands-display") 10 | include("easyarmorstands-display-api") 11 | include("easyarmorstands-fancyholograms") 12 | include("easyarmorstands-griefdefender") 13 | include("easyarmorstands-griefprevention") 14 | include("easyarmorstands-headdatabase") 15 | include("easyarmorstands-huskclaims") 16 | include("easyarmorstands-lands") 17 | include("easyarmorstands-plotsquared") 18 | include("easyarmorstands-plugin") 19 | include("easyarmorstands-residence") 20 | include("easyarmorstands-towny") 21 | include("easyarmorstands-traincarts") 22 | include("easyarmorstands-worldguard-v6") 23 | include("easyarmorstands-worldguard-v7") 24 | --------------------------------------------------------------------------------