package openmods.network.rpc.targets; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import openmods.network.rpc.IRpcTarget; import openmods.network.rpc.IRpcTargetProvider; import openmods.sync.ISyncMapProvider; import openmods.sync.ISyncableObject; import openmods.sync.SyncMap; import openmods.utils.ByteUtils; public abstract class SyncRpcTarget implements IRpcTarget { private final IRpcTarget syncProvider; private ISyncableObject object; private int objectId; protected SyncRpcTarget(IRpcTarget syncProvider) { this.syncProvider = syncProvider; } protected SyncRpcTarget(IRpcTarget syncProvider, SyncMap<?> map, ISyncableObject object) { this(syncProvider); this.object = object; this.objectId = map.getId(object); } protected <P extends ISyncMapProvider & IRpcTargetProvider> SyncRpcTarget(P provider, ISyncableObject object) { this(provider.createRpcTarget(), provider.getSyncMap(), object); } @Override public Object getTarget() { return object; } @Override public void writeToStream(DataOutput output) throws IOException { syncProvider.writeToStream(output); ByteUtils.writeVLI(output, objectId); } private SyncMap<?> getSyncMap() { ISyncMapProvider provider = (ISyncMapProvider)syncProvider.getTarget(); return provider.getSyncMap(); } @Override public void readFromStreamStream(EntityPlayer player, DataInput input) throws IOException { syncProvider.readFromStreamStream(player, input); SyncMap<?> map = getSyncMap(); objectId = ByteUtils.readVLI(input); object = map.get(objectId); } @Override public void afterCall() { getSyncMap().sync(); } public static class SyncTileEntityRpcTarget extends SyncRpcTarget { public SyncTileEntityRpcTarget() { super(new TileEntityRpcTarget()); } public <P extends TileEntity & ISyncMapProvider & IRpcTargetProvider> SyncTileEntityRpcTarget(P provider, ISyncableObject object) { super(provider, object); } } public static class SyncEntityRpcTarget extends SyncRpcTarget { public SyncEntityRpcTarget() { super(new EntityRpcTarget()); } public <P extends Entity & ISyncMapProvider & IRpcTargetProvider> SyncEntityRpcTarget(P provider, ISyncableObject object) { super(provider, object); } } }