Skip to content

Commit

Permalink
Fixed: Syncing networkData
Browse files Browse the repository at this point in the history
  • Loading branch information
Reider745 committed Mar 22, 2024
1 parent 8a50de8 commit 8d3525d
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import com.zhekasmirnov.apparatus.job.JobExecutor;
import com.zhekasmirnov.apparatus.multiplayer.Network;
import com.zhekasmirnov.apparatus.multiplayer.ThreadTypeMarker;
import com.zhekasmirnov.apparatus.multiplayer.client.ModdedClient;
import com.zhekasmirnov.apparatus.multiplayer.server.ConnectedClient;
import com.zhekasmirnov.apparatus.multiplayer.util.list.ConnectedClientList;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
Expand All @@ -24,6 +26,66 @@ public static NetworkEntity getClientEntityInstance(String name) {
}

static {
Network.getSingleton().addClientPacket("system.entity.add", (Object data, String meta, Class<?> dataType) -> {
synchronized (clientEntities) {
String[] metaArr = meta.split("#");
if (metaArr.length == 2) {
NetworkEntityType entityType = NetworkEntityType.getByName(metaArr[0]);
String entityName = metaArr[1];
if (entityType != null && entityName.length() > 0) {
if (!clientEntities.containsKey(entityName)) {
NetworkEntity entity = new NetworkEntity(entityType, null, entityName, false);
clientEntities.put(entityName, entity);
entity.getClientExecutor().add(() -> entityType.onClientEntityAdded(entity, data));
} else {
if (entityType.isDuplicateAddPacketAllowed()) {
NetworkEntity entity = clientEntities.get(entityName);
if (entity != null) {
entity.getClientExecutor().add(() -> entityType.onClientEntityAdded(entity, data));
}
} else {
}
}
}
}
}
}, null);

Network.getSingleton().addClientPacket("system.entity.remove", (Object data, String meta, Class<?> dataType) -> {
synchronized (clientEntities) {
NetworkEntity entity = clientEntities.get(meta);
if (entity != null) {
entity.isRemoved = true;
entity.getClientExecutor().add(() -> entity.type.onClientEntityRemoved(entity, data));
clientEntities.remove(meta);
}
}
}, null); // use entity executor instead

Network.getSingleton().addClientPacket("system.entity.packet", (Object data, String meta, Class<?> dataType) -> {
synchronized (clientEntities) {
int sepIndex = meta.indexOf('#');
if (sepIndex != -1) {
NetworkEntity entity = clientEntities.get(meta.substring(0, sepIndex));
String packetName = meta.substring(sepIndex + 1);
sepIndex = packetName.indexOf('#');
if (sepIndex != -1) {
meta = packetName.substring(sepIndex + 1);
packetName = packetName.substring(0, sepIndex);
} else {
meta = null;
}
if (entity != null) {
String finalPacketName = packetName;
String finalMeta = meta;
entity.getClientExecutor().add(() -> {
entity.type.onClientPacket(entity, finalPacketName, data, finalMeta);
});
}
}
}
}, null); // use entity executor instead

Network.getSingleton().addServerPacket("system.entity.packet", (ConnectedClient client, Object data, String meta, Class<?> dataType) -> {
synchronized (serverEntities) {
int sepIndex = meta.indexOf('#');
Expand Down Expand Up @@ -58,6 +120,23 @@ public static NetworkEntity getClientEntityInstance(String name) {
serverEntities.clear();
}
});

Network.getSingleton().addClientShutdownListener(reason -> {
synchronized (clientEntities) {
for (NetworkEntity entity : clientEntities.values()) {
entity.removeOnShutdown();
}
clientEntities.clear();
}
});
}

public interface IConnectionPlayer {
void onConnection(ConnectedClient client);
}

public interface IDisconnectionPlayer {
void onDisconnection(ConnectedClient client);
}

private final String name;
Expand All @@ -67,11 +146,13 @@ public static NetworkEntity getClientEntityInstance(String name) {

private boolean isRemoved = false;

private final ModdedClient clientInstance = Network.getSingleton().getClient();
private final ConnectedClientList clients = new ConnectedClientList();

@Deprecated(since = "Zote")
private JobExecutor clientExecutor = Network.getSingleton().getClientThreadJobExecutor();
private JobExecutor serverExecutor = Network.getSingleton().getServerThreadJobExecutor();
private IConnectionPlayer connectionPlayerListener = (client) -> {};
private IDisconnectionPlayer disconnectionPlayerListener = (client) -> {};

protected NetworkEntity(NetworkEntityType type, Object target, String name, boolean isServer) {
if (type == null) {
Expand All @@ -91,12 +172,14 @@ protected NetworkEntity(NetworkEntityType type, Object target, String name, bool
public void onAdd(ConnectedClient client) {
if (!isRemoved) {
client.send("system.entity.add#" + type.getTypeName() + "#" + name, type.newClientAddPacket(NetworkEntity.this, client));
connectionPlayerListener.onConnection(client);
}
}

@Override
public void onRemove(ConnectedClient client) {
client.send("system.entity.remove#" + name, type.newClientRemovePacket(NetworkEntity.this, client));
disconnectionPlayerListener.onDisconnection(client);
}
});

Expand All @@ -118,6 +201,14 @@ public NetworkEntity(NetworkEntityType type) {
this(type, null);
}

public void setConnectionPlayerListener(IConnectionPlayer connectionPlayerListener) {
this.connectionPlayerListener = connectionPlayerListener;
}

public void setDisconnectionPlayerListener(IDisconnectionPlayer disconnectionPlayerListener) {
this.disconnectionPlayerListener = disconnectionPlayerListener;
}

public NetworkEntityType getType() {
return type;
}
Expand Down Expand Up @@ -146,12 +237,10 @@ public void refreshClients() {
clients.refresh();
}

@Deprecated(since = "Zote")
public JobExecutor getClientExecutor() {
return clientExecutor;
}

@Deprecated(since = "Zote")
public void setClientExecutor(JobExecutor clientExecutor) {
if (clientExecutor == null) {
throw new NullPointerException("clientExecutor cannot be null");
Expand All @@ -178,6 +267,9 @@ public void send(String name, Object data) {
if (isServer) {
ThreadTypeMarker.assertServerThread();
clients.send("system.entity.packet#" + this.name + "#" + name, data);
} else {
ThreadTypeMarker.assertClientThread();
clientInstance.send("system.entity.packet#" + this.name + "#" + name, data);
}
}
}
Expand Down Expand Up @@ -216,6 +308,10 @@ private void removeOnShutdown() {
isRemoved = true;
if (isServer) {
clients.clear();
} else {
Network.getSingleton().getInstantJobExecutor().add(() -> {
type.onClientEntityRemovedDueShutdown(this);
});
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import com.zhekasmirnov.apparatus.multiplayer.Network;
import com.zhekasmirnov.apparatus.multiplayer.ThreadTypeMarker;
import com.zhekasmirnov.apparatus.multiplayer.client.ModdedClient;
import com.zhekasmirnov.apparatus.multiplayer.server.ConnectedClient;
import com.zhekasmirnov.apparatus.multiplayer.util.list.ConnectedClientList;
import com.zhekasmirnov.apparatus.util.Java8BackComp;
import com.zhekasmirnov.innercore.api.log.ICLog;
import org.json.JSONException;
import org.json.JSONObject;
import org.mozilla.javascript.annotations.JSStaticFunction;
Expand All @@ -18,16 +18,27 @@
*/
public class SyncedNetworkData implements ConnectedClientList.Listener {
private static final Map<String, SyncedNetworkData> serverSyncedData = new HashMap<>();
@Deprecated(since = "Zote")
private static final Map<String, SyncedNetworkData> receivedSyncedData = new HashMap<>();

@JSStaticFunction
@Deprecated(since = "Zote")
public static SyncedNetworkData getClientSyncedData(String name) {
return Java8BackComp.computeIfAbsent(receivedSyncedData, name, key -> new SyncedNetworkData(name, false));
}

static {
Network.getSingleton().addClientPacket("system.synced_data.data", (JSONObject map, String meta) -> {
if (map.length() > 0) {
SyncedNetworkData data = getClientSyncedData(meta);
for (Iterator<String> it = map.keys(); it.hasNext(); ) {
String key = it.next();
try {
data.put(key, map.get(key), true);
} catch (Throwable err) {
}
}
}
}, null);

Network.getSingleton().addServerPacket("system.synced_data.data", (ConnectedClient client, JSONObject map, String meta) -> {
SyncedNetworkData data = serverSyncedData.get(meta);
if (data != null && map.length() > 0) {
Expand All @@ -43,7 +54,6 @@ public static SyncedNetworkData getClientSyncedData(String name) {
try {
val = verifier.verify(key, val);
} catch (Throwable err) {
ICLog.e("INNERCORE", "failed to run synced data verifier for key " + key, err);
}
if (val == null) {
continue;
Expand All @@ -52,7 +62,6 @@ public static SyncedNetworkData getClientSyncedData(String name) {
try {
data.put(key, map.get(key), true);
} catch (Throwable err) {
ICLog.e("INNERCORE", "failed to run synced data listener", err);
}
} catch (JSONException ignore) {
}
Expand All @@ -62,6 +71,7 @@ public static SyncedNetworkData getClientSyncedData(String name) {
}, null);

Network.getSingleton().addServerShutdownListener(server -> serverSyncedData.clear());
Network.getSingleton().addClientShutdownListener(reason -> receivedSyncedData.clear());
}

@Override
Expand All @@ -71,6 +81,7 @@ public void onAdd(ConnectedClient client) {

@Override
public void onRemove(ConnectedClient client) {

}


Expand All @@ -85,6 +96,7 @@ public interface OnDataChangedListener {
private final String name;
private final boolean isServer;

private final ModdedClient clientInstance = Network.getSingleton().getClient();
private ConnectedClientList clients = new ConnectedClientList();

private final Map<String, Object> data = new HashMap<>();
Expand Down Expand Up @@ -167,6 +179,9 @@ public void apply() {
if (isServer) {
ThreadTypeMarker.assertServerThread();
clients.send("system.synced_data.data#" + name, new JSONObject(dirtyData));
} else {
ThreadTypeMarker.assertClientThread();
clientInstance.send("system.synced_data.data#" + name, new JSONObject(dirtyData));
}
dirtyData.clear();
}
Expand All @@ -177,6 +192,13 @@ public void sendChanges() {
this.apply();
}

public void sendChangesForClient(ConnectedClient client) {
if(isServer) {
client.send("system.synced_data.data#", new JSONObject(data));
}
}


public void addOnDataChangedListener(OnDataChangedListener listener) {
dataChangedListeners.add(listener);
}
Expand Down Expand Up @@ -209,6 +231,21 @@ public String toString() {
'}';
}

public String toJSON(){
return data.toString();
}

public void fromJSON(String networkData) throws JSONException {
data.clear();

final JSONObject json = new JSONObject(networkData);
final Iterator<String> keys = json.keys();
while (keys.hasNext()) {
final String key = keys.next();
data.put(key, json.get(key));
}
}

public Object getObject(String key) {
return data.get(key);
}
Expand Down
Loading

0 comments on commit 8d3525d

Please sign in to comment.