package org.starmod.net.handler.sync;
import io.netty.buffer.ByteBuf;
import org.starmod.net.NetworkClient;
import org.starmod.ServerRegistry;
import org.starmod.net.Handler;
import org.starmod.net.command.sync.Synchronize;
import org.starmod.net.object.NetworkObject;
import org.starmod.net.object.Sendable;
import org.starmod.net.object.SendableRegistry;
public class SynchronizeHandler implements Handler<Synchronize> {
@Override
public void handle(NetworkClient modClient, Synchronize cmd) {
for (int i = 0; i < cmd.getIds().length; i++) {
int id = cmd.getIds()[i];
if (ServerRegistry.containsLocal(id)) {
updateObject(cmd.getBuf(), id);
} else {
newObject(cmd.getBuf(), cmd.getKeys()[i]);
}
}
}
public void updateObject(ByteBuf buf, int id) {
NetworkObject netObj = ServerRegistry.getRemote(id);
netObj = NetworkObject.decode(buf, netObj);
Sendable sendable = ServerRegistry.getLocal(id);
sendable.update(netObj);
}
public void newObject(ByteBuf buf, byte key) {
Sendable sendable = SendableRegistry.getSendable(key);
NetworkObject netObj = sendable.getNetworkObject();
netObj = NetworkObject.decode(buf, netObj);
sendable.initialize(netObj);
int id = netObj.id.getValue();
ServerRegistry.addLocal(id, sendable);
ServerRegistry.addRemote(id, netObj);
}
}