Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.jetbrains.annotations.Nullable;

import java.lang.invoke.VarHandle;
import java.net.InetSocketAddress;
import java.util.Optional;
import java.util.UUID;

Expand All @@ -37,6 +38,7 @@ public class MapperSessionProcessor implements SessionListener {
private volatile Session session;
private boolean kickMasterWhenDisconnect = true;
private boolean destroyed = false;
private InetSocketAddress remoteAddress;

private static final VarHandle KICK_MASTER_HANDLE = ConcurrentUtil.getVarHandle(MapperSessionProcessor.class,
"kickMasterWhenDisconnect", boolean.class);
Expand Down Expand Up @@ -254,6 +256,9 @@ protected void detachFromManager(boolean updateSession, @Nullable DisconnectedEv

protected void setSession(Session session) {
SESSION_HANDLE.setVolatile(this, session);
if (session != null) {
this.remoteAddress = (InetSocketAddress) session.getRemoteAddress();
}
}

public void destroyAndAwaitDisconnected() {
Expand All @@ -278,4 +283,19 @@ protected void waitForDisconnected() {
Thread.onSpinWait();
}
}

public @Nullable InetSocketAddress getRemoteAddress() {
if (this.remoteAddress != null) {
return this.remoteAddress;
}

final Session sessionObject = (Session) SESSION_HANDLE.getVolatile(this);

if (sessionObject == null) {
return null;
}

this.remoteAddress = (InetSocketAddress) sessionObject.getRemoteAddress();
return this.remoteAddress;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.kyori.adventure.key.Key;
import org.geysermc.mcprotocollib.protocol.packet.common.serverbound.ServerboundCustomPayloadPacket;

import java.net.InetSocketAddress;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
Expand Down Expand Up @@ -112,8 +113,9 @@ public ProxyComputeResult processS2C(Key key, ByteBuf copiedPacketData) {
final int[] entityIdsRemapped = new int[entityIds.length];
final String expression = mcBuffer.readUtf();

final Map<Integer, Integer> collectedPaddingWorkerEntityId = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> collectedPaddingWorkerEntityId = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);

int idx = 0;
for (int singleWorkerEntityId : entityIds) {
Expand Down Expand Up @@ -152,8 +154,9 @@ public ProxyComputeResult processS2C(Key key, ByteBuf copiedPacketData) {
this.ysmVersion, workerEntityId, layer, action, animationName);
}

final Map<Integer, Integer> collectedPaddingWorkerEntityId = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> collectedPaddingWorkerEntityId = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);

final Integer targetProxyId = collectedPaddingWorkerEntityId.get(workerEntityId);

Expand Down Expand Up @@ -242,8 +245,9 @@ public ProxyComputeResult processC2S(Key key, ByteBuf copiedPacketData) {
if (entityId == -1) {
mappedEntityId = -1;
} else {
final Map<Integer, Integer> workerToProxy = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> workerToProxy = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);
int foundWorkerId = -1;
for (Map.Entry<Integer, Integer> entry : workerToProxy.entrySet()) {
if (entry.getValue().equals(entityId)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class YsmMapperPayloadManager {
private final Map<InetSocketAddress, Integer> backend2Players = Maps.newLinkedHashMap();
private final Set<UUID> ysmInstalledPlayers = Sets.newConcurrentHashSet();

private final Map<Integer, Integer> worker2PlayerEntityIdCache = Maps.newConcurrentMap();
private final Map<InetSocketAddress, Map<Integer, Integer>> worker2PlayerEntityIdCache = Maps.newConcurrentMap();

public YsmMapperPayloadManager(Function<Player, YsmPacketProxy> packetProxyCreator,
Function<UUID, YsmPacketProxy> packetProxyCreatorVirtual) {
Expand Down Expand Up @@ -75,8 +75,11 @@ public void updateWorkerPlayerEntityId(Player target, int entityId) {
mapper.getPacketProxy().setPlayerWorkerEntityId(entityId);

final int playerEntityId = mapper.getPacketProxy().getPlayerEntityId();
if (playerEntityId != -1) {
this.worker2PlayerEntityIdCache.put(entityId, playerEntityId);
final InetSocketAddress remoteAddress = mapper.getRemoteAddress();

if (playerEntityId != -1 && remoteAddress != null) {
this.worker2PlayerEntityIdCache.computeIfAbsent(remoteAddress, k -> Maps.newConcurrentMap())
.put(entityId, playerEntityId);
}
}

Expand All @@ -90,8 +93,11 @@ public void updateRealPlayerEntityId(Player target, int entityId) {
mapper.getPacketProxy().setPlayerEntityId(entityId);

final int workerEntityId = mapper.getPacketProxy().getPlayerWorkerEntityId();
if (workerEntityId != -1) {
this.worker2PlayerEntityIdCache.put(workerEntityId, entityId);
final InetSocketAddress remoteAddress = mapper.getRemoteAddress();

if (workerEntityId != -1 && remoteAddress != null) {
this.worker2PlayerEntityIdCache.computeIfAbsent(remoteAddress, k -> Maps.newConcurrentMap())
.put(workerEntityId, entityId);
}
}

Expand Down Expand Up @@ -244,8 +250,8 @@ private void disconnectMapperWithoutKickingMaster(@NotNull MapperSessionProcesso
connection.destroyAndAwaitDisconnected();
}

public Map<Integer, Integer> collectRealProxy2WorkerEntityId() {
return Collections.unmodifiableMap(this.worker2PlayerEntityIdCache);
public Map<Integer, Integer> collectRealProxy2WorkerEntityId(InetSocketAddress remoteAddress) {
return Collections.unmodifiableMap(this.worker2PlayerEntityIdCache.getOrDefault(remoteAddress, Map.of()));
}

public void autoCreateMapper(Player player) {
Expand All @@ -269,8 +275,18 @@ public void onPlayerDisconnect(@NotNull Player player) {
this.disconnectMapperWithoutKickingMaster(mapperSession);

final int workerEntityId = mapperSession.getPacketProxy().getPlayerWorkerEntityId();
if (workerEntityId != -1) {
this.worker2PlayerEntityIdCache.remove(workerEntityId);
final InetSocketAddress remoteAddress = mapperSession.getRemoteAddress();

if (workerEntityId != -1 && remoteAddress != null) {
final Map<Integer, Integer> workerMap = this.worker2PlayerEntityIdCache.get(remoteAddress);

if (workerMap != null) {
workerMap.remove(workerEntityId);

if (workerMap.isEmpty()) {
this.worker2PlayerEntityIdCache.remove(remoteAddress);
}
}
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions Freesia-Velocity/src/main/resources/lang/en_US.lang
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Ysm backend has been disconnected, reason:<reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>There is not a valid connection to ysm backend! If you still meet this issue. please report to the administrators
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Cannot found specified worker
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>][</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Handshake time outed, please ensure you have installed the corrected version of ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4>Ysm Player List:
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Ysm backend has been disconnected, reason:<reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> There is not a valid connection to ysm backend! If you still meet this issue. please report to the administrators
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Cannot found specified worker
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>] [</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Handshake time outed, please ensure you have installed the corrected version of ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4> Ysm Player List:
freesia.list_player_command_body=<#cdd6f4><name>
12 changes: 6 additions & 6 deletions Freesia-Velocity/src/main/resources/lang/vi_VN.lang
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Backend Ysm đã ngắt kết nối, lý do: <reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Không có kết nối hợp lệ tới backend Ysm! Nếu bạn vẫn gặp sự cố này, vui lòng báo cáo cho quản trị viên
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Không tìm thấy worker được chỉ định
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>][</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Bắt tay kết nối đã hết thời gian chờ, vui lòng đảm bảo bạn đã cài đúng phiên bản Ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4>Danh sách người chơi Ysm:
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Backend Ysm đã ngắt kết nối, lý do: <reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Không có kết nối hợp lệ tới backend Ysm! Nếu bạn vẫn gặp sự cố này, vui lòng báo cáo cho quản trị viên
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Không tìm thấy worker được chỉ định
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>] [</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Bắt tay kết nối đã hết thời gian chờ, vui lòng đảm bảo bạn đã cài đúng phiên bản Ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4> Danh sách người chơi Ysm:
freesia.list_player_command_body=<#cdd6f4><name>
12 changes: 6 additions & 6 deletions Freesia-Velocity/src/main/resources/lang/zh_CN.lang
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Ysm后端worker断开了连接,原因:<reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>你没有连接到Ysm后端worker.如果反复遇到该问题,请汇报管理员!
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>找不到该worker!
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>][</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8>Ysm握手超时,请确认您安装了正确版本的Ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4>Ysm Player List:
freesia.backend.disconnected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Ysm后端worker断开了连接,原因:<reason>
freesia.backend.not_connected=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> 你没有连接到Ysm后端worker.如果反复遇到该问题,请汇报管理员!
freesia.worker_command.worker_not_found=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> 找不到该worker!
freesia.worker_command.command_feedback=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>] [</#cdd6f4><worker_name><#cdd6f4>]</#cdd6f4><feedback>
freesia.mod_handshake_time_outed=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4><#f38ba8> Ysm握手超时,请确认您安装了正确版本的Ysm
freesia.list_player_command_header=<#cdd6f4>[</#cdd6f4><#89dceb>Freesia</#89dceb><#cdd6f4>]</#cdd6f4> Ysm Player List:
freesia.list_player_command_body=<#cdd6f4><name>
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.jetbrains.annotations.Nullable;

import java.lang.invoke.VarHandle;
import java.net.InetSocketAddress;
import java.util.Optional;
import java.util.UUID;

Expand All @@ -38,6 +39,7 @@ public class MapperSessionProcessor implements SessionListener {
private volatile Session session;
private boolean kickMasterWhenDisconnect = true;
private boolean destroyed = false;
private InetSocketAddress remoteAddress;

private static final VarHandle KICK_MASTER_HANDLE = ConcurrentUtil.getVarHandle(MapperSessionProcessor.class,
"kickMasterWhenDisconnect", boolean.class);
Expand Down Expand Up @@ -275,6 +277,9 @@ protected void detachFromManager(boolean updateSession, @Nullable DisconnectedEv

protected void setSession(Session session) {
SESSION_HANDLE.setVolatile(this, session);
if (session != null) {
this.remoteAddress = (InetSocketAddress) session.getRemoteAddress();
}
}

public void destroyAndAwaitDisconnected() {
Expand Down Expand Up @@ -307,4 +312,19 @@ protected void waitForDisconnected() {
Thread.onSpinWait(); // Spin wait instead of block waiting
}
}

public @Nullable InetSocketAddress getRemoteAddress() {
if (this.remoteAddress != null) {
return this.remoteAddress;
}

final Session sessionObject = (Session) SESSION_HANDLE.getVolatile(this);

if (sessionObject == null) {
return null;
}

this.remoteAddress = (InetSocketAddress) sessionObject.getRemoteAddress();
return this.remoteAddress;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.nguyendevs.freesia.waterfall.utils.FriendlyByteBuf;
import io.netty.buffer.ByteBuf;
import net.kyori.adventure.key.Key;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
Expand Down Expand Up @@ -114,8 +115,9 @@ public ProxyComputeResult processS2C(Key key, ByteBuf copiedPacketData) {
final int[] entityIdsRemapped = new int[entityIds.length];
final String expression = mcBuffer.readUtf();

final Map<Integer, Integer> collectedPaddingWorkerEntityId = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> collectedPaddingWorkerEntityId = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);

// remap the entity id
int idx = 0;
Expand Down Expand Up @@ -156,8 +158,9 @@ public ProxyComputeResult processS2C(Key key, ByteBuf copiedPacketData) {
+ ", layer=" + layer + ", action=" + action + ", name=" + animationName);
}

final Map<Integer, Integer> collectedPaddingWorkerEntityId = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> collectedPaddingWorkerEntityId = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);

final Integer targetProxyId = collectedPaddingWorkerEntityId.get(workerEntityId);

Expand Down Expand Up @@ -247,8 +250,9 @@ public ProxyComputeResult processC2S(Key key, ByteBuf copiedPacketData) {
mappedEntityId = -1;
} else {
// Reverse lookup: find the worker ID belonging to the real entity ID
final Map<Integer, Integer> workerToProxy = Freesia.mapperManager
.collectRealProxy2WorkerEntityId();
final InetSocketAddress remoteAddress = this.handler == null ? null : this.handler.getRemoteAddress();
final Map<Integer, Integer> workerToProxy = remoteAddress == null ? Map.of() : Freesia.mapperManager
.collectRealProxy2WorkerEntityId(remoteAddress);
int foundWorkerId = -1;
for (Map.Entry<Integer, Integer> entry : workerToProxy.entrySet()) {
if (entry.getValue().equals(entityId)) {
Expand Down
Loading
Loading