编写脚本文件注册角色
- 根据副包脚本文件结构,在ModServer文件夹下创建mianshen.py文件,并在该python文件中定义WishDictList(dictlist)变量并填写抽卡数据信息、定义RenderList(dictlist)变量并填写角色数据信息。

- 根据资产规范及导入导入对应的资产文件,以下仅展示部分:


- 导入免神角色数据、抽卡数据
from mianshen import RenderList, WishDictList
- 服务端代码
获取主包服务端系统实例并注册角色数据、抽卡数据(过于传统)
def __init__(self, namespace, systemName):
...
self.AddTimes = 0
self.MianPack = None
self.GetMainPackSystem()
def GetMainPackSystem(self):
logging.debug('{0}'.format(self.AddTimes))
try:
self.MianPack = serverApi.GetSystem('cyzs3', 'cyzs3ServerSystem')
if self.AddTimes <= 10:
if not self.MianPack:
compTimer.AddTimer(1.0, self.GetMainPackSystem)
self.AddTimes += 1
else:
self.MianPack.AddOtherRenderList(RenderList)
self.MianPack.AddOtherWishList(WishDictList)
except:
if self.AddTimes <= 10:
compTimer.AddTimer(1.0, self.GetMainPackSystem)
- 客户端代码
点击此处下载并解压出Cyzs3Lib.py文件,并在客户端继承。
# 这里是因为将Cyzs3Lib.py放在了ModClient/cyzs3下,因此这样导入
from cyzs3.Cyzs3Lib import Cyzs3Lib
class ***ClientSystem(ClientSystem, Cyzs3Lib):
...
编写脚本文件角色必要属性
:::warning{title=注意} 这三个函数只有RenderLevel变量有用,其他的还是空壳。 ::: 由于免神底层代码问题,目前需要在服务端、客户端定义3个函数(GetRenderHealth, GetRenderDamage, GetRenderExp)来定义角色属性。
- 客户端代码
由于客户端系统继承了Cyzs3Lib,可以直接触发这3个函数的补全库,因此直接在客户端定义这3个函数
def GetRenderHealth(self, RenderLevel=1):
Health = 20.0
AddPercent = 1.0735
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Health *= AddPercent
else:
for i in range(0, 80):
Health *= AddPercent
for i in range(0, RenderLevel - 80):
Health *= 1.013
return int(Health)
def GetRenderDamage(self, RenderLevel=1, AttackLevel=1, RenderId=None): # type: (int, int, any) -> float
Damage = 10.0
AddPercent = 1.070
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Damage *= AddPercent
else:
for i in range(0, 80):
Damage *= AddPercent
for i in range(0, RenderLevel - 80):
Damage *= 1.0175
return int(Damage)
def GetRenderExp(self, RenderLevel=1): # type: (int) -> float
Exp = 1000.0
AddPercent = 1.10
LastAddPercent = 1.15
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Exp *= AddPercent
else:
for i in range(0, 80):
Exp *= AddPercent
for i in range(0, RenderLevel - 80):
Exp *= LastAddPercent
return int(Exp)
- 服务端代码
直接将客户端的这段代码复制到服务端即可
def GetRenderHealth(self, RenderLevel=1):
Health = 20.0
AddPercent = 1.0735
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Health *= AddPercent
else:
for i in range(0, 80):
Health *= AddPercent
for i in range(0, RenderLevel - 80):
Health *= 1.013
return int(Health)
def GetRenderDamage(self, RenderLevel=1, AttackLevel=1, RenderId=None): # type: (int, int, any) -> float
Damage = 10.0
AddPercent = 1.070
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Damage *= AddPercent
else:
for i in range(0, 80):
Damage *= AddPercent
for i in range(0, RenderLevel - 80):
Damage *= 1.0175
return int(Damage)
def GetRenderExp(self, RenderLevel=1): # type: (int) -> float
Exp = 1000.0
AddPercent = 1.10
LastAddPercent = 1.15
if RenderLevel <= 80:
for i in range(0, RenderLevel):
Exp *= AddPercent
else:
for i in range(0, 80):
Exp *= AddPercent
for i in range(0, RenderLevel - 80):
Exp *= LastAddPercent
return int(Exp)
:::success{title=基本完成} 普通角色写到这里便基本完成了制作,更高级的角色逻辑需要根据这篇手动编写伪继承脚本逻辑 :::
编写伪继承脚本逻辑
当编写角色数据信息并拒绝使用主包逻辑时,需要手动编写伪继承逻辑,否则对应功能将会失效。这些伪继承函数在客户端Cyzs3Lib拥有继承函数补全库。以下是对照表:
| 角色数据信息Key | 该Key的Value | 副包客户端伪继承函数名 |
|---|---|---|
| IsMainPackPlayerAttack | False | PlayerAttack |
| IsMainPackPlayerSkill | False | PlayerSkill |
| IsMainPackPlayerShanBi | False | 该项暂未更新 |
| IsMainPackPlayerBiShaJi | False | PlayerBiShaJi |
- 使用伪继承时,推荐在客户端系统实例的
__init__函数中添加主包ModName和主包ClientSystem,以方便获取:
def __init__(self, namespace, systemName):
...
self.MainPackModName = 'cyzs3'
self.MainPackClientSystem = 'cyzs3ClientSystem'
- 当伪继承后仍然需要使用原版功能,然后自己再额外添加一些触发功能,这个时候就派上用场了:
| 参数名 | 数据类型 | 说明 |
|---|---|---|
| RenderDict | dict | 该副包角色数据 |
| Type | str | 该按钮触发模式:弹起('Up') 还是按下('Down'),可以用于制作蓄力 |
下面的方法便是最为典型的仍然需要使用原版功能并额外添加一些功能:
:::info{title=提示}
如果想要完全重写,就可以自己在这个函数中从0开始写逻辑
:::
def PlayerBiShaJi(self, RenderDict, Type): # type: (dict, str) -> None
# 获取主包客户端系统实例
MainPackClient = clientApi.GetSystem(self.MainPackModName, self.MainPackClientSystem)
# 暂时使用主包逻辑
RenderDict['IsMainPackPlayerBiShaJi'] = True
# 重新调用主包逻辑,这样就不会因为IsMainPackPlayerBiShaJi为False而再来到这个函数中
MainPackClient.PlayerBiShaJi(RenderDict, Type)
# 调用完主包逻辑后,恢复伪继承
RenderDict['IsMainPackPlayerBiShaJi'] = False
# 额外添加的一些小功能
self.NotifyToServer('BroadcastToAllClientEvent', {
'EventName': 'BiShaJiSfxEvent',
'Dict': playerId
})