[交流][教程]在游戏中显示报错和模组冲突的解决方法

[交流][教程]在游戏中显示报错和模组冲突的解决方法

sevenstars

sevenstars

当前离线

回帖317

主题22

积分174

精华3

注册时间2017-9-16

最后登录2025-3-16

在线时间381 小时

22

主题317

回帖174

积分

Lv.4 怪物猎人

Lv.4 怪物猎人, 积分 174, 距离下一级还需 26 积分

UID373726

小麦3

金锭611

下界之星0

发消息

电梯直达

楼主

发表于 2021-6-1 22:38:18

|

只看该作者

|倒序浏览

|阅读模式

IP:上海

本帖最后由 sevenstars 于 2021-6-2 18:10 编辑

先看一个图,这是手机上的效果

此教程将教会你①如何在手机上显示报错②如何自定义指令③如何解决模组冲突

玩家来反馈mod失效,但是自己按照这个方法想要复现却没发现问题,这有可能是mod冲突了。mod冲突有很多可能,有可能是一些开发者不小心把回调函数发来的字典修改了,导致下一个接收这个字典的开发者遭殃。也有可能是官方接口失效,直接返回一个None,还有各种奇怪问题。作为一个合格的开发者要尽量避免mod冲突,使自己的代码更健壮,防止玩家来反馈失效。

①如何自定义指令,用于切换报错显示(大佬级开发者可以跳过不看)

需要一个开关来切换是否显示报错。这里使用自定义指令来做这个功能,因为相比监听聊天,指令输完后,发送就会自动关闭聊天窗口,显得方便一点。最重要的是做起来容易。

打开mod的服务端py文件,监听CommandEvent。我指定回调函数名字叫OnCommand,以下回调函数实现了两个指令,分别用于开/关开发者模式

def OnCommand(self, args):

if args['command']=='/devmode true':

#设为True取消红字报错信息

args['cancel'] = True

#使用tellraw指令给玩家反馈结果,这个指令相比/say,优点是不显示前面那个名字

#CMD就是指令接口,CMD = serverApi.GetEngineCompFactory().CreateCommand(serverApi.GetLevelId()).SetCommand

CMD('/tellraw @s {"rawtext":[{"text":"§f[连锁采集]已开启开发者模式"}]}', args['entityId'])

#通知客户端,如果你想收集客户端错误的话

self.NotifyToClient(args['entityId'], 'SetDevMode', {'value':True})

#把类变量设为True

self.DevMode = True

elif args['command']=='/devmode false':

args['cancel'] = True

CMD('/tellraw @s {"rawtext":[{"text":"§f[连锁采集]已关闭开发者模式"}]}', args['entityId'])

self.NotifyToClient(args['entityId'], 'SetDevMode', {'value':False})

self.DevMode = False复制代码②如何在手机上显示报错把下面的代码,在class之前的,直接复制到服务端py文件的开头即可

# -*- coding: utf-8 -*-

import server.extraServerApi as serverApi

from functools import wraps

from traceback import format_exc

#三个全局变量,使得调用接口时方便点

CF = serverApi.GetEngineCompFactory()

LVID = serverApi.GetLevelId()

#第三个全局变量,也就是之前说的那个CMD

CMD = CF.CreateCommand(LVID).SetCommand

#一个装饰器,用来处理报错

def CatchException(originFunc):

@wraps(originFunc)

def wrapper(self, *args, **kwargs):

try:

return originFunc(self, *args, **kwargs)

except:

text = format_exc()

#text就是获取到的报错信息了,你可以在下面调用类里面的任何函数,或者直接调用官方接口

#Logger是下面的类里的函数,用来检测是不是开发者模式,

#是的话就把字符串text用/say函数显示在游戏屏幕上

self.Logger(text)

return wrapper

#这就是你的mod的服务端类

class ServerSystem(serverApi.GetServerSystemCls()):

def __init__(self, namespace, systemName):

self.DevMode = False

......

def Logger(self, text, playerId=''):

if self.DevMode:

CMD('/say @s '+text, playerId)

else:

print text复制代码然后,修饰器和日志函数都弄好了,现在就找个类函数,在它前面加上@CatchException吧,这样这个函数如果发生错误,就能在游戏里打印出来。

@CatchException

def function(self, args):

......复制代码③如何解决模组冲突

将mod按教程更新,加入开发者模式和报错系统,如果玩家来反馈mod失效,就告诉他指令,让他复制后打开开发者模式,然后让他把报错截图给你看就行。当然,如果还是没有报错,多半是你的代码逻辑有问题。建议自己在一些关键节点调用Logger代替print。这样,玩家打开开发者模式后,能清楚的看到代码执行的流程,方便排查问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

相关推荐

青天小县令手游试玩评测 九品芝麻官也能当王爷![多图]
月饼能放几天,月饼最多可以放多久
beat365官方app安卓版下载

月饼能放几天,月饼最多可以放多久

📅 07-26 👁️ 8678
光辉女郎是什么在哪里
beat365官方app安卓版下载

光辉女郎是什么在哪里

📅 07-13 👁️ 9017