From 1e8f96bd7fc27df3ad5492ddca8b1e3ca1f6a6c7 Mon Sep 17 00:00:00 2001 From: Mats Date: Fri, 2 Feb 2024 22:50:42 +0100 Subject: [PATCH 1/6] Init --- api/pom.xml | 58 ++++++++++++++++++ .../gamemodefilter/OaGamemodeFilter$1.class | Bin 1042 -> 0 bytes .../gamemodefilter/OaGamemodeFilter.class | Bin 1636 -> 0 bytes .../target/classes/type.info | 1 - .../target/maven-archiver/pom.properties | 3 - .../compile/default-compile/createdFiles.lst | 2 - .../compile/default-compile/inputFiles.lst | 1 - .../rules/survival/OaSurvivalRules.class | Bin 967 -> 0 bytes .../target/classes/type.info | 1 - .../target/maven-archiver/pom.properties | 3 - .../compile/default-compile/createdFiles.lst | 1 - .../compile/default-compile/inputFiles.lst | 1 - pom.xml | 1 + 13 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 api/pom.xml delete mode 100644 modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter$1.class delete mode 100644 modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter.class delete mode 100644 modules/gamemode-voice-filter-module/target/classes/type.info delete mode 100644 modules/gamemode-voice-filter-module/target/maven-archiver/pom.properties delete mode 100644 modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 modules/survival-audio-rules-module/target/classes/com/craftmend/rules/survival/OaSurvivalRules.class delete mode 100644 modules/survival-audio-rules-module/target/classes/type.info delete mode 100644 modules/survival-audio-rules-module/target/maven-archiver/pom.properties delete mode 100644 modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 000000000..f0d131316 --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + openaudiomc-api + ${oa.version} + jar + openaudiomc-api + + + com.craftmend.openaudiomc + OpenAudioMc-Parent + ../pom.xml + 1.2 + + + + 1.8 + UTF-8 + + + + openaudiomc-api + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter$1.class b/modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter$1.class deleted file mode 100644 index a0d11e4ae3131d080f0269ef41d3ff86b0cca089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1042 zcmb7DTWb?R6#gdJy3M6Fwyv%9RyDOrs*VxChe{EG6(MbfN*;U=CYxz8&F;*yJ6q@< z(idNR5YY#JfImt+yNT5bMY^yvb8g?6bIvzEet!E7;0c-~IJjQM3~p3#6SrKfy14D) z4#NdIQc3+01Mm7KDtpW)o||V|nr|6qgA`;t0LeenKm`NKnTBnak(_5+hBJ=~FYWCkwoR#C@V z6)tA0C}GXTy(-qxprM{?ru8;MEla`!p@)30e<*#+uy-27L{f`%piJoVBvM0TIq@V7 zWWtY(@})l#mQPrd@J^ao6HX|zooe4IqZuBYM*I)es84-kY{!I=(KHx_Vk2YF@>%m@ zs0^je__~vGY^l-wdoI5Xn^>i1F#}>USgn?|k6ufG{u0Wht+< z?o*|eqG(;m9IaO-Ubu)FN#viSG4i;Cg(=oM@+p$d+xUti!~J}H57+qsr}&W!Mf`zn x<*=)hfD>2`i@2Pp_2AK|K#4&m6c(RTSFl7v0n4~byMq;6!#tg`S{&Nx`vqnI4^IF9 diff --git a/modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter.class b/modules/gamemode-voice-filter-module/target/classes/com/craftmend/gamemodefilter/OaGamemodeFilter.class deleted file mode 100644 index eb8b6fe2fd2848d031f8b39bf6110300e4d4b0cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1636 zcmb7ETW=dh6#mAEv+34NX_|%>0&MBcX-J3kLP4pJLN29}Q`07@)Te5)p4dZncdXrU z+VX>VE<6AN3GvL2LVSA(ah#T_e(*UvXU=!NbDO{a`Tb7-xAD~^KAps+6S#~kK2GAQ zhig8XnD=nqhld3pb$sTdfkh8DJV+0p3p5@iiB4A|m1Q~;@VeSPRIwJAY0kI4SNlpv zD(T8Cmzt!zEHJ)mJG7o|nM6Mv#5+3ORyz?-rdu{t(G!)L{JT0FcRfQ?*$Qne!&L3M zSSKCXWrUbGyC!lvm2GvuI@l-<7-ot*)^rx8rtgeR$kQed661`D%nyt<)|`JLP|Gd1 znwt_m!@v$w#hEvLf0P1Uc`Jhfx3 zTeWfDCI#liJwvWv3;0`hkcOIRk@LCHJa6Rn6_`E9J}A=ZMMz;JIWFo>pm~RoDwG?Wu>Q25w@mfsb)s;M=1e7_L#)H(l#w z88wsp)`U9jDJRSJWU{2SrPF;{Jltw<+U~HcM4uG|^y?HMPFzRQ-$oaW>oOJfxE*z|Dt zziX{*Z?qq8K5MmC*4EbquDqF9o71?GPvd6DdEi)AbrjfW4lP)*fy?v%GmPDwt_fvU z_CZ!ST$Y=o8}OD^6!U*Zbvk8ZHwH;qF4^`d&~P!{Iwq@w%-Q%TCPQI~k5L2M8a`7K zl&A3?|IhGiky22OO^a6)HB47mK=WDZxf{)x!8uB<%4=L}qpq{Bb$uV_36Mu!D4+=U z6P4kZb3=}N0IQf6@ImGHh_`F>X)OGVu^-`G{}tmo##q67iV_I;(q3f3mkO-e@_vPt z=kp=vi1tz8B~H@J?X2Lx!8kQwX1e|xCjLVG4|q=*WAYcAIHc+qkk<&mI7D~mKf2tk l3Qtnzcy(g diff --git a/modules/gamemode-voice-filter-module/target/classes/type.info b/modules/gamemode-voice-filter-module/target/classes/type.info deleted file mode 100644 index 10a135dc0..000000000 --- a/modules/gamemode-voice-filter-module/target/classes/type.info +++ /dev/null @@ -1 +0,0 @@ -main: com.craftmend.gamemodefilter.OaGamemodeFilter \ No newline at end of file diff --git a/modules/gamemode-voice-filter-module/target/maven-archiver/pom.properties b/modules/gamemode-voice-filter-module/target/maven-archiver/pom.properties deleted file mode 100644 index c3cb31244..000000000 --- a/modules/gamemode-voice-filter-module/target/maven-archiver/pom.properties +++ /dev/null @@ -1,3 +0,0 @@ -artifactId=openaudiomc-gamemodefilter -groupId=com.craftmend.openaudiomc -version=6.8.10 diff --git a/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 9ae938f3f..000000000 --- a/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -com/craftmend/gamemodefilter/OaGamemodeFilter.class -com/craftmend/gamemodefilter/OaGamemodeFilter$1.class diff --git a/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index dbbcacd3c..000000000 --- a/modules/gamemode-voice-filter-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/mindgamesnl/workspaces/openaudiomc/OpenAudioMc/modules/gamemode-voice-filter-module/src/main/java/com/craftmend/gamemodefilter/OaGamemodeFilter.java diff --git a/modules/survival-audio-rules-module/target/classes/com/craftmend/rules/survival/OaSurvivalRules.class b/modules/survival-audio-rules-module/target/classes/com/craftmend/rules/survival/OaSurvivalRules.class deleted file mode 100644 index 8904a20c27ab9289bd2ff058ac048464888a759c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 967 zcmb7CO>Yx15Pi<(V-r%^hO`CRLg18AsD)ICLlII%QVFzaP*e4a+>MhOcD>PlM8N;y zPPrg);0N%d5aZ1fg{4BO51#RO-uTV){QUL(2Y`J%tf7oMHtyQktYQn>72K=fK12Dr z(kgzzV6}J77>X~0p=4Ngl$OVde=fsQaqdy1;RLSm&P1rpISUr!3l%Z!Id0%{Hx#4T zmwL#<#FG(^l5nb~!sC50$lMciallX+%lKIMRJPgPao&lk;GWQ9K8Qo5$CPlB5;`(+ zLp6z2pc(3cenmW$@YE-Q6-;cuoqIQ!NG+0~3VfG~iQ-Zxe#Cphke=;MrH&6wizR7X zhNss?Gb{~a;lA&QNhUyT5G0{1kCc(9nQL^x>l!}dHd3KfaweQc%F zTd8;zwCZ?(HHOF6k(S}v-|2Zpl#XRM5-xpD_XD|Fcr$qz`2UgrXh}oz#yLDa>Yw!9 zI{m{=w?l+WG-YO$K%Weo_9~q?S!SY-zJXnmQ$UUOavHR8gZ%m|f$S2UNG~kYZop5- z8nD$Ud?B+4tuH{WIdtU;sFjDVUI|^DQ{GKk5R*LJjRhc$Wk$DwTN&Ng#IQi%>h4z* pKcjeQ3Rr2swe(_>-q=cutj`j&A_PGbYgA@EMKGh@2Dt^?{tent)Cm9p diff --git a/modules/survival-audio-rules-module/target/classes/type.info b/modules/survival-audio-rules-module/target/classes/type.info deleted file mode 100644 index d6cdf82fc..000000000 --- a/modules/survival-audio-rules-module/target/classes/type.info +++ /dev/null @@ -1 +0,0 @@ -main: com.craftmend.oaparties.RinoarcLegacy \ No newline at end of file diff --git a/modules/survival-audio-rules-module/target/maven-archiver/pom.properties b/modules/survival-audio-rules-module/target/maven-archiver/pom.properties deleted file mode 100644 index b09654622..000000000 --- a/modules/survival-audio-rules-module/target/maven-archiver/pom.properties +++ /dev/null @@ -1,3 +0,0 @@ -artifactId=openaudiomc-survival-audio-rules -groupId=com.craftmend.openaudiomc -version=6.8.10 diff --git a/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 678359cd7..000000000 --- a/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -com/craftmend/rules/survival/OaSurvivalRules.class diff --git a/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 99df6c87f..000000000 --- a/modules/survival-audio-rules-module/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/mindgamesnl/workspaces/openaudiomc/OpenAudioMc/modules/survival-audio-rules-module/src/main/java/com/craftmend/rules/survival/OaSurvivalRules.java diff --git a/pom.xml b/pom.xml index d2f52dcff..210da590c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ modules/jutils + api plugin modules/voice-join-permission modules/vistas-client From 7c6b8abfabb3a2b101f2c48df8ad7239bdcebdd8 Mon Sep 17 00:00:00 2001 From: Mats Date: Sat, 3 Feb 2024 14:53:16 +0100 Subject: [PATCH 2/6] New API footprint --- api/pom.xml | 22 +++ .../craftmend/openaudiomc/api/ClientApi.java | 33 ++++ .../craftmend/openaudiomc/api/MediaApi.java | 68 ++++++++ .../craftmend/openaudiomc/api/VoiceApi.java | 61 +++++++ .../craftmend/openaudiomc/api/WorldApi.java | 34 ++++ .../openaudiomc/api/basic/Actor.java | 44 +++++ .../openaudiomc/api/clients/Client.java | 47 ++++++ .../openaudiomc/api/media/Media.java | 159 ++++++++++++++++++ .../openaudiomc/api/media/UrlMutation.java | 22 +++ .../openaudiomc/api/regions/AudioRegion.java | 30 ++++ .../openaudiomc/api/spakers/BasicSpeaker.java | 57 +++++++ .../api/spakers}/ExtraSpeakerOptions.java | 11 +- .../openaudiomc/api/spakers/Loc.java | 56 ++++++ .../openaudiomc/api/spakers}/SpeakerType.java | 2 +- .../api/voice}/VoicePeerOptions.java | 2 +- .../craftmend/openaudiomc/api/ClientApi.class | Bin 0 -> 129 bytes .../openaudiomc/api/basic/Actor.class | Bin 0 -> 337 bytes .../openaudiomc/api/basic/Media.class | Bin 0 -> 692 bytes .../openaudiomc/api/clients/Client.class | Bin 0 -> 333 bytes api/target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 4 + .../compile/default-compile/inputFiles.lst | 4 + api/target/openaudiomc-api.jar | Bin 0 -> 4642 bytes api/target/original-openaudiomc-api.jar | Bin 0 -> 4342 bytes .../database/models/Speaker.java | 4 +- plugin/pom.xml | 5 + .../openaudiomc/api/impl/MediaApiImpl.java | 2 +- .../openaudiomc/api/impl/RegistryApiImpl.java | 2 +- .../openaudiomc/api/impl/VoiceApiImpl.java | 2 +- .../openaudiomc/api/interfaces/Client.java | 2 +- .../api/interfaces/RegistryApi.java | 2 +- .../openaudiomc/api/interfaces/VoiceApi.java | 2 +- .../client/objects/ClientConnection.java | 1 + .../generic/client/objects/PeerQueue.java | 1 + .../client/session/RtcSessionManager.java | 2 +- .../generic/media/MediaService.java | 2 +- .../media/interfaces/ForcedUrlMutation.java | 2 + .../generic/media/interfaces/UrlMutation.java | 11 -- .../media/middleware/DropBoxMiddleware.java | 2 +- .../generic/media/objects/Media.java | 31 +++- .../migrations/SpeakerDatabaseMigration.java | 4 +- .../speakers/objects/ClientSpeaker.java | 2 +- .../voice/ClientVoiceOptionsPayload.java | 2 +- .../voice/ClientVoiceSubscribePayload.java | 2 +- .../openaudiomc/generic/user/User.java | 16 +- .../speaker/SpeakerSetSubCommand.java | 2 +- .../players/handlers/SpeakerHandler.java | 4 +- .../modules/playlists/PlaylistService.java | 2 +- .../modules/speakers/SpeakerCollector.java | 4 +- .../modules/speakers/SpeakerService.java | 7 +- .../listeners/SpeakerCreateListener.java | 4 +- .../listeners/SpeakerSelectListener.java | 2 - .../modules/speakers/menu/SpeakerMenu.java | 4 +- .../speakers/objects/ApplicableSpeaker.java | 2 +- .../speakers/objects/MappedLocation.java | 3 +- .../modules/speakers/objects/Speaker.java | 4 +- .../voicechat/tasks/PlayerPeerTicker.java | 2 +- pom.xml | 26 +++ 58 files changed, 759 insertions(+), 67 deletions(-) create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java rename {plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums => api/src/main/java/com/craftmend/openaudiomc/api/spakers}/ExtraSpeakerOptions.java (84%) create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java rename {plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums => api/src/main/java/com/craftmend/openaudiomc/api/spakers}/SpeakerType.java (83%) rename {plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects => api/src/main/java/com/craftmend/openaudiomc/api/voice}/VoicePeerOptions.java (96%) create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/clients/Client.class create mode 100644 api/target/maven-archiver/pom.properties create mode 100644 api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 api/target/openaudiomc-api.jar create mode 100644 api/target/original-openaudiomc-api.jar delete mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/UrlMutation.java diff --git a/api/pom.xml b/api/pom.xml index f0d131316..7c8533c8f 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -55,4 +55,26 @@ + + + org.jetbrains + annotations + 24.1.0 + + + + org.projectlombok + lombok-maven + 1.18.20.0 + pom + + + + org.projectlombok + lombok + 1.18.22 + compile + + + \ No newline at end of file diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java new file mode 100644 index 000000000..79e658650 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java @@ -0,0 +1,33 @@ +package com.craftmend.openaudiomc.api; + +import com.craftmend.openaudiomc.api.clients.Client; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.UUID; + +public interface ClientApi { + + /** + * Get a client by a player UUID, or null if the player is not online or not registered yet + * @param clientUuid the UUID of the player + * @return the client instance, or null if the client is not connected + */ + @Nullable Client getClient(String clientUuid); + + /** + * Get all clients that are currently known to the server + * @return All clients + */ + @NotNull + Collection getAllClients(); + + /** + * Check if a client is registered, and has an active web connection + * @param uuid the UUID of the player + * @return true if the player is connected, false if not or not registered + */ + boolean isConnected(UUID uuid); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java new file mode 100644 index 000000000..86ced4bc9 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java @@ -0,0 +1,68 @@ +package com.craftmend.openaudiomc.api; + +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.api.media.Media; +import com.craftmend.openaudiomc.api.media.UrlMutation; +import org.jetbrains.annotations.NotNull; + +public interface MediaApi { + + /** + * Create a new media instance with a source, and automatically translate the source + * (if needed) and register a normalized time for the start instant. + * + * @param source the source of the media + * @return a new media instance + */ + @NotNull + Media createMedia(@NotNull String source); + + /** + * Translate server-sided aliases, playlists or other sources to a valid source. + * This is automatically done by createMedia, but you might want to do this manually. + * + * @param source the source to translate + * @return the translated source + */ + @NotNull + String translateSource(@NotNull String source); + + /** + * URL mutations can be used to register custom server-side media hooks or source translators. + * An example use case would be a custom media server aliased by hypixel:, which can be resolved + * to https://hypixel.com/media/* by a mutation. + * + * @param mutation the mutation to register + */ + void registerMutation(@NotNull UrlMutation mutation); + + /** + * Get the current epoch time, but normalized to the start of the current media. + * This timecodes is normalized based on heartbeats from an open audio server, to eliminate + * timezone changes between this server and the web-client (because the player might be in a different timezone) + * + * @return the current epoch time, but normalized to the start of the current media + */ + long getNormalizedCurrentEpoch(); + + /** + * Play a media for a client + * @param client Target client + * @param media Media instance + */ + void playFor(@NotNull Media media, @NotNull Client... clients); + + /** + * Stop all media (except regions and speakers) for a client + * @param clients Target clients + */ + void stopFor(@NotNull Client... clients); + + /** + * Stop a specific media by ID for a client + * @param id Media ID + * @param clients Target clients + */ + void stopFor(@NotNull String id, @NotNull Client... clients); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java new file mode 100644 index 000000000..7af64eef0 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java @@ -0,0 +1,61 @@ +package com.craftmend.openaudiomc.api; + +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; + +import java.util.UUID; + +public interface VoiceApi { + + /* + * The VoiceApi contains registry, as well as control endpoints for voice-chat related features. + * This implementation is only available on the Spigot instance, even if the plugin is running in a BungeeCord/Velocity or Vistas network. + * Accessing this API on a non-spigot instance will result in undefined behavior or runtime exceptions. + */ + + /** + * Register a client as a voice-chat peer + * @param haystack The client that will be the host + * @param needle The client that will be the peer + * @return true if the client was registered, false if the client was already registered + */ + boolean hasPeer(Client haystack, Client needle); + + /** + * Register a client as a voice-chat peer + * @param haystack The client that will be the host + * @param needle The client that will be the peer + * @return true if the client was registered, false if the client was already registered + */ + boolean hasPeer(Client haystack, UUID needle); + + /** + * Push new options for a peer, changing how its rendered in the client + * @param client The web client that should receive this update + * @param peerToUpdate The peer that should be updated + * @param options The new options + */ + void updatePeerOptions(Client client, Client peerToUpdate, VoicePeerOptions options); + + /** + * Add a peer (partner) to someone's voice chat. + * This would let the client hear the peerToAdd as a global voice (without spatial audio/distance) until it's removed. + * @param client The web client that should receive this update + * @param peerToAdd The peer that should be added + * @param visible Whether the peer should be visible in the client + * @param mutual Whether the peer should also hear the client (repeat the call for mutual) + */ + void addStaticPeer(Client client, Client peerToAdd, boolean visible, boolean mutual); + + /** + * Remove a global peer from someone's voice chat. + * This would remove a static peer if they have been added through addStaticPeer, but not + * if they have been added through the regular voice-chat system. + * @param client The web client that should receive this update + * @param peerToRemove The peer that should be removed + * @param mutual Whether the peer should also stop hearing the client (repeat the call for mutual) + */ + void removeStaticPeer(Client client, Client peerToRemove, boolean mutual); + + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java new file mode 100644 index 000000000..0970b56f2 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java @@ -0,0 +1,34 @@ +package com.craftmend.openaudiomc.api; + +import com.craftmend.openaudiomc.api.regions.AudioRegion; +import com.craftmend.openaudiomc.api.spakers.BasicSpeaker; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +public interface WorldApi { + + /** + * Get all regions at a location + * @param x x + * @param y y + * @param z z + * @param world world + * @return regions + */ + @NotNull + Collection getRegionsAt(int x, int y, int z, @NotNull String world); + + /** + * Get a speaker at a location, or null if invalid + * @param x x + * @param y y + * @param z z + * @param world world + * @return speaker + */ + @Nullable + BasicSpeaker getSpeakerAt(int x, int y, int z, @NotNull String world); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java b/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java new file mode 100644 index 000000000..e1b46dc65 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java @@ -0,0 +1,44 @@ +package com.craftmend.openaudiomc.api.basic; + +import java.util.UUID; + +public interface Actor { + + /* + * An actor is a further abstraction of a User from within OpenAudioMc. + * A user is an object representing a platform specific user whose type is given as a parameter to the user class itself. + * An actor is a more abstract version of this, and is used to represent any user, regardless of platform. + */ + + /** + * Get the name of the actor (usually the player name) + * @return the name of the actor + */ + String getName(); + + /** + * Get the unique id of the actor (usually the player uuid) + * @return the unique id of the actor + */ + UUID getUniqueId(); + + /** + * If the actor is an administrator (usually a player with OP if we're running on a spigot host, otherwise determined by the platform) + * @return if the actor is an administrator + */ + boolean isAdministrator(); + + /** + * Check if the actor has a certain permission node. This uses the underlying platform's permission system if available. + * @param permissionNode the permission node to check for + * @return if the actor has the permission node + */ + boolean hasPermission(String permissionNode); + + /** + * Make the actor execute a command. This is usually a wrapper around the platform's command sender system. + * @param command the command to execute + */ + void sendMessage(String message); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java new file mode 100644 index 000000000..8fe535c3d --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java @@ -0,0 +1,47 @@ +package com.craftmend.openaudiomc.api.clients; + +import com.craftmend.openaudiomc.api.basic.Actor; + +public interface Client { + + /* + * A player session represents the state of an online player and its corresponding web client connection. + * It's used to interact with the webclient, determine and change state and hook back into the platform specific user object. + */ + + /** + * Get the actor of the underlying User (usually a player) + * @return the actor + */ + Actor getActor(); + + /** + * If this client currently has the web session open + * @return if the client is connected + */ + boolean isConnected(); + + /** + * If this session has an active voice chat instance + * @return if the client is in a voice chat + */ + boolean hasVoicechatEnabled(); + + /** + * If this the actor's microphone is muted, false if the actor is not in a voice chat + * @return if the microphone is muted + */ + boolean isMicrophoneMuted(); + + /** + * Get the volume of the client (media volume, 0-100, -1 if unknown or not applicable) + * @return the volume + */ + int getVolume(); + + /** + * If the actor is currently in moderation mode + * @return if the actor is moderating + */ + boolean isModerating(); +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java new file mode 100644 index 000000000..e755548aa --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java @@ -0,0 +1,159 @@ +package com.craftmend.openaudiomc.api.media; + +public interface Media { + + /** + * The unique id of the media, used by the client to keep track of media pools. + * This is a random UUID by default, but can be set to a custom value and will be used to identify the media + * for regions, stop commands and other features. + * + * @return the unique id of the media + */ + String getMediaId(); + + /** + * Source value for the media. Typically, a web compatible web link or translatable OA value + * + * @return the source of the media + */ + String getSource(); + + /** + * The volume of the media, 0-100 + * + * @return the volume of the media + */ + int getVolume(); + + /** + * An epoch millisecond timestamp of when the media started playing, used by the client to calculate the current position + * if keepup is configured (time spent + startAtMillis) + * + * @return the start instant of the media + */ + long getStartInstant(); + + + /** + * The starting point of the media, in milliseconds. 0 by default, but can be used to skip intros or start at a certain point. + * + * @return the starting point of the media + */ + int startAtMillis(); + + /** + * If the media should loop (jumping back to startAtMillis and playing again) + * + * @return if the media should loop + */ + boolean loopMedia(); + + /** + * If the media should attempt to pick up where its currently according to the time spent since the start instant. + * + * @return if the media should attempt to pick up + */ + boolean doPickup(); + + /** + * Fade time is the amount of milliseconds it takes to fade in or out. 0 by default, but can be used to create smooth transitions + * between multiple regions, or to create a fade in effect. + * + * @return the fade time of the media + */ + int getFadeTime(); + + /** + * Keep timeout is the amount of seconds that the openaudiomc plugin runtime should keep track of this media for. + * Used to retroactively play media if a client connected too late. optional, -1 by default to disable. + * + * @return the keep timeout of the media + */ + int getKeepTimeout(); + + /** + * If this media will mute current regions while playing. This is used to prevent overlapping media in regions. + * + * @return if the media will mute regions + */ + boolean muteRegions(); + + /** + * If this media will mute the speakers of the client. This is used to prevent overlapping media with speakers. + * + * @return if the media will mute speakers + */ + boolean muteSpeakers(); + + /** + * New media ID, used to identify the media for regions, stop commands and other features, can be any non-null string + * + * @param mediaId the new media id + */ + void setMediaId(String mediaId); + + /** + * Epoch millisecond timestamp of when the media started playing, used by the client to calculate the current position. + * + * @param startInstant the new start instant + */ + void setStartInstant(long startInstant); + + /** + * Amount of seconds to keep track of this media for, used to retroactively play media if a client connected too late. + * + * @param keepTimeout the new keep timeout in seconds + */ + void setKeepTimeout(int keepTimeout); + + /** + * If the media should attempt to pick up where its currently according to the time spent since the start instant. + * + * @param doPickup if the media should attempt to pick up + */ + void setDoPickup(boolean doPickup); + + /** + * If the media should loop (jumping back to startAtMillis and playing again), defaults to false + * + * @param loopMedia if the media should loop + */ + void setLoopMedia(boolean loopMedia); + + + /** + * The amount of milliseconds to fade in or out. 0 by default, but can be used to create smooth transitions + * + * @param fadeTime the new fade time + */ + void setFadeTime(int fadeTime); + + /** + * The volume of the media, 0-100 + * + * @param volume the new volume + */ + void setVolume(int volume); + + /** + * if this media should mute current regions while playing. This is used to prevent overlapping media in regions. + * + * @param muteRegions if the media should mute regions + */ + void setMuteRegions(boolean muteRegions); + + /** + * if this media should mute the speakers of the client. This is used to prevent overlapping media with speakers. + * + * @param muteSpeakers if the media should mute speakers + */ + void setMuteSpeakers(boolean muteSpeakers); + + /** + * The starting point of the media, in miliseconds. 0 by default, but can be used to skip intros or start at a certain point. + * + * @param startAtMillis the new starting point + */ + void setStartAtMillis(int startAtMillis); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java new file mode 100644 index 000000000..eb5373cbe --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java @@ -0,0 +1,22 @@ +package com.craftmend.openaudiomc.api.media; + +import org.jetbrains.annotations.NotNull; + +public interface UrlMutation { + + /* + * URL mutations can be used to register custom server-side media hooks or source translators. + * An example use case would be a custom media server aliased by hypixel:, which can be resolved + * to https://hypixel.com/media/* by a mutation. + */ + + /** + * Translate a custom source to a full media URL. + * + * @param original The original source as given in the createMedia method or any command + * @return the URL that should be used for playback + */ + @NotNull + String onRequest(@NotNull String original); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java b/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java new file mode 100644 index 000000000..214017988 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java @@ -0,0 +1,30 @@ +package com.craftmend.openaudiomc.api.regions; + +import com.craftmend.openaudiomc.api.media.Media; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface AudioRegion { + + /** + * Get the media playing in this region + * @return media + */ + @NotNull + Media getMedia(); + + /** + * Get the region id + * @return id + */ + @NotNull + String getRegionId(); + + /** + * Get the world this region is in, can be null if its legacy + * @return world + */ + @Nullable + String getWorld(); + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java new file mode 100644 index 000000000..f5f0e8aba --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java @@ -0,0 +1,57 @@ +package com.craftmend.openaudiomc.api.spakers; + +import com.craftmend.openaudiomc.api.media.Media; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; +import java.util.UUID; + +public interface BasicSpeaker { + + /** + * Get the location of the speaker + * @return location + */ + @NotNull + Loc getLocation(); + + /** + * Get the media that's being played by this speaker + * @return media + */ + @NotNull + Media getMedia(); + + /** + * Get the speaker id + * @return id + */ + @NotNull + UUID getSpeakerId(); + + /** + * Get the type of speaker (spatial audio, or static) + * @return speaker type + */ + SpeakerType getSpeakerType(); + + /** + * Get extra options for the speaker + * @return options + */ + @NotNull + Set getExtraOptions(); + + /** + * Get the radius of the speaker + * @return radius + */ + int getRadius(); + + /** + * If this speaker is currently directly powered by redstone + * @return is powered + */ + boolean isRedstonePowered(); + +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/ExtraSpeakerOptions.java b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.java similarity index 84% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/ExtraSpeakerOptions.java rename to api/src/main/java/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.java index 9c8e5bc4f..6ab32e7bd 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/ExtraSpeakerOptions.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.java @@ -1,6 +1,5 @@ -package com.craftmend.openaudiomc.spigot.modules.speakers.enums; +package com.craftmend.openaudiomc.api.spakers; -import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; import lombok.Getter; import java.util.Arrays; @@ -55,20 +54,20 @@ public enum ExtraSpeakerOptions { @Getter private boolean display; @Getter private String title; @Getter private String description; - private Predicate[] predicates; + private Predicate[] predicates; - ExtraSpeakerOptions(boolean display, String title, String description, Predicate... requirementChecks) { + ExtraSpeakerOptions(boolean display, String title, String description, Predicate... requirementChecks) { this.display = display; this.title = title; this.description = description; this.predicates = requirementChecks; } - public boolean isCompatibleWith(Speaker speaker) { + public boolean isCompatibleWith(BasicSpeaker speaker) { return Arrays.stream(this.predicates).allMatch(predicate -> predicate.test(speaker)); } - public boolean isEnabledFor(Speaker speaker) { + public boolean isEnabledFor(BasicSpeaker speaker) { return speaker.getExtraOptions().contains(this) && isCompatibleWith(speaker); } diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java new file mode 100644 index 000000000..d6bce2363 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java @@ -0,0 +1,56 @@ +package com.craftmend.openaudiomc.api.spakers; + +import org.jetbrains.annotations.NotNull; + +public interface Loc { + + /** + * Get the x coordinate + * @return x + */ + int getX(); + + /** + * Get the y coordinate + * @return y + */ + int getY(); + + /** + * Get the z coordinate + * @return z + */ + int getZ(); + + /** + * Get the world name + * @return world + */ + @NotNull + String getWorld(); + + /** + * Set the x coordinate + * @param x x + */ + void setX(int x); + + /** + * Set the y coordinate + * @param y y + */ + void setY(int y); + + /** + * Set the z coordinate + * @param z z + */ + void setZ(int z); + + /** + * Set the world name + * @param world world + */ + void setWorld(@NotNull String world); + +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/SpeakerType.java b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/SpeakerType.java similarity index 83% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/SpeakerType.java rename to api/src/main/java/com/craftmend/openaudiomc/api/spakers/SpeakerType.java index 484c1028e..34bf84bff 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/enums/SpeakerType.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/SpeakerType.java @@ -1,4 +1,4 @@ -package com.craftmend.openaudiomc.spigot.modules.speakers.enums; +package com.craftmend.openaudiomc.api.spakers; import lombok.Getter; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/VoicePeerOptions.java b/api/src/main/java/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.java similarity index 96% rename from plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/VoicePeerOptions.java rename to api/src/main/java/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.java index 86fdac41e..34bbf64f5 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/VoicePeerOptions.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.java @@ -1,4 +1,4 @@ -package com.craftmend.openaudiomc.generic.client.objects; +package com.craftmend.openaudiomc.api.voice; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class b/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class new file mode 100644 index 0000000000000000000000000000000000000000..771eb97cc1af8be056ae5d842e5d897242467964 GIT binary patch literal 129 zcmX^0Z`VEs1_l!bc6J6PMh5ld{9OIyqQtb4+|;}j{rrN|yu{L!%>3MB{ltPyednCa z)VvbMf=qS>7Dfhvti-ZJ{hY+SbbbG%tkmQZMh33n{L-T2RJY8WR7M6qxN<#^N;XCY SMh0e}Wgx)FzzQUp7}x+4c_JkM literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class b/api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class new file mode 100644 index 0000000000000000000000000000000000000000..27fcd28d9f195f2fa04468f06f701687d40adec5 GIT binary patch literal 337 zcmZvYy-ve06oroqZ6Kjg5WGXO;DwE;5<;rPpHzi`&2>z;RcsgA;o%r~03Hf)8woMM z;xqV@&UfzT*ZT*63mj({2~^r!se^h>*0@Icjd7}P$XhMdhU7{`(sHho4;gj^W^47P zWT#v!?^kQ1lR(y*bf>HlI4!H2-~VL_Sc;Ln6F4jX7Hqj9viz-yQMK&xFZC#pFMS`hxu%Yxd>D1U l^_>WCAs+=8^TshI*lx|RH{?F@AqyM~ImIE9EY0r-vu~99Rki>C literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class b/api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class new file mode 100644 index 0000000000000000000000000000000000000000..a85017eaf6b54b95ef03fbf176b2e3263f57db97 GIT binary patch literal 692 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 E0vKr9IsgCw literal 0 HcmV?d00001 diff --git a/api/target/original-openaudiomc-api.jar b/api/target/original-openaudiomc-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..084f19e800822b546d80a8c95c426e4165e44067 GIT binary patch literal 4342 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 literal 0 HcmV?d00001 diff --git a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java index 71162db88..8c714fc5d 100644 --- a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java +++ b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java @@ -3,8 +3,8 @@ import com.craftmend.oamapmigrator.database.internal.LegacyStore; import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.SpeakerMedia; import lombok.Getter; diff --git a/plugin/pom.xml b/plugin/pom.xml index e6cdb3e55..9fc607086 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -101,6 +101,11 @@ + + com.craftmend.openaudiomc + openaudiomc-api + 6.8.10 + com.coreoz diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java index 26673ee0d..e2009dfcd 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java @@ -14,7 +14,7 @@ import com.craftmend.openaudiomc.generic.networking.payloads.client.speakers.ClientSpeakerDestroyPayload; import com.craftmend.openaudiomc.generic.networking.payloads.client.speakers.objects.ClientSpeaker; import com.craftmend.openaudiomc.spigot.services.world.Vector3; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import java.time.Instant; import java.util.UUID; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/RegistryApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/RegistryApiImpl.java index 976c71699..d6334623e 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/RegistryApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/RegistryApiImpl.java @@ -9,7 +9,7 @@ import com.craftmend.openaudiomc.generic.commands.interfaces.SubCommand; import com.craftmend.openaudiomc.generic.database.DatabaseService; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.interfaces.UrlMutation; +import com.craftmend.openaudiomc.api.media.UrlMutation; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.platform.Platform; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java index 15e928e7a..d96e9be11 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java @@ -3,7 +3,7 @@ import com.craftmend.openaudiomc.api.interfaces.Client; import com.craftmend.openaudiomc.api.interfaces.VoiceApi; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import java.util.UUID; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java index 05f5a2c08..fc2da9dd8 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.api.interfaces; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.media.objects.Media; import com.craftmend.openaudiomc.generic.user.User; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/RegistryApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/RegistryApi.java index fb39ba3c3..0da9f8cb2 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/RegistryApi.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/RegistryApi.java @@ -2,7 +2,7 @@ import com.craftmend.openaudiomc.api.exceptions.RegionException; import com.craftmend.openaudiomc.generic.commands.interfaces.SubCommand; -import com.craftmend.openaudiomc.generic.media.interfaces.UrlMutation; +import com.craftmend.openaudiomc.api.media.UrlMutation; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.utils.data.Filter; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java index 12cc08efe..f96eadaac 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.api.interfaces; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import java.util.UUID; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java index d435a88b2..fbdeb4032 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java @@ -2,6 +2,7 @@ import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.api.impl.event.events.ClientConnectEvent; import com.craftmend.openaudiomc.api.impl.event.events.ClientDisconnectEvent; import com.craftmend.openaudiomc.api.impl.event.events.ClientErrorEvent; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java index c5f711e2b..d71f403c7 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java @@ -1,5 +1,6 @@ package com.craftmend.openaudiomc.generic.client.objects; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientDropVoiceStream; import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientSubscribeToVoice; import com.craftmend.openaudiomc.generic.networking.payloads.client.voice.ClientVoiceDropPayload; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java index 2c416470c..7fc03c06a 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java @@ -8,7 +8,7 @@ import com.craftmend.openaudiomc.generic.client.enums.RtcStateFlag; import com.craftmend.openaudiomc.generic.client.helpers.ClientRtcLocationUpdate; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.oac.OpenaudioAccountService; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.node.packets.ForceMuteMicrophonePacket; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/MediaService.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/MediaService.java index 5667ea8b9..a78eb5b66 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/MediaService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/MediaService.java @@ -4,7 +4,7 @@ import com.craftmend.openaudiomc.generic.authentication.AuthenticationService; import com.craftmend.openaudiomc.generic.media.middleware.CdnMiddleware; import com.craftmend.openaudiomc.generic.media.interfaces.ForcedUrlMutation; -import com.craftmend.openaudiomc.generic.media.interfaces.UrlMutation; +import com.craftmend.openaudiomc.api.media.UrlMutation; import com.craftmend.openaudiomc.generic.media.middleware.DropBoxMiddleware; import com.craftmend.openaudiomc.generic.service.Inject; import com.craftmend.openaudiomc.generic.service.Service; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/ForcedUrlMutation.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/ForcedUrlMutation.java index 89b03d466..9e8ab3bd3 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/ForcedUrlMutation.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/ForcedUrlMutation.java @@ -1,5 +1,7 @@ package com.craftmend.openaudiomc.generic.media.interfaces; +import com.craftmend.openaudiomc.api.media.UrlMutation; + public interface ForcedUrlMutation extends UrlMutation { } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/UrlMutation.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/UrlMutation.java deleted file mode 100644 index 910b3c7ec..000000000 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/interfaces/UrlMutation.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.craftmend.openaudiomc.generic.media.interfaces; - -public interface UrlMutation { - - /** - * @param original the original source as entered in the command - * @return the new url that will be send to the client - */ - String onRequest(String original); - -} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/middleware/DropBoxMiddleware.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/middleware/DropBoxMiddleware.java index 6edf0f91a..02b1f8e1b 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/middleware/DropBoxMiddleware.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/middleware/DropBoxMiddleware.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.media.middleware; -import com.craftmend.openaudiomc.generic.media.interfaces.UrlMutation; +import com.craftmend.openaudiomc.api.media.UrlMutation; public class DropBoxMiddleware implements UrlMutation { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java index 7602f15ae..ea16fe977 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java @@ -10,7 +10,7 @@ import java.util.UUID; @Getter -public class Media { +public class Media implements com.craftmend.openaudiomc.api.media.Media { //media tracker @Setter private String mediaId = UUID.randomUUID().toString(); @@ -60,4 +60,33 @@ public Media applySettings(MediaOptions options) { return this; } + @Override + public int startAtMillis() { + return startAtMillis; + } + + @Override + public boolean loopMedia() { + return loop; + } + + @Override + public boolean doPickup() { + return doPickup; + } + + @Override + public boolean muteRegions() { + return muteRegions; + } + + @Override + public boolean muteSpeakers() { + return muteSpeakers; + } + + @Override + public void setLoopMedia(boolean b) { + this.loop = b; + } } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/migrations/migrations/SpeakerDatabaseMigration.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/migrations/migrations/SpeakerDatabaseMigration.java index 40ead1a98..761e7bf24 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/migrations/migrations/SpeakerDatabaseMigration.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/migrations/migrations/SpeakerDatabaseMigration.java @@ -9,8 +9,8 @@ import com.craftmend.openaudiomc.generic.storage.enums.StorageLocation; import com.craftmend.openaudiomc.generic.storage.interfaces.Configuration; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/speakers/objects/ClientSpeaker.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/speakers/objects/ClientSpeaker.java index b6f400c7c..f50e2780d 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/speakers/objects/ClientSpeaker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/speakers/objects/ClientSpeaker.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.speakers.objects; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.services.world.Vector3; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java index bf6043519..ee3ad0319 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.voice; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java index dcb045558..f52066af3 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.voice; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.client.helpers.ClientRtcLocationUpdate; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/user/User.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/user/User.java index fb54ba1b2..f2dd7a285 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/user/User.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/user/User.java @@ -1,32 +1,30 @@ package com.craftmend.openaudiomc.generic.user; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.basic.Actor; import com.craftmend.openaudiomc.api.interfaces.Client; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import net.md_5.bungee.api.chat.TextComponent; -import javax.annotation.Nullable; import java.util.Optional; import java.util.UUID; -public interface User { +public interface User extends Actor { - T getOriginal(); + // Please check inherited methods from Actor - String getName(); - UUID getUniqueId(); + T getOriginal(); String getIpAddress(); - boolean isAdministrator(); - boolean hasPermission(String permission); - void makeExecuteCommand(String command); - void sendMessage(String message); void sendTitle(String title, String subtitle, int fadeIn, int stay, int fadeOut); + + // todo: this can be private where needed, should not be inherited void sendMessage(TextComponent textComponent); + void sendClickableCommandMessage(String message, String hoverMessage, String command); void sendClickableUrlMessage(String message, String hoverMessage, String url); default void sendActionbarMessage(String message) { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/commands/subcommands/speaker/SpeakerSetSubCommand.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/commands/subcommands/speaker/SpeakerSetSubCommand.java index cb26cd31f..6bddb3e5f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/commands/subcommands/speaker/SpeakerSetSubCommand.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/commands/subcommands/speaker/SpeakerSetSubCommand.java @@ -9,7 +9,7 @@ import com.craftmend.openaudiomc.generic.user.User; import com.craftmend.openaudiomc.spigot.modules.commands.subcommands.SpeakersSubCommand; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; import com.craftmend.openaudiomc.spigot.modules.speakers.utils.SpeakerUtils; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/handlers/SpeakerHandler.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/handlers/SpeakerHandler.java index 64680a63d..424620556 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/handlers/SpeakerHandler.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/handlers/SpeakerHandler.java @@ -11,8 +11,8 @@ import com.craftmend.openaudiomc.spigot.services.world.Vector3; import com.craftmend.openaudiomc.spigot.modules.players.enums.PlayerLocationFollower; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.players.interfaces.ITickableHandler; import com.craftmend.openaudiomc.spigot.modules.players.objects.SpigotConnection; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.ApplicableSpeaker; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/playlists/PlaylistService.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/playlists/PlaylistService.java index af3f85794..882729707 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/playlists/PlaylistService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/playlists/PlaylistService.java @@ -4,7 +4,7 @@ import com.craftmend.openaudiomc.generic.database.internal.Repository; import com.craftmend.openaudiomc.generic.logging.OpenAudioLogger; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.interfaces.UrlMutation; +import com.craftmend.openaudiomc.api.media.UrlMutation; import com.craftmend.openaudiomc.generic.service.Inject; import com.craftmend.openaudiomc.generic.service.Service; import com.craftmend.openaudiomc.spigot.modules.playlists.models.Playlist; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerCollector.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerCollector.java index 4f6a63473..448b6cf03 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerCollector.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerCollector.java @@ -1,10 +1,10 @@ package com.craftmend.openaudiomc.spigot.modules.speakers; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; import com.craftmend.openaudiomc.spigot.services.world.Vector3; import com.craftmend.openaudiomc.generic.utils.data.TypeCounter; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.ApplicableSpeaker; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; import lombok.AllArgsConstructor; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java index 20846f4d8..c5c184082 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java @@ -9,25 +9,22 @@ import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; import com.craftmend.openaudiomc.spigot.modules.players.objects.SpigotConnection; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.services.world.interfaces.IRayTracer; import com.craftmend.openaudiomc.spigot.modules.speakers.listeners.SpeakerSelectListener; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.*; import com.craftmend.openaudiomc.spigot.modules.speakers.tasks.SpeakerGarbageCollection; import com.craftmend.openaudiomc.spigot.services.world.tracing.DummyTracer; -import com.craftmend.openaudiomc.spigot.services.world.tracing.EstimatedRayTracer; import com.craftmend.openaudiomc.spigot.services.server.ServerService; import com.craftmend.openaudiomc.spigot.services.server.enums.ServerVersion; import com.craftmend.openaudiomc.spigot.modules.speakers.listeners.SpeakerCreateListener; import com.craftmend.openaudiomc.spigot.modules.speakers.listeners.SpeakerDestroyListener; -import com.google.gson.Gson; import lombok.Getter; import lombok.NoArgsConstructor; import org.bukkit.*; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import java.util.*; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerCreateListener.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerCreateListener.java index 51a8f6ce7..9b9e8e10f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerCreateListener.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerCreateListener.java @@ -5,8 +5,8 @@ import com.craftmend.openaudiomc.generic.environment.MagicValue; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; import com.craftmend.openaudiomc.spigot.modules.speakers.utils.SpeakerUtils; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerSelectListener.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerSelectListener.java index da174c603..fad6ae83e 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerSelectListener.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/listeners/SpeakerSelectListener.java @@ -1,9 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.speakers.listeners; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; import com.craftmend.openaudiomc.spigot.modules.speakers.menu.SpeakerMenu; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/menu/SpeakerMenu.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/menu/SpeakerMenu.java index 2bbf391d4..46a8166f5 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/menu/SpeakerMenu.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/menu/SpeakerMenu.java @@ -5,8 +5,8 @@ import com.craftmend.openaudiomc.generic.environment.MagicValue; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; import com.craftmend.openaudiomc.spigot.modules.players.objects.SpigotConnection; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.Speaker; import com.craftmend.openaudiomc.spigot.modules.speakers.utils.SpeakerUtils; import com.craftmend.openaudiomc.spigot.services.clicklib.Item; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/ApplicableSpeaker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/ApplicableSpeaker.java index 5d6b739fb..af15821c5 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/ApplicableSpeaker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/ApplicableSpeaker.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.speakers.objects; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.services.world.Vector3; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/MappedLocation.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/MappedLocation.java index dbc9ca4aa..8157a0c0f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/MappedLocation.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/MappedLocation.java @@ -1,5 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.speakers.objects; +import com.craftmend.openaudiomc.api.spakers.Loc; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,7 +11,7 @@ @Data @AllArgsConstructor -public class MappedLocation { +public class MappedLocation implements Loc { private int x; private int y; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java index 7c19d11fa..271c8145a 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java @@ -3,8 +3,8 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.generic.database.internal.DataStore; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.ExtraSpeakerOptions; -import com.craftmend.openaudiomc.spigot.modules.speakers.enums.SpeakerType; +import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; +import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.storm.api.markers.Column; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java index e14ca0357..d5288405f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java @@ -8,7 +8,7 @@ import com.craftmend.openaudiomc.api.impl.event.events.VoiceChatPeerTickEvent; import com.craftmend.openaudiomc.api.interfaces.AudioApi; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.generic.client.objects.VoicePeerOptions; +import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.utils.data.Filter; import com.craftmend.openaudiomc.spigot.modules.voicechat.filters.PeerFilter; diff --git a/pom.xml b/pom.xml index 210da590c..14ceb7dcf 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,32 @@ UTF-8 6.8.10 + + + org.jetbrains + annotations-java5 + 24.0.1 + compile + + + org.projectlombok + lombok + 1.18.30 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + https://openaudiomc.net/ From 3e97e1dbf72563e39b10a9b28c63f94e6ccc23a0 Mon Sep 17 00:00:00 2001 From: Mats Date: Sat, 3 Feb 2024 16:25:04 +0100 Subject: [PATCH 3/6] Base API implementations --- .../craftmend/openaudiomc/api/ApiHolder.java | 24 ++++ .../craftmend/openaudiomc/api/ClientApi.java | 10 +- .../craftmend/openaudiomc/api/MediaApi.java | 12 +- .../craftmend/openaudiomc/api/VoiceApi.java | 8 ++ .../craftmend/openaudiomc/api/WorldApi.java | 8 ++ .../openaudiomc/api/clients/Client.java | 8 ++ .../openaudiomc/api/regions/AudioRegion.java | 6 + .../database/models/Speaker.java | 4 +- .../craftmend/openaudiomc/OpenAudioMc.java | 4 +- .../openaudiomc/api/impl/DefaultApi.java | 6 - .../openaudiomc/api/impl/MediaApiImpl.java | 6 +- .../openaudiomc/api/impl/VoiceApiImpl.java | 78 ----------- .../openaudiomc/api/interfaces/AudioApi.java | 6 - .../openaudiomc/api/interfaces/Client.java | 8 +- .../openaudiomc/api/interfaces/VoiceApi.java | 59 --------- .../openaudiomc/generic/api/ApiService.java | 27 ++++ .../api/implementaions/ClientApiImpl.java | 36 +++++ .../api/implementaions/MediaApiImpl.java | 62 +++++++++ .../api/implementaions/VoiceApiImpl.java | 124 ++++++++++++++++++ .../api/implementaions/WorldApiImpl.java | 89 +++++++++++++ .../generic/api/utils/ApiUtils.java | 13 ++ .../client/objects/ClientConnection.java | 89 ++++++------- .../generic/client/objects/PeerQueue.java | 2 +- .../generic/client/session/SessionData.java | 4 +- .../commands/subcommands/PlaySubCommand.java | 6 +- .../media/objects/{Media.java => Sound.java} | 6 +- .../client/media/PacketClientCreateMedia.java | 6 +- .../media/ClientCreateMediaPayload.java | 6 +- .../voice/ClientVoiceOptionsPayload.java | 2 +- .../voice/ClientVoiceSubscribePayload.java | 2 +- .../players/objects/SpigotConnection.java | 4 +- .../spigot/modules/regions/RegionModule.java | 4 +- .../modules/regions/gui/RegionEditGui.java | 10 +- .../interfaces/AbstractRegionAdapter.java | 1 - .../modules/regions/interfaces/IRegion.java | 6 +- .../regions/interfaces/RegionMutator.java | 4 +- .../modules/regions/objects/Region.java | 4 +- .../regions/objects/RegionProperties.java | 8 +- .../{RegionMedia.java => RegionSound.java} | 6 +- .../objects/TimedRegionProperties.java | 12 +- .../regions/registry/WorldRegionManager.java | 8 +- .../modules/speakers/SpeakerService.java | 6 +- .../modules/speakers/objects/Speaker.java | 5 +- .../{SpeakerMedia.java => SpeakerSound.java} | 6 +- .../modules/traincarts/models/TrainMedia.java | 8 +- .../subcommand/VelocityPlaylistCommand.java | 8 -- 46 files changed, 544 insertions(+), 277 deletions(-) create mode 100644 api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java delete mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java delete mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/ApiService.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/ClientApiImpl.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/VoiceApiImpl.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/WorldApiImpl.java create mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/api/utils/ApiUtils.java rename plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/{Media.java => Sound.java} (94%) rename plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/{RegionMedia.java => RegionSound.java} (76%) rename plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/{SpeakerMedia.java => SpeakerSound.java} (80%) diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java b/api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java new file mode 100644 index 000000000..2316d799d --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java @@ -0,0 +1,24 @@ +package com.craftmend.openaudiomc.api; + +public class ApiHolder { + + static ClientApi clientApiInstance; + static WorldApi worldApiInstance; + static VoiceApi voiceApiInstance; + static MediaApi mediaApiInstance; + + public static void initiate( + ClientApi clientApi, + WorldApi worldApi, + VoiceApi voiceApi, + MediaApi mediaApi + ) { + if (clientApiInstance != null) throw new IllegalStateException("Api already initiated"); + + clientApiInstance = clientApi; + worldApiInstance = worldApi; + voiceApiInstance = voiceApi; + mediaApiInstance = mediaApi; + } + +} diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java index 79e658650..974845b1d 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java @@ -9,12 +9,20 @@ public interface ClientApi { + /** + * Get an instance of the client api. May be null if the plugin is not loaded yet + * @return instance + */ + static ClientApi getInstance() { + return ApiHolder.clientApiInstance; + } + /** * Get a client by a player UUID, or null if the player is not online or not registered yet * @param clientUuid the UUID of the player * @return the client instance, or null if the client is not connected */ - @Nullable Client getClient(String clientUuid); + @Nullable Client getClient(UUID clientUuid); /** * Get all clients that are currently known to the server diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java index 86ced4bc9..151b20452 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java @@ -7,6 +7,14 @@ public interface MediaApi { + /** + * Get an instance of the media api. May be null if the plugin is not loaded yet + * @return instance + */ + static MediaApi getInstance() { + return ApiHolder.mediaApiInstance; + } + /** * Create a new media instance with a source, and automatically translate the source * (if needed) and register a normalized time for the start instant. @@ -32,9 +40,11 @@ public interface MediaApi { * An example use case would be a custom media server aliased by hypixel:, which can be resolved * to https://hypixel.com/media/* by a mutation. * + * @param prefix the prefix to register the mutation for, + * the mutation will only be called for media sources starting with this prefix * @param mutation the mutation to register */ - void registerMutation(@NotNull UrlMutation mutation); + void registerMutation(@NotNull String prefix, @NotNull UrlMutation mutation); /** * Get the current epoch time, but normalized to the start of the current media. diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java index 7af64eef0..0b285eb98 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java @@ -7,6 +7,14 @@ public interface VoiceApi { + /** + * Get the voice api instance, or null if the plugin is not loaded yet + * @return instance + */ + static VoiceApi getInstance() { + return ApiHolder.voiceApiInstance; + } + /* * The VoiceApi contains registry, as well as control endpoints for voice-chat related features. * This implementation is only available on the Spigot instance, even if the plugin is running in a BungeeCord/Velocity or Vistas network. diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java b/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java index 0970b56f2..6afe45975 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java @@ -9,6 +9,14 @@ public interface WorldApi { + /** + * Get an instance of the world api. May be null if the plugin is not loaded yet + * @return instance + */ + static WorldApi getInstance() { + return ApiHolder.worldApiInstance; + } + /** * Get all regions at a location * @param x x diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java index 8fe535c3d..7ce8a1d18 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java @@ -1,6 +1,8 @@ package com.craftmend.openaudiomc.api.clients; import com.craftmend.openaudiomc.api.basic.Actor; +import com.craftmend.openaudiomc.api.media.Media; +import org.jetbrains.annotations.NotNull; public interface Client { @@ -44,4 +46,10 @@ public interface Client { * @return if the actor is moderating */ boolean isModerating(); + + /** + * Play a media for this client + * @param media the media to play + */ + void playMedia(@NotNull Media media); } diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java b/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java index 214017988..183862855 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java @@ -27,4 +27,10 @@ public interface AudioRegion { @Nullable String getWorld(); + /** + * Get the priority of this region + * @return priority + */ + int getPriority(); + } diff --git a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java index 8c714fc5d..bdd89957e 100644 --- a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java +++ b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java @@ -6,7 +6,7 @@ import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; -import com.craftmend.openaudiomc.spigot.modules.speakers.objects.SpeakerMedia; +import com.craftmend.openaudiomc.spigot.modules.speakers.objects.SpeakerSound; import lombok.Getter; import lombok.Setter; @@ -34,7 +34,7 @@ public Speaker(String source, UUID id, int radius, MappedLocation location, Spea this.extraOptions = options; } - public SpeakerMedia getMedia() { + public SpeakerSound getMedia() { return OpenAudioMc.getService(SpeakerService.class).getMedia(source); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/OpenAudioMc.java b/plugin/src/main/java/com/craftmend/openaudiomc/OpenAudioMc.java index e803a1b07..59e94bfd8 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/OpenAudioMc.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/OpenAudioMc.java @@ -2,6 +2,7 @@ import com.craftmend.openaudiomc.api.enums.ModuleEvent; import com.craftmend.openaudiomc.api.impl.event.ApiEventDriver; +import com.craftmend.openaudiomc.generic.api.ApiService; import com.craftmend.openaudiomc.generic.authentication.AuthenticationService; import com.craftmend.openaudiomc.generic.backups.BackupService; import com.craftmend.openaudiomc.generic.client.ClientDataService; @@ -149,7 +150,8 @@ public OpenAudioMc(OpenAudioInvoker invoker) throws Exception { RedisService.class, // redis hook/service implementation OpenaudioAccountService.class, // platform specific features, like voice chat RestDirectService.class, // manage rest direct - ClientDataService.class // manage player profiles + ClientDataService.class, // manage player profiles + ApiService.class // initialize api implementations ); getService(ModuleLoaderService.class).fire(ModuleEvent.SERVICES_LOADED); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/DefaultApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/DefaultApi.java index cc0a8d22b..f6ce3eb38 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/DefaultApi.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/DefaultApi.java @@ -17,7 +17,6 @@ public class DefaultApi implements AudioApi { private final WorldApiImpl worldApi = new WorldApiImpl(); private final MediaApiImpl mediaApi = new MediaApiImpl(); private final RegistryApiImpl registryApi = new RegistryApiImpl(); - private final VoiceApiImpl voiceApi = new VoiceApiImpl(); public static AudioApi i() { if (instance != null) return instance; @@ -59,9 +58,4 @@ public MediaApi getMediaApi() { public RegistryApi getRegistryApi() { return registryApi; } - - @Override - public VoiceApi getVoiceApi() { - return voiceApi; - } } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java index e2009dfcd..65bea4632 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java @@ -3,7 +3,7 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.api.interfaces.Client; import com.craftmend.openaudiomc.api.interfaces.MediaApi; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; @@ -28,12 +28,12 @@ private ClientConnection validateClient(Client client) { @Override public void playMedia(Client client, String source) { - validateClient(client).sendMedia(new Media(source)); + validateClient(client).sendMedia(new Sound(source)); } @Override public void playMedia(Client client, String source, MediaOptions mediaOptions) { - validateClient(client).sendMedia(new Media(source).applySettings(mediaOptions)); + validateClient(client).sendMedia(new Sound(source).applySettings(mediaOptions)); } @Override diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java deleted file mode 100644 index d96e9be11..000000000 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/VoiceApiImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.craftmend.openaudiomc.api.impl; - -import com.craftmend.openaudiomc.api.interfaces.Client; -import com.craftmend.openaudiomc.api.interfaces.VoiceApi; -import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.api.VoicePeerOptions; - -import java.util.UUID; - -public class VoiceApiImpl implements VoiceApi { - - @Override - public boolean hasPeer(Client haystack, Client needle) { - return hasPeer(haystack, needle.getUser().getUniqueId()); - } - - @Override - public boolean hasPeer(Client haystack, UUID needle) { - ClientConnection clientConnection = (ClientConnection) haystack; - return clientConnection.getRtcSessionManager().isPeer(needle); - } - - @Override - public void updatePeerOptions(Client client, Client peerToUpdate, VoicePeerOptions options) { - client.updatePeerOptions(peerToUpdate, options); - } - - private boolean isProximityPeer(Client haystack, Client needle) { - ClientConnection haystackConnection = (ClientConnection) haystack; - return haystackConnection.getRtcSessionManager().getCurrentProximityPeers().contains(needle.getUser().getUniqueId()); - } - - public boolean isGlobalPeer(Client haystack, Client needle) { - ClientConnection haystackConnection = (ClientConnection) haystack; - return haystackConnection.getRtcSessionManager().getCurrentGlobalPeers().contains(needle.getUser().getUniqueId()); - } - - @Override - public void addStaticPeer(Client client, Client peerToAdd, boolean visible, boolean mutual) { - VoicePeerOptions options = new VoicePeerOptions(); - options.setSpatialAudio(false); - options.setVisible(visible); - - ClientConnection clientConnection = (ClientConnection) client; - ClientConnection peerConnection = (ClientConnection) peerToAdd; - - if (!clientConnection.getRtcSessionManager().isReady() || !peerConnection.getRtcSessionManager().isReady()) { - throw new IllegalStateException("Both clients must be ready (connected and have voice chat enabled) before adding a peer"); - } - - if (isProximityPeer(client, peerToAdd)) { - client.updatePeerOptions(peerToAdd, options); - clientConnection.getRtcSessionManager().getCurrentGlobalPeers().add(peerToAdd.getUser().getUniqueId()); - clientConnection.getRtcSessionManager().getCurrentProximityPeers().remove(peerToAdd.getUser().getUniqueId()); - } else { - clientConnection.getRtcSessionManager().getCurrentGlobalPeers().add(peerToAdd.getUser().getUniqueId()); - clientConnection.getPeerQueue().addSubscribe(peerConnection, clientConnection, options); - } - - if (mutual) { - addStaticPeer(peerToAdd, client, visible, false); - } - } - - @Override - public void removeStaticPeer(Client client, Client peerToRemove, boolean mutual) { - if (isGlobalPeer(client, peerToRemove)) { - ClientConnection clientConnection = (ClientConnection) client; - ClientConnection peerConnection = (ClientConnection) peerToRemove; - clientConnection.getRtcSessionManager().getCurrentGlobalPeers().remove(peerToRemove.getUser().getUniqueId()); - clientConnection.getPeerQueue().drop(peerConnection.getRtcSessionManager().getStreamKey()); - } - - if (mutual) { - removeStaticPeer(peerToRemove, client, false); - } - } -} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/AudioApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/AudioApi.java index d38cc86be..82c48d151 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/AudioApi.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/AudioApi.java @@ -61,12 +61,6 @@ public interface AudioApi { */ RegistryApi getRegistryApi(); - /** - * Get the voice API instance, used to manage voice chat - * @return Voice api instance - */ - VoiceApi getVoiceApi(); - static AudioApi getInstance() { return DefaultApi.i(); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java index fc2da9dd8..09f35c234 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java @@ -1,9 +1,9 @@ package com.craftmend.openaudiomc.api.interfaces; -import com.craftmend.openaudiomc.api.VoicePeerOptions; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.user.User; +@Deprecated public interface Client { /** @@ -28,7 +28,7 @@ public interface Client { * * @param media media to be send */ - void sendMedia(Media media); + void sendMedia(Sound media); /** * Add a on connect handler, which fires when the client gets closed for by player @@ -66,6 +66,4 @@ public interface Client { */ void preloadMedia(String source); - - void updatePeerOptions(Client peer, VoicePeerOptions options); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java deleted file mode 100644 index f96eadaac..000000000 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/VoiceApi.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.craftmend.openaudiomc.api.interfaces; - -import com.craftmend.openaudiomc.api.VoicePeerOptions; - -import java.util.UUID; - -public interface VoiceApi { - - /* - * The VoiceApi contains registry, as well as control endpoints for voice-chat related features. - * This implementation is only available on the Spigot instance, even if the plugin is running in a BungeeCord/Velocity or Vistas network. - * Accessing this API on a non-spigot instance will result in undefined behavior or runtime exceptions. - */ - - /** - * Register a client as a voice-chat peer - * @param haystack The client that will be the host - * @param needle The client that will be the peer - * @return true if the client was registered, false if the client was already registered - */ - boolean hasPeer(Client haystack, Client needle); - - /** - * Register a client as a voice-chat peer - * @param haystack The client that will be the host - * @param needle The client that will be the peer - * @return true if the client was registered, false if the client was already registered - */ - boolean hasPeer(Client haystack, UUID needle); - - /** - * Push new options for a peer, changing how its rendered in the client - * @param client The web client that should receive this update - * @param peerToUpdate The peer that should be updated - * @param options The new options - */ - void updatePeerOptions(Client client, Client peerToUpdate, VoicePeerOptions options); - - /** - * Add a peer (partner) to someone's voice chat. - * This would let the client hear the peerToAdd as a global voice (without spatial audio/distance) until it's removed. - * @param client The web client that should receive this update - * @param peerToAdd The peer that should be added - * @param visible Whether the peer should be visible in the client - * @param mutual Whether the peer should also hear the client (repeat the call for mutual) - */ - void addStaticPeer(Client client, Client peerToAdd, boolean visible, boolean mutual); - - /** - * Remove a global peer from someone's voice chat. - * This would remove a static peer if they have been added through addStaticPeer, but not - * if they have been added through the regular voice-chat system. - * @param client The web client that should receive this update - * @param peerToRemove The peer that should be removed - * @param mutual Whether the peer should also stop hearing the client (repeat the call for mutual) - */ - void removeStaticPeer(Client client, Client peerToRemove, boolean mutual); - -} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/ApiService.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/ApiService.java new file mode 100644 index 000000000..9fa320bfd --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/ApiService.java @@ -0,0 +1,27 @@ +package com.craftmend.openaudiomc.generic.api; + +import com.craftmend.openaudiomc.api.ApiHolder; +import com.craftmend.openaudiomc.generic.api.implementaions.ClientApiImpl; +import com.craftmend.openaudiomc.generic.api.implementaions.MediaApiImpl; +import com.craftmend.openaudiomc.generic.api.implementaions.VoiceApiImpl; +import com.craftmend.openaudiomc.generic.api.implementaions.WorldApiImpl; +import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; +import com.craftmend.openaudiomc.generic.service.Inject; +import com.craftmend.openaudiomc.generic.service.Service; + +public class ApiService extends Service { + + @Inject + public ApiService( + NetworkingService networkingService + ) { + // initialize api + ApiHolder.initiate( + new ClientApiImpl(networkingService), + new WorldApiImpl(), + new VoiceApiImpl(), + new MediaApiImpl() + ); + } + +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/ClientApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/ClientApiImpl.java new file mode 100644 index 000000000..2505b8b05 --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/ClientApiImpl.java @@ -0,0 +1,36 @@ +package com.craftmend.openaudiomc.generic.api.implementaions; + +import com.craftmend.openaudiomc.api.ClientApi; +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; +import lombok.AllArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.UUID; + +@AllArgsConstructor +public class ClientApiImpl implements ClientApi { + + private NetworkingService networkingService; + + @Nullable + @Override + public Client getClient(UUID clientUuid) { + return networkingService.getClient(clientUuid); + } + + @NotNull + @Override + public Collection getAllClients() { + return new ArrayList<>(networkingService.getClients()); + } + + @Override + public boolean isConnected(UUID uuid) { + Client c = getClient(uuid); + return c != null && c.isConnected(); + } +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java new file mode 100644 index 000000000..009880058 --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java @@ -0,0 +1,62 @@ +package com.craftmend.openaudiomc.generic.api.implementaions; + +import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.MediaApi; +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.api.media.Media; +import com.craftmend.openaudiomc.api.media.UrlMutation; +import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; +import com.craftmend.openaudiomc.generic.media.MediaService; +import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.generic.media.time.TimeService; +import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; +import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientDestroyMedia; +import org.jetbrains.annotations.NotNull; + +import static com.craftmend.openaudiomc.generic.api.utils.ApiUtils.validateClient; + +public class MediaApiImpl implements MediaApi { + + @NotNull + @Override + public Media createMedia(@NotNull String source) { + return new Sound(source); + } + + @NotNull + @Override + public String translateSource(@NotNull String source) { + return OpenAudioMc.getService(MediaService.class).process(source); + } + + @Override + public void registerMutation(@NotNull String prefix, @NotNull UrlMutation mutation) { + OpenAudioMc.getService(MediaService.class).registerMutation(prefix, mutation); + } + + @Override + public long getNormalizedCurrentEpoch() { + return OpenAudioMc.getService(TimeService.class).getSyncedInstant().toEpochMilli(); + } + + @Override + public void playFor(@NotNull Media media, @NotNull Client... clients) { + for (Client client : clients) { + client.playMedia(media); + } + } + + @Override + public void stopFor(@NotNull Client... clients) { + for (Client client : clients) { + OpenAudioMc.getService(NetworkingService.class).send(validateClient(client), new PacketClientDestroyMedia(null)); + } + } + + @Override + public void stopFor(@NotNull String id, @NotNull Client... clients) { + for (Client client : clients) { + OpenAudioMc.getService(NetworkingService.class).send(validateClient(client), new PacketClientDestroyMedia(id)); + } + } +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/VoiceApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/VoiceApiImpl.java new file mode 100644 index 000000000..ee2619734 --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/VoiceApiImpl.java @@ -0,0 +1,124 @@ +package com.craftmend.openaudiomc.generic.api.implementaions; + +import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.VoiceApi; +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; +import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; +import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; +import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientVoiceOptionsUpdate; +import com.craftmend.openaudiomc.generic.networking.payloads.client.voice.ClientVoiceOptionsPayload; +import com.craftmend.openaudiomc.generic.platform.Platform; + +import java.util.Objects; +import java.util.UUID; + +public class VoiceApiImpl implements VoiceApi { + + @Override + public boolean hasPeer(Client haystack, Client needle) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + return hasPeer(haystack, needle.getActor().getUniqueId()); + } + + @Override + public boolean hasPeer(Client haystack, UUID needle) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + ClientConnection clientConnection = (ClientConnection) haystack; + return clientConnection.getRtcSessionManager().isPeer(needle); + } + + @Override + public void updatePeerOptions(Client client, Client peerToUpdate, VoicePeerOptions options) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + Objects.requireNonNull(peerToUpdate, "Peer cannot be null"); + Objects.requireNonNull(options, "Options cannot be null"); + + ClientConnection clientConnection = (ClientConnection) client; + ClientConnection peerConnection = (ClientConnection) peerToUpdate; + + // do we have this peer? + if (!clientConnection.getRtcSessionManager().isPeer(peerConnection.getActor().getUniqueId())) { + throw new IllegalArgumentException("Peer is not connected to this client"); + } + + // update the options + ClientConnection peerCon = OpenAudioMc.getService(NetworkingService.class).getClient(peerConnection.getUser().getUniqueId()); + PacketClientVoiceOptionsUpdate packet = new PacketClientVoiceOptionsUpdate( + new ClientVoiceOptionsPayload(peerCon.getRtcSessionManager().getStreamKey(), options) + ); + clientConnection.sendPacket(packet); + } + + private boolean isProximityPeer(Client haystack, Client needle) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + ClientConnection haystackConnection = (ClientConnection) haystack; + return haystackConnection.getRtcSessionManager().getCurrentProximityPeers().contains(needle.getActor().getUniqueId()); + } + + public boolean isGlobalPeer(Client haystack, Client needle) { + ClientConnection haystackConnection = (ClientConnection) haystack; + return haystackConnection.getRtcSessionManager().getCurrentGlobalPeers().contains(needle.getActor().getUniqueId()); + } + + @Override + public void addStaticPeer(Client client, Client peerToAdd, boolean visible, boolean mutual) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + VoicePeerOptions options = new VoicePeerOptions(); + options.setSpatialAudio(false); + options.setVisible(visible); + + ClientConnection clientConnection = (ClientConnection) client; + ClientConnection peerConnection = (ClientConnection) peerToAdd; + + if (!clientConnection.getRtcSessionManager().isReady() || !peerConnection.getRtcSessionManager().isReady()) { + throw new IllegalStateException("Both clients must be ready (connected and have voice chat enabled) before adding a peer"); + } + + if (isProximityPeer(client, peerToAdd)) { + updatePeerOptions(client, peerToAdd, options); + clientConnection.getRtcSessionManager().getCurrentGlobalPeers().add(peerToAdd.getActor().getUniqueId()); + clientConnection.getRtcSessionManager().getCurrentProximityPeers().remove(peerToAdd.getActor().getUniqueId()); + } else { + clientConnection.getRtcSessionManager().getCurrentGlobalPeers().add(peerToAdd.getActor().getUniqueId()); + clientConnection.getPeerQueue().addSubscribe(peerConnection, clientConnection, options); + } + + if (mutual) { + addStaticPeer(peerToAdd, client, visible, false); + } + } + + @Override + public void removeStaticPeer(Client client, Client peerToRemove, boolean mutual) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + if (isGlobalPeer(client, peerToRemove)) { + ClientConnection clientConnection = (ClientConnection) client; + ClientConnection peerConnection = (ClientConnection) peerToRemove; + clientConnection.getRtcSessionManager().getCurrentGlobalPeers().remove(peerToRemove.getActor().getUniqueId()); + clientConnection.getPeerQueue().drop(peerConnection.getRtcSessionManager().getStreamKey()); + } + + if (mutual) { + removeStaticPeer(peerToRemove, client, false); + } + } +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/WorldApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/WorldApiImpl.java new file mode 100644 index 000000000..2cb05123a --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/WorldApiImpl.java @@ -0,0 +1,89 @@ +package com.craftmend.openaudiomc.generic.api.implementaions; + +import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.WorldApi; +import com.craftmend.openaudiomc.api.media.Media; +import com.craftmend.openaudiomc.api.regions.AudioRegion; +import com.craftmend.openaudiomc.api.spakers.BasicSpeaker; +import com.craftmend.openaudiomc.generic.platform.Platform; +import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; +import com.craftmend.openaudiomc.spigot.modules.regions.RegionModule; +import com.craftmend.openaudiomc.spigot.modules.regions.interfaces.ApiRegion; +import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; +import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; +import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; +import lombok.AllArgsConstructor; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class WorldApiImpl implements WorldApi { + + @NotNull + @Override + public Collection getRegionsAt(int x, int y, int z, @NotNull String world) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + RegionModule regionModule = OpenAudioMcSpigot.getInstance().getRegionModule(); + + List regions = new ArrayList<>(); + + for (ApiRegion apiRegion : regionModule.getRegionAdapter().getRegionsAtLocation( + new Location(Bukkit.getWorld(world), x, y, z) + )) { + RegionProperties rp = regionModule.getWorld(world).getRegionProperties(apiRegion.getName()); + regions.add(new WrappedRegion(apiRegion, world, rp.getMediaForWorld(world))); + } + + return regions; + } + + @Nullable + @Override + public BasicSpeaker getSpeakerAt(int x, int y, int z, @NotNull String world) { + if (OpenAudioMc.getInstance().getPlatform() != Platform.SPIGOT) { + throw new IllegalStateException("This method is only available on the spigot platform"); + } + + return OpenAudioMc.getService(SpeakerService.class).getSpeaker(new MappedLocation(x, y, z, world)); + } + + @AllArgsConstructor + private static class WrappedRegion implements AudioRegion { + + private ApiRegion region; + private String world; + private Media media; + + @NotNull + @Override + public Media getMedia() { + return media; + } + + @NotNull + @Override + public String getRegionId() { + return region.getName(); + } + + @Nullable + @Override + public String getWorld() { + return world; + } + + @Override + public int getPriority() { + return region.getPriority(); + } + } + +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/utils/ApiUtils.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/utils/ApiUtils.java new file mode 100644 index 000000000..547ec9f7a --- /dev/null +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/utils/ApiUtils.java @@ -0,0 +1,13 @@ +package com.craftmend.openaudiomc.generic.api.utils; + +import com.craftmend.openaudiomc.api.clients.Client; +import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; + +public class ApiUtils { + + public static ClientConnection validateClient(Client client) { + if (!(client instanceof ClientConnection)) throw new IllegalStateException("This player isn't a instance of ClientConnection"); + return (ClientConnection) client; + } + +} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java index fbdeb4032..cef358d14 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java @@ -1,69 +1,72 @@ package com.craftmend.openaudiomc.generic.client.objects; import com.craftmend.openaudiomc.OpenAudioMc; - -import com.craftmend.openaudiomc.api.VoicePeerOptions; +import com.craftmend.openaudiomc.api.basic.Actor; +import com.craftmend.openaudiomc.api.clients.Client; import com.craftmend.openaudiomc.api.impl.event.events.ClientConnectEvent; import com.craftmend.openaudiomc.api.impl.event.events.ClientDisconnectEvent; import com.craftmend.openaudiomc.api.impl.event.events.ClientErrorEvent; import com.craftmend.openaudiomc.api.interfaces.AudioApi; -import com.craftmend.openaudiomc.api.interfaces.Client; - import com.craftmend.openaudiomc.generic.client.ClientDataService; +import com.craftmend.openaudiomc.generic.client.helpers.SerializableClient; +import com.craftmend.openaudiomc.generic.client.helpers.TokenFactory; +import com.craftmend.openaudiomc.generic.client.session.ClientAuth; +import com.craftmend.openaudiomc.generic.client.session.RtcSessionManager; +import com.craftmend.openaudiomc.generic.client.session.SessionData; import com.craftmend.openaudiomc.generic.client.store.ClientDataStore; import com.craftmend.openaudiomc.generic.environment.GlobalConstantService; import com.craftmend.openaudiomc.generic.environment.MagicValue; import com.craftmend.openaudiomc.generic.media.MediaService; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacket; -import com.craftmend.openaudiomc.generic.client.session.ClientAuth; -import com.craftmend.openaudiomc.generic.client.session.RtcSessionManager; -import com.craftmend.openaudiomc.generic.client.helpers.SerializableClient; -import com.craftmend.openaudiomc.generic.client.session.SessionData; -import com.craftmend.openaudiomc.generic.client.helpers.TokenFactory; import com.craftmend.openaudiomc.generic.networking.enums.MediaError; import com.craftmend.openaudiomc.generic.networking.interfaces.Authenticatable; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; +import com.craftmend.openaudiomc.generic.networking.packets.PacketSocketKickClient; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientCreateMedia; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientPreFetch; import com.craftmend.openaudiomc.generic.networking.packets.client.ui.PacketClientModerationStatus; import com.craftmend.openaudiomc.generic.networking.packets.client.ui.PacketClientProtocolRevisionPacket; import com.craftmend.openaudiomc.generic.networking.packets.client.ui.PacketClientSetVolume; -import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientVoiceOptionsUpdate; import com.craftmend.openaudiomc.generic.networking.payloads.client.media.ClientPreFetchPayload; -import com.craftmend.openaudiomc.generic.networking.payloads.client.voice.ClientVoiceOptionsPayload; -import com.craftmend.openaudiomc.generic.rest.Task; import com.craftmend.openaudiomc.generic.node.packets.ClientConnectedPacket; import com.craftmend.openaudiomc.generic.node.packets.ClientDisconnectedPacket; +import com.craftmend.openaudiomc.generic.platform.Platform; import com.craftmend.openaudiomc.generic.platform.interfaces.TaskService; import com.craftmend.openaudiomc.generic.proxy.interfaces.UserHooks; -import com.craftmend.openaudiomc.generic.user.User; +import com.craftmend.openaudiomc.generic.rest.Task; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.generic.storage.interfaces.Configuration; -import com.craftmend.openaudiomc.generic.media.objects.Media; -import com.craftmend.openaudiomc.generic.networking.packets.*; -import com.craftmend.openaudiomc.generic.platform.Platform; - +import com.craftmend.openaudiomc.generic.user.User; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.proxy.enums.OAClientMode; - import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.List; -public class ClientConnection implements Authenticatable, Client, Serializable { +public class ClientConnection implements Authenticatable, Client, Serializable, + com.craftmend.openaudiomc.api.interfaces.Client { - @Getter private transient final User user; + @Getter + private transient final User user; - @Getter private final SessionData session; - @Setter private ClientAuth auth; - @Getter private final RtcSessionManager rtcSessionManager; + @Getter + private final SessionData session; + @Setter + private ClientAuth auth; + @Getter + private final RtcSessionManager rtcSessionManager; private transient final List connectHandlers = new ArrayList<>(); private transient final List disconnectHandlers = new ArrayList<>(); - @Setter @Getter private ClientDataStore dataCache; - @Getter private PeerQueue peerQueue = new PeerQueue(); + @Setter + @Getter + private ClientDataStore dataCache; + @Getter + private PeerQueue peerQueue = new PeerQueue(); public ClientConnection(User playerContainer, SerializableClient fromSerialized) { this.user = playerContainer; @@ -214,7 +217,7 @@ public void setModerating(boolean state) { * @param media media to be send */ @Override - public void sendMedia(Media media) { + public void sendMedia(Sound media) { if (media.getKeepTimeout() != -1 && !session.getOngoingMedia().contains(media)) { session.getOngoingMedia().add(media); @@ -260,11 +263,26 @@ public void handleError(MediaError error, String source) { } } + @Override + public Actor getActor() { + return getOwner(); + } + @Override public boolean isConnected() { return this.session.isConnected(); } + @Override + public boolean hasVoicechatEnabled() { + return false; + } + + @Override + public boolean isMicrophoneMuted() { + return false; + } + @Override public void onConnect(Runnable runnable) { addOnConnectHandler(runnable); @@ -301,21 +319,4 @@ public void preloadMedia(String source) { sendPacket(new PacketClientPreFetch(payload)); } - @Override - public void updatePeerOptions(Client peer, VoicePeerOptions options) { - Objects.requireNonNull(peer, "Peer cannot be null"); - Objects.requireNonNull(options, "Options cannot be null"); - - // do we have this peer? - if (!rtcSessionManager.isPeer(peer.getUser().getUniqueId())) { - throw new IllegalArgumentException("Peer is not connected to this client"); - } - - // update the options - ClientConnection peerCon = OpenAudioMc.getService(NetworkingService.class).getClient(peer.getUser().getUniqueId()); - PacketClientVoiceOptionsUpdate packet = new PacketClientVoiceOptionsUpdate( - new ClientVoiceOptionsPayload(peerCon.getRtcSessionManager().getStreamKey(), options) - ); - sendPacket(packet); - } } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java index d71f403c7..c764bee8e 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/PeerQueue.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.client.objects; -import com.craftmend.openaudiomc.api.VoicePeerOptions; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientDropVoiceStream; import com.craftmend.openaudiomc.generic.networking.packets.client.voice.PacketClientSubscribeToVoice; import com.craftmend.openaudiomc.generic.networking.payloads.client.voice.ClientVoiceDropPayload; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java index cfe17d1f3..9ac7d5588 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java @@ -5,7 +5,7 @@ import com.craftmend.openaudiomc.generic.oac.OpenaudioAccountService; import com.craftmend.openaudiomc.generic.oac.enums.CraftmendTag; import com.craftmend.openaudiomc.generic.environment.MagicValue; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.client.helpers.SerializableClient; import com.craftmend.openaudiomc.generic.platform.Platform; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; @@ -31,7 +31,7 @@ public class SessionData { private boolean isConnectedToRtc = false; // ongoing sounds - used for media-sources with the expiration timeout configured - private final List ongoingMedia = new ArrayList<>(); + private final List ongoingMedia = new ArrayList<>(); private int apiSpeakers = 0; // session info diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java index 668e8dec7..4b76494bb 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java @@ -11,7 +11,7 @@ import com.craftmend.openaudiomc.generic.user.User; import com.craftmend.openaudiomc.generic.commands.interfaces.SubCommand; import com.craftmend.openaudiomc.generic.commands.objects.Argument; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; import lombok.SneakyThrows; @@ -42,7 +42,7 @@ public void onExecute(User sender, String[] args) { throw new CommandError("Invalid source url."); } - Media media = new Media(args[1]); + Sound media = new Sound(args[1]); int affected = 0; for (User user : resolveSelector(sender, args[0])) { @@ -71,7 +71,7 @@ public void onExecute(User sender, String[] args) { throw new CommandError("Invalid source url."); } - Media media = new Media(args[1]).applySettings(mediaOptions); + Sound media = new Sound(args[1]).applySettings(mediaOptions); for (User user : resolveSelector(sender, args[0])) { Optional client = user.findClient(); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java similarity index 94% rename from plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java rename to plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java index ea16fe977..a28f5f3b8 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java @@ -10,7 +10,7 @@ import java.util.UUID; @Getter -public class Media implements com.craftmend.openaudiomc.api.media.Media { +public class Sound implements com.craftmend.openaudiomc.api.media.Media { //media tracker @Setter private String mediaId = UUID.randomUUID().toString(); @@ -35,7 +35,7 @@ public class Media implements com.craftmend.openaudiomc.api.media.Media { * * @param source the resource url */ - public Media(String source) { + public Sound(String source) { this.source = OpenAudioMc.getService(MediaService.class).process(source); this.startInstant = OpenAudioMc.getService(TimeService.class).getSyncedInstant().toEpochMilli(); } @@ -47,7 +47,7 @@ public Media(String source) { * @param options The options. Selected via the command * @return instance of self */ - public Media applySettings(MediaOptions options) { + public Sound applySettings(MediaOptions options) { this.loop = options.isLoop(); this.keepTimeout = options.getExpirationTimeout(); if (options.getId() != null) this.mediaId = options.getId(); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java index 5d3a70b4c..8d593466c 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java @@ -1,17 +1,17 @@ package com.craftmend.openaudiomc.generic.networking.packets.client.media; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacket; import com.craftmend.openaudiomc.generic.networking.abstracts.PacketChannel; import com.craftmend.openaudiomc.generic.networking.payloads.client.media.ClientCreateMediaPayload; public class PacketClientCreateMedia extends AbstractPacket { - public PacketClientCreateMedia(Media media) { + public PacketClientCreateMedia(Sound media) { super(new ClientCreateMediaPayload(media), PacketChannel.CLIENT_OUT_CREATE_MEDIA, null); } - public PacketClientCreateMedia(Media media, int distance, int maxDistance) { + public PacketClientCreateMedia(Sound media, int distance, int maxDistance) { super(new ClientCreateMediaPayload(media, distance, maxDistance), PacketChannel.CLIENT_OUT_CREATE_MEDIA, null); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java index 2dae76248..a39e2a105 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.media; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import com.craftmend.openaudiomc.generic.networking.payloads.client.interfaces.SourceHolder; import lombok.AllArgsConstructor; @@ -12,11 +12,11 @@ @AllArgsConstructor public class ClientCreateMediaPayload extends AbstractPacketPayload implements SourceHolder { - public ClientCreateMediaPayload(Media media) { + public ClientCreateMediaPayload(Sound media) { this.media = media; } - private Media media; + private Sound media; private int distance; private int maxDistance; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java index ee3ad0319..b6c982d5f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceOptionsPayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.voice; -import com.craftmend.openaudiomc.api.VoicePeerOptions; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java index f52066af3..a04d31165 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/voice/ClientVoiceSubscribePayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.voice; -import com.craftmend.openaudiomc.api.VoicePeerOptions; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.client.helpers.ClientRtcLocationUpdate; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java index 9053f217e..a3e18981b 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java @@ -8,7 +8,7 @@ import com.craftmend.openaudiomc.generic.networking.payloads.client.speakers.ClientPlayerLocationPayload; import com.craftmend.openaudiomc.generic.platform.interfaces.TaskService; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.spigot.modules.players.enums.PlayerLocationFollower; import com.craftmend.openaudiomc.spigot.modules.players.events.ClientDisconnectEvent; import com.craftmend.openaudiomc.spigot.modules.players.handlers.AudioChunkHandler; @@ -166,7 +166,7 @@ public List getSpeakers() { /** * @param media start media for the client */ - public void playMedia(Media media) { + public void playMedia(Sound media) { clientConnection.sendMedia(media); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java index c89a3a4a1..4149db89c 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java @@ -6,7 +6,7 @@ import com.craftmend.openaudiomc.generic.database.DatabaseService; import com.craftmend.openaudiomc.generic.logging.OpenAudioLogger; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.generic.utils.data.ArrayUtil; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; @@ -251,7 +251,7 @@ public int mutateForMatchingWorld(RegionMutator mutator, String regionName, Stri // does this world contain a region with the same name? if (worldManager.containsRegion(regionName)) { RegionProperties region = worldManager.getRegionProperties(regionName); - Media media = region.getMediaForWorld(worldManager); + Sound media = region.getMediaForWorld(worldManager); // mutate the region try { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java index df48da9dd..ef6cc2419 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java @@ -3,7 +3,7 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.generic.database.DatabaseService; import com.craftmend.openaudiomc.generic.environment.MagicValue; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientDestroyMedia; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; @@ -76,9 +76,9 @@ public Item getSyncItem(IRegion region) { // reset the media cache for this region - Media oldMedia = region.getMedia(); + Sound oldMedia = region.getMedia(); OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(player.getWorld().getName()).unregisterRegionMedia(region.getMedia().getSource()); - Media newMedia = region.getMedia(); + Sound newMedia = region.getMedia(); // send destroy packets to all players in the region for (SpigotConnection spigotConnection : OpenAudioMcSpigot.getInstance().getRegionModule().findPlayersInRegion(region.getProperties().getRegionName())) { @@ -113,9 +113,9 @@ private Item getPlayOnceItem(IRegion region) { } // reset the media cache for this region - Media oldMedia = region.getMedia(); + Sound oldMedia = region.getMedia(); OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(player.getWorld().getName()).unregisterRegionMedia(region.getMedia().getSource()); - Media newMedia = region.getMedia(); + Sound newMedia = region.getMedia(); // send destroy packets to all players in the region for (SpigotConnection spigotConnection : OpenAudioMcSpigot.getInstance().getRegionModule().findPlayersInRegion(region.getProperties().getRegionName())) { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/AbstractRegionAdapter.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/AbstractRegionAdapter.java index 9f7b3d317..a5cae57e5 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/AbstractRegionAdapter.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/AbstractRegionAdapter.java @@ -7,7 +7,6 @@ public abstract class AbstractRegionAdapter extends RegionAdapterBase { - /** * Expose the RegionModule instance to the implementing class */ diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java index 9f175167b..dfe40a2fa 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.regions.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; public interface IRegion { @@ -10,7 +10,7 @@ public interface IRegion { /** * @return Media playing in the region */ - Media getMedia(); + Sound getMedia(); /** * @return Extra settings related to the region @@ -56,7 +56,7 @@ public interface IRegion { public class EmptyRegion implements IRegion { @Override - public Media getMedia() { + public Sound getMedia() { return null; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java index 3c0871422..56d3e9b26 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java @@ -1,10 +1,10 @@ package com.craftmend.openaudiomc.spigot.modules.regions.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; public interface RegionMutator { - void feed(RegionProperties properties, Media media); + void feed(RegionProperties properties, Sound media); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java index 6b7b1f77b..715ca981b 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.spigot.modules.regions.interfaces.IRegion; import lombok.AllArgsConstructor; @@ -12,7 +12,7 @@ public class Region implements IRegion { private String worldName; @Override - public Media getMedia() { + public Sound getMedia() { if (getProperties() == null) return null; return regionProperties.getMediaForWorld(worldName); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java index 99d50f374..1693e6dcc 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; import com.craftmend.openaudiomc.generic.database.internal.DataStore; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.utils.data.ArrayUtil; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.regions.registry.WorldRegionManager; @@ -41,9 +41,9 @@ public RegionProperties(String source, int volume, int fadeTimeMs, boolean allow this.worlds = worldNames; } - public Media getMediaForWorld(WorldRegionManager worldRegionManager) { + public Sound getMediaForWorld(WorldRegionManager worldRegionManager) { if (loop == null) loop = true; - Media media = worldRegionManager.getRegionMedia(source, volume, fadeTimeMs, loop); + Sound media = worldRegionManager.getRegionMedia(source, volume, fadeTimeMs, loop); media.setDoPickup(this.doSync); return media; } @@ -53,7 +53,7 @@ public boolean hasWorlds() { return hasWorlds; } - public Media getMediaForWorld(String worldName) { + public Sound getMediaForWorld(String worldName) { return getMediaForWorld(OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(worldName)); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java similarity index 76% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java rename to plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java index d7f2380df..74f95d17a 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java @@ -3,11 +3,11 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.generic.media.enums.MediaFlag; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; -public class RegionMedia extends Media { +public class RegionSound extends Sound { - public RegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { + public RegionSound(String source, int volume, int fadeTimeMs, Boolean loop) { super(source); setLoop(loop); if (loop) setDoPickup(OpenAudioMc.getInstance().getConfiguration().getBoolean(StorageKey.SETTINGS_REGIONS_SYNC)); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java index 0eb8423ca..d16b5b20a 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.platform.Platform; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; @@ -17,7 +17,7 @@ public class TimedRegionProperties extends RegionProperties { private int task = -1; @Column private String regionId; - private Media media; + private Sound media; public TimedRegionProperties() { @@ -59,22 +59,22 @@ public void destroy() { forceUpdateClients(); } - public Media getOrStartMedia() { + public Sound getOrStartMedia() { // temp regions always use their own media, as it shouldn't sync with others if (media == null) { - this.media = new RegionMedia(getSource(), getVolume(), getFadeTimeMs(), true); + this.media = new RegionSound(getSource(), getVolume(), getFadeTimeMs(), true); this.media.setLoop(false); } return this.media; } @Override - public Media getMediaForWorld(String worldName) { + public Sound getMediaForWorld(String worldName) { return getOrStartMedia(); } @Override - public Media getMediaForWorld(WorldRegionManager worldRegionManager) { + public Sound getMediaForWorld(WorldRegionManager worldRegionManager) { return getOrStartMedia(); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java index 1b4a6b5a1..bf2521130 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.registry; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; -import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionMedia; +import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionSound; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; import java.util.Collection; @@ -14,7 +14,7 @@ public class WorldRegionManager { private String world; // map region source -> shared media - private final Map regionMediaMap = new HashMap<>(); + private final Map regionMediaMap = new HashMap<>(); // map region name -> region properties / settings private final Map regionPropertiesMap = new HashMap<>(); @@ -60,9 +60,9 @@ public boolean containsRegion(String regionName) { return regionPropertiesMap.containsKey(regionName); } - public RegionMedia getRegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { + public RegionSound getRegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { if (regionMediaMap.containsKey(source)) return regionMediaMap.get(source); - RegionMedia regionMedia = new RegionMedia(source, volume, fadeTimeMs, loop); + RegionSound regionMedia = new RegionSound(source, volume, fadeTimeMs, loop); regionMediaMap.put(source, regionMedia); return regionMedia; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java index c5c184082..bcaf48668 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java @@ -43,7 +43,7 @@ public class SpeakerService extends Service { public static final SpeakerType DEFAULT_SPEAKER_TYPE = SpeakerType.SPEAKER_3D; @Getter private final Map speakerMap = new ConcurrentHashMap<>(); - private final Map speakerMediaMap = new ConcurrentHashMap<>(); + private final Map speakerMediaMap = new ConcurrentHashMap<>(); @Getter private Material playerSkullItem; @Getter private Material playerSkullBlock; @Getter private ServerVersion version; @@ -162,9 +162,9 @@ public Speaker getSpeaker(MappedLocation location) { return speakerMap.get(location); } - public SpeakerMedia getMedia(String source) { + public SpeakerSound getMedia(String source) { if (speakerMediaMap.containsKey(source)) return speakerMediaMap.get(source); - SpeakerMedia speakerMedia = new SpeakerMedia(source); + SpeakerSound speakerMedia = new SpeakerSound(source); speakerMediaMap.put(source, speakerMedia); return speakerMedia; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java index 271c8145a..6c9764766 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java @@ -1,6 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.speakers.objects; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.spakers.BasicSpeaker; import com.craftmend.openaudiomc.generic.database.internal.DataStore; import com.craftmend.openaudiomc.spigot.modules.speakers.SpeakerService; import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; @@ -13,7 +14,7 @@ import java.util.*; @NoArgsConstructor -public class Speaker extends DataStore { +public class Speaker extends DataStore implements BasicSpeaker { @Column @Getter private String source; @Column @Getter private UUID speakerId; @@ -61,7 +62,7 @@ public void fixEnumSet() { extraOptions = fixedValues; } - public SpeakerMedia getMedia() { + public SpeakerSound getMedia() { return OpenAudioMc.getService(SpeakerService.class).getMedia(source); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java similarity index 80% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java rename to plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java index 5cfe8ae7b..c718e5884 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java @@ -3,16 +3,16 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.generic.media.enums.MediaFlag; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import lombok.Getter; import lombok.Setter; -public class SpeakerMedia extends Media { +public class SpeakerSound extends Sound { @Getter @Setter private boolean distanceFading = false; - public SpeakerMedia(String source) { + public SpeakerSound(String source) { super(source); setLoop(true); setDoPickup(OpenAudioMc.getInstance().getConfiguration().getBoolean(StorageKey.SETTINGS_SPEAKER_SYNC)); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java index 6620a94a7..1faedcb20 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.traincarts.models; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.media.objects.Media; +import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.media.time.TimeService; import lombok.Data; @@ -14,17 +14,17 @@ public class TrainMedia { private UUID mediaId = UUID.randomUUID(); private Instant startedAt = OpenAudioMc.getService(TimeService.class).getSyncedInstant(); private String source; - private Media media; + private Sound media; public TrainMedia(String source) { this.source = source; - this.media = new Media(this.source); + this.media = new Sound(this.source); this.media.setDoPickup(true); this.media.setMediaId(this.mediaId.toString()); this.media.setLoop(false); } - public Media toMedia() { + public Sound toMedia() { return media; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/velocity/modules/commands/subcommand/VelocityPlaylistCommand.java b/plugin/src/main/java/com/craftmend/openaudiomc/velocity/modules/commands/subcommand/VelocityPlaylistCommand.java index dbb5e5555..745bb5de6 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/velocity/modules/commands/subcommand/VelocityPlaylistCommand.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/velocity/modules/commands/subcommand/VelocityPlaylistCommand.java @@ -1,21 +1,13 @@ package com.craftmend.openaudiomc.velocity.modules.commands.subcommand; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.generic.commands.CommandService; import com.craftmend.openaudiomc.generic.commands.interfaces.SubCommand; import com.craftmend.openaudiomc.generic.commands.objects.Argument; -import com.craftmend.openaudiomc.generic.media.objects.Media; -import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; -import com.craftmend.openaudiomc.generic.media.objects.OptionalError; -import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.node.enums.ProxiedCommand; import com.craftmend.openaudiomc.generic.node.packets.CommandProxyPacket; import com.craftmend.openaudiomc.generic.proxy.interfaces.UserHooks; import com.craftmend.openaudiomc.generic.user.User; import com.craftmend.openaudiomc.spigot.modules.proxy.objects.CommandProxyPayload; -import com.craftmend.openaudiomc.velocity.modules.player.objects.VelocityPlayerSelector; -import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; public class VelocityPlaylistCommand extends SubCommand { From 59e8c035ab67ed9fed26b6dc861f7a94ab238a0c Mon Sep 17 00:00:00 2001 From: Mats Date: Sat, 3 Feb 2024 17:06:09 +0100 Subject: [PATCH 4/6] Further API --- api/dependency-reduced-pom.xml | 55 ++++++ api/pom.xml | 11 +- .../openaudiomc/api/clients/Client.java | 14 ++ .../openaudiomc/api/media/Media.java | 168 +++++++----------- .../openaudiomc/api/media}/MediaFlag.java | 2 +- .../openaudiomc/api/media}/MediaOptions.java | 2 +- .../openaudiomc/api/media}/OptionalError.java | 2 +- .../openaudiomc/api/spakers/BasicSpeaker.java | 3 +- .../generic/media/objects/Media.java | 13 ++ .../craftmend/openaudiomc/api/ApiHolder.class | Bin 0 -> 1119 bytes .../craftmend/openaudiomc/api/ClientApi.class | Bin 129 -> 845 bytes .../craftmend/openaudiomc/api/MediaApi.class | Bin 0 -> 1321 bytes .../craftmend/openaudiomc/api/VoiceApi.class | Bin 0 -> 992 bytes .../craftmend/openaudiomc/api/WorldApi.class | Bin 0 -> 947 bytes .../openaudiomc/api/basic/Media.class | Bin 692 -> 0 bytes .../openaudiomc/api/clients/Client.class | Bin 333 -> 610 bytes .../openaudiomc/api/media/Media.class | Bin 0 -> 3902 bytes .../openaudiomc/api/media/MediaFlag.class | Bin 0 -> 1203 bytes .../openaudiomc/api/media/MediaOptions.class | Bin 0 -> 4291 bytes .../openaudiomc/api/media/OptionalError.class | Bin 0 -> 644 bytes .../openaudiomc/api/media/UrlMutation.class | Bin 0 -> 387 bytes .../openaudiomc/api/regions/AudioRegion.class | Bin 0 -> 519 bytes .../api/spakers/BasicSpeaker.class | Bin 0 -> 862 bytes .../api/spakers/ExtraSpeakerOptions.class | Bin 0 -> 5495 bytes .../openaudiomc/api/spakers/Loc.class | Bin 0 -> 508 bytes .../openaudiomc/api/spakers/SpeakerType.class | Bin 0 -> 1659 bytes .../api/voice/VoicePeerOptions.class | Bin 0 -> 1881 bytes .../generic/media/objects/Media.class | Bin 0 -> 514 bytes api/target/maven-archiver/pom.properties | 2 +- .../compile/default-compile/createdFiles.lst | 19 +- .../compile/default-compile/inputFiles.lst | 19 +- api/target/openaudiomc-api.jar | Bin 4642 -> 51975 bytes api/target/original-openaudiomc-api.jar | Bin 4342 -> 19933 bytes .../database/models/Speaker.java | 4 +- .../parties-module/dependency-reduced-pom.xml | 135 ++++++++++++++ .../rinaorc-legacy/dependency-reduced-pom.xml | 128 +++++++++++++ .../skywars-module/dependency-reduced-pom.xml | 135 ++++++++++++++ .../dependency-reduced-pom.xml | 125 +++++++++++++ .../openaudiomc/api/impl/MediaApiImpl.java | 8 +- .../api/impl/event/enums/VoiceEventCause.java | 18 -- .../PlayerEnterVoiceProximityEvent.java | 2 - .../PlayerLeaveVoiceProximityEvent.java | 2 - .../openaudiomc/api/interfaces/Client.java | 4 +- .../openaudiomc/api/interfaces/MediaApi.java | 2 +- .../api/implementaions/MediaApiImpl.java | 4 +- .../client/objects/ClientConnection.java | 21 ++- .../client/session/RtcSessionManager.java | 9 +- .../generic/client/session/SessionData.java | 4 +- .../commands/subcommands/PlaySubCommand.java | 10 +- .../generic/media/objects/Sound.java | 92 ---------- .../client/media/PacketClientCreateMedia.java | 6 +- .../media/ClientCreateMediaPayload.java | 6 +- .../players/objects/SpigotConnection.java | 4 +- .../spigot/modules/regions/RegionModule.java | 4 +- .../modules/regions/gui/RegionEditGui.java | 10 +- .../modules/regions/interfaces/IRegion.java | 6 +- .../regions/interfaces/RegionMutator.java | 4 +- .../modules/regions/objects/Region.java | 4 +- .../{RegionSound.java => RegionMedia.java} | 8 +- .../regions/objects/RegionProperties.java | 8 +- .../objects/TimedRegionProperties.java | 12 +- .../regions/registry/WorldRegionManager.java | 8 +- .../modules/speakers/SpeakerService.java | 6 +- .../modules/speakers/objects/Speaker.java | 2 +- .../{SpeakerSound.java => SpeakerMedia.java} | 8 +- .../modules/traincarts/models/TrainMedia.java | 8 +- .../voicechat/SpigotVoiceChatService.java | 7 - .../voicechat/tasks/PlayerPeerTicker.java | 7 +- 68 files changed, 801 insertions(+), 330 deletions(-) create mode 100644 api/dependency-reduced-pom.xml rename {plugin/src/main/java/com/craftmend/openaudiomc/generic/media/enums => api/src/main/java/com/craftmend/openaudiomc/api/media}/MediaFlag.java (72%) rename {plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects => api/src/main/java/com/craftmend/openaudiomc/api/media}/MediaOptions.java (94%) rename {plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects => api/src/main/java/com/craftmend/openaudiomc/api/media}/OptionalError.java (75%) create mode 100644 api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/WorldApi.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/Media.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/MediaFlag.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/OptionalError.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/UrlMutation.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/regions/AudioRegion.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class create mode 100644 api/target/classes/com/craftmend/openaudiomc/generic/media/objects/Media.class create mode 100644 modules/parties-module/dependency-reduced-pom.xml create mode 100644 modules/rinaorc-legacy/dependency-reduced-pom.xml create mode 100644 modules/skywars-module/dependency-reduced-pom.xml create mode 100644 modules/voice-join-permission/dependency-reduced-pom.xml delete mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/enums/VoiceEventCause.java delete mode 100644 plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java rename plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/{RegionSound.java => RegionMedia.java} (67%) rename plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/{SpeakerSound.java => SpeakerMedia.java} (71%) diff --git a/api/dependency-reduced-pom.xml b/api/dependency-reduced-pom.xml new file mode 100644 index 000000000..8b9183683 --- /dev/null +++ b/api/dependency-reduced-pom.xml @@ -0,0 +1,55 @@ + + + + OpenAudioMc-Parent + com.craftmend.openaudiomc + 1.2 + + 4.0.0 + openaudiomc-api + openaudiomc-api + ${oa.version} + + + + true + src/main/resources + + + openaudiomc-api + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + 1.8 + UTF-8 + + diff --git a/api/pom.xml b/api/pom.xml index 7c8533c8f..47c8e5591 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -62,18 +62,11 @@ 24.1.0 - - org.projectlombok - lombok-maven - 1.18.20.0 - pom - - org.projectlombok lombok - 1.18.22 - compile + 1.18.30 + provided diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java index 7ce8a1d18..83be77b03 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java @@ -17,6 +17,20 @@ public interface Client { */ Actor getActor(); + /** + * Add a on connect handler, which fires when the client gets opened for the player + * + * @param runnable Handler + */ + void onConnect(Runnable runnable); + + /** + * Add a on connect handler, which fires when the client gets closed for by player + * + * @param runnable Handler + */ + void onDisconnect(Runnable runnable); + /** * If this client currently has the web session open * @return if the client is connected diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java index e755548aa..f65b3de41 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java @@ -1,159 +1,121 @@ package com.craftmend.openaudiomc.api.media; -public interface Media { +import com.craftmend.openaudiomc.api.MediaApi; +import lombok.Getter; +import lombok.Setter; - /** - * The unique id of the media, used by the client to keep track of media pools. - * This is a random UUID by default, but can be set to a custom value and will be used to identify the media - * for regions, stop commands and other features. - * - * @return the unique id of the media - */ - String getMediaId(); +import java.util.UUID; + +@Getter +public class Media { /** * Source value for the media. Typically, a web compatible web link or translatable OA value - * - * @return the source of the media */ - String getSource(); + private final String source; /** - * The volume of the media, 0-100 - * - * @return the volume of the media + * The unique id of the media, used by the client to keep track of media pools. + * This is a random UUID by default, but can be set to a custom value and will be used to identify the media + * for regions, stop commands and other features. */ - int getVolume(); + @Setter + private String mediaId = UUID.randomUUID().toString(); /** * An epoch millisecond timestamp of when the media started playing, used by the client to calculate the current position * if keepup is configured (time spent + startAtMillis) - * - * @return the start instant of the media */ - long getStartInstant(); - + @Setter + private long startInstant; /** - * The starting point of the media, in milliseconds. 0 by default, but can be used to skip intros or start at a certain point. - * - * @return the starting point of the media + * Keep timeout is the amount of seconds that the openaudiomc plugin runtime should keep track of this media for. + * Used to retroactively play media if a client connected too late. optional, -1 by default to disable. */ - int startAtMillis(); + @Setter + private transient int keepTimeout = -1; /** - * If the media should loop (jumping back to startAtMillis and playing again) - * - * @return if the media should loop + * If the media should attempt to pick up where its currently according to the time spent since the start instant. */ - boolean loopMedia(); + @Setter + private boolean doPickup = false; /** - * If the media should attempt to pick up where its currently according to the time spent since the start instant. - * - * @return if the media should attempt to pick up + * If the media should loop (jumping back to startAtMillis and playing again) */ - boolean doPickup(); + @Setter + private boolean loop = false; /** * Fade time is the amount of milliseconds it takes to fade in or out. 0 by default, but can be used to create smooth transitions * between multiple regions, or to create a fade in effect. - * - * @return the fade time of the media */ - int getFadeTime(); + @Setter + private int fadeTime = 0; /** - * Keep timeout is the amount of seconds that the openaudiomc plugin runtime should keep track of this media for. - * Used to retroactively play media if a client connected too late. optional, -1 by default to disable. - * - * @return the keep timeout of the media + * The volume of the media, 0-100 */ - int getKeepTimeout(); + @Setter + private int volume = 100; /** * If this media will mute current regions while playing. This is used to prevent overlapping media in regions. - * - * @return if the media will mute regions */ - boolean muteRegions(); + @Setter + private boolean muteRegions = false; /** * If this media will mute the speakers of the client. This is used to prevent overlapping media with speakers. - * - * @return if the media will mute speakers - */ - boolean muteSpeakers(); - - /** - * New media ID, used to identify the media for regions, stop commands and other features, can be any non-null string - * - * @param mediaId the new media id - */ - void setMediaId(String mediaId); - - /** - * Epoch millisecond timestamp of when the media started playing, used by the client to calculate the current position. - * - * @param startInstant the new start instant - */ - void setStartInstant(long startInstant); - - /** - * Amount of seconds to keep track of this media for, used to retroactively play media if a client connected too late. - * - * @param keepTimeout the new keep timeout in seconds */ - void setKeepTimeout(int keepTimeout); + @Setter + private boolean muteSpeakers = false; /** - * If the media should attempt to pick up where its currently according to the time spent since the start instant. - * - * @param doPickup if the media should attempt to pick up - */ - void setDoPickup(boolean doPickup); - - /** - * If the media should loop (jumping back to startAtMillis and playing again), defaults to false - * - * @param loopMedia if the media should loop - */ - void setLoopMedia(boolean loopMedia); - - - /** - * The amount of milliseconds to fade in or out. 0 by default, but can be used to create smooth transitions - * - * @param fadeTime the new fade time - */ - void setFadeTime(int fadeTime); - - /** - * The volume of the media, 0-100 - * - * @param volume the new volume + * The starting point of the media, in milliseconds. 0 by default, but can be used to skip intros or start at a certain point. */ - void setVolume(int volume); + @Setter + private int startAtMillis = 0; /** - * if this media should mute current regions while playing. This is used to prevent overlapping media in regions. - * - * @param muteRegions if the media should mute regions + * The flag of the media, used to identify the type of media. This is used by the client to apply different settings + * based on the type of media. This is set to DEFAULT by default, but can be set to REGION or SPEAKER to apply different settings. */ - void setMuteRegions(boolean muteRegions); + @Setter + private MediaFlag flag = MediaFlag.DEFAULT; /** - * if this media should mute the speakers of the client. This is used to prevent overlapping media with speakers. + * Create a new media based on a url + * the source will first be processed by the mutation api + * so you can just use addons without needing to wor§§ry * - * @param muteSpeakers if the media should mute speakers + * @param source the resource url */ - void setMuteSpeakers(boolean muteSpeakers); + public Media(String source) { + this.source = MediaApi.getInstance().translateSource(source); + this.startInstant = MediaApi.getInstance().getNormalizedCurrentEpoch(); + } /** - * The starting point of the media, in miliseconds. 0 by default, but can be used to skip intros or start at a certain point. + * You can apply multiple options. + * Used by the commands to allow settings via JSON * - * @param startAtMillis the new starting point + * @param options The options. Selected via the command + * @return instance of self */ - void setStartAtMillis(int startAtMillis); + public Media applySettings(MediaOptions options) { + this.loop = options.isLoop(); + this.keepTimeout = options.getExpirationTimeout(); + if (options.getId() != null) this.mediaId = options.getId(); + this.doPickup = options.isPickUp(); + this.setFadeTime(options.getFadeTime()); + this.volume = options.getVolume(); + this.muteRegions = options.isMuteRegions(); + this.muteSpeakers = options.isMuteSpeakers(); + this.startAtMillis = options.getStartAtMillis(); + return this; + } } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/enums/MediaFlag.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaFlag.java similarity index 72% rename from plugin/src/main/java/com/craftmend/openaudiomc/generic/media/enums/MediaFlag.java rename to api/src/main/java/com/craftmend/openaudiomc/api/media/MediaFlag.java index 2b9f9d56f..1f10ff913 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/enums/MediaFlag.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaFlag.java @@ -1,4 +1,4 @@ -package com.craftmend.openaudiomc.generic.media.enums; +package com.craftmend.openaudiomc.api.media; /** * The 3 types of sounds, used by the client to mark the WebAudioType diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/MediaOptions.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaOptions.java similarity index 94% rename from plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/MediaOptions.java rename to api/src/main/java/com/craftmend/openaudiomc/api/media/MediaOptions.java index 978fad665..cb0c16131 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/MediaOptions.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaOptions.java @@ -1,4 +1,4 @@ -package com.craftmend.openaudiomc.generic.media.objects; +package com.craftmend.openaudiomc.api.media; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/OptionalError.java b/api/src/main/java/com/craftmend/openaudiomc/api/media/OptionalError.java similarity index 75% rename from plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/OptionalError.java rename to api/src/main/java/com/craftmend/openaudiomc/api/media/OptionalError.java index 89ea33ebf..88347625b 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/OptionalError.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/media/OptionalError.java @@ -1,4 +1,4 @@ -package com.craftmend.openaudiomc.generic.media.objects; +package com.craftmend.openaudiomc.api.media; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java index f5f0e8aba..ccd365909 100644 --- a/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java +++ b/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java @@ -46,7 +46,8 @@ public interface BasicSpeaker { * Get the radius of the speaker * @return radius */ - int getRadius(); + @NotNull + Integer getRadius(); /** * If this speaker is currently directly powered by redstone diff --git a/api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java b/api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java new file mode 100644 index 000000000..18ec66dd3 --- /dev/null +++ b/api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java @@ -0,0 +1,13 @@ +package com.craftmend.openaudiomc.generic.media.objects; + +@Deprecated +public class Media extends com.craftmend.openaudiomc.api.media.Media { + + /** + * @deprecated use Sound instead, this class only exists at this package level for legacy reasons + */ + + public Media(String source) { + super(source); + } +} diff --git a/api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class b/api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class new file mode 100644 index 0000000000000000000000000000000000000000..1e5ee79a1f1dda853eed70e43ef029b2016d6af0 GIT binary patch literal 1119 zcmb7D$!-%t5Pj`&yfIE3Ck_DuvDsof%Urk_A)yFFBnJ+Tj5xMu8q;AsV@<{Zet<9G z2f&9&Ai<3TABA}BRa`JpOI6j~Rj;dFRsZ_^^*ewEILILZD~+U$C8Pujr}A7nz6`p~ zi_WQXV}aB|9q9OxfK{!vv&bNuM$X0+*aACl*mK-SzK(k;@SL!(0y*$>*mE7(*Usa< zeir(kiUd|&U#lSI$x(0?%fM9vwdTLW52qoGG?oRn=eZsEzUoT970XyXdGD%ztivFK zf3t}h#5G;K9P%id64&TaZO(yOaioK8V_aCt#s;pEgm+=&dw-=`U6AU_ zNkqdCbj`+f+#t?*s9kj_oc1JQgmcrzEo>8~r#vk$g>yWKXb2<^Lyu&yG}(jB{j}LMr~RTirCcD-DRbW*%l?F+Tq_(zu6n8shs!e}4$M%Y!uBWlvy#;OA+$1P zrbe1GG1BZQbppbCIm$A34z-|Os$W2S9$i-`%{5@*Hl;mwz#ZJ>E{l7(&yzCkkMu}V zSH2+q6Zvn*zbdX=VD(3Ri1h9d>w80N?hmnLfGy?-&S#3Uz*WRL*04#rg%aU5Mvv9U kfY=$;KxkB1g-ND@8tX7MR#0ap7ItY{5CvZE(M(|f4>xWfJOBUy literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class b/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class index 771eb97cc1af8be056ae5d842e5d897242467964..f370345c11eb4017d2b6c1e7bf21c48bf6f6a00e 100644 GIT binary patch literal 845 zcma)4PfHs?9DSqF7^Bwsr)sr$XrYSWT)ag}L!=l83RN$?O?JmHVRk0$&I*1j@#w)1 z;D-`lvaLZ&jfdUYdHa6v{r){X-rWN@z~>4kFj+=v4pW#G_!jv@Mya|CiFUE{eeF~p z8=pi{^^I)w&9S$!P6cX_HQEItEtdu5A}z4nemlJRH>6(1%viH$b{Vq*i#>Ivq*bmf zPdhyw1%YZ;hmrZ-&im~JN=+X#;}31)^hus{bb78jmPm!7g|onqo%YZ*55~%ii`G$n zoJG-;Ocn}tfz4mJ3ntMmcV#j|hlX=Ls9?Oy1irR?+Lb*WI;k=)lWO!+p5)dJQliNA zYmxKo{!5{GX5Fy1u%+-in=wkg>8)kQ=t;54ndv$e@|49M|A%%sW{|JS{7%^~ZH;O6Rm?$Pp0_QY zL-ZEnh98XNdwPi0N*pv6x#_h(*b>iWJ~I$20B>ZhU=@@2NOS^g&&>4~Oy0=cz$c=d I?U1|m1iQ2DC;$Ke delta 65 zcmX@h*2pMu>ff$?3=9k=4D9R-OpFZbldT!$c${-GQ}aq33o_XmSSD^1ojjLGUYL=A Q8K@2f7#UcBBohN002NaVTmS$7 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class b/api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class new file mode 100644 index 0000000000000000000000000000000000000000..ba9c2f3955d3f563944ba55a16f8c7ccc404ff39 GIT binary patch literal 1321 zcmbVM-%k@k5dOBU98jg<59d%o(L-qgS1`ly#5WQ5t@!LB zsRM3esYMzn6Zu@kif_c~wFv`h8LE*Cl%T+tPMpxbWT5?+rJvRt=M`rtwM;LVn&?6^sAt710b(PP8K8& z9wQVvgt|!|E{?i|W%^Ue_^T+4m}^wtk-%bMC~z#Zg4-l_h*fH12wXY=%o_U#^bmJ( bZv-iW)rfJNd)!BswRRz5;<-;u1w8lz8!=Eo literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class b/api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class new file mode 100644 index 0000000000000000000000000000000000000000..5975aec323b55d4432ad85cfdfe55009e1c44b0d GIT binary patch literal 992 zcmcIj%}xR_5T4@7%AbJ$8qW$I?8V!j2*yZ4#025MMN7A0$!@#Z?eZqRhwkVSAxWr%4^9#zPMk7dLJNqsIu zib=$ABjVRG@L7zYGLf7zZD@%^5kVP(T6=bM|0lw8VFSU*V$Lq)HQAU<2o8uC;m&Z( zs6tQ}G4)4%R;w>cj=*V3U&}4GxnMVGIArl183x+oK9S^>ne6W8o*a-r=2!6sM(^ZLyu^I(c9D(Jayv27t&8IQ>XX%(bc|NNS*J4qv8lW;sbth0%+LNZ&FHo0F{3vR3vSUO#Kz)M za4k&EPm-}rJ)@;u`kC~*?%qSi8AZo7L%AyhW#q6f66wxGqJeb4c_wpZP1T3Qem9Qe z!AyGOoicfEZvxd`X?|?AMmfmnF=~%gZiKHLsFMH5{qT?4-J~Yo53QIK*gJ&a_E~Mb zDr9UfRi$u*zA@H|P)^0@^}xEEkEKtXP^RKy=Hx@`hqcz=cy*WK{CjzuXZLQzsc@o@ zUbE>VXNg1;Tuu%e&De!wz%f_>o{U5hX#v`P`J0c+4xdN%bvhh4|J rLJfT4*=SxH+5os5VGD}|4>(@XCRA^7x8RxO;_v=kFuX)`gSM{#c^3zq literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class b/api/target/classes/com/craftmend/openaudiomc/api/basic/Media.class deleted file mode 100644 index a85017eaf6b54b95ef03fbf176b2e3263f57db97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 zcmZWm%TB{E5L}niNBRU>-fuXh7jogo2?dLDt6-5F$-kxY2x-w`OIXC%_ZWy|we1Zjxp4ZG7L z&``IMCbAbTB#p2p>U{z=WQn|&LmmWtfqw=<#JZJsObC=b@yy+M8WX5skuLSvD_4c< z$Q~Js6%#2|tc0m#FU;p6!b(-eMlqvvmLRnjD^F&l$e`Zl3Ijf*u-}#`J60_46F=n3=BY;oq+>Pb3$n@25vB)2TJoo tX+8#iu($w}FUTOoz{DU73?WViMlm2I0>q*~%+AQb2<9*{fP|SC!~yUmP-y@F delta 85 zcmaFFa+Znf)W2Q(7#J8#7z8GAwN5+|KlwbPiZvSxBLgb~8v_H7W@q34)0|M63rce{ T@PNg6L3{>A20kFk#J~>#{m(x#WTl%-&WYNePa(g31G3dPz5(}lKl0qO$NWLkzMnUG8naL0Y$ z{)Rq}@>mo<_{ql){wN>cb0_ICPFTL&lR5Xk?>*Z+C;$BW$DaU>;fDxnP#Z>_LOntT zTCbYd%|yn`tt6(Fu39PAKrF zb7?2*eY8b;Cbk~v7kslq3t9~{xX!FwuyZR0c2-X6n>}rRBigVdjGYR*u-iaS%E=~D z1#{WWTDf$>$y+(Il(wC0Dq-gBMAk~%W@1uS17ZD@OdDwPEb#O0QP_*e3^c7;R({UT zT26_s8cDhHafN-@Py5o&w4GWl<+-sa8&4=aDI0Ye$H|N0DTM>V(y(l%EnyMmL4~J9 z8M^LdN}j4mAtu14Y{|9GSu3`aE6UMl6b^}AiGDV3nX6VoZzL2B3&*yiYZlx=chb&e zZ0;Pzvtb-lcn;4SIP}l~8O@jsa(H-TbZ~xR&Ol<~k)S#g#}!_XTkDod)`WhX4C9o- z08Se?cz-&bl)=2s0IXPUGDoL!Da$~NS${ZWzg#$|@Dhd$w74v?V#Z|1oKiuE4o3f< z<#Ory6F;IbD%BJ!YOL_StdPW*fxR^DtW(IE8T*!%9x4?IR?Z#CJE<$W_Qxb+6AF_! z%Z%y7c&?j*TskiyC?-bpBLq21yk501*7G1jnJc%LK=)= zQ*lGjEJu^_*r&0ga7AE^ge~ZT7VTAqRk>lCU7Xw~Y1zptZM2~{hp zW;fThfn7lfT%Z|4PMWs0OxQW=Y$>~B73R#P3^i>NPRh(Im<3zD%gQ?Uip@aAA5c`A zg5OUU%zQp`bJlWQb|RuLMIRns&Rze5%6RLIVW*PvqmOU+el6K>Dffbp8wIXKe*J}7eeZ?XZ!luNBYYRz*04QRvxfFq?HW2{>6E1_)|y^J zxBQIC5|^bnb_Yk+&`0En_&vN>gEb7x$32`e_N%k9IV3*zMpT z+r!zk4}IvuDMT^E5tig&nxbZb7!%`IV&h7oMD%XYR$Rv$`~oiMSg~Q^25y!;y2CRP z$(dOEE~dnI%6Ym&aq(|7$>&9Jk@8h>kn+-9EQwqe2PtjwkuoE0Qaa-4&m^sdxDrEz zYnFdLa%hEvPUJbHuOY#(_A#uddFl)eo}!@}X3wmfJ%d|#ljgpq8I4ZB-9a6AyqxflTM^n;HCf;qYZz+Hau@jx&KSOB=&4;}~vbIt{T zqkiykAef^t037#&#{$6|mI2^iKX^J2d>bDGfcyLvc0LgN;d-|@QGT1DSe!3#qc?cP zy<4NbHy&DlEFs+orMN!A$7Lf<@FCW+#zL{qEj`BL*;j=}`l#@H0&AVe>lL9`2OEUn zo&!~Qqz?WbCAK#YW+25y>v*kVjA7Xheba97laB8M4KqA*0^V)7 zp>Lb~%r$+d;d1kxcy4>VnE->LBZ?S<`lhm7I;wP z(VwTs4wo((haUBy#QM37asd`wk7*;=w*iD0hdn!^oCUKu3YI|YeFid81)l+`X zO^*jnbN~3%u{#9~X*^Idts{en)cpof3A#SXIOks1**{^}$PQJPJ>G5?h7wk%#~x+M|5211(RK!-8rs~e^Oh@E2h>Wyed=J`Hj6f^ z^Uk%tA^8P&uVH+mh+&bQF?kmw zdfN8ZHYi^CMzzM1 x$R(a$AR>b~MFy%2o<(J#U19zLNg=iGj3MjeNJ?)s5*4HA`Z8b9pOkQ9<2TCu1*`x7 literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class new file mode 100644 index 0000000000000000000000000000000000000000..90ad85325e4309a3acbe2c47f26d48c2c78f6f81 GIT binary patch literal 4291 zcmb7IYf~HN6@FG)At4ql2~3P}?9IiA5CY-UX@fC|6AGt@Ypl`XqkDj0REP&LbzQCO1a za^11)T2n#Kwq0peO$ACZj)a0^-9UKSMrFRyup0>^6&zf1Vf3o;vR<`@4oyQp26);@t7bV*Dj3eLFJ3mbjY7q!Z5CFXhE>~~8Cy#rrQq;htcv{-!JI9l zrcWi1Q801dZt2Y}yHzRI9(8nc+pOvJ3J6OmSJIp#{;G_IJ9 zrYz(&Ovpl?ESxnrC3_+-Xqb`{`kRi?aGrLStV+ddCb{yMhA-ea9j0URFSd+|g8kVx zGnY3mn{B+thaDN!wgO;7}_+Q`A#Pka9dIIpVaV_=qIe^ z8P^#RKCR&y(e0zI#93Sy`Ij}!i@cX|FV`adiiWQW#DLXYYI9zep4IR*S?c$eeD`H# zNyBM@N)c+MGXiHcJcqLiVq7dTNkiGOHvj#iOJWu0;#kx0b%|E$^Q!a$#F&^8J;rnu z=QXU$afvOXxix2(%{acP;J(jwJkV!aR;6q7WI@6|eE=Cs*40jk)k8elnN{3hrqxW`UK_ zKJ)xxLX&OI-iCs>#N}ZbjR{xclCd*qi%at?@`l-LRUCGOD^9N1twzaQuq4Xq_8?74 zXW;=h`YJCxnRlGSq#`nU-8aXp`{p2Z-<o*!;3D5>&?82A+N^J=E|4*EV8*}H*cUm&?2NYcJ!aCgtJNCY67IUpo~qxcD* zkI(_|66(b;hG@blMkpKQTt9>-aF_%12%e=|uX2~>8HCsHQ*uA!Zx7U=bUIBr2eof_ zfp0N9Mk5d2A`x*9>T!k1HlUafq{u)FQ9dkIwk!9AD)S}?QGT%VWGz&g_d|&C(N5+5 zP-WgDAz8;Bwo897!w1v#(GH3y-Ur8te)Cko!g}rLiQCy zWQ!MPdFJwIIh=t`q{eR`KCy#u5Gg#sInQK2z){xpAKhw-F`Vy`itz5erWlzJSPl?>|=sBUcJ$ga*T=nRp(BJmx zMcH$W^bWq)d3k%~;eA3}^P|YGO}yaSeATykGIs~Blpk35CW`JP6AX-oR>yf$|1* z9R^l4tQjzoC**$yTD_sPLqg_Uc`CdhBrDYpv#Ig?HmzI$k8=`)brd*maAk2O>3<=rJBEa?Hd{9h-bMW&( z!?uE>2A8NUa;+bWhRUd5=y^_Wi8^^-UQJgCix>>o(m7)QYolKVs;V}IZEuvbt?6*G4KQUQHbX< zlrWURw%+sk?%w(H>-_`3JA%g9G8DNUeyxZb5pqJoUl3s3uOm9fgL8TN*wn4z~YjZNi)DkWw0E4*7T*<~OgeFD&-Ecekx pfRL&#^&>hDXhmQHzx%X%=>LN_Y$1+X98?j8i=9bkx(J;^ato$29*$POZ&n~tr+a@)mxLXsiwhTyPGL1V{EFS zOl3d9Go`f6VJU;%mNp?DpzRwWRm#QpCU0xo&Z3AIJAWCsFUfCCiF&-oK#EBkjGd6@ za)QrM=_r9_z@SFw%QMKVjQHJM^MW)B-x_Dl;CSK`MrcfqEuR|GO6^VKhSe&J1JF+@X}s!Y2Wq*g1u z(NAcQf|=T@-!qu)>CE_eB_rys`g42^TxvxIq@+0n@MxN5pa=!DCHj`>DFIt? sZ#QqVP#L3`gZVLv1z5~kOHd{68aWhT`Cr!+SRKP$gLUFC*vM&{pNewb)Bpeg literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class new file mode 100644 index 0000000000000000000000000000000000000000..ca1a1806c4453434a10d565037c913552557dfee GIT binary patch literal 5495 zcmb_f`F|8=8UIeQ$!?Nq2?K%ywp$ zG}T(I_pP;})p~2|Z5wWoinrE!-`8K@|KP{(`|fPAVFN_!{;==7?{h!zbG0QYfSk$)6PVlylESSjOFCgQ6q0fy}WVUbiHW&5#KeEc~k5XdEatu zuMP@ADr!)xplP6gC@~VBNRAEl9UMsv4UG4s1`njU4V1+>-*KL4_(1>V^k<#wHR&eQ|MmtBO_PboEI5!NUV1@#Mrve19^P7?RM{ zDl`GzNF>b|Vud9kvCr0-hxbgW#0U?BOwO2wnr48To6x@Ea$fV#~+2~ZkPK%g~4wo>f`@MK=7%>%H zxKBZ&^o>OBab07M9BMt^H4VCHduza}+_!-%!ykTwI`H1rybij zESvYRt~{WE$Zi|2=fxjZF^VI+Jj?5Ia(TnICbQ-d%cr4xZ_eX1e+=Vc92NIRwKgrP zRT)FVRc}!7MocibXmW6GskuC3csDIxneWQTSkeqkhLKj00h#RhpE)oKlEd+y2jU|W zyY?&CbrU*7P!j=N*fcP0JFclG=j`;1>)6(#bg*MbaExVpzvUTpwx`QxpnJqwMA4@l zSNCTuPxp!)L9A(Oin*E1&S|{4tne>WOJ5Qfl`dwQDsV)J$txHy4+JKgs7V9km9?Vs zP{J@Zu$C*;c2KsHUc#Qmb|)QRz5vpr_Bi7te`hxXXkWQ!?a0u{4>aX z%5`#dps9Pl;rjaQjA_fQD4M3Lo3_uMD^CoT91Yci{i+Ba7ah%fxL~=rmqWSecpaydPZ1V;;9ch9{utj z1^bVblq=nJ*6}F4#8j7pwh2$nTG=em1zTa8FeYHFaY~@%brF1k79>uX?yPJ1CdEyQ zNg{#|DTt=bT;6dF*P_321w!2-l*|lYrz0ds21PL@*};(&;qy@yAH$QP0n2vBTi(~& z_DWhX?=Wdi+lF6onWKlVA6#84%)s&r8rv6R`zdJ~>T@!bvue-i}+0FHVDg-;9|)&a0_<` zhxEKj54Mf+%7d6x(0Mc0pg^^}xGj86YCUC!G~1yDCn0R-EjpIN@v;=}KpVL6Q#T6&@<9=3?kvX*4Vs;3BQ+lTN`+ zn+GhBLANb~wOzD)&J?|l#4yI*?PLWuI`4 zo6$jem83AHjI{5#jEja``R?WNoDGPI0uHk9v%jx5SXA4%oKo%D0K>h4D89cU8E5 zIZuZ1561ZQQCV$^Ztvbfi8=@PhVEwZas{~ZfhkwMBjw7Mqg+LY5pX{KNKqx;Hge@# zMy`CU$d!*1a{ajceyVYUcnC-< z@EP~10Kb#+1Vz23w4cZASD*;|swMbO^F%FT;nPx=C&VB{EFtkEr-m@sE$tnf&f%{1 z&1cZo-W)oEyW5*<&R|D-bL|;)zCes>$#sLYGRFTdG~hn!zYptiKcAu95Ry9SFLJ|Y zB%b&Z{-~B`!XqL1C45rEdxl=A#bKim|cO>^`YXQxSbZnKk%4zCdOQzPP~jp@8Y;jte-*$LR$ORgrjAd&gO% zo<=zI975HCebN5nE%cYM-@L$nbHM&f#I8Zr#%>|$%lHcag{z}n#bwn{{kE$W-Xl2{ zeNYo{RPa?iyA1K&S6}kpWr?3#mUze2#P?JZH`a?Z4kUL44vKWpH?P0Gt0U3_v=I?} z1K)%~PE6Z?(>AWc0ac-^t>0OuLsgLnDVhE^r0iIhl4azElr76rvK-xza`Up3ENcO! zh*M#wMu$D5U>2GdW4CY~i{}m1xwVYRqVqWH29&)r>45ge+RISJ zs^?Li91G1OoE)o}XD1x1o##k17M@3Aax5~BHOb1N6QLES0)GEy;)~yz4~( azh3zI-NM%&`Slla6aDS4_&ffI=KlhUD3v?_ literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class new file mode 100644 index 0000000000000000000000000000000000000000..330d8e7e19d339080cea7302544a82a9469a60b6 GIT binary patch literal 508 zcmZXQy-ve06orpVXxj2upe+Lf0}Sbc7d9pqq)Jsm6!EvYsfk$kJeQB@Q$w zz-`pwgA6M+DmKwV4LdYdr}zc%;44z><6yyd#lwn6I3}f^Zi4j)UQ8;4{<1F^ Jy7bo2`vVG`cZdK0 literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class new file mode 100644 index 0000000000000000000000000000000000000000..7ed8087b4afc376b5320d1726e4a62a5a8b99d24 GIT binary patch literal 1659 zcmbVM`%lwQ6#gz-*(e1@MG+Jkh`LU(^6)uCkPSj4Vw^59nwYz;V6khLK1lqp6nsUa z@n`=ioFc=oPg_JAR&KteZzTz*noepGt;dbY?gxAEUt1p$^;&~pTA zt|-jC3KaA)q^2s%8_!E+hWVE#V309@ObUGp2B9)YhV42g!%$A!*x|cex4E;eZ&r6q zBPhri!s!&wC>X|BhWg_ z9L_UzFIbKhEHa#Fg^DBBwTh77f`V~mNp6SNDQC5vLU>IoxG21OYo>2_RwJ-nCk-i$ z%M4w!#WZpZW1EisE?eck>1TIcJFJ^o*U8o_Kj4mG%7l^^d0l0=*D0NL;&zKxNuwu? z>qI(7q&FDG%c1AFp;OEH(J1I^g4b_$lc1edFo$_j!@IILHxZ+X=w%UXxCX(#9@Q3}`Kc7=PEK#t*)!5fPXz&QP@3_WFQ+u=dz5%ZM} z%$+18A-2unaa8W3EgE+QbtO3z4=YXgXTh-JUP|P&3PY&{S@hk)368i}5VzY6J;PkJ zgm#&hC*Zoc7)vu$z9D)_q@@w@8UQrYMJ7v^XxnI}#so5>;wIBRMc;4I(?dn3-6YN8 zC+|W2jQ(F3cuzZq+cb7Z-z4%M#+}%Io^VBktg`%9ocaYO{JW0$-zAIE^g76a+M2us z<0~X6Q$WpMJ^uwG`RPv>%a0^KVdBF9l8Pj)`zV8c^wQfghzta3mSQOq_o5SuRpG$4 zK&vF~M;MF5{s2of3Pzn~k+YQlh_U18$`NogT`2};Sne1+aXh%UJvbwayA(5P(K&!Y z=?B=0#2ymm7s)-O%IzYj@enI<*m`_C?K?%OQwjBwdgTkWeIz2owWK<&>X9M!6*K#g bg>ucB^+yV&NU=24RwB)tiWE_blv(`?XIO2c literal 0 HcmV?d00001 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class new file mode 100644 index 0000000000000000000000000000000000000000..46adac910126e25c5886cbf2626d8bbeeb425d08 GIT binary patch literal 1881 zcmbVNT~ixn6n@@KLYA;3X>2HIky2}G2%+l-R&Ah4TTo_#)KW7eS1y~i*&4Dj+3+X) z1$v`bdc%c|N@whhqqqL1j`caaOIQLrj?D1B=e!@!Ip;agzWMX7Uw;FzgpF}%NTiW8 zkiwY4lI`u8cF+3E-*Y-m)9X4NYtVGPJ=?UpuDS2IwqrJAyze-@t*-BSoxVbP-|f4* zZAU@v2%>IaT;Pm;*YaJfy($2Z!i8hJZNKMs9^DzZ?WWVqponP$ zC0tY(TXs9He_Mfo4IMKIrO~p=QBf;$Z`QzN%<-PpB_~aV#dz9bnA&`-k`s|@0`ZbS zTveDU@BH&Y9oH0c)wwuvD>_~wv-1KnZ=iw&66kwj1cmeE({K#9i0L$LDCCdX2-y{C zr=?4;8F(FUuzUB`)>l8SKUBC`|3Ce&DJ1WDO?E$5cRS99gS}m+_s|OTP^f#h)oxfl zSNv!(>9<^}CewHPVPlhIr9lL)#T!b-9nlGoD^H;iV>r@^Ldx@7PETQS+qdk`H?3|I zMsHdDR+t#OyupL_A8c%{5sCI#&*=}^J{QY7L1cZ|ZbzEPYaZXi!hB^q2y~%MbSe(U8+D3Q)Zv}8{ z?3tI-qnEFpdHHR;LpX_iis&eTUs2^!*I1Zf-Zcl|LqR^6-)FK(*IvXebUvY#B z!Kq=AqvZ1?VM*Cr@ypaOn^)O2UV@Qg}JE z3u0fVeTec8JbPL{p>)epntV)gF~VPs@N<wbiv+t+wFNn^iEEiib);6i=%ME4`=LSf_N8vYYk2JP96r03S-6 ztQ7_EVgi$V!=FEs%-j3RD}X*a5h|!QP-|iZb%CCCsnnUe_o=aobPHouk&sKZR11=+ zNl3}-5C!UIWXTT&ItTGgJt{d@b}C0cBRd`R#tp0roc!%KHP&RLm!57iGur20-n9#t z7=czy*4z~7#AJ7BGUrS?c3REHDx<*5WX(TNE^r$E>$U+uC3i)pOZ#6h5r{6$A~RZf zlQ4`*=@o@)qVg+_!x@3S+roNE&6slH+Rm+YUU_nsOY8plp>MYV_R-)5gduox3z*iJ zhP;M+{qX1+;)!<^L>xoAfOS?jIRf2J71IV2>#>OzJ8hLz#Wt@Mw3ob7Dg<_c59wHe AssI20 literal 0 HcmV?d00001 diff --git a/api/target/maven-archiver/pom.properties b/api/target/maven-archiver/pom.properties index 198974840..ca4981700 100644 --- a/api/target/maven-archiver/pom.properties +++ b/api/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Fri Feb 02 23:37:46 CET 2024 +#Sat Feb 03 17:05:18 CET 2024 artifactId=openaudiomc-api groupId=com.craftmend.openaudiomc version=6.8.10 diff --git a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 5d2d42e98..da3a86d32 100644 --- a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,4 +1,19 @@ +com/craftmend/openaudiomc/api/media/MediaFlag.class +com/craftmend/openaudiomc/api/media/MediaOptions.class +com/craftmend/openaudiomc/api/media/OptionalError.class +com/craftmend/openaudiomc/api/media/UrlMutation.class +com/craftmend/openaudiomc/generic/media/objects/Media.class +com/craftmend/openaudiomc/api/ClientApi.class +com/craftmend/openaudiomc/api/WorldApi.class +com/craftmend/openaudiomc/api/media/Media.class com/craftmend/openaudiomc/api/basic/Actor.class +com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class +com/craftmend/openaudiomc/api/spakers/BasicSpeaker.class +com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class com/craftmend/openaudiomc/api/clients/Client.class -com/craftmend/openaudiomc/api/basic/Media.class -com/craftmend/openaudiomc/api/ClientApi.class +com/craftmend/openaudiomc/api/VoiceApi.class +com/craftmend/openaudiomc/api/spakers/Loc.class +com/craftmend/openaudiomc/api/MediaApi.class +com/craftmend/openaudiomc/api/ApiHolder.class +com/craftmend/openaudiomc/api/spakers/SpeakerType.class +com/craftmend/openaudiomc/api/regions/AudioRegion.class diff --git a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index ec73a62f8..41cd6962a 100644 --- a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,4 +1,19 @@ +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/SpeakerType.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaOptions.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java /home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java /home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/basic/Media.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaFlag.java +/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/OptionalError.java diff --git a/api/target/openaudiomc-api.jar b/api/target/openaudiomc-api.jar index 1908498c868d74d9a94cb6c5670d2b5a85482d2b..f672738a789fe57878bdc67d75c75885017c7d0e 100644 GIT binary patch literal 51975 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 DYy}f6 delta 2234 zcmZ8idpy(YAKzSNW3eSHD_C$pX&Mk@&10E@B4Y4&-ZyhpZ8N-DPL!#8iFEc$!4_+3#nbMV0(%3Rk9mtLd}*Y*x@sUr)4PyEub|+O182?$J4zlPq}8dP+SCqp6%cNYvJdSXqvX+o#pXGq*B==n1zD8f}}cO@1R+~-73J5gL~d9n`^fbEC~ z2&?iwd@p9qvY=D&%Kp`HY8rw-SBLGfF`rn}Q1!T43K+zecKgKpYVe86zW2PYA+5d0 z&dU$bl)`YsY$GGG#-Nv%4bLIV036@m$iMi=-XPO0SVMQrM;SXyQd;&TF^5JYD_imf zN%6-rC>B4yVT|k$izqEO;Ck)|?UVs(?;V@4NkrM5G=xGe-ah&S=`4JLn1-k zCvJgn?rZ80pQYJf;CmXPjf3Pjb2~ggQMs)2-1Yiq{{Y_?)thARx##NV3 zI{-aZpb*Q1KN%RyUzE4O7zXq^*gtfy5sJ1-_a|7llsqTd8b67gfq3P=3)iF59pGb~ z?#yT<_A;ZrX)v_T3*~yhqOMzdqLLX{{O%MnYw!taj5qo=eIM<~zcRvx zUn`4J78f=d!ZBptJ_fVo-z~(BiPbs>0(+>3Q8RIvnxgwFcM--)MCt@zFG)TGctRxH0YX^9bF`R zr!!Qhb-0Rm9WWuC(cnEgxaX2iBqdPcsp4eO+X#cuvbt>wb``_sD6v*ms@0HcK&SJE zHoNz+o@zD@Wfp{-GMJ@-feKZ4jW%WXlhw$=KNSV(K`U{!5&O-Pr}Luw58_JN4VlI1 z-0Y}FD?T&k9o@SlSWPQeSML@PSM2@#g0#R3b7oKcQI#YTVtY_x+2%p?wiJHI+2#8a z$e4_3TQ$eXew`~*&zv|s&fbdMTTM0%Pwm`({tdWgWb$Yj*6`_3)7!ic7YIo!)LKg- zWS%ATXq-ul;BIs|JJ87@C)FkFai`b|k#F9*?MB75hG4^IDgc zF3**ZJS1@#uF`jv8wLW_-NH!in|rNcppj4P$y$PkFP`FV+CC|qQI7zc;s%VVM`)y5 z*Jr0}GqexhM4WK=?*T{UJ-2bxEVtQ_Q?VKPYv5a5TldXoBU{ppqjtpb3JW`7gar!< zH1+rJkH0*8kV(I5QW-7Qo@=hDiq{?bjfx?HrS*~s_;?Z|^^ynDkY)vzgM=_w}OROOgqa6t9&8H=3aWKxSZ(QqmU(lo_DK21D|8ToGuOw*s~| zsK|1#Xw{R$LI4dpq|_EM-!JyHQ|$g`9^mgmNSQzQx9Q2fPy&v%ZI^}TB%wYOSZ_mr zGo{2?!lbiE1eP_2FZdZUqyxN>QqtGQ!1WuFP)c$HcDN`3jqNJ3pWToL1oHld+^j4k Xt9QWQiV*1+4at+K2m)28NTa_1i;t*q diff --git a/api/target/original-openaudiomc-api.jar b/api/target/original-openaudiomc-api.jar index 084f19e800822b546d80a8c95c426e4165e44067..1e0da70fa24c47d3dd064bfe9f6c08531aa6cc9e 100644 GIT binary patch literal 19933 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 diff --git a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java index bdd89957e..8c714fc5d 100644 --- a/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java +++ b/modules/mapdb-migrator/src/main/java/com/craftmend/oamapmigrator/database/models/Speaker.java @@ -6,7 +6,7 @@ import com.craftmend.openaudiomc.api.spakers.ExtraSpeakerOptions; import com.craftmend.openaudiomc.api.spakers.SpeakerType; import com.craftmend.openaudiomc.spigot.modules.speakers.objects.MappedLocation; -import com.craftmend.openaudiomc.spigot.modules.speakers.objects.SpeakerSound; +import com.craftmend.openaudiomc.spigot.modules.speakers.objects.SpeakerMedia; import lombok.Getter; import lombok.Setter; @@ -34,7 +34,7 @@ public Speaker(String source, UUID id, int radius, MappedLocation location, Spea this.extraOptions = options; } - public SpeakerSound getMedia() { + public SpeakerMedia getMedia() { return OpenAudioMc.getService(SpeakerService.class).getMedia(source); } diff --git a/modules/parties-module/dependency-reduced-pom.xml b/modules/parties-module/dependency-reduced-pom.xml new file mode 100644 index 000000000..ca9c7c8dd --- /dev/null +++ b/modules/parties-module/dependency-reduced-pom.xml @@ -0,0 +1,135 @@ + + + + OpenAudioMc-Parent + com.craftmend.openaudiomc + 1.2 + ../../pom.xml + + 4.0.0 + com.craftmend.openaudiomc + openaudiomc-parties + OpenAudioMc-parties + ${oa.version} + + + + true + src/main/resources + + + parties-hook + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + de.tr7zw.changeme.nbtapi + com.craftmend.thirdparty.nbt + + + io. + com.craftmend.thirdparty.io + + + org.json. + com.craftmend.thirdparty.json + + + reactor. + com.craftmend.thirdparty.reactor + + + okhttp3 + com.craftmend.thirdparty.okhttp3 + + + okio + com.craftmend.thirdparty.okio + + + org.projectlombok + com.craftmend.thirdparty.org + + + org.mapdb + com.craftmend.thirdparty.mapdb + + + kotlin + com.craftmend.thirdparty.kotlin + + + + + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + alessiodp-repo + https://repo.alessiodp.com/releases/ + + + + + com.craftmend.openaudiomc + openaudiomc + 6.8.10 + provided + + + com.alessiodp.parties + parties-api + 3.2.5 + provided + + + org.spigotmc + spigot-api + 1.17.1-R0.1-SNAPSHOT + provided + + + + 1.8 + UTF-8 + + diff --git a/modules/rinaorc-legacy/dependency-reduced-pom.xml b/modules/rinaorc-legacy/dependency-reduced-pom.xml new file mode 100644 index 000000000..88c7712dc --- /dev/null +++ b/modules/rinaorc-legacy/dependency-reduced-pom.xml @@ -0,0 +1,128 @@ + + + + OpenAudioMc-Parent + com.craftmend.openaudiomc + 1.2 + ../../pom.xml + + 4.0.0 + OpenAudioMc-rinaorc-legacy + OpenAudioMc-rinaorc-legacy + ${oa.version} + + + + true + src/main/resources + + + rinaorc-legacy-users + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + de.tr7zw.changeme.nbtapi + com.craftmend.thirdparty.nbt + + + io. + com.craftmend.thirdparty.io + + + org.json. + com.craftmend.thirdparty.json + + + reactor. + com.craftmend.thirdparty.reactor + + + okhttp3 + com.craftmend.thirdparty.okhttp3 + + + okio + com.craftmend.thirdparty.okio + + + org.projectlombok + com.craftmend.thirdparty.org + + + org.mapdb + com.craftmend.thirdparty.mapdb + + + kotlin + com.craftmend.thirdparty.kotlin + + + + + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + alessiodp-repo + https://repo.alessiodp.com/releases/ + + + + + com.craftmend.openaudiomc + openaudiomc + 6.8.10 + provided + + + org.spigotmc + spigot-api + 1.8.8-R0.1-SNAPSHOT + provided + + + + 1.8 + UTF-8 + + diff --git a/modules/skywars-module/dependency-reduced-pom.xml b/modules/skywars-module/dependency-reduced-pom.xml new file mode 100644 index 000000000..d654fb61f --- /dev/null +++ b/modules/skywars-module/dependency-reduced-pom.xml @@ -0,0 +1,135 @@ + + + + OpenAudioMc-Parent + com.craftmend.openaudiomc + 1.2 + ../../pom.xml + + 4.0.0 + com.craftmend.openaudiomc + openaudiomc-skywars + OpenAudioMc-skywars + ${oa.version} + + + + true + src/main/resources + + + skywars-hook + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + de.tr7zw.changeme.nbtapi + com.craftmend.thirdparty.nbt + + + io. + com.craftmend.thirdparty.io + + + org.json. + com.craftmend.thirdparty.json + + + reactor. + com.craftmend.thirdparty.reactor + + + okhttp3 + com.craftmend.thirdparty.okhttp3 + + + okio + com.craftmend.thirdparty.okio + + + org.projectlombok + com.craftmend.thirdparty.org + + + org.mapdb + com.craftmend.thirdparty.mapdb + + + kotlin + com.craftmend.thirdparty.kotlin + + + + + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + gcnt + https://nexuslite.gcnt.net/repos/gcnt + + + + + com.craftmend.openaudiomc + openaudiomc + 6.8.10 + provided + + + net.gcnt + skywarsreloaded + 5.6.1 + provided + + + org.spigotmc + spigot-api + 1.17.1-R0.1-SNAPSHOT + provided + + + + 1.8 + UTF-8 + + diff --git a/modules/voice-join-permission/dependency-reduced-pom.xml b/modules/voice-join-permission/dependency-reduced-pom.xml new file mode 100644 index 000000000..37afbca9b --- /dev/null +++ b/modules/voice-join-permission/dependency-reduced-pom.xml @@ -0,0 +1,125 @@ + + + + OpenAudioMc-Parent + com.craftmend.openaudiomc + 1.2 + ../../pom.xml + + 4.0.0 + com.craftmend + openaudiomc-voice-permission + OpenAudioMc-voice-permissions + ${oa.version} + + + + true + src/main/resources + + + voice-join-permission + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + de.tr7zw.changeme.nbtapi + com.craftmend.thirdparty.nbt + + + io. + com.craftmend.thirdparty.io + + + org.json. + com.craftmend.thirdparty.json + + + reactor. + com.craftmend.thirdparty.reactor + + + okhttp3 + com.craftmend.thirdparty.okhttp3 + + + okio + com.craftmend.thirdparty.okio + + + org.projectlombok + com.craftmend.thirdparty.org + + + org.mapdb + com.craftmend.thirdparty.mapdb + + + kotlin + com.craftmend.thirdparty.kotlin + + + + + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + com.craftmend.openaudiomc + openaudiomc + 6.8.10 + provided + + + org.spigotmc + spigot-api + 1.17.1-R0.1-SNAPSHOT + provided + + + + 1.8 + UTF-8 + + diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java index 65bea4632..f6866c362 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/MediaApiImpl.java @@ -3,8 +3,8 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.api.interfaces.Client; import com.craftmend.openaudiomc.api.interfaces.MediaApi; -import com.craftmend.openaudiomc.generic.media.objects.Sound; -import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; +import com.craftmend.openaudiomc.api.media.Media; +import com.craftmend.openaudiomc.api.media.MediaOptions; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientDestroyMedia; @@ -28,12 +28,12 @@ private ClientConnection validateClient(Client client) { @Override public void playMedia(Client client, String source) { - validateClient(client).sendMedia(new Sound(source)); + validateClient(client).sendMedia(new Media(source)); } @Override public void playMedia(Client client, String source, MediaOptions mediaOptions) { - validateClient(client).sendMedia(new Sound(source).applySettings(mediaOptions)); + validateClient(client).sendMedia(new Media(source).applySettings(mediaOptions)); } @Override diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/enums/VoiceEventCause.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/enums/VoiceEventCause.java deleted file mode 100644 index d1b209c18..000000000 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/enums/VoiceEventCause.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.craftmend.openaudiomc.api.impl.event.enums; - -/** - * This enum represents the cause of a specific event, used to provide more context - * or filter based on functionality. - * - * Example: the {@link com.craftmend.openaudiomc.api.impl.event.events.PlayerEnterVoiceProximityEvent} can be called for a few reasons, - * like walking up to some one or shouting from a distance; and you may not want to execute the same behaviour - * for both scenarios - */ -public enum VoiceEventCause { - - // voice state changed under normal circumstances - NORMAL, - // voice change was due to shouting - SHOUT - -} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerEnterVoiceProximityEvent.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerEnterVoiceProximityEvent.java index aa3b9aa5c..f34e85b13 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerEnterVoiceProximityEvent.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerEnterVoiceProximityEvent.java @@ -2,7 +2,6 @@ import com.craftmend.openaudiomc.api.impl.event.AudioEvent; import com.craftmend.openaudiomc.api.impl.event.enums.EventSupport; -import com.craftmend.openaudiomc.api.impl.event.enums.VoiceEventCause; import com.craftmend.openaudiomc.api.interfaces.EventSupportFlag; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import lombok.AllArgsConstructor; @@ -26,6 +25,5 @@ public class PlayerEnterVoiceProximityEvent extends AudioEvent { private ClientConnection speaker; private ClientConnection listener; - private VoiceEventCause cause; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerLeaveVoiceProximityEvent.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerLeaveVoiceProximityEvent.java index 6a152a8a6..5d55bd615 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerLeaveVoiceProximityEvent.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/impl/event/events/PlayerLeaveVoiceProximityEvent.java @@ -2,7 +2,6 @@ import com.craftmend.openaudiomc.api.impl.event.AudioEvent; import com.craftmend.openaudiomc.api.impl.event.enums.EventSupport; -import com.craftmend.openaudiomc.api.impl.event.enums.VoiceEventCause; import com.craftmend.openaudiomc.api.interfaces.EventSupportFlag; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import lombok.AllArgsConstructor; @@ -26,6 +25,5 @@ public class PlayerLeaveVoiceProximityEvent extends AudioEvent { private ClientConnection speaker; private ClientConnection listener; - private VoiceEventCause cause; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java index 09f35c234..c548078b1 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/Client.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.api.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.generic.media.objects.Media; import com.craftmend.openaudiomc.generic.user.User; @Deprecated @@ -28,7 +28,7 @@ public interface Client { * * @param media media to be send */ - void sendMedia(Sound media); + void sendMedia(Media media); /** * Add a on connect handler, which fires when the client gets closed for by player diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/MediaApi.java b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/MediaApi.java index 8324cdcce..4ff5ea7a4 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/MediaApi.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/api/interfaces/MediaApi.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.api.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; +import com.craftmend.openaudiomc.api.media.MediaOptions; public interface MediaApi { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java index 009880058..df856ce1f 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/api/implementaions/MediaApiImpl.java @@ -5,9 +5,7 @@ import com.craftmend.openaudiomc.api.clients.Client; import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.api.media.UrlMutation; -import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.media.time.TimeService; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientDestroyMedia; @@ -20,7 +18,7 @@ public class MediaApiImpl implements MediaApi { @NotNull @Override public Media createMedia(@NotNull String source) { - return new Sound(source); + return new Media(source); } @NotNull diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java index cef358d14..e85649ccd 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/objects/ClientConnection.java @@ -7,6 +7,7 @@ import com.craftmend.openaudiomc.api.impl.event.events.ClientDisconnectEvent; import com.craftmend.openaudiomc.api.impl.event.events.ClientErrorEvent; import com.craftmend.openaudiomc.api.interfaces.AudioApi; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.client.ClientDataService; import com.craftmend.openaudiomc.generic.client.helpers.SerializableClient; import com.craftmend.openaudiomc.generic.client.helpers.TokenFactory; @@ -17,7 +18,6 @@ import com.craftmend.openaudiomc.generic.environment.GlobalConstantService; import com.craftmend.openaudiomc.generic.environment.MagicValue; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacket; import com.craftmend.openaudiomc.generic.networking.enums.MediaError; import com.craftmend.openaudiomc.generic.networking.interfaces.Authenticatable; @@ -42,6 +42,7 @@ import com.craftmend.openaudiomc.spigot.modules.proxy.enums.OAClientMode; import lombok.Getter; import lombok.Setter; +import org.jetbrains.annotations.NotNull; import java.io.Serializable; import java.time.Instant; @@ -211,13 +212,7 @@ public void setModerating(boolean state) { } } - /** - * send media to the client to play - * - * @param media media to be send - */ - @Override - public void sendMedia(Sound media) { + public void sendMedia(Media media) { if (media.getKeepTimeout() != -1 && !session.getOngoingMedia().contains(media)) { session.getOngoingMedia().add(media); @@ -288,6 +283,11 @@ public void onConnect(Runnable runnable) { addOnConnectHandler(runnable); } + @Override + public void sendMedia(com.craftmend.openaudiomc.generic.media.objects.Media media) { + sendMedia(media); + } + @Override public void onDisconnect(Runnable runnable) { addOnDisconnectHandler(runnable); @@ -313,6 +313,11 @@ public boolean isModerating() { return session.isModerating(); } + @Override + public void playMedia(@NotNull Media media) { + sendMedia(media); + } + @Override public void preloadMedia(String source) { ClientPreFetchPayload payload = new ClientPreFetchPayload(OpenAudioMc.getService(MediaService.class).process(source), "api", false); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java index 7fc03c06a..0da298647 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/RtcSessionManager.java @@ -1,14 +1,13 @@ package com.craftmend.openaudiomc.generic.client.session; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.api.impl.event.enums.VoiceEventCause; import com.craftmend.openaudiomc.api.impl.event.events.*; import com.craftmend.openaudiomc.api.interfaces.AudioApi; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; import com.craftmend.openaudiomc.generic.client.enums.RtcBlockReason; import com.craftmend.openaudiomc.generic.client.enums.RtcStateFlag; import com.craftmend.openaudiomc.generic.client.helpers.ClientRtcLocationUpdate; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.oac.OpenaudioAccountService; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.node.packets.ForceMuteMicrophonePacket; @@ -81,7 +80,7 @@ public boolean requestLinkage(ClientConnection peer, boolean mutual, VoicePeerOp if (mutual && !peer.getRtcSessionManager().currentProximityPeers.contains(clientConnection.getOwner().getUniqueId())) { peer.getRtcSessionManager().getCurrentProximityPeers().add(clientConnection.getOwner().getUniqueId()); peer.getPeerQueue().addSubscribe(clientConnection, peer, options); - AudioApi.getInstance().getEventDriver().fire(new PlayerEnterVoiceProximityEvent(clientConnection, peer, VoiceEventCause.NORMAL)); + AudioApi.getInstance().getEventDriver().fire(new PlayerEnterVoiceProximityEvent(clientConnection, peer)); peer.getRtcSessionManager().updateLocationWatcher(); } @@ -92,7 +91,7 @@ public boolean requestLinkage(ClientConnection peer, boolean mutual, VoicePeerOp currentProximityPeers.add(peer.getOwner().getUniqueId()); clientConnection.getPeerQueue().addSubscribe(peer, clientConnection, options); - AudioApi.getInstance().getEventDriver().fire(new PlayerEnterVoiceProximityEvent(peer, clientConnection, VoiceEventCause.NORMAL)); + AudioApi.getInstance().getEventDriver().fire(new PlayerEnterVoiceProximityEvent(peer, clientConnection)); updateLocationWatcher(); @@ -134,7 +133,7 @@ public void makePeersDrop() { peer.getRtcSessionManager().updateLocationWatcher(); peer.getPeerQueue().drop(streamKey); - AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(clientConnection, peer, VoiceEventCause.NORMAL)); + AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(clientConnection, peer)); } } } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java index 9ac7d5588..1c4693e22 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/client/session/SessionData.java @@ -1,11 +1,11 @@ package com.craftmend.openaudiomc.generic.client.session; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.oac.OpenaudioAccountService; import com.craftmend.openaudiomc.generic.oac.enums.CraftmendTag; import com.craftmend.openaudiomc.generic.environment.MagicValue; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.client.helpers.SerializableClient; import com.craftmend.openaudiomc.generic.platform.Platform; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; @@ -31,7 +31,7 @@ public class SessionData { private boolean isConnectedToRtc = false; // ongoing sounds - used for media-sources with the expiration timeout configured - private final List ongoingMedia = new ArrayList<>(); + private final List ongoingMedia = new ArrayList<>(); private int apiSpeakers = 0; // session info diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java index 4b76494bb..f678e088e 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/commands/subcommands/PlaySubCommand.java @@ -3,16 +3,16 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.api.interfaces.Client; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.commands.objects.CommandError; -import com.craftmend.openaudiomc.generic.media.objects.OptionalError; +import com.craftmend.openaudiomc.api.media.OptionalError; import com.craftmend.openaudiomc.generic.media.utils.Validation; import com.craftmend.openaudiomc.generic.platform.OaColor; import com.craftmend.openaudiomc.generic.user.User; import com.craftmend.openaudiomc.generic.commands.interfaces.SubCommand; import com.craftmend.openaudiomc.generic.commands.objects.Argument; -import com.craftmend.openaudiomc.generic.media.objects.Sound; -import com.craftmend.openaudiomc.generic.media.objects.MediaOptions; +import com.craftmend.openaudiomc.api.media.MediaOptions; import lombok.SneakyThrows; import java.util.Optional; @@ -42,7 +42,7 @@ public void onExecute(User sender, String[] args) { throw new CommandError("Invalid source url."); } - Sound media = new Sound(args[1]); + Media media = new Media(args[1]); int affected = 0; for (User user : resolveSelector(sender, args[0])) { @@ -71,7 +71,7 @@ public void onExecute(User sender, String[] args) { throw new CommandError("Invalid source url."); } - Sound media = new Sound(args[1]).applySettings(mediaOptions); + Media media = new Media(args[1]).applySettings(mediaOptions); for (User user : resolveSelector(sender, args[0])) { Optional client = user.findClient(); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java deleted file mode 100644 index a28f5f3b8..000000000 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Sound.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.craftmend.openaudiomc.generic.media.objects; - -import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.enums.MediaFlag; -import com.craftmend.openaudiomc.generic.media.time.TimeService; -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -public class Sound implements com.craftmend.openaudiomc.api.media.Media { - - //media tracker - @Setter private String mediaId = UUID.randomUUID().toString(); - - //media information - private String source; - @Setter private long startInstant; - @Setter private transient int keepTimeout = -1; - @Setter private boolean doPickup = false; - @Setter private boolean loop = false; - @Setter private int fadeTime = 0; - @Setter private int volume = 100; - @Setter private boolean muteRegions = false; - @Setter private boolean muteSpeakers = false; - @Setter private int startAtMillis = 0; - @Setter private MediaFlag flag = MediaFlag.DEFAULT; - - /** - * Create a new media based on a url - * the source will first be processed by the mutation api - * so you can just use addons without needing to wor§§ry - * - * @param source the resource url - */ - public Sound(String source) { - this.source = OpenAudioMc.getService(MediaService.class).process(source); - this.startInstant = OpenAudioMc.getService(TimeService.class).getSyncedInstant().toEpochMilli(); - } - - /** - * You can apply multiple options. - * Used by the commands to allow settings via JSON - * - * @param options The options. Selected via the command - * @return instance of self - */ - public Sound applySettings(MediaOptions options) { - this.loop = options.isLoop(); - this.keepTimeout = options.getExpirationTimeout(); - if (options.getId() != null) this.mediaId = options.getId(); - this.doPickup = options.isPickUp(); - this.setFadeTime(options.getFadeTime()); - this.volume = options.getVolume(); - this.muteRegions = options.isMuteRegions(); - this.muteSpeakers = options.isMuteSpeakers(); - this.startAtMillis = options.getStartAtMillis(); - return this; - } - - @Override - public int startAtMillis() { - return startAtMillis; - } - - @Override - public boolean loopMedia() { - return loop; - } - - @Override - public boolean doPickup() { - return doPickup; - } - - @Override - public boolean muteRegions() { - return muteRegions; - } - - @Override - public boolean muteSpeakers() { - return muteSpeakers; - } - - @Override - public void setLoopMedia(boolean b) { - this.loop = b; - } -} diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java index 8d593466c..c469b10d8 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/packets/client/media/PacketClientCreateMedia.java @@ -1,17 +1,17 @@ package com.craftmend.openaudiomc.generic.networking.packets.client.media; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacket; import com.craftmend.openaudiomc.generic.networking.abstracts.PacketChannel; import com.craftmend.openaudiomc.generic.networking.payloads.client.media.ClientCreateMediaPayload; public class PacketClientCreateMedia extends AbstractPacket { - public PacketClientCreateMedia(Sound media) { + public PacketClientCreateMedia(Media media) { super(new ClientCreateMediaPayload(media), PacketChannel.CLIENT_OUT_CREATE_MEDIA, null); } - public PacketClientCreateMedia(Sound media, int distance, int maxDistance) { + public PacketClientCreateMedia(Media media, int distance, int maxDistance) { super(new ClientCreateMediaPayload(media, distance, maxDistance), PacketChannel.CLIENT_OUT_CREATE_MEDIA, null); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java index a39e2a105..baa292d05 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/generic/networking/payloads/client/media/ClientCreateMediaPayload.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.generic.networking.payloads.client.media; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.networking.abstracts.AbstractPacketPayload; import com.craftmend.openaudiomc.generic.networking.payloads.client.interfaces.SourceHolder; import lombok.AllArgsConstructor; @@ -12,11 +12,11 @@ @AllArgsConstructor public class ClientCreateMediaPayload extends AbstractPacketPayload implements SourceHolder { - public ClientCreateMediaPayload(Sound media) { + public ClientCreateMediaPayload(Media media) { this.media = media; } - private Sound media; + private Media media; private int distance; private int maxDistance; diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java index a3e18981b..50f7562be 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/players/objects/SpigotConnection.java @@ -1,6 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.players.objects; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.environment.MagicValue; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; @@ -8,7 +9,6 @@ import com.craftmend.openaudiomc.generic.networking.payloads.client.speakers.ClientPlayerLocationPayload; import com.craftmend.openaudiomc.generic.platform.interfaces.TaskService; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.spigot.modules.players.enums.PlayerLocationFollower; import com.craftmend.openaudiomc.spigot.modules.players.events.ClientDisconnectEvent; import com.craftmend.openaudiomc.spigot.modules.players.handlers.AudioChunkHandler; @@ -166,7 +166,7 @@ public List getSpeakers() { /** * @param media start media for the client */ - public void playMedia(Sound media) { + public void playMedia(Media media) { clientConnection.sendMedia(media); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java index 4149db89c..a7004fdad 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/RegionModule.java @@ -2,11 +2,11 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.OpenAudioMcBuild; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.backups.BackupService; import com.craftmend.openaudiomc.generic.database.DatabaseService; import com.craftmend.openaudiomc.generic.logging.OpenAudioLogger; import com.craftmend.openaudiomc.generic.media.MediaService; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; import com.craftmend.openaudiomc.generic.utils.data.ArrayUtil; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; @@ -251,7 +251,7 @@ public int mutateForMatchingWorld(RegionMutator mutator, String regionName, Stri // does this world contain a region with the same name? if (worldManager.containsRegion(regionName)) { RegionProperties region = worldManager.getRegionProperties(regionName); - Sound media = region.getMediaForWorld(worldManager); + Media media = region.getMediaForWorld(worldManager); // mutate the region try { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java index ef6cc2419..de0694b88 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/gui/RegionEditGui.java @@ -1,9 +1,9 @@ package com.craftmend.openaudiomc.spigot.modules.regions.gui; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.database.DatabaseService; import com.craftmend.openaudiomc.generic.environment.MagicValue; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.networking.packets.client.media.PacketClientDestroyMedia; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; @@ -76,9 +76,9 @@ public Item getSyncItem(IRegion region) { // reset the media cache for this region - Sound oldMedia = region.getMedia(); + Media oldMedia = region.getMedia(); OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(player.getWorld().getName()).unregisterRegionMedia(region.getMedia().getSource()); - Sound newMedia = region.getMedia(); + Media newMedia = region.getMedia(); // send destroy packets to all players in the region for (SpigotConnection spigotConnection : OpenAudioMcSpigot.getInstance().getRegionModule().findPlayersInRegion(region.getProperties().getRegionName())) { @@ -113,9 +113,9 @@ private Item getPlayOnceItem(IRegion region) { } // reset the media cache for this region - Sound oldMedia = region.getMedia(); + Media oldMedia = region.getMedia(); OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(player.getWorld().getName()).unregisterRegionMedia(region.getMedia().getSource()); - Sound newMedia = region.getMedia(); + Media newMedia = region.getMedia(); // send destroy packets to all players in the region for (SpigotConnection spigotConnection : OpenAudioMcSpigot.getInstance().getRegionModule().findPlayersInRegion(region.getProperties().getRegionName())) { diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java index dfe40a2fa..9441961cf 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/IRegion.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.regions.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; public interface IRegion { @@ -10,7 +10,7 @@ public interface IRegion { /** * @return Media playing in the region */ - Sound getMedia(); + Media getMedia(); /** * @return Extra settings related to the region @@ -56,7 +56,7 @@ public interface IRegion { public class EmptyRegion implements IRegion { @Override - public Sound getMedia() { + public Media getMedia() { return null; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java index 56d3e9b26..bf7453846 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/interfaces/RegionMutator.java @@ -1,10 +1,10 @@ package com.craftmend.openaudiomc.spigot.modules.regions.interfaces; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; public interface RegionMutator { - void feed(RegionProperties properties, Sound media); + void feed(RegionProperties properties, Media media); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java index 715ca981b..f47286ce7 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/Region.java @@ -1,6 +1,6 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.spigot.modules.regions.interfaces.IRegion; import lombok.AllArgsConstructor; @@ -12,7 +12,7 @@ public class Region implements IRegion { private String worldName; @Override - public Sound getMedia() { + public Media getMedia() { if (getProperties() == null) return null; return regionProperties.getMediaForWorld(worldName); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java similarity index 67% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java rename to plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java index 74f95d17a..f44cf1242 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionSound.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionMedia.java @@ -1,13 +1,13 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; -import com.craftmend.openaudiomc.generic.media.enums.MediaFlag; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.MediaFlag; -public class RegionSound extends Sound { +public class RegionMedia extends Media { - public RegionSound(String source, int volume, int fadeTimeMs, Boolean loop) { + public RegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { super(source); setLoop(loop); if (loop) setDoPickup(OpenAudioMc.getInstance().getConfiguration().getBoolean(StorageKey.SETTINGS_REGIONS_SYNC)); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java index 1693e6dcc..46d457df5 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/RegionProperties.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.database.internal.DataStore; -import com.craftmend.openaudiomc.generic.media.objects.Sound; import com.craftmend.openaudiomc.generic.utils.data.ArrayUtil; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.regions.registry.WorldRegionManager; @@ -41,9 +41,9 @@ public RegionProperties(String source, int volume, int fadeTimeMs, boolean allow this.worlds = worldNames; } - public Sound getMediaForWorld(WorldRegionManager worldRegionManager) { + public Media getMediaForWorld(WorldRegionManager worldRegionManager) { if (loop == null) loop = true; - Sound media = worldRegionManager.getRegionMedia(source, volume, fadeTimeMs, loop); + Media media = worldRegionManager.getRegionMedia(source, volume, fadeTimeMs, loop); media.setDoPickup(this.doSync); return media; } @@ -53,7 +53,7 @@ public boolean hasWorlds() { return hasWorlds; } - public Sound getMediaForWorld(String worldName) { + public Media getMediaForWorld(String worldName) { return getMediaForWorld(OpenAudioMcSpigot.getInstance().getRegionModule().getWorld(worldName)); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java index d16b5b20a..32b0d3275 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/objects/TimedRegionProperties.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.objects; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.platform.Platform; import com.craftmend.openaudiomc.spigot.OpenAudioMcSpigot; import com.craftmend.openaudiomc.spigot.modules.players.SpigotPlayerService; @@ -17,7 +17,7 @@ public class TimedRegionProperties extends RegionProperties { private int task = -1; @Column private String regionId; - private Sound media; + private Media media; public TimedRegionProperties() { @@ -59,22 +59,22 @@ public void destroy() { forceUpdateClients(); } - public Sound getOrStartMedia() { + public Media getOrStartMedia() { // temp regions always use their own media, as it shouldn't sync with others if (media == null) { - this.media = new RegionSound(getSource(), getVolume(), getFadeTimeMs(), true); + this.media = new RegionMedia(getSource(), getVolume(), getFadeTimeMs(), true); this.media.setLoop(false); } return this.media; } @Override - public Sound getMediaForWorld(String worldName) { + public Media getMediaForWorld(String worldName) { return getOrStartMedia(); } @Override - public Sound getMediaForWorld(WorldRegionManager worldRegionManager) { + public Media getMediaForWorld(WorldRegionManager worldRegionManager) { return getOrStartMedia(); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java index bf2521130..1b4a6b5a1 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/regions/registry/WorldRegionManager.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.regions.registry; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; -import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionSound; +import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionMedia; import com.craftmend.openaudiomc.spigot.modules.regions.objects.RegionProperties; import java.util.Collection; @@ -14,7 +14,7 @@ public class WorldRegionManager { private String world; // map region source -> shared media - private final Map regionMediaMap = new HashMap<>(); + private final Map regionMediaMap = new HashMap<>(); // map region name -> region properties / settings private final Map regionPropertiesMap = new HashMap<>(); @@ -60,9 +60,9 @@ public boolean containsRegion(String regionName) { return regionPropertiesMap.containsKey(regionName); } - public RegionSound getRegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { + public RegionMedia getRegionMedia(String source, int volume, int fadeTimeMs, Boolean loop) { if (regionMediaMap.containsKey(source)) return regionMediaMap.get(source); - RegionSound regionMedia = new RegionSound(source, volume, fadeTimeMs, loop); + RegionMedia regionMedia = new RegionMedia(source, volume, fadeTimeMs, loop); regionMediaMap.put(source, regionMedia); return regionMedia; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java index bcaf48668..c5c184082 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/SpeakerService.java @@ -43,7 +43,7 @@ public class SpeakerService extends Service { public static final SpeakerType DEFAULT_SPEAKER_TYPE = SpeakerType.SPEAKER_3D; @Getter private final Map speakerMap = new ConcurrentHashMap<>(); - private final Map speakerMediaMap = new ConcurrentHashMap<>(); + private final Map speakerMediaMap = new ConcurrentHashMap<>(); @Getter private Material playerSkullItem; @Getter private Material playerSkullBlock; @Getter private ServerVersion version; @@ -162,9 +162,9 @@ public Speaker getSpeaker(MappedLocation location) { return speakerMap.get(location); } - public SpeakerSound getMedia(String source) { + public SpeakerMedia getMedia(String source) { if (speakerMediaMap.containsKey(source)) return speakerMediaMap.get(source); - SpeakerSound speakerMedia = new SpeakerSound(source); + SpeakerMedia speakerMedia = new SpeakerMedia(source); speakerMediaMap.put(source, speakerMedia); return speakerMedia; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java index 6c9764766..4bf26e2a1 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/Speaker.java @@ -62,7 +62,7 @@ public void fixEnumSet() { extraOptions = fixedValues; } - public SpeakerSound getMedia() { + public SpeakerMedia getMedia() { return OpenAudioMc.getService(SpeakerService.class).getMedia(source); } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java similarity index 71% rename from plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java rename to plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java index c718e5884..d41a069e0 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerSound.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/speakers/objects/SpeakerMedia.java @@ -1,18 +1,18 @@ package com.craftmend.openaudiomc.spigot.modules.speakers.objects; import com.craftmend.openaudiomc.OpenAudioMc; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.storage.enums.StorageKey; -import com.craftmend.openaudiomc.generic.media.enums.MediaFlag; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.MediaFlag; import lombok.Getter; import lombok.Setter; -public class SpeakerSound extends Sound { +public class SpeakerMedia extends Media { @Getter @Setter private boolean distanceFading = false; - public SpeakerSound(String source) { + public SpeakerMedia(String source) { super(source); setLoop(true); setDoPickup(OpenAudioMc.getInstance().getConfiguration().getBoolean(StorageKey.SETTINGS_SPEAKER_SYNC)); diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java index 1faedcb20..2187bce02 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/traincarts/models/TrainMedia.java @@ -1,7 +1,7 @@ package com.craftmend.openaudiomc.spigot.modules.traincarts.models; import com.craftmend.openaudiomc.OpenAudioMc; -import com.craftmend.openaudiomc.generic.media.objects.Sound; +import com.craftmend.openaudiomc.api.media.Media; import com.craftmend.openaudiomc.generic.media.time.TimeService; import lombok.Data; @@ -14,17 +14,17 @@ public class TrainMedia { private UUID mediaId = UUID.randomUUID(); private Instant startedAt = OpenAudioMc.getService(TimeService.class).getSyncedInstant(); private String source; - private Sound media; + private Media media; public TrainMedia(String source) { this.source = source; - this.media = new Sound(this.source); + this.media = new Media(this.source); this.media.setDoPickup(true); this.media.setMediaId(this.mediaId.toString()); this.media.setLoop(false); } - public Sound toMedia() { + public Media toMedia() { return media; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/SpigotVoiceChatService.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/SpigotVoiceChatService.java index e969a7bfd..77e7ebd5d 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/SpigotVoiceChatService.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/SpigotVoiceChatService.java @@ -3,7 +3,6 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.api.impl.event.ApiEventDriver; import com.craftmend.openaudiomc.api.impl.event.enums.TickEventType; -import com.craftmend.openaudiomc.api.impl.event.enums.VoiceEventCause; import com.craftmend.openaudiomc.api.impl.event.events.*; import com.craftmend.openaudiomc.api.interfaces.AudioApi; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; @@ -75,9 +74,6 @@ public void onEnable() { // skip if this is disabled in the settings if (!StorageKey.SETTINGS_VC_ANNOUNCEMENTS.getBoolean()) return; - // only notify normal events, we don't really care about special things - if (event.getCause() != VoiceEventCause.NORMAL) return; - if (event.getListener().isModerating() && !event.getSpeaker().isModerating()) { return; } @@ -90,9 +86,6 @@ public void onEnable() { // skip if this is disabled in the settings if (!StorageKey.SETTINGS_VC_ANNOUNCEMENTS.getBoolean()) return; - // only notify normal events, we don't really care about special things - if (event.getCause() != VoiceEventCause.NORMAL) return; - if (event.getListener().isModerating() && !event.getSpeaker().isModerating()) { return; } diff --git a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java index d5288405f..66fae26dc 100644 --- a/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java +++ b/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/voicechat/tasks/PlayerPeerTicker.java @@ -2,13 +2,12 @@ import com.craftmend.openaudiomc.OpenAudioMc; import com.craftmend.openaudiomc.api.impl.event.enums.TickEventType; -import com.craftmend.openaudiomc.api.impl.event.enums.VoiceEventCause; import com.craftmend.openaudiomc.api.impl.event.events.PlayerLeaveVoiceProximityEvent; import com.craftmend.openaudiomc.api.impl.event.events.SystemReloadEvent; import com.craftmend.openaudiomc.api.impl.event.events.VoiceChatPeerTickEvent; import com.craftmend.openaudiomc.api.interfaces.AudioApi; +import com.craftmend.openaudiomc.api.voice.VoicePeerOptions; import com.craftmend.openaudiomc.generic.client.objects.ClientConnection; -import com.craftmend.openaudiomc.api.VoicePeerOptions; import com.craftmend.openaudiomc.generic.networking.interfaces.NetworkingService; import com.craftmend.openaudiomc.generic.utils.data.Filter; import com.craftmend.openaudiomc.spigot.modules.voicechat.filters.PeerFilter; @@ -148,7 +147,7 @@ public void run() { } client.getPeerQueue().drop(peer.getRtcSessionManager().getStreamKey()); - AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(client, peer, VoiceEventCause.NORMAL)); + AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(client, peer)); client.getRtcSessionManager().updateLocationWatcher(); client.getRtcSessionManager().getCurrentProximityPeers().remove(peer.getOwner().getUniqueId()); @@ -159,7 +158,7 @@ public void run() { peer.getPeerQueue().drop(client.getRtcSessionManager().getStreamKey()); peer.getRtcSessionManager().getCurrentProximityPeers().remove(client.getOwner().getUniqueId()); - AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(peer, client, VoiceEventCause.NORMAL)); + AudioApi.getInstance().getEventDriver().fire(new PlayerLeaveVoiceProximityEvent(peer, client)); peer.getRtcSessionManager().updateLocationWatcher(); } } From ebcc4f2f534fabceab42fda4fcde5c8a4f427053 Mon Sep 17 00:00:00 2001 From: Mats Date: Sat, 3 Feb 2024 17:07:41 +0100 Subject: [PATCH 5/6] Add gitignore --- api/.gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 api/.gitignore diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 000000000..a8463100e --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,5 @@ +target/ +target/* +.DS_Store +test-storage/ +test-server/ \ No newline at end of file From d7b2172a1adde62336efb242ce71b53409b575f6 Mon Sep 17 00:00:00 2001 From: Mats Auraot Date: Sat, 3 Feb 2024 17:08:32 +0100 Subject: [PATCH 6/6] Delete api/target directory --- .../craftmend/openaudiomc/api/ApiHolder.class | Bin 1119 -> 0 bytes .../craftmend/openaudiomc/api/ClientApi.class | Bin 845 -> 0 bytes .../craftmend/openaudiomc/api/MediaApi.class | Bin 1321 -> 0 bytes .../craftmend/openaudiomc/api/VoiceApi.class | Bin 992 -> 0 bytes .../craftmend/openaudiomc/api/WorldApi.class | Bin 947 -> 0 bytes .../openaudiomc/api/basic/Actor.class | Bin 337 -> 0 bytes .../openaudiomc/api/clients/Client.class | Bin 610 -> 0 bytes .../openaudiomc/api/media/Media.class | Bin 3902 -> 0 bytes .../openaudiomc/api/media/MediaFlag.class | Bin 1203 -> 0 bytes .../openaudiomc/api/media/MediaOptions.class | Bin 4291 -> 0 bytes .../openaudiomc/api/media/OptionalError.class | Bin 644 -> 0 bytes .../openaudiomc/api/media/UrlMutation.class | Bin 387 -> 0 bytes .../openaudiomc/api/regions/AudioRegion.class | Bin 519 -> 0 bytes .../api/spakers/BasicSpeaker.class | Bin 862 -> 0 bytes .../api/spakers/ExtraSpeakerOptions.class | Bin 5495 -> 0 bytes .../openaudiomc/api/spakers/Loc.class | Bin 508 -> 0 bytes .../openaudiomc/api/spakers/SpeakerType.class | Bin 1659 -> 0 bytes .../api/voice/VoicePeerOptions.class | Bin 1881 -> 0 bytes .../generic/media/objects/Media.class | Bin 514 -> 0 bytes api/target/maven-archiver/pom.properties | 5 ----- .../compile/default-compile/createdFiles.lst | 19 ------------------ .../compile/default-compile/inputFiles.lst | 19 ------------------ api/target/openaudiomc-api.jar | Bin 51975 -> 0 bytes api/target/original-openaudiomc-api.jar | Bin 19933 -> 0 bytes 24 files changed, 43 deletions(-) delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/WorldApi.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/clients/Client.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/Media.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/MediaFlag.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/OptionalError.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/media/UrlMutation.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/regions/AudioRegion.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class delete mode 100644 api/target/classes/com/craftmend/openaudiomc/generic/media/objects/Media.class delete mode 100644 api/target/maven-archiver/pom.properties delete mode 100644 api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 api/target/openaudiomc-api.jar delete mode 100644 api/target/original-openaudiomc-api.jar diff --git a/api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class b/api/target/classes/com/craftmend/openaudiomc/api/ApiHolder.class deleted file mode 100644 index 1e5ee79a1f1dda853eed70e43ef029b2016d6af0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmb7D$!-%t5Pj`&yfIE3Ck_DuvDsof%Urk_A)yFFBnJ+Tj5xMu8q;AsV@<{Zet<9G z2f&9&Ai<3TABA}BRa`JpOI6j~Rj;dFRsZ_^^*ewEILILZD~+U$C8Pujr}A7nz6`p~ zi_WQXV}aB|9q9OxfK{!vv&bNuM$X0+*aACl*mK-SzK(k;@SL!(0y*$>*mE7(*Usa< zeir(kiUd|&U#lSI$x(0?%fM9vwdTLW52qoGG?oRn=eZsEzUoT970XyXdGD%ztivFK zf3t}h#5G;K9P%id64&TaZO(yOaioK8V_aCt#s;pEgm+=&dw-=`U6AU_ zNkqdCbj`+f+#t?*s9kj_oc1JQgmcrzEo>8~r#vk$g>yWKXb2<^Lyu&yG}(jB{j}LMr~RTirCcD-DRbW*%l?F+Tq_(zu6n8shs!e}4$M%Y!uBWlvy#;OA+$1P zrbe1GG1BZQbppbCIm$A34z-|Os$W2S9$i-`%{5@*Hl;mwz#ZJ>E{l7(&yzCkkMu}V zSH2+q6Zvn*zbdX=VD(3Ri1h9d>w80N?hmnLfGy?-&S#3Uz*WRL*04#rg%aU5Mvv9U kfY=$;KxkB1g-ND@8tX7MR#0ap7ItY{5CvZE(M(|f4>xWfJOBUy diff --git a/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class b/api/target/classes/com/craftmend/openaudiomc/api/ClientApi.class deleted file mode 100644 index f370345c11eb4017d2b6c1e7bf21c48bf6f6a00e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcma)4PfHs?9DSqF7^Bwsr)sr$XrYSWT)ag}L!=l83RN$?O?JmHVRk0$&I*1j@#w)1 z;D-`lvaLZ&jfdUYdHa6v{r){X-rWN@z~>4kFj+=v4pW#G_!jv@Mya|CiFUE{eeF~p z8=pi{^^I)w&9S$!P6cX_HQEItEtdu5A}z4nemlJRH>6(1%viH$b{Vq*i#>Ivq*bmf zPdhyw1%YZ;hmrZ-&im~JN=+X#;}31)^hus{bb78jmPm!7g|onqo%YZ*55~%ii`G$n zoJG-;Ocn}tfz4mJ3ntMmcV#j|hlX=Ls9?Oy1irR?+Lb*WI;k=)lWO!+p5)dJQliNA zYmxKo{!5{GX5Fy1u%+-in=wkg>8)kQ=t;54ndv$e@|49M|A%%sW{|JS{7%^~ZH;O6Rm?$Pp0_QY zL-ZEnh98XNdwPi0N*pv6x#_h(*b>iWJ~I$20B>ZhU=@@2NOS^g&&>4~Oy0=cz$c=d I?U1|m1iQ2DC;$Ke diff --git a/api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class b/api/target/classes/com/craftmend/openaudiomc/api/MediaApi.class deleted file mode 100644 index ba9c2f3955d3f563944ba55a16f8c7ccc404ff39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmbVM-%k@k5dOBU98jg<59d%o(L-qgS1`ly#5WQ5t@!LB zsRM3esYMzn6Zu@kif_c~wFv`h8LE*Cl%T+tPMpxbWT5?+rJvRt=M`rtwM;LVn&?6^sAt710b(PP8K8& z9wQVvgt|!|E{?i|W%^Ue_^T+4m}^wtk-%bMC~z#Zg4-l_h*fH12wXY=%o_U#^bmJ( bZv-iW)rfJNd)!BswRRz5;<-;u1w8lz8!=Eo diff --git a/api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class b/api/target/classes/com/craftmend/openaudiomc/api/VoiceApi.class deleted file mode 100644 index 5975aec323b55d4432ad85cfdfe55009e1c44b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmcIj%}xR_5T4@7%AbJ$8qW$I?8V!j2*yZ4#025MMN7A0$!@#Z?eZqRhwkVSAxWr%4^9#zPMk7dLJNqsIu zib=$ABjVRG@L7zYGLf7zZD@%^5kVP(T6=bM|0lw8VFSU*V$Lq)HQAU<2o8uC;m&Z( zs6tQ}G4)4%R;w>cj=*V3U&}4GxnMVGIArl183x+oK9S^>ne6W8o*a-r=2!6sM(^ZLyu^I(c9D(Jayv27t&8IQ>XX%(bc|NNS*J4qv8lW;sbth0%+LNZ&FHo0F{3vR3vSUO#Kz)M za4k&EPm-}rJ)@;u`kC~*?%qSi8AZo7L%AyhW#q6f66wxGqJeb4c_wpZP1T3Qem9Qe z!AyGOoicfEZvxd`X?|?AMmfmnF=~%gZiKHLsFMH5{qT?4-J~Yo53QIK*gJ&a_E~Mb zDr9UfRi$u*zA@H|P)^0@^}xEEkEKtXP^RKy=Hx@`hqcz=cy*WK{CjzuXZLQzsc@o@ zUbE>VXNg1;Tuu%e&De!wz%f_>o{U5hX#v`P`J0c+4xdN%bvhh4|J rLJfT4*=SxH+5os5VGD}|4>(@XCRA^7x8RxO;_v=kFuX)`gSM{#c^3zq diff --git a/api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class b/api/target/classes/com/craftmend/openaudiomc/api/basic/Actor.class deleted file mode 100644 index 27fcd28d9f195f2fa04468f06f701687d40adec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmZvYy-ve06oroqZ6Kjg5WGXO;DwE;5<;rPpHzi`&2>z;RcsgA;o%r~03Hf)8woMM z;xqV@&UfzT*ZT*63mj({2~^r!se^h>*0@Icjd7}P$XhMdhU7{`(sHho4;gj^W^47P zWT#v!?^kQ1lR(y*bf>HlI4!H2-~VL_Sc;Ln6F4jX7Hqj9viz-yQMK&xFZC#pFMS`hxu%Yxd>D1U l^_>WCAs+=8^TshI*lx|RH{?F@AqyM~ImIE9EY0r-vu~99Rki>C diff --git a/api/target/classes/com/craftmend/openaudiomc/api/clients/Client.class b/api/target/classes/com/craftmend/openaudiomc/api/clients/Client.class deleted file mode 100644 index ddf55df86a792a4a5cf65f25f0ae273809295559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmah`O-~y^4E2PM5JFo56ng6c4vEw<7jB#)J|v`sR#4^8n=@;YiFWPP%q$XrjRQY` zABC7579lva2kXi9^BceMzg6U6fE@ze-&)c(NDx0GII=PX*BkF){m`mQqF~GT!ot7 ziQ7&juL?@D7g0X4BqN8x@+=a{9Ph@ISyXV?|Bs!b=IO*vtA3A*2V2ku-&${@fj@U8 z4VfiGbz!eye(^2_L+3V+Zn`gL zI;?+jRY9~DFAdO%S6hKqsIS+CwS=7p*P)y8jRrq8_!+*W`eu{&U<+EXU8{lGjj$8r QYm9dNPMs*I%PrV@2HGX0e*gdg diff --git a/api/target/classes/com/craftmend/openaudiomc/api/media/Media.class b/api/target/classes/com/craftmend/openaudiomc/api/media/Media.class deleted file mode 100644 index f40d8f53dec596b8b926d7a8be1df86518ea7853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3902 zcmb7GX?qh@6n>{m(x#WTl%-&WYNePa(g31G3dPz5(}lKl0qO$NWLkzMnUG8naL0Y$ z{)Rq}@>mo<_{ql){wN>cb0_ICPFTL&lR5Xk?>*Z+C;$BW$DaU>;fDxnP#Z>_LOntT zTCbYd%|yn`tt6(Fu39PAKrF zb7?2*eY8b;Cbk~v7kslq3t9~{xX!FwuyZR0c2-X6n>}rRBigVdjGYR*u-iaS%E=~D z1#{WWTDf$>$y+(Il(wC0Dq-gBMAk~%W@1uS17ZD@OdDwPEb#O0QP_*e3^c7;R({UT zT26_s8cDhHafN-@Py5o&w4GWl<+-sa8&4=aDI0Ye$H|N0DTM>V(y(l%EnyMmL4~J9 z8M^LdN}j4mAtu14Y{|9GSu3`aE6UMl6b^}AiGDV3nX6VoZzL2B3&*yiYZlx=chb&e zZ0;Pzvtb-lcn;4SIP}l~8O@jsa(H-TbZ~xR&Ol<~k)S#g#}!_XTkDod)`WhX4C9o- z08Se?cz-&bl)=2s0IXPUGDoL!Da$~NS${ZWzg#$|@Dhd$w74v?V#Z|1oKiuE4o3f< z<#Ory6F;IbD%BJ!YOL_StdPW*fxR^DtW(IE8T*!%9x4?IR?Z#CJE<$W_Qxb+6AF_! z%Z%y7c&?j*TskiyC?-bpBLq21yk501*7G1jnJc%LK=)= zQ*lGjEJu^_*r&0ga7AE^ge~ZT7VTAqRk>lCU7Xw~Y1zptZM2~{hp zW;fThfn7lfT%Z|4PMWs0OxQW=Y$>~B73R#P3^i>NPRh(Im<3zD%gQ?Uip@aAA5c`A zg5OUU%zQp`bJlWQb|RuLMIRns&Rze5%6RLIVW*PvqmOU+el6K>Dffbp8wIXKe*J}7eeZ?XZ!luNBYYRz*04QRvxfFq?HW2{>6E1_)|y^J zxBQIC5|^bnb_Yk+&`0En_&vN>gEb7x$32`e_N%k9IV3*zMpT z+r!zk4}IvuDMT^E5tig&nxbZb7!%`IV&h7oMD%XYR$Rv$`~oiMSg~Q^25y!;y2CRP z$(dOEE~dnI%6Ym&aq(|7$>&9Jk@8h>kn+-9EQwqe2PtjwkuoE0Qaa-4&m^sdxDrEz zYnFdLa%hEvPUJbHuOY#(_A#uddFl)eo}!@}X3wmfJ%d|#ljgpq8I4ZB-9a6AyqxflTM^n;HCf;qYZz+Hau@jx&KSOB=&4;}~vbIt{T zqkiykAef^t037#&#{$6|mI2^iKX^J2d>bDGfcyLvc0LgN;d-|@QGT1DSe!3#qc?cP zy<4NbHy&DlEFs+orMN!A$7Lf<@FCW+#zL{qEj`BL*;j=}`l#@H0&AVe>lL9`2OEUn zo&!~Qqz?WbCAK#YW+25y>v*kVjA7Xheba97laB8M4KqA*0^V)7 zp>Lb~%r$+d;d1kxcy4>VnE->LBZ?S<`lhm7I;wP z(VwTs4wo((haUBy#QM37asd`wk7*;=w*iD0hdn!^oCUKu3YI|YeFid81)l+`X zO^*jnbN~3%u{#9~X*^Idts{en)cpof3A#SXIOks1**{^}$PQJPJ>G5?h7wk%#~x+M|5211(RK!-8rs~e^Oh@E2h>Wyed=J`Hj6f^ z^Uk%tA^8P&uVH+mh+&bQF?kmw zdfN8ZHYi^CMzzM1 x$R(a$AR>b~MFy%2o<(J#U19zLNg=iGj3MjeNJ?)s5*4HA`Z8b9pOkQ9<2TCu1*`x7 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/media/MediaOptions.class deleted file mode 100644 index 90ad85325e4309a3acbe2c47f26d48c2c78f6f81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4291 zcmb7IYf~HN6@FG)At4ql2~3P}?9IiA5CY-UX@fC|6AGt@Ypl`XqkDj0REP&LbzQCO1a za^11)T2n#Kwq0peO$ACZj)a0^-9UKSMrFRyup0>^6&zf1Vf3o;vR<`@4oyQp26);@t7bV*Dj3eLFJ3mbjY7q!Z5CFXhE>~~8Cy#rrQq;htcv{-!JI9l zrcWi1Q801dZt2Y}yHzRI9(8nc+pOvJ3J6OmSJIp#{;G_IJ9 zrYz(&Ovpl?ESxnrC3_+-Xqb`{`kRi?aGrLStV+ddCb{yMhA-ea9j0URFSd+|g8kVx zGnY3mn{B+thaDN!wgO;7}_+Q`A#Pka9dIIpVaV_=qIe^ z8P^#RKCR&y(e0zI#93Sy`Ij}!i@cX|FV`adiiWQW#DLXYYI9zep4IR*S?c$eeD`H# zNyBM@N)c+MGXiHcJcqLiVq7dTNkiGOHvj#iOJWu0;#kx0b%|E$^Q!a$#F&^8J;rnu z=QXU$afvOXxix2(%{acP;J(jwJkV!aR;6q7WI@6|eE=Cs*40jk)k8elnN{3hrqxW`UK_ zKJ)xxLX&OI-iCs>#N}ZbjR{xclCd*qi%at?@`l-LRUCGOD^9N1twzaQuq4Xq_8?74 zXW;=h`YJCxnRlGSq#`nU-8aXp`{p2Z-<o*!;3D5>&?82A+N^J=E|4*EV8*}H*cUm&?2NYcJ!aCgtJNCY67IUpo~qxcD* zkI(_|66(b;hG@blMkpKQTt9>-aF_%12%e=|uX2~>8HCsHQ*uA!Zx7U=bUIBr2eof_ zfp0N9Mk5d2A`x*9>T!k1HlUafq{u)FQ9dkIwk!9AD)S}?QGT%VWGz&g_d|&C(N5+5 zP-WgDAz8;Bwo897!w1v#(GH3y-Ur8te)Cko!g}rLiQCy zWQ!MPdFJwIIh=t`q{eR`KCy#u5Gg#sInQK2z){xpAKhw-F`Vy`itz5erWlzJSPl?>|=sBUcJ$ga*T=nRp(BJmx zMcH$W^bWq)d3k%~;eA3}^P|YGO}yaSeATykGIs~Blpk35CW`JP6AX-oR>yf$|1* z9R^l4tQjzoC**$yTD_sPLqg_Uc`CdhBrDYpv#Ig?HmzI$k8=`)brd*maAk2O>3<=rJBEa?Hd{9h-bMW&( z!?uE>2A8NUa;+bWhRUd5=y^_Wi8^^-UQJgCix>>o(m7)QYolKVs;V}IZEuvbt?6*G4KQUQHbX< zlrWURw%+sk?%w(H>-_`3JA%g9G8DNUeyxZb5pqJoUl3s3uOm9fgL8TN*wn4z~YjZNi)DkWw0E4*7T*<~OgeFD&-Ecekx pfRL&#^&>hDXhmQHzx%X%=>LN_Y$1+X98?j8i=9bkx(J;^ato$29*$POZ&n~tr+a@)mxLXsiwhTyPGL1V{EFS zOl3d9Go`f6VJU;%mNp?DpzRwWRm#QpCU0xo&Z3AIJAWCsFUfCCiF&-oK#EBkjGd6@ za)QrM=_r9_z@SFw%QMKVjQHJM^MW)B-x_Dl;CSK`MrcfqEuR|GO6^VKhSe&J1JF+@X}s!Y2Wq*g1u z(NAcQf|=T@-!qu)>CE_eB_rys`g42^TxvxIq@+0n@MxN5pa=!DCHj`>DFIt? sZ#QqVP#L3`gZVLv1z5~kOHd{68aWhT`Cr!+SRKP$gLUFC*vM&{pNewb)Bpeg diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class deleted file mode 100644 index ca1a1806c4453434a10d565037c913552557dfee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5495 zcmb_f`F|8=8UIeQ$!?Nq2?K%ywp$ zG}T(I_pP;})p~2|Z5wWoinrE!-`8K@|KP{(`|fPAVFN_!{;==7?{h!zbG0QYfSk$)6PVlylESSjOFCgQ6q0fy}WVUbiHW&5#KeEc~k5XdEatu zuMP@ADr!)xplP6gC@~VBNRAEl9UMsv4UG4s1`njU4V1+>-*KL4_(1>V^k<#wHR&eQ|MmtBO_PboEI5!NUV1@#Mrve19^P7?RM{ zDl`GzNF>b|Vud9kvCr0-hxbgW#0U?BOwO2wnr48To6x@Ea$fV#~+2~ZkPK%g~4wo>f`@MK=7%>%H zxKBZ&^o>OBab07M9BMt^H4VCHduza}+_!-%!ykTwI`H1rybij zESvYRt~{WE$Zi|2=fxjZF^VI+Jj?5Ia(TnICbQ-d%cr4xZ_eX1e+=Vc92NIRwKgrP zRT)FVRc}!7MocibXmW6GskuC3csDIxneWQTSkeqkhLKj00h#RhpE)oKlEd+y2jU|W zyY?&CbrU*7P!j=N*fcP0JFclG=j`;1>)6(#bg*MbaExVpzvUTpwx`QxpnJqwMA4@l zSNCTuPxp!)L9A(Oin*E1&S|{4tne>WOJ5Qfl`dwQDsV)J$txHy4+JKgs7V9km9?Vs zP{J@Zu$C*;c2KsHUc#Qmb|)QRz5vpr_Bi7te`hxXXkWQ!?a0u{4>aX z%5`#dps9Pl;rjaQjA_fQD4M3Lo3_uMD^CoT91Yci{i+Ba7ah%fxL~=rmqWSecpaydPZ1V;;9ch9{utj z1^bVblq=nJ*6}F4#8j7pwh2$nTG=em1zTa8FeYHFaY~@%brF1k79>uX?yPJ1CdEyQ zNg{#|DTt=bT;6dF*P_321w!2-l*|lYrz0ds21PL@*};(&;qy@yAH$QP0n2vBTi(~& z_DWhX?=Wdi+lF6onWKlVA6#84%)s&r8rv6R`zdJ~>T@!bvue-i}+0FHVDg-;9|)&a0_<` zhxEKj54Mf+%7d6x(0Mc0pg^^}xGj86YCUC!G~1yDCn0R-EjpIN@v;=}KpVL6Q#T6&@<9=3?kvX*4Vs;3BQ+lTN`+ zn+GhBLANb~wOzD)&J?|l#4yI*?PLWuI`4 zo6$jem83AHjI{5#jEja``R?WNoDGPI0uHk9v%jx5SXA4%oKo%D0K>h4D89cU8E5 zIZuZ1561ZQQCV$^Ztvbfi8=@PhVEwZas{~ZfhkwMBjw7Mqg+LY5pX{KNKqx;Hge@# zMy`CU$d!*1a{ajceyVYUcnC-< z@EP~10Kb#+1Vz23w4cZASD*;|swMbO^F%FT;nPx=C&VB{EFtkEr-m@sE$tnf&f%{1 z&1cZo-W)oEyW5*<&R|D-bL|;)zCes>$#sLYGRFTdG~hn!zYptiKcAu95Ry9SFLJ|Y zB%b&Z{-~B`!XqL1C45rEdxl=A#bKim|cO>^`YXQxSbZnKk%4zCdOQzPP~jp@8Y;jte-*$LR$ORgrjAd&gO% zo<=zI975HCebN5nE%cYM-@L$nbHM&f#I8Zr#%>|$%lHcag{z}n#bwn{{kE$W-Xl2{ zeNYo{RPa?iyA1K&S6}kpWr?3#mUze2#P?JZH`a?Z4kUL44vKWpH?P0Gt0U3_v=I?} z1K)%~PE6Z?(>AWc0ac-^t>0OuLsgLnDVhE^r0iIhl4azElr76rvK-xza`Up3ENcO! zh*M#wMu$D5U>2GdW4CY~i{}m1xwVYRqVqWH29&)r>45ge+RISJ zs^?Li91G1OoE)o}XD1x1o##k17M@3Aax5~BHOb1N6QLES0)GEy;)~yz4~( azh3zI-NM%&`Slla6aDS4_&ffI=KlhUD3v?_ diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/Loc.class deleted file mode 100644 index 330d8e7e19d339080cea7302544a82a9469a60b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmZXQy-ve06orpVXxj2upe+Lf0}Sbc7d9pqq)Jsm6!EvYsfk$kJeQB@Q$w zz-`pwgA6M+DmKwV4LdYdr}zc%;44z><6yyd#lwn6I3}f^Zi4j)UQ8;4{<1F^ Jy7bo2`vVG`cZdK0 diff --git a/api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class b/api/target/classes/com/craftmend/openaudiomc/api/spakers/SpeakerType.class deleted file mode 100644 index 7ed8087b4afc376b5320d1726e4a62a5a8b99d24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmbVM`%lwQ6#gz-*(e1@MG+Jkh`LU(^6)uCkPSj4Vw^59nwYz;V6khLK1lqp6nsUa z@n`=ioFc=oPg_JAR&KteZzTz*noepGt;dbY?gxAEUt1p$^;&~pTA zt|-jC3KaA)q^2s%8_!E+hWVE#V309@ObUGp2B9)YhV42g!%$A!*x|cex4E;eZ&r6q zBPhri!s!&wC>X|BhWg_ z9L_UzFIbKhEHa#Fg^DBBwTh77f`V~mNp6SNDQC5vLU>IoxG21OYo>2_RwJ-nCk-i$ z%M4w!#WZpZW1EisE?eck>1TIcJFJ^o*U8o_Kj4mG%7l^^d0l0=*D0NL;&zKxNuwu? z>qI(7q&FDG%c1AFp;OEH(J1I^g4b_$lc1edFo$_j!@IILHxZ+X=w%UXxCX(#9@Q3}`Kc7=PEK#t*)!5fPXz&QP@3_WFQ+u=dz5%ZM} z%$+18A-2unaa8W3EgE+QbtO3z4=YXgXTh-JUP|P&3PY&{S@hk)368i}5VzY6J;PkJ zgm#&hC*Zoc7)vu$z9D)_q@@w@8UQrYMJ7v^XxnI}#so5>;wIBRMc;4I(?dn3-6YN8 zC+|W2jQ(F3cuzZq+cb7Z-z4%M#+}%Io^VBktg`%9ocaYO{JW0$-zAIE^g76a+M2us z<0~X6Q$WpMJ^uwG`RPv>%a0^KVdBF9l8Pj)`zV8c^wQfghzta3mSQOq_o5SuRpG$4 zK&vF~M;MF5{s2of3Pzn~k+YQlh_U18$`NogT`2};Sne1+aXh%UJvbwayA(5P(K&!Y z=?B=0#2ymm7s)-O%IzYj@enI<*m`_C?K?%OQwjBwdgTkWeIz2owWK<&>X9M!6*K#g bg>ucB^+yV&NU=24RwB)tiWE_blv(`?XIO2c diff --git a/api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class b/api/target/classes/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class deleted file mode 100644 index 46adac910126e25c5886cbf2626d8bbeeb425d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1881 zcmbVNT~ixn6n@@KLYA;3X>2HIky2}G2%+l-R&Ah4TTo_#)KW7eS1y~i*&4Dj+3+X) z1$v`bdc%c|N@whhqqqL1j`caaOIQLrj?D1B=e!@!Ip;agzWMX7Uw;FzgpF}%NTiW8 zkiwY4lI`u8cF+3E-*Y-m)9X4NYtVGPJ=?UpuDS2IwqrJAyze-@t*-BSoxVbP-|f4* zZAU@v2%>IaT;Pm;*YaJfy($2Z!i8hJZNKMs9^DzZ?WWVqponP$ zC0tY(TXs9He_Mfo4IMKIrO~p=QBf;$Z`QzN%<-PpB_~aV#dz9bnA&`-k`s|@0`ZbS zTveDU@BH&Y9oH0c)wwuvD>_~wv-1KnZ=iw&66kwj1cmeE({K#9i0L$LDCCdX2-y{C zr=?4;8F(FUuzUB`)>l8SKUBC`|3Ce&DJ1WDO?E$5cRS99gS}m+_s|OTP^f#h)oxfl zSNv!(>9<^}CewHPVPlhIr9lL)#T!b-9nlGoD^H;iV>r@^Ldx@7PETQS+qdk`H?3|I zMsHdDR+t#OyupL_A8c%{5sCI#&*=}^J{QY7L1cZ|ZbzEPYaZXi!hB^q2y~%MbSe(U8+D3Q)Zv}8{ z?3tI-qnEFpdHHR;LpX_iis&eTUs2^!*I1Zf-Zcl|LqR^6-)FK(*IvXebUvY#B z!Kq=AqvZ1?VM*Cr@ypaOn^)O2UV@Qg}JE z3u0fVeTec8JbPL{p>)epntV)gF~VPs@N<wbiv+t+wFNn^iEEiib);6i=%ME4`=LSf_N8vYYk2JP96r03S-6 ztQ7_EVgi$V!=FEs%-j3RD}X*a5h|!QP-|iZb%CCCsnnUe_o=aobPHouk&sKZR11=+ zNl3}-5C!UIWXTT&ItTGgJt{d@b}C0cBRd`R#tp0roc!%KHP&RLm!57iGur20-n9#t z7=czy*4z~7#AJ7BGUrS?c3REHDx<*5WX(TNE^r$E>$U+uC3i)pOZ#6h5r{6$A~RZf zlQ4`*=@o@)qVg+_!x@3S+roNE&6slH+Rm+YUU_nsOY8plp>MYV_R-)5gduox3z*iJ zhP;M+{qX1+;)!<^L>xoAfOS?jIRf2J71IV2>#>OzJ8hLz#Wt@Mw3ob7Dg<_c59wHe AssI20 diff --git a/api/target/maven-archiver/pom.properties b/api/target/maven-archiver/pom.properties deleted file mode 100644 index ca4981700..000000000 --- a/api/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Sat Feb 03 17:05:18 CET 2024 -artifactId=openaudiomc-api -groupId=com.craftmend.openaudiomc -version=6.8.10 diff --git a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index da3a86d32..000000000 --- a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,19 +0,0 @@ -com/craftmend/openaudiomc/api/media/MediaFlag.class -com/craftmend/openaudiomc/api/media/MediaOptions.class -com/craftmend/openaudiomc/api/media/OptionalError.class -com/craftmend/openaudiomc/api/media/UrlMutation.class -com/craftmend/openaudiomc/generic/media/objects/Media.class -com/craftmend/openaudiomc/api/ClientApi.class -com/craftmend/openaudiomc/api/WorldApi.class -com/craftmend/openaudiomc/api/media/Media.class -com/craftmend/openaudiomc/api/basic/Actor.class -com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.class -com/craftmend/openaudiomc/api/spakers/BasicSpeaker.class -com/craftmend/openaudiomc/api/voice/VoicePeerOptions.class -com/craftmend/openaudiomc/api/clients/Client.class -com/craftmend/openaudiomc/api/VoiceApi.class -com/craftmend/openaudiomc/api/spakers/Loc.class -com/craftmend/openaudiomc/api/MediaApi.class -com/craftmend/openaudiomc/api/ApiHolder.class -com/craftmend/openaudiomc/api/spakers/SpeakerType.class -com/craftmend/openaudiomc/api/regions/AudioRegion.class diff --git a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 41cd6962a..000000000 --- a/api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,19 +0,0 @@ -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/VoiceApi.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/WorldApi.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/Media.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/SpeakerType.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/generic/media/objects/Media.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/BasicSpeaker.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/basic/Actor.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaOptions.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/Loc.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/UrlMutation.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/MediaApi.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/ClientApi.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/regions/AudioRegion.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/voice/VoicePeerOptions.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/spakers/ExtraSpeakerOptions.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/ApiHolder.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/clients/Client.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/MediaFlag.java -/home/mats/workspace/openaudiomc/OpenAudioMc/api/src/main/java/com/craftmend/openaudiomc/api/media/OptionalError.java diff --git a/api/target/openaudiomc-api.jar b/api/target/openaudiomc-api.jar deleted file mode 100644 index f672738a789fe57878bdc67d75c75885017c7d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51975 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 DYy}f6 diff --git a/api/target/original-openaudiomc-api.jar b/api/target/original-openaudiomc-api.jar deleted file mode 100644 index 1e0da70fa24c47d3dd064bfe9f6c08531aa6cc9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19933 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