Files
netease-modsdk-wiki/docs/mconline/30-网络服插件教程/4-插件制作/6-插件编写——制作篇(下).md
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

123 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 插件编写——制作篇(下)
### Game/Lobby编写
接下来开始制作Game/Lobby服的插件我们按照官方要求的规范更改文件夹soldierLottery的命名。并创建脚本文件夹开始编写脚本。
同时由于我们这个插件不需要行为包和资源包,所以将对应文件夹删除。
更改命名后文件夹名字如下
<img src="./images/code-8.png" style="zoom:200%;" />
然后开始编写Game/Lobby和Service通信的部分基础部分将不再过多讲解。
**下方编写的都是```lotteryServerSystem.py```中的代码**
```python
def GetPlayerRandomNumber(self, uid, callback):
"""
为玩家获取一个随机彩票号码
:param uid: 玩家UID
:param callback:int 参数唯一,随机彩票号码,请求失败值为-1
:return:
"""
self.RequestToServiceMod(ServiceServerType, GetPlayerRandomNumber, {"player": uid},
lambda suc, args: callback(args["msg"]) if suc else callback(-1))
```
例如这个接口调用后就可以为玩家申请一个随机彩票号码然后将号码带入回调函数的参数中并调用。Service端的对应相关代码可以在上一节的最后找到。
同时我们还需要监听玩家加入和退出并根据是否转服判断是否需要通知Service服务器对缓存进行处理。
```python
def OnJoin(self, args):
playerId = args["id"]
uid = args["uid"]
self.idUidMap[playerId] = uid
if not args["isTransfer"]:
print "玩家{}加入,进行缓存".format(uid)
self.CachePlayer(uid)
def OnLeave(self, args):
playerId = args["id"]
uid = args["uid"]
del self.idUidMap[playerId]
if not args["isTransfer"]:
print "玩家{}退出,删除缓存".format(uid)
self.SavePlayer(uid)
def CachePlayer(self, uid):
def callback(suc, args):
print "缓存玩家: suc:{} ,args:{}".format(suc, args)
self.RequestToServiceMod(ServiceServerType, PlayerJoin, {"player": uid}, callback)
def SavePlayer(self, uid):
def callback(suc, args):
print "保存玩家: suc:{} ,args:{}".format(suc, args)
self.RequestToServiceMod(ServiceServerType, PlayerLeave, {"player": uid}, callback)
```
然后再监听聊天事件判断玩家是否输入cp1,cp2,并编写相应逻辑。
```python
def OnServerChat(self, args):
playerId = args["playerId"]
message = args["message"]
uid = self.idUidMap[playerId]
if message == "cp1":
args["cancel"] = True
def callback(number):
if number != -1:
self.alertSystem.Alert(playerId, '§f本次领取的号码是 §a{}'.format(number), 3)
else:
self.alertSystem.Alert(playerId, '§f今日领取的号码已超过上限', 3)
self.GetPlayerRandomNumber(uid, callback)
elif message == "cp2":
args["cancel"] = True
def callback(numbers):
if numbers is None:
self.alertSystem.Alert(playerId, '§c获取失败请稍后再试', 3)
return
size = len(numbers)
if size == 0:
self.alertSystem.Alert(playerId, '§c你还没有领取任何号码', 3)
else:
self.alertSystem.Alert(playerId, '§c今日已领取{}个号码: {}'.format(size, self.FormatNumbers(numbers)), 3)
self.GetPlayerNumbers(uid, callback)
```
这里使用调用了neteaseAlert插件来发送提示我们可以到官方插件库中下载neteaseAlert并查看readme.txt找到我们需要的接口文档。
> 1服务端向某一个玩家弹出一个提示内容最多显示五行
> 函数Alert(playerId, text, seconds, xratio, yratio, priority)
> 参数:
> playerId: 玩家的playerId
> text: 需要提示的内容
> seconds: 内容显示停留的秒数不传则用mod.json的default_show_time设置
> xratio: 提示背景框中心与主屏横轴的位置比0-1之间的小数不传则用mod.json的default_xratio设置
> yratio: 提示背景框中心与主屏纵轴的位置比0-1之间的小数不传则用mod.json的default_yratio设置
> priority: 消息显示优先级数值越大优先级越大。优先级大于0时消息按照优先级排序顺序显示优先级小于0时覆盖显示当前消息并清空之前保存的消息。默认优先级是-1
> 示例:
> import server.extraServerApi as serverApi
> alertSystem = serverApi.GetSystem("neteaseAlert", "neteaseAlertDev")
> alertSystem.Alert(playerId, '§c摊位方块只能放置于规定的摆摊区域。', 2, 0.5, 0.8, 50) # 提示框中点位于(横屏水平方向大小*0.5, 横屏竖直方向大小*0.8)处
### 代码下载
教程中仅展示了部分代码,全部代码可以在这里下载。
[彩票插件——lobby/game部分](https://g79.gdl.netease.com/pluginguide04-05.zip)
随后我们就可以部署并测试啦!