- 一、一些简单讲述
- (1)、必要基础(含模板配置下载)
- (2)、脚本讲解
- (3)、本文章主要目的以及处理方法
- 二、动手操作
- 实现
- 可修改部分
- 结果预览
为啥有这文章,当然是吃饱了撑的呗。
(1)、必要基础(含模板配置下载)你需要知道的一些小知识:
- 相关游戏:求生之路2(Left 4 Dead 2);
- vtf 喷漆在线制作: VTF Spray Converter;
- 娱乐性:纯属学习娱乐
- 专用性:这是为求生之路2游戏配置文件制作的工具,你可以当他是一个脚本 模板资源;
注意:模板资源中仅配置了一张喷漆,喷漆脚本不会和喷漆模组冲突,但游戏内自行选择的喷漆将会无效。
在了解以上知识后,那么你可以正式开始了解文章内容了
(2)、脚本讲解声明:脚本源自steam创意工坊随机喷漆模组简介的相关下载链接(可能由于个别原因已经下架,侵删)。
文件内容:
- 【文件】autoexec.cfg:游戏原有配置文件,新增部分内容。
- 【文件】start_spray.cfg:用户新增配置文件,用以配置喷漆。
- 【文件夹】random_spray:存放喷漆文件。
背景:因为vtf文件无法预览,所有我针对于所有的喷漆文件,对他们进行了内容的分类,见下图。所有文件夹下的vtf文件名称没有任何规则且随机(主要是制作的时候随便取的命名,为了快基本都是用编号命名)。
奇怪的命名:
FineA = Fine Animation = 精美的动画图片 喷漆
JKA = Jyoshi Koukousei Animation = 女高生漫画 喷漆
KHA = Kazutake Hazano Animation = 武叶佐乃漫画 喷漆
Other = … = 其他分类
RHA = Rabbit House Animation = 点兔动画 喷漆
目的:
- 将所有文件按照 # + 所属文件夹名称 + 数字编号 的格式进行重命名,同时可选择覆盖源文件或者不修改源文件,存放到指定文件夹。
- 生成start_spray.cfg配置文件,代替手动编辑配置进行新增或修改游戏用喷漆。
支持后期喷漆增量重新生成配置文件。
import java.io.*;
import java.nio.file.Files;
import java.util.HashMap;
public class RandomSAutoCreate {
public static String fileDir = "F:\GameWorking\求生之路\MOD\随机喷漆#55\自制test";//喷漆存放路径
public static String cfgFileName = "start_spray.cfg";//生成的配置文件名称
public static String cmdCode = "alias";
public static String cmdCode2 = "allspraycmd";
public static String title = "//fix infinite load bug:n" + cmdCode + " loadscript wait;n";//cfg文件开始行
public static String mainContextHead = cmdCode + " spray";
public static String mainContextCentre = " "cl_logofile random_spray/";
public static String mainContextTail = ""n";//自定义
public static String groupTitle = "cmd_spray";
public static String endResult = " exec start_spray.cfg"n";
public static int index = -1;//记录(vtf)文件数量
public static String outPathSet = "Out";//文件输出位置设置,默认路径为fileDir文件夹中新建该文件夹
public static String outPath = "";//文件输出具体位置,由程序控制
public static int space = 300;//喷漆随机延时
public static void main(String[] args) throws IOException {
File rootFile = new File(fileDir);
if(null != outPathSet && !"".equals(outPathSet)){
outPath = rootFile.getPath() + "\" + outPathSet;
new File(outPath).mkdirs();
}
if(!rootFile.exists())
System.out.println("文件路径无效!");
else{
String rootName = rootFile.getName();
File[] files = rootFile.listFiles();
if(files.length != 0){
StringBuilder stringBuilder = changeFileName(rootName, files);//复制文件并进行重命名,同时统计生成配置文件数据
stringBuilder = generateCfgLastTimeSet(stringBuilder);//对配置文件进行补充
if(index >= 1)
createStartSprayCfgFile(rootFile.getPath(), stringBuilder);//生成配置文件
}
}
}
public static StringBuilder changeFileName(String rootName, File[] files) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
if(index == -1){//根目录文件,处理配置头
stringBuilder.append(title);
index++;
}
HashMap fileIndex = new HashMap();//存储文件名与新文件名的关系
int i = 1;
for(File file : files){
if(file.isFile() && !file.getName().equals(cfgFileName)){//处理文件时排除配置文件
String fileName = file.getName();
String fileNewName = "#" + rootName + i;//新文件名称,不包含扩展名
String fileKey = rootName + fileName.substring(0, fileName.lastIndexOf("."));//以 根目录名+无扩展名文件名 为key进行储存
if(fileIndex.containsKey(fileKey)){
fileNewName = fileIndex.get(fileKey);//查询并获取key对应的文件名
}
else{
fileIndex.put(fileKey, fileNewName);//存储进hashmap缓存
i++;
}
String fileNewFullName = fileNewName + fileName.substring(fileName.lastIndexOf("."));//新文件名,包括扩展名
//处理字符串生成,仅vtf文件
if(fileName.substring(fileName.lastIndexOf(".") + 1).equals("vtf")){
stringBuilder.append(mainContextHead + index + mainContextCentre + fileNewFullName + mainContextTail);
index++;
}
if(null != outPath && !"".equals(outPath))
Files.copy(file.toPath(),new FileOutputStream(new File(outPath, fileNewFullName)));
else
file.renameTo(new File(file.getParent(), fileNewFullName));
//重命名或者移动重命名
//file.renameTo(new File(null != outPath && !"".equals(outPath) ? outPath : file.getParent(), fileNewFullName));
}
else if(file.isDirectory() && !file.getName().equals(outPathSet))//文件夹遍历处理
stringBuilder.append(changeFileName(file.getName(), file.listFiles()));
}
return stringBuilder;
}
public static StringBuilder generateCfgLastTimeSet(StringBuilder stringBuilder){
stringBuilder.append("n");
StringBuilder newStringBuilder = new StringBuilder();
StringBuilder endString = new StringBuilder();
for(int i = 1; i <= index; i++){
//处理每组开头
if(i % 20 == 1){
int groupId = i / 20 + 1;
newStringBuilder.append(cmdCode + " " + groupTitle + groupId + " "");// ==> alias cmd_spray? "
}
//处理当前项
if(i % 20 != 1)
newStringBuilder.append(" ");
newStringBuilder.append("spray" + i + "; wait " + space + ";");// ==> spray?; wait 300;
//处理结尾开头
if(i == 1)
endString.append(cmdCode + " " + cmdCode2 + " "");// ==> alias allspraycmd "
//处理每组结尾
if(i % 20 == 0 || i == index){
stringBuilder.append(newStringBuilder + ""n");//将每组配置添加进去
newStringBuilder = new StringBuilder();
if(i % 20 == 0){// ==> cmd_spray?;wait ????;
endString.append(groupTitle + i / 20 + ";wait " + 20 * space + ";");
if(i == index)
endString.append(endResult + cmdCode2 + "n");
}
else if(i == index){
endString.append(groupTitle + (i / 20 + 1) + ";wait "+ (i % 20 + 1) * space +";" + endResult + cmdCode2 + "n");// ==> exec start_spray.cfg" n allspraycmd n
}
}
}
stringBuilder.append(endString);
return stringBuilder;
}
public static void createStartSprayCfgFile(String path, StringBuilder context) throws IOException {
File file = new File(path);
if(!file.exists()) {
file.createNewFile();
}
file = new File(path, cfgFileName);
try(FileWriter fileWriter = new FileWriter(file)){
fileWriter.append(context);
}
}
}
可修改部分
结果预览fileDir:喷漆文件完整文件夹路径
outPathSet:空则直接重命名源文件,不移动位置。非空则创建一个该值的文件夹用以存放所有重命名后的文件。
space:喷漆随机延时参数(毫秒,越小能随机性越高,但消耗性能也越高,不建议小于100,推荐300)
以下为outPathSet = Out时的运行结果;生成了Out文件夹以及start_spray.cfg文件。
配置文件结果预览:



