Global-proximity fix.

This commit is contained in:
ayunami2000 2022-07-18 23:14:42 -04:00
parent 782235327b
commit 79b87e32a2
4 changed files with 46151 additions and 46120 deletions
javascript
src
main/java/net/minecraft/client
teavm/java/net/lax1dude/eaglercraft/adapter

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -1122,23 +1122,25 @@ public class Minecraft implements Runnable {
if(this.currentScreen == null || !this.currentScreen.blockHotKeys()) { if(this.currentScreen == null || !this.currentScreen.blockHotKeys()) {
EaglerAdapter.activateVoice(EaglerAdapter.isKeyDown(gameSettings.voicePTTKey)); EaglerAdapter.activateVoice(EaglerAdapter.isKeyDown(gameSettings.voicePTTKey));
} }
if (EaglerAdapter.getVoiceChannel() == Voice.VoiceChannel.PROXIMITY) { if (this.theWorld != null && this.thePlayer != null) {
if (this.theWorld != null && this.thePlayer != null) { HashSet<String> seenPlayers = new HashSet<>();
HashSet<String> seenPlayers = new HashSet<>(); for (Object playerObject : this.theWorld.playerEntities) {
for (Object playerObject : this.theWorld.playerEntities) { EntityPlayer player = (EntityPlayer) playerObject;
EntityPlayer player = (EntityPlayer) playerObject; if (player == this.thePlayer) continue;
if (player == this.thePlayer) continue; if (EaglerAdapter.getVoiceChannel() == Voice.VoiceChannel.PROXIMITY) EaglerAdapter.updateVoicePosition(player.username, player.posX, player.posY + player.getEyeHeight(), player.posZ);
EaglerAdapter.updateVoicePosition(player.username, player.posX, player.posY + player.getEyeHeight(), player.posZ); int prox = EaglerAdapter.getVoiceProximity();
int prox = EaglerAdapter.getVoiceProximity(); // cube
// cube if (Math.abs(thePlayer.posX - player.posX) <= prox && Math.abs(thePlayer.posY - player.posY) <= prox && Math.abs(thePlayer.posZ - player.posZ) <= prox) {
if (Math.abs(thePlayer.posX - player.posX) <= prox && Math.abs(thePlayer.posY - player.posY) <= prox && Math.abs(thePlayer.posZ - player.posZ) <= prox) { if (EaglerAdapter.getVoiceChannel() == Voice.VoiceChannel.PROXIMITY) {
EaglerAdapter.addNearbyPlayer(player.username); EaglerAdapter.addNearbyPlayer(player.username);
seenPlayers.add(player.username); seenPlayers.add(player.username);
} else if (EaglerAdapter.getVoiceChannel() == Voice.VoiceChannel.GLOBAL) {
EaglerAdapter.sendVoiceRequestIfNeeded(player.username);
} }
} }
EaglerAdapter.cleanupNearbyPlayers(seenPlayers);
} }
if (EaglerAdapter.getVoiceChannel() == Voice.VoiceChannel.PROXIMITY) EaglerAdapter.cleanupNearbyPlayers(seenPlayers);
} }
} }

