11package dev .emortal .velocity .misc .listener ;
22
33import com .velocitypowered .api .event .Subscribe ;
4+ import com .velocitypowered .api .event .connection .DisconnectEvent ;
45import com .velocitypowered .api .event .player .PlayerResourcePackStatusEvent ;
5- import com .velocitypowered .api .event .player .ServerPostConnectEvent ;
6+ import com .velocitypowered .api .event .player .configuration . PlayerConfigurationEvent ;
67import com .velocitypowered .api .proxy .Player ;
78import com .velocitypowered .api .proxy .player .ResourcePackInfo ;
89import dev .emortal .velocity .adapter .resourcepack .ResourcePackProvider ;
1718import java .net .URI ;
1819import java .security .MessageDigest ;
1920import java .security .NoSuchAlgorithmException ;
21+ import java .util .HashSet ;
22+ import java .util .Set ;
23+ import java .util .UUID ;
2024import java .util .concurrent .TimeUnit ;
2125
2226final class ResourcePackSender {
@@ -26,6 +30,8 @@ final class ResourcePackSender {
2630
2731 private ResourcePackInfo resourcePackInfo ;
2832
33+ private final Set <UUID > rpAcceptedPlayers = new HashSet <>();
34+
2935 ResourcePackSender (@ NotNull ResourcePackProvider resourcePackProvider , @ NotNull EmortalScheduler scheduler ) {
3036 this .updateResourcePackInfo (resourcePackProvider );
3137 scheduler .repeat (() -> this .updateResourcePackInfo (resourcePackProvider ), 30 , TimeUnit .SECONDS );
@@ -70,19 +76,26 @@ private byte[] fetchSha1() throws NoSuchAlgorithmException, IOException {
7076 }
7177
7278 @ Subscribe
73- void onPlayerJoin ( @ NotNull ServerPostConnectEvent event ) {
74- if (event .getPreviousServer () != null ) return ; // Don't send the resource pack if the player is switching servers
79+ void onPlayerConfiguration ( PlayerConfigurationEvent event ) {
80+ if (this . rpAcceptedPlayers . contains ( event .player (). getUniqueId ())) return ; // Don't send the resource pack if the player has already got it
7581
76- event .getPlayer ().sendResourcePackOffer (this .resourcePackInfo );
82+ event .player ().sendResourcePackOffer (this .resourcePackInfo );
7783 }
7884
7985 @ Subscribe
8086 void onPlayerResourceStatus (@ NotNull PlayerResourcePackStatusEvent event ) {
8187 LOGGER .info ("Player {} resource pack status {}" , event .getPlayer ().getUsername (), event .getStatus ());
8288 Player player = event .getPlayer ();
8389 switch (event .getStatus ()) {
90+ case SUCCESSFUL -> this .rpAcceptedPlayers .add (player .getUniqueId ());
8491 case DECLINED -> ChatMessages .RESOURCE_PACK_DECLINED .send (player );
8592 case FAILED_DOWNLOAD -> ChatMessages .RESOURCE_PACK_FAILED .send (player );
8693 }
8794 }
95+
96+ @ Subscribe
97+ void onPlayerDisconnect (DisconnectEvent event ) {
98+ this .rpAcceptedPlayers .remove (event .getPlayer ().getUniqueId ());
99+ }
100+
88101}
0 commit comments