/*
** 2012 June 3
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
package info.ata4.bspsrc.modules;
import info.ata4.bsplib.BspFileReader;
import info.ata4.bsplib.entity.Entity;
import info.ata4.bspsrc.modules.texture.TextureSource;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
/**
* BSP resource dependencies scanner.
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class BspDependencies extends ModuleRead {
public BspDependencies(BspFileReader reader) {
super(reader);
reader.loadEntities();
}
public Set<String> getMaterials() {
Set<String> materials = new TreeSet<>();
TextureSource texsrc = new TextureSource(reader);
// add all texnames
for (String texname : texsrc.getFixedTextureNames()) {
materials.add("materials/" + texname + ".vmt");
}
// add all entity materials
for (Entity ent : bsp.entities) {
try {
for (String value : ent.getValues()) {
if (value.startsWith("materials/")
|| value.endsWith(".vtf")
|| value.endsWith(".vmt")) {
String texture = texsrc.canonizeTextureName(value);
if (!texture.startsWith("materials/")) {
texture = "materials/" + texture;
}
if (!texture.endsWith(".vtf") && !texture.endsWith(".vmt")) {
texture += ".vmt";
}
materials.add(texture);
}
}
} catch (NullPointerException ex) {
}
}
return materials;
}
public Set<String> getModels() {
reader.loadStaticProps();
TreeSet<String> models = new TreeSet<>();
// add entity models
for (Entity ent : bsp.entities) {
try {
for (String value : ent.getValues()) {
if (value.endsWith(".mdl")) {
models.add(value);
}
}
} catch (NullPointerException ex) {
}
}
// add static prop models
models.addAll(bsp.staticPropName);
return models;
}
public Set<String> getSoundFiles() {
Set<String> soundFiles = new TreeSet<>();
for (Entity ent : bsp.entities) {
for (Map.Entry<String, String> kv : ent.getEntrySet()) {
String value = kv.getValue();
// raw sound extensions
if (value.startsWith("sound/")
|| value.endsWith(".wav")
|| value.endsWith(".mp3")) {
if (!value.startsWith("sound/")) {
value = "sound/" + value;
}
soundFiles.add(value);
}
}
}
return soundFiles;
}
public Set<String> getSoundScripts() {
Set<String> soundScripts = new TreeSet<>();
for (Entity ent : bsp.entities) {
for (Map.Entry<String, String> kv : ent.getEntrySet()) {
// soundscapes are not our job
if (ent.getClassName().equals("env_soundscape")) {
continue;
}
String key = kv.getKey();
String value = kv.getValue();
// heuristic soundscript detection
if (key.contains("sound") || key.contains("noise")) {
// ignore empty strings, scripted sentences and numeric values
if (value == null
|| value.length() == 0
|| value.startsWith("!")
|| value.matches("^-?[0-9]+$")) {
continue;
}
soundScripts.add(value);
}
}
}
return soundScripts;
}
public Set<String> getSoundscapes() {
Set<String> soundScapes = new TreeSet<>();
for (Entity ent : bsp.entities) {
if (ent.getClassName().equals("env_soundscape")) {
soundScapes.add(ent.getValue("soundscape"));
}
}
return soundScapes;
}
public Set<String> getParticles() {
Set<String> particles = new TreeSet<>();
for (Entity ent : bsp.entities) {
try {
if (ent.getClassName().equals("info_particle_system")) {
particles.add(ent.getValue("effect_name"));
}
} catch (NullPointerException ex) {
}
}
return particles;
}
}