栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【求生之路2】Java 自动生成随机喷漆配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【求生之路2】Java 自动生成随机喷漆配置

Java 求生之路2随机喷漆脚本vtf文件统一重命名以及生成配置文件
  • 一、一些简单讲述
    • (1)、必要基础(含模板配置下载)
    • (2)、脚本讲解
    • (3)、本文章主要目的以及处理方法
  • 二、动手操作
    • 实现
    • 可修改部分
    • 结果预览

一、一些简单讲述

为啥有这文章,当然是吃饱了撑的呗。

(1)、必要基础(含模板配置下载)

你需要知道的一些小知识:

  1. 相关游戏:求生之路2(Left 4 Dead 2);
  2. vtf 喷漆在线制作: VTF Spray Converter;
  3. 娱乐性:纯属学习娱乐
  4. 专用性:这是为求生之路2游戏配置文件制作的工具,你可以当他是一个脚本 模板资源;

注意:模板资源中仅配置了一张喷漆,喷漆脚本不会和喷漆模组冲突,但游戏内自行选择的喷漆将会无效。

在了解以上知识后,那么你可以正式开始了解文章内容了

(2)、脚本讲解

声明:脚本源自steam创意工坊随机喷漆模组简介的相关下载链接(可能由于个别原因已经下架,侵删)。

文件内容:

  1. 【文件】autoexec.cfg:游戏原有配置文件,新增部分内容。
  2. 【文件】start_spray.cfg:用户新增配置文件,用以配置喷漆。
  3. 【文件夹】random_spray:存放喷漆文件。
(3)、本文章主要目的以及处理方法

背景:因为vtf文件无法预览,所有我针对于所有的喷漆文件,对他们进行了内容的分类,见下图。所有文件夹下的vtf文件名称没有任何规则且随机(主要是制作的时候随便取的命名,为了快基本都是用编号命名)。

奇怪的命名:
FineA = Fine Animation = 精美的动画图片 喷漆
JKA = Jyoshi Koukousei Animation = 女高生漫画 喷漆
KHA = Kazutake Hazano Animation = 武叶佐乃漫画 喷漆
Other = … = 其他分类
RHA = Rabbit House Animation = 点兔动画 喷漆

目的:

  1. 将所有文件按照 # + 所属文件夹名称 + 数字编号 的格式进行重命名,同时可选择覆盖源文件或者不修改源文件,存放到指定文件夹。
  2. 生成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文件。


配置文件结果预览:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013223.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号