Skip to content

Commit

Permalink
Merge pull request #836 from KyoriPowered/feature/bossbar-platform-im…
Browse files Browse the repository at this point in the history
…plementation

feat(api): bossbar platform implementation
  • Loading branch information
zml2008 authored Nov 11, 2022
2 parents 25886b7 + e924cd9 commit 08f357a
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
24 changes: 24 additions & 0 deletions api/src/main/java/net/kyori/adventure/bossbar/BossBarImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer;
Expand All @@ -35,8 +36,11 @@
import java.util.stream.Stream;
import net.kyori.adventure.internal.Internals;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.util.Services;
import net.kyori.examination.ExaminableProperty;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static java.util.Objects.requireNonNull;

Expand All @@ -48,6 +52,26 @@ final class BossBarImpl extends HackyBossBarPlatformBridge implements BossBar {
private Color color;
private Overlay overlay;
private final Set<Flag> flags = EnumSet.noneOf(Flag.class);
@Nullable BossBarImplementation implementation;

@ApiStatus.Internal
static final class ImplementationAccessor {
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
private static final Optional<BossBarImplementation.Provider> SERVICE = Services.service(BossBarImplementation.Provider.class);

private ImplementationAccessor() {
}

@SuppressWarnings("OptionalGetWithoutIsPresent")
static @NotNull <I extends BossBarImplementation> I get(final @NotNull BossBar bar, final @NotNull Class<I> type) {
@Nullable BossBarImplementation implementation = ((BossBarImpl) bar).implementation;
if (implementation == null) {
implementation = SERVICE.get().create(bar);
((BossBarImpl) bar).implementation = implementation;
}
return type.cast(implementation);
}
}

BossBarImpl(final @NotNull Component name, final float progress, final @NotNull Color color, final @NotNull Overlay overlay) {
this.name = requireNonNull(name, "name");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* This file is part of adventure, licensed under the MIT License.
*
* Copyright (c) 2017-2022 KyoriPowered
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.kyori.adventure.bossbar;

import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

/**
* {@link BossBar} internal implementation.
*
* @since 4.12.0
*/
@ApiStatus.Internal
public interface BossBarImplementation {
/**
* Gets an implementation, and casts it to {@code type}.
*
* @param bar the bossbar
* @param type the implementation type
* @param <I> the implementation type
* @return a {@code I}
* @since 4.12.0
*/
@ApiStatus.Internal
static <I extends BossBarImplementation> @NotNull I get(final @NotNull BossBar bar, final @NotNull Class<I> type) {
return BossBarImpl.ImplementationAccessor.get(bar, type);
}

/**
* A {@link BossBarImplementation} service provider.
*
* @since 4.12.0
*/
@ApiStatus.Internal
interface Provider {
/**
* Gets an implementation.
*
* @param bar the bossbar
* @return a {@code I}
* @since 4.12.0
*/
@ApiStatus.Internal
@NotNull BossBarImplementation create(final @NotNull BossBar bar);
}
}

0 comments on commit 08f357a

Please sign in to comment.