Skip to content

Commit

Permalink
added support for loading campaign files
Browse files Browse the repository at this point in the history
  • Loading branch information
cniemira committed Jan 3, 2015
1 parent d8f7a74 commit c42208e
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 4 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ You can declare any of the following properties to configure the server:
server.port (defaults to 51234)
server.gmPassword
server.playerPassword

You can also declare the following. The actual value doesn't matter, if you set them at all, they're on.
campaign.file

Because the MapTool server must host a saved campaign, you load a .cmpgn file in the standalone server, but keep in mind that changes will have to be saved on one of the clients. You can also declare the following. The actual value doesn't matter, if you set them at all, they're on.

log.debug
server.useStrictTokenManagement
Expand Down
99 changes: 97 additions & 2 deletions src/net/rptools/maptool/server/StandaloneServer.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,51 @@
package net.rptools.maptool.server;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Set;

import net.rptools.lib.MD5Key;
import net.rptools.lib.ModelVersionManager;
import net.rptools.lib.io.PackedFile;
import net.rptools.maptool.client.AppUtil;
import net.rptools.maptool.client.AssetTransferHandler;
import net.rptools.maptool.client.MapToolRegistry;
import net.rptools.maptool.client.ServerCommandClientImpl;
import net.rptools.maptool.model.Asset;
import net.rptools.maptool.model.AssetManager;
import net.rptools.maptool.model.Campaign;
import net.rptools.maptool.model.CampaignFactory;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.model.transform.campaign.AssetNameTransform;
import net.rptools.maptool.model.transform.campaign.PCVisionTransform;
import net.rptools.maptool.server.MapToolServer;
import net.rptools.maptool.server.ServerConfig;
import net.rptools.maptool.server.ServerPolicy;
import net.rptools.maptool.transfer.AssetTransferManager;
import net.rptools.maptool.util.PersistenceUtil.PersistedCampaign;
import net.rptools.maptool.util.StringUtil;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class StandaloneServer {
private static final Logger log = Logger.getLogger(StandaloneServer.class);

private static final ModelVersionManager campaignVersionManager = new ModelVersionManager();
private static final ModelVersionManager assetnameVersionManager = new ModelVersionManager();

private static MapToolServer server;
private static ServerCommand serverCommand;

static {
PackedFile.init(AppUtil.getAppHome("tmp"));
campaignVersionManager.registerTransformation("1.3.51", new PCVisionTransform());
assetnameVersionManager.registerTransformation("1.3.51", new AssetNameTransform("^(.*)\\.(dat)?$", "$1"));
}

private static boolean haveProp(String name) {
if(System.getProperty(name) != null) {
return true;
Expand All @@ -25,12 +54,69 @@ private static boolean haveProp(String name) {

}

private static void loadAssets(Collection<MD5Key> assetIds, PackedFile pakFile) throws IOException {
pakFile.getXStream().processAnnotations(Asset.class);
String campVersion = (String)pakFile.getProperty("campaignVersion");

for (MD5Key key : assetIds) {
if (key == null) {
continue;
}

if (!AssetManager.hasAsset(key)) {
String pathname = "assets/" + key;
Asset asset;
asset = (Asset) pakFile.getFileObject(pathname);

if (asset == null) {
log.error("Referenced asset '" + pathname + "' not found while loading?!");
continue;
}
if ("broken".equals(asset.getName())) {
log.warn("Reference to 'broken' asset '" + pathname + "' not restored.");
continue;
}
if (asset.getImage() == null || asset.getImage().length < 4) {
String ext = asset.getImageExtension();
pathname = pathname + "." + (StringUtil.isEmpty(ext) ? "dat" : ext);
pathname = assetnameVersionManager.transform(pathname, campVersion);
InputStream is = pakFile.getFileAsInputStream(pathname);
asset.setImage(IOUtils.toByteArray(is));
is.close();
}

AssetManager.putAsset(asset);
serverCommand.putAsset(asset);
}
}
}

public static void loadCampaignFile(String filename) throws IOException {
File campaignFile = new File(filename);
PackedFile pakfile = new PackedFile(campaignFile);
pakfile.setModelVersionManager(campaignVersionManager);

String version = (String)pakfile.getProperty("campaignVersion");
version = version == null ? "1.3.50" : version;
PersistedCampaign persistedCampaign = (PersistedCampaign) pakfile.getContent(version);

if (persistedCampaign != null) {
server.setCampaign(persistedCampaign.campaign);

Set<MD5Key> allAssetIds = persistedCampaign.assetMap.keySet();
loadAssets(allAssetIds, pakfile);
for (Zone zone : persistedCampaign.campaign.getZones()) {
zone.optimize();
}
}
}

private static void startServer(String id, ServerConfig config, ServerPolicy policy, Campaign campaign) throws IOException {
AssetTransferManager assetTransferManager = new AssetTransferManager();
assetTransferManager.addConsumerListener(new AssetTransferHandler());
assetTransferManager.flush();

MapToolServer server = new MapToolServer(config, policy);
server = new MapToolServer(config, policy);
server.setCampaign(campaign);

if (config.isServerRegistered()) {
Expand Down Expand Up @@ -60,8 +146,9 @@ public static void main(String [] args) {
Logger.getRootLogger().setLevel(Level.INFO);
}

serverCommand = new ServerCommandClientImpl();
Campaign campaign = CampaignFactory.createBasicCampaign();

String port_number = System.getProperty("server.port");
int port;
if (port_number == null) {
Expand Down Expand Up @@ -92,5 +179,13 @@ public static void main(String [] args) {
}

log.info("Started on port " + port);

if (haveProp("campaign.file")) {
try {
loadCampaignFile(System.getProperty("campaign.file"));
} catch (IOException e) {
log.error("Unable to load campaign", e);
}
}
}
}

0 comments on commit c42208e

Please sign in to comment.