admin
发表于 2021-7-22 21:54:08
NPC基础写法
范本说明
下面用肉店的脚本来做基础说明 蓝色字为本身脚本的注解内容红色字为注解说明,请认真看
# -*- coding: utf-8 -*- 有中文,如果是纯英文的,可以不加这行
#载入模块SYS
import sys
#引用模块的地址
import Globals 调用Globals
import clr
clr.AddReferenceToFile("Library.dll")
from Library import *
import NpcEvent
import collections 从这里往上,基本都直接复制就行了
######################################################
#本函数为程序调用的固定格式 函数名和参数数量不要修改
#OnClick(Self, Sender, Menu)
##参数 Self:NPC的类
## Sender:玩家的类
## Menu:菜单的类
#####################################################
def OnClick(args): # 对NPC进行鼠标点击处理
Self = args
Sender = args
Menu = args 这里是固定格式,不能变
Dict={} Dict对象
#红名判断
if(Sender.Stats > 199): 如果 玩家的PK值大于199,那么就是红名了,就显示拒绝交易对话框
str = """请你离开。
我不想和红名交易。
[离开:0]"""
#跳转菜单1商品 点击按钮1以后跳转到菜单1这里
elif (Menu == 1):
Dict['Goods'] =goods # 定义可购买商品
Dict['Types'] =types # 定义类别
Dict['DialogType'] = NPCDialogType.BuySell# 类型为Library.Enums里的买卖类 BuySell为买卖
str = """如果您有什么需要,请告诉我。。。。。。 NPC显示的文字内容
我的存货越来越少了,所以我会收购一些高质量的肉。
[返回:5]
[离开:0]"""
#主菜单 如果不是红名,就跳转到主菜单
else:
str = """欢迎光临我的店。
我经营多年,刀法举世无双。
我能为您做些什么?
[查看 商品:1] 按钮1查看商品
[离开:0]"""
Dict['Say']=str # 定义聊天框对话内容
return Dict
#类型为 Library.Enums里的肉类
types = 这里其实代表两个意思,比方你写了武器类,那么这里一个是可以买卖武器,如果你增加了修理按钮,那么对应这里可以修理武器
#商品列表'商品名称'商品价格比例,固定格式为float(1.0)比例倍数
goodslist=[
('鸡肉',float(1)),
('猪肉',float(1)),
('鹿肉',float(1)),
('牛肉',float(1)),
('狼肉',float(1)),]
goods = collections.OrderedDict(goodslist)
#NPC调用定义
NpcEvent.add_listener(15,"OnClick",OnClick) 15是NPC的Index,代表哪个NPC调用这个脚本
admin
发表于 2021-7-22 21:54:27
传送基础写法
范本说明
下面用比奇城的脚本来做基础说明 蓝色字为本身脚本的注解内容红色字为注解说明,请认真看
# -*- coding: utf-8 -*- 有中文,如果是纯英文的,可以不加这行
#载入模块SYS
import sys
#引用模块的地址
from Globals import *
import collections
import clr
clr.AddReferenceToFile("Library.dll")
from Library import *
import Server
Server.Envir.SEnvir.Log(__name__+"导入")
import NpcEvent 从这里往上,基本都直接复制就行了
######################################################
#本函数为程序调用的固定格式 函数名和参数数量不要修改
#OnClick(Self, Sender, Menu)
##参数 Self:NPC的类
## Sender:玩家的类
## Menu:菜单的类
#####################################################
def OnClick(args): 对NPC进行鼠标点击处理
Self = args
Sender = args
Menu = args 这里是固定格式,不能变
Dict={} Dict对象
#红名判断
if(Sender.Stats > 199): 如果 玩家的PK值大于199,那么就是红名了,就显示拒绝交易对话框
str = """请你离开。
我不想和红名交易。
[离开:0]"""
#飞比奇
elif(Menu == 1):
if (Sender.Gold < 10000):
str = """你没有足够的金币,无法传送。
[离开:0]"""
else: #地图传送限制,用于版本设置,判断排行榜等级 人物
not CanMoveInMap(99,1) #排行榜等级大于多少级,达到几个人,这个地图才能传送
return
else:
SubGold(Sender,10000)
Sender.TeleportByMapIndex(1,140,263) #飞地图ID X坐标 Y坐标
return
#自由通行
elif(Menu == 2):
str = """我知道你想传送到哪里?
[神舰:21] 自由通行
[熔岩地带:22] 自由通行 (等级 45+)
[海盗洞穴:23] 自由通行 (等级 45+)
[离开:0]"""
#神舰
elif(Menu == 21):
if(Sender.GetItemCount("自由通行证") < 1):
str = """无法传送到目的地,
没有自由通行证。
[离开:0]"""
else:
Sender.TakeItem("自由通行证",1)
Sender.TeleportByMapIndex(68,43,62) #飞地图ID X坐标 Y坐标
return
#熔岩地带
elif(Menu == 22):
if(Sender.Level < 45):
str = """无法传送到目的地,
等级没有达到要求。
[离开:0]"""
elif(Sender.GetItemCount("自由通行证") < 1):
str = """无法传送到目的地,
没有自由通行证。
[离开:0]"""
else:
Sender.TakeItem("自由通行证",1)
Sender.TeleportByMapIndex(332,19,27) #飞地图ID X坐标 Y坐标
return
#海盗洞穴
elif(Menu == 23):
if(Sender.Level < 45):
str = """无法传送到目的地,
等级没有达到要求。
[离开:0]"""
elif(Sender.GetItemCount("自由通行证") < 1):
str = """无法传送到目的地,
没有自由通行证。
[离开:0]"""
else:
Sender.TakeItem("自由通行证",1)
Sender.TeleportByMapIndex(301,162,209) #飞地图ID X坐标 Y坐标
return
#主菜单
else:
str = """选择目的地
[比奇县:1] 10,000 金币
[自由通行:2]
[离开:0]"""
Dict['Say']=str #定义聊天框对话内容
return Dict
#NPC调用定义
NpcEvent.add_listener(124,"OnClick",OnClick) 124是NPC的Index,代表哪个NPC调用这个脚本
admin
发表于 2021-7-22 21:56:49
跨日触发
函数原型:
def OnDayChange(args):
Sender=args
参数:
sender=args #玩家
功能:
服务器跨天触发,主要用于清除或重置服务器日变量;每天晚上12点触发;
示例:
def OnDayChange(args):
Sender=args
PlayerSetTempV(Sender,TK_WXDZ_ONOFF,0) #需重置或清除的服务器日变量
Server.Envir.SEnvir.Log("隔天调用成功")
admin
发表于 2021-7-22 21:57:03
跨周触发
函数原型:
def OnWeekChange(args):
Sender=args
参数:
sender=args #玩家
功能:
服务器跨周触发,主要用于清除或重置服务器周变量;每周的第一天晚上0点触发;
示例:
def OnWeekChange(args):
Sender=args
PlayerSetTempV(Sender,TK_WXDZ_ONOFF,0) #需重置或清除的服务器周变量
Sender.Connection.ReceiveChat("今天是周一了",MessageType.System)
Server.Envir.SEnvir.Log("隔周调用成功")
admin
发表于 2021-7-22 21:57:27
跨月触发
函数原型:
def OnMonthChange(args):
Sender=args
参数:
sender=args #玩家
功能:
服务器跨月触发,主要用于清除或重置服务器月变量;每月的第一天晚上0点触发;
示例:
def OnMonthChange(args):
Sender=args
PlayerSetTempV(Sender,TK_WXDZ_ONOFF,0) #需重置或清除的服务器月变量
Sender.Connection.ReceiveChat("又是一个新的月份",MessageType.System)
Server.Envir.SEnvir.Log("隔月调用成功")
admin
发表于 2021-7-22 21:57:46
进入游戏触发
函数原型:
def OnStartGame(args):
Sender = args
参数:
sender=args #玩家
功能:
玩家进入游戏时触发回调;
示例:
def OnStartGame(args):
Sender = args
for player in SEnvir.Players:
if(player is None):
continue
player.Connection.ReceiveChat("玩家【{}】加入游戏".format(Sender.Name),MessageType.System)
admin
发表于 2021-7-22 21:58:00
离开游戏触发
函数原型:
def OnStopGame(args):
Sender = args
参数:
sender=args #玩家
功能:
玩家离开游戏时触发回调;
示例:
def OnStopGame(args):
Sender = args
for player in SEnvir.Players:
if(player is None):
continue
player.Connection.ReceiveChat("玩家【{}】离开游戏".format(Sender.Name),MessageType.System)
admin
发表于 2021-7-22 21:58:14
死亡触发
函数原型:
def OnDie(args):
Sender=args
参数:
sender=args #玩家
功能:
玩家死亡时触发回调;
示例:
def OnDie(args):
Sender=args
Sender.Connection.ReceiveChat("我死了",MessageType.System)
admin
发表于 2021-7-22 21:58:58
创建NPC
函数原型:
map.CreateNpc(...) #map表示地图对象
参数:
(int x, int y, int NpcIndex)
(int x,int y ,string NpcName)
x: x坐标
y: y坐标
NpcIndex: NPC的ID
NpcName: NPC的名字
功能:
在指定的坐标刷NPC,支持静态地图和副本地图
示例:
map.CreateNpc(25,23,'补给师') #在地图的25,23 坐标刷出补给师的NPC
admin
发表于 2021-7-22 21:59:22
删除NPC
函数原型:
map.DeleteNpc(...) #map表示地图对象
参数:
( int NpcIndex)
(string NpcName)
NpcIndex: NPC的ID
NpcName: NPC的名字
功能:
删除指定的NPC,支持静态地图和副本地图
示例:
map.DeleteNpc('补给师') #将地图里补给师的NPC删除