@ -2036,7 +2036,7 @@ public class EaglerAdapterImpl2 {
for(int i = 0; i < voicePlayers.length; i++) voicePlayers[i] = streamIn.readUTF(); for(int i = 0; i < voicePlayers.length; i++) voicePlayers[i] = streamIn.readUTF();
for (String username : voicePlayers) { for (String username : voicePlayers) {
// notice that literally everyone except for those already connected using voice chat will receive the request; however, ones using proximity will simply ignore it. // notice that literally everyone except for those already connected using voice chat will receive the request; however, ones using proximity will simply ignore it.
if (!voiceGains.containsKey(username)) addNearbyPlayer(username); sendVoiceRequestIfNeeded(username);
} }
break; break;
case VOICE_SIGNAL_ALLOWED: case VOICE_SIGNAL_ALLOWED:
@ -2055,11 +2055,7 @@ public class EaglerAdapterImpl2 {
} catch (EOFException e) { // this is actually a connect ANNOUNCE, not an absolute "yes please connect" situation } catch (EOFException e) { // this is actually a connect ANNOUNCE, not an absolute "yes please connect" situation
if (enabledChannel == Voice.VoiceChannel.PROXIMITY && !nearbyPlayers.contains(peerId)) return; if (enabledChannel == Voice.VoiceChannel.PROXIMITY && !nearbyPlayers.contains(peerId)) return;
// send request to peerId // send request to peerId
ByteArrayOutputStream baos = new ByteArrayOutputStream(); sendVoiceRequest(peerId);
DataOutputStream dos = new DataOutputStream(baos);
dos.write(VOICE_SIGNAL_REQUEST);
dos.writeUTF(peerId);
returnSignalHandler.accept(baos.toByteArray());
} }
break; break;
case VOICE_SIGNAL_DISCONNECT: case VOICE_SIGNAL_DISCONNECT:
@ -2100,16 +2096,25 @@ public class EaglerAdapterImpl2 {
recentlyNearbyPlayers.remove(username); recentlyNearbyPlayers.remove(username);
if (nearbyPlayers.add(username)) { if (nearbyPlayers.add(username)) {
if (getVoiceStatus() == Voice.VoiceStatus.DISCONNECTED || getVoiceStatus() == Voice.VoiceStatus.UNAVAILABLE) return; if (getVoiceStatus() == Voice.VoiceStatus.DISCONNECTED || getVoiceStatus() == Voice.VoiceStatus.UNAVAILABLE) return;
try { sendVoiceRequest(username);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.write(VOICE_SIGNAL_REQUEST);
dos.writeUTF(username);
returnSignalHandler.accept(baos.toByteArray());
} catch (IOException ignored) { }
} }
} }
private static final void sendVoiceRequest(String username) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.write(VOICE_SIGNAL_REQUEST);
dos.writeUTF(username);
returnSignalHandler.accept(baos.toByteArray());
} catch (IOException ignored) { }
}
public static final void sendVoiceRequestIfNeeded(String username) {
if (getVoiceStatus() == Voice.VoiceStatus.DISCONNECTED || getVoiceStatus() == Voice.VoiceStatus.UNAVAILABLE) return;
if (!voiceGains.containsKey(username)) sendVoiceRequest(username);
}
private static final ExpiringSet<String> recentlyNearbyPlayers = new ExpiringSet<>(5000, new ExpiringSet.ExpiringEvent<String>() { private static final ExpiringSet<String> recentlyNearbyPlayers = new ExpiringSet<>(5000, new ExpiringSet.ExpiringEvent<String>() {
@Override @Override
public void onExpiration(String username) { public void onExpiration(String username) {
@ -2134,23 +2139,20 @@ public class EaglerAdapterImpl2 {
public static final void sendInitialVoice() { public static final void sendInitialVoice() {
returnSignalHandler.accept(new byte[] { VOICE_SIGNAL_CONNECT }); returnSignalHandler.accept(new byte[] { VOICE_SIGNAL_CONNECT });
for (String username : nearbyPlayers) { for (String username : nearbyPlayers) sendVoiceRequest(username);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.write(VOICE_SIGNAL_REQUEST);
dos.writeUTF(username);
returnSignalHandler.accept(baos.toByteArray());
} catch (IOException ignored) { }
}
} }
public static final void enableVoice(Voice.VoiceChannel enable) { public static final void enableVoice(Voice.VoiceChannel enable) {
if (enabledChannel == enable) return; if (enabledChannel == enable) return;
if (enabledChannel != Voice.VoiceChannel.NONE) { if (enabledChannel == Voice.VoiceChannel.PROXIMITY) {
for (String username : nearbyPlayers) voiceClient.signalDisconnect(username, false); for (String username : nearbyPlayers) voiceClient.signalDisconnect(username, false);
for (String username : recentlyNearbyPlayers) voiceClient.signalDisconnect(username, false); for (String username : recentlyNearbyPlayers) voiceClient.signalDisconnect(username, false);
nearbyPlayers.clear(); nearbyPlayers.clear();
recentlyNearbyPlayers.clear();
returnSignalHandler.accept(new byte[] { VOICE_SIGNAL_DISCONNECT });
} else if(enabledChannel == Voice.VoiceChannel.GLOBAL) {
Set<String> antiConcurrentModificationUsernames = new HashSet<>(voiceGains.keySet());
for (String username : antiConcurrentModificationUsernames) voiceClient.signalDisconnect(username, false);
returnSignalHandler.accept(new byte[] { VOICE_SIGNAL_DISCONNECT }); returnSignalHandler.accept(new byte[] { VOICE_SIGNAL_DISCONNECT });
} }
enabledChannel = enable; enabledChannel = enable;