EMUnion / MirrorServerReforged

适用于MCDR 2.0+的镜像服插件
Apache License 2.0
20 stars 1 forks source link

同步世界失败 #4

Closed Allenobbin closed 1 year ago

Allenobbin commented 1 year ago

控制台提示说'cp' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

GamerNoTitle commented 1 year ago

MCDR版本和系统信息发一下 (我猜你应该是Windows?

Allenobbin commented 1 year ago

MCDR2.7.2 64 位操作系统, 基于 x64 的处理器 Windows 11 家庭中文版

Allenobbin commented 1 year ago

能解决吗?

GamerNoTitle commented 1 year ago

用的Windows Terminal/Powershell/Command Prompt(cmd)的哪一个?

Allenobbin commented 1 year ago

cmd

GamerNoTitle commented 1 year ago

cmd还真没cp命令,PowerShell和Terminal有 =-= 晚点看看怎么判断终端类型吧

Allenobbin commented 1 year ago

GamerNoTitle commented 1 year ago

我看看如果是判断出cmd的话改成用xcopy好了 晚点改

Allenobbin commented 1 year ago

关于使用还有一些细节问题。镜像服的世界文件夹是不是只能命名为world并放在服务器目录中。命名成别的名字并与镜像服的服务器配置中的level-name匹配是不是也能用?

GamerNoTitle commented 1 year ago

是的 但是要注意修改配置 文件夹名字在插件的配置文件里面是可以改的

GamerNoTitle commented 1 year ago

只要匹配就可以的

Allenobbin commented 1 year ago

所以生存服和镜像服的世界文件夹名称必须一样吗?

Allenobbin commented 1 year ago

我是不是可以这么理解,当使用!!msr sync时,插件会在镜像服的服务器目录中去寻找插件的配置文件里的world文件夹的名称,并将生存服正在运行的地图搬到那个文件夹去。

GamerNoTitle commented 1 year ago

1、最好是一样 因为复制的时候文件夹名字是不会进行修改的 本来也就没想到会有人进行修改 2、你的理解是对的

GamerNoTitle commented 1 year ago

复制的逻辑是这么写的

@new_thread('MSR-Sync')
def ServerSync(InterFace):
    global syncFlag
    syncFlag = True
    start_time = datetime.datetime.now()
    ignore = shutil.ignore_patterns('session.lock')
    if MCDR:
        if os.path.exists('./Mirror/server/world'):
            shutil.rmtree('./Mirror/server/world')
        # shutil.copytree('./server/world/',
        #                 './Mirror/server/world', ignore=ignore)
        os.system(f'cp -r ./server/world ./Mirror/server/world')
    else:
        for world in config['world']:
            shutil.rmtree('./Mirror/{}/'.format(world))
            # shutil.copytree('./server/world/', './Mirror/world/', ignore=ignore)
            os.system(f'cp -r ./server/{world} ./Mirror/{world}')
    end_time = datetime.datetime.now()
    InterFace.execute(
        f'say §b[MirrorServerReforged] §6同步完成!用时{end_time-start_time}')
    syncFlag = False

def Sync():
    InterFace = GetInterFace()
    if syncFlag:
        InterFace.execute(
            'say §b[MirrorServerReforged] §d服务器正在进行同步,请不要重复提交同步任务!')
    else:
        InterFace.execute('say §b[MirrorServerReforged] §6正在同步服务器地图……')
        InterFace.execute('save-off')
        InterFace.execute('save-all')
        ServerSync(InterFace)
        InterFace.execute('save-on')

执行!!msr sync的时候是调用了Sync函数,Sync函数里面去开多个线程调用ServerSync函数,ServerSync函数进行服务器的同步操作 (刚好看到了个逻辑bug一会一起修了)

Allenobbin commented 1 year ago

我的生存服存档不是放在服务器目录里的,开启生存服的时候是使用的--universe 和--world选项,我怕插件识别不出来。

GamerNoTitle commented 1 year ago

你是什么服务器类型?不是Vanilla

Allenobbin commented 1 year ago

是,是装了Fabric的服务器。--universe和--world是原版的功能

GamerNoTitle commented 1 year ago

这两个启动参数具体的作用是什么?

Allenobbin commented 1 year ago

--universe <字符串> 指定查找world文件夹的位置(默认为.,即当前目录)。 --world <字符串> 指定一个level.dat所在文件夹的名称。

GamerNoTitle commented 1 year ago

好像我应该加一个世界位置的配置项?不过你这个不是普遍情况……

Allenobbin commented 1 year ago

我用这两个参数来启动我单人游戏的存档,以便在服务器上和朋友们一起玩。

GamerNoTitle commented 1 year ago

copy的问题我已经改完了 不过你这个嘛……

@new_thread('MSR-Sync')
def ServerSync(InterFace):
    global syncFlag
    syncFlag = True
    start_time = datetime.datetime.now()
    ignore = shutil.ignore_patterns('session.lock')
    if MCDR:
        for world in config['world']:
            if os.path.exists(f'./Mirror/server/{world}'):
                shutil.rmtree(f'./Mirror/{world}/')
            # shutil.copytree('./server/world/', './Mirror/world/', ignore=ignore)
            if sys.platform == 'win32':
                os.system(f'xcopy ./server/{world} ./Mirror/server/{world} /e /h /k /y')
            else:
                os.system(f'cp -r ./server/{world} ./Mirror/server/{world}')
    else:
        for world in config['world']:
            if os.path.exists(f'./Mirror/server/{world}'):
                shutil.rmtree(f'./Mirror/{world}/')
            if sys.platform == 'win32':
                os.system(f'xcopy ./server/{world} ./Mirror/{world} /e /h /k /y')
            else:
                os.system(f'cp -r ./server/{world} ./Mirror/{world}')
    end_time = datetime.datetime.now()
    InterFace.execute(
        f'say §b[MirrorServerReforged] §6同步完成!用时{end_time-start_time}')
    syncFlag = False

def Sync():
    InterFace = GetInterFace()
    if syncFlag:
        InterFace.execute(
            'say §b[MirrorServerReforged] §d服务器正在进行同步,请不要重复提交同步任务!')
    else:
        InterFace.execute('say §b[MirrorServerReforged] §6正在同步服务器地图……')
        InterFace.execute('save-off')
        InterFace.execute('save-all')
        ServerSync(InterFace)
        InterFace.execute('save-on')
GamerNoTitle commented 1 year ago

emmmm 那你自己改下文件的位置吧 我先把commit推上去 然后我告诉你在哪里改

Allenobbin commented 1 year ago

当然,我可以把存档换个位置,问题不大。如果你的插件能有这种功能我也支持。

GamerNoTitle commented 1 year ago

能写是能写 只不过没那么快

Allenobbin commented 1 year ago

好的,多谢。

GamerNoTitle commented 1 year ago

copy的那个问题你试试刚发的1.0.6插件 应该是解决了的

Allenobbin commented 1 year ago

它提示说无效的参数数量

Allenobbin commented 1 year ago

我检查了一下,好像没成。

GamerNoTitle commented 1 year ago

emmmm 完整的是啥发一下 刚刚睡觉去了

GamerNoTitle commented 1 year ago

好吧我知道了 应该直接用copy而不是xcopy

GamerNoTitle commented 1 year ago

改好了 重新下一下1.0.6版本

Allenobbin commented 1 year ago

它提示说 命令语法不正确

GamerNoTitle commented 1 year ago

=-= 我等会看看 我这里明明可以的……

GamerNoTitle commented 1 year ago

再试试?我把所有的可选参数删掉了,应该能够兼容多数电脑的

Allenobbin commented 1 year ago

不行,它还是提示“命令语法不正确”。

GamerNoTitle commented 1 year ago

你下了新的插件嘛 我是更在了Release里面

Allenobbin commented 1 year ago

是的

GamerNoTitle commented 1 year ago

在插件目录下开个cmd 运行这个 certutil -hashfile .\MirrorServerReforged-v1.0.6.mcdr md5 结果发下

Allenobbin commented 1 year ago

MD5 的 .\MirrorServerReforged-v1.0.6.mcdr 哈希: 1fe957d8041739294b9542e078c8422c CertUtil: -hashfile 命令成功完成。

GamerNoTitle commented 1 year ago

是最新的呀 今晚再看吧……

GamerNoTitle commented 1 year ago

我知道了 Windows的垃圾机制 路径使用右斜杠\来分割的 用左斜杠/会被Windows认为是参数……

GamerNoTitle commented 1 year ago

刚发了个新版 允许用户自定义存档位置了 你可以试试 顺带解决了Windows的同步问题

Allenobbin commented 1 year ago

试了一下,服务器地图可以同步了。

GamerNoTitle commented 1 year ago

OK 有啥问题再开issue找我吧