配置游戏中心GameCenter
- 打开软件
游戏引擎目录\MirServer\GameCenter.exe
,选中自动配置服务器目录,确认后重启软件 - 配置登录网关,如下图,剩下的一直点下一步即可.
生成登录器
- 在
引擎目录\MirServer
目录下创建文件夹登录器XXX
(可以是任意名字) - 将
MakeGameLogin.exe
同级补丁文件夹
目录下的文件夹复制到登录器XXX,一般只需要如下图几个文件夹 - 打开
MakeGameLogin.exe
,配置步骤如下: - 前往haom2下周更新包
- 将
HaoM2[XXX]\登录器
下的MakeGameLogin.exe
,GuiEdit.dll
,D3DX81ab.dll
复制到老版本登录器生成器覆盖. - 打开
HaoM2[XXX]\登录器\自定义UI升级工具(xxx).exe
选中老版本登录器 正式开区\NewUI
进行修复 - 打开
HaoM2[XXX]\开始更新程序.bat
文件夹编辑,将所有D:\Mirserver
的XXX更换为老版本的启动器路径,保存后执行.添加地图
- 准备工作:准备缩略图(
bmp文件
),Objects(编号).pak
,SmTiles(编号).pak
,Tiles(编号).pak
和(地图名称).map
地图文件. 确认密码:查看和修改pak文件密码,
.pak
是加密资源文件,在使用它们时需要正确的密码,查看和修改密码为以下几个步骤.- 如下图:每一个pak文件对应着一个密码.一般的,在项目中存在文件
游戏引擎目录\Mirserver\(自定义登录器)\Pak.txt
,打开文件,会发现文件路径|密码
这样的格式,每一个Pak
都对应着一个密码,游戏在读取资源时会使用文件中的密码,若密码错误则无法加载文件. - 修改新密码:打开软件
V8M2资源编辑器
打开需要被修改密码的文件,会提示输入密码,输入旧密码即可,然后点击修改密码,保存即可,修改完毕记得在游戏引擎目录\Mirserver\(自定义登录器)\Pak.txt
更新改文件的密码
- 如下图:每一个pak文件对应着一个密码.一般的,在项目中存在文件
修改地图文件资源指向:使用软件
AnduNet.MapIdxChanger.exe
打开.map
文件,查看地图文件指向的三个文件编号是否正确.
若是不正确则修改为正确的编号,例如下方编号不能一一对应,则可以将地图指向的248改为32,或者将文件夹中的文件重命名为248.移动资源:接着将文件
Objects(编号).pak
,SmTiles(编号).pak
,Tiles(编号).pak
复制到:游戏引擎目录\MirServer\(自定义登录器文件夹)\(自定义资源文件夹)\Data
移动地图(需重启服务器,需重新打包客户端):将地图文件(.map)分别复制到
游戏引擎目录\MirServer\Mir200\Map
和游戏引擎目录\MirServer\(自定义登录器)\(自定义资源文件夹)\Map
下.如何修改文件游戏引擎目录\MirServer\Mir200\Envir\MapInfo.txt
,添加内容[地图别名|地图编号 玩家所见地图名]
.并且打开文件游戏引擎目录\MirServer\登录器\Map.txt
添加新内容(如:G:\热血传奇\mafa003\Map\at73.map
)- 其中
地图编号
值得就是刚刚素材中地图文件的文件名 - 其中
玩家所见地图名
指的是地图在游戏中的名称,例如:比奇城,盟重城,沙巴克城,等等.
- 其中
添加小地图:使用软件
V8M2资源编辑器
打开目录游戏引擎目录\MirServer\(自定义登录器文件夹)\(自定义资源文件夹)\Data\mmap10.pak
文件,同样的输入密码解密,然后点击导入,选中需要导入的小地图.bmg
文件,选中尾部添加
点击确认.
接着打开文件游戏引擎目录\MirServer\Mir200\Envir\MiniMap.txt
,添加内容地图 小地图编号
- 打开文件
项目目录\MirServer\Mir200\Envir\MonGen.txt
,复制文件内部的所有内容 - 打开网站,将复制的内容粘贴入内容框.
- 在正则表达式输入框输入
\n([\u4e00-\u9fa5a-zA-Z0-9]+(?:[、,]|\d+)?)
- 复制匹配结果
- 打开网站,将复制的内容粘贴入内容框,点击去重.
导出怪物素材
- 使用软件
V8M2资源编辑器
打开游戏引擎目录\MirServer\(自定义登录器文件夹)\(自定义资源文件夹)\Data\MonXXX.pak
文件,输入密码解密 - 寻找怪物名称步骤(两种方法)
- 方法一
- 找到数据库文件
游戏引擎\MirServer\Mud2\DB\数据库文件.db
- 打开网站,导入找到的数据库文件
- 输入SQL语句
SELECT * FROM 'Monster' where Appr = 编号
.编号的规则为
MonXXX.Pak其中XXX加1,加上怪物首张图片编号乘360,例如Mon147.Pak文件中编号为00360的怪物编号为:1481 - 查询即可得到怪物名称
- 找到数据库文件
- 方法二
- 打开软件
WJ4.0 4.2.1.9.exe
,版本目录设置为素材项目的根目录,点击怪物数据库 - 如下图所示,要在文件
Mon147.Pak
找到00360
号怪物 - 编号规则如下
- 打开软件
- 方法一
- 确认好要导出的怪物的编号起始
- 一般怪物图片有以下几种状态
- 打开软件
Wzl编辑器
,打开目录游戏引擎目录\MirServer\自定义登陆器\自定义资源\Data
- 点击新建,入下图所示步骤
- 将新创建的Pak文件的密码添加到
登录器生成器\Pak.txt
文件. - 打开软件Wzl编辑器点击
密码管理
将旧密码全部清空,重新导入密码文件 Wzl编辑器
打开文件D游戏引擎目录\MirServer\自定义登陆器\自定义资源\Data\新添加.Pak
文件.- 添加素材
编辑怪物数据(两种方法)
- 方法一
- 打开软件
WJ4.0 4.2.1.9.exe
,编码规则如Mon493.Pak,编号为00000.,则编号为493-1=492,360/0=0,加起来为4920
- 打开软件
- 方法二
- 打开软件
WJ4.0 4.2.1.9.exe
,图片有错误怪物外观只要不与其它编号冲突即可
. - 打开游戏控制台的怪物设置
若确定配置无误没有显示怪物,可以重启引擎尝试
- 打开软件
- 方法一
添加MonXXX.Pak文件
- 在Pak.txt配置新添加的Monxxx.pak的密码
传奇物品相关
物品代码表
| 物品代码(Stdmode) | 物品类型 | 相关说明 |
|—————————-|————————|—————————————————————————————————————————————|
| 0 | 药品 | |
| 1 | 食物 | |
| 2 | | |
| 3 | 卷类 | |
| 4 | 技能书 | |
| 5 | 武器 | |
| 6 | 武器 | |
| 7 | 技能书 | |
| 8 | | |
| 9 | | |
| 10 | 衣服(男) | |
| 11 | 衣服(女) | |
| 12 | 盾牌 | (支持外观)位置代码=16 变量<$SHIELD> |
| 15 | 头盔 | |
| 16 | 斗笠 | |
| 19 | 项链 | |
| 20 | 项链 | |
| 21 | 项链 | |
| 22 | 戒指 | |
| 23 | 戒指 | |
| 24 | 手镯 | |
| 25 | 符、毒药 | |
| 26 | 手镯 | |
| 28 | 马牌 | (支持外观)位置代码=15 变量<$HORSE> |
| 29 | 天使翼 | ——翅膀 |
| 30 | 照明物 | 物品数据内Source字段为1时不随时间掉持久,为0随时间掉持久 |
| 31 | 捆装物品 | |
| 40 | 宝箱钥匙 | 游戏开宝箱功能,宝箱所需的钥匙 |
| 46 | 宝石镶嵌 | 装备打孔镶嵌的宝石 |
| 49 | 聚灵珠 | |
| 53 | 宝石 | 有气血石功能 Anicount=1,2,3 分别对应三种石头 |
| 55,56,57,58,59 | 宝石 | 宝石升级所需物品 |
| 62 | 鞋子 | Anicount控制腰带、靴子、宝石的负重属性 |
| 63 | 宝石 | Anicount控制腰带、靴子、宝石的负重属性 |
| 64 | 腰带 | Anicount控制腰带、靴子、宝石的负重属性 |
| 65 | 军鼓 | 装备位置 14 |
| 90 | 灵玉 | 物品位置代码=17 |
| 66 | 时装衣服(男) | 物品位置代码=18 |
| 67 | 时装衣服(女) | 物品位置代码=18 |
| 68、69 | 时装武器 | 物品位置代码=19 |
| 70 - 74 | 称号系统 | 称号系统 |
| 75、76、77 | 时装项链 | 物品位置代码=20 |
| 78 | 时装头盔 | 物品位置代码=21 |
| 79、80 | 时装左手镯 | 物品位置代码=22 |
| 79、80 | 时装右手镯 | 物品位置代码=23 |
| 81、82 | 时装左戒指 | 物品位置代码=24 |
| 81、82 | 时装右戒指 | 物品位置代码=25 |
| 83 | 时装勋章 | 物品位置代码=26 |
| 84、85 | 时装腰带 | 物品位置代码=27 |
| 86, 87 | 时装靴子 | 物品位置代码=28 |
| 88, 89 | 时装宝石 | 物品位置代码=29 |
| 96 | 祝福罐 | 祝福罐、魔族指令、火龙之心填充物数据库设置 |
原端物品表格
快速找到原端物品并且统计数量
- 使用任意一款能打开SqLite的数据库软件(例如:HeidiSQL)打开
MirServer\Mud2\DB\数据库文件.DB
- 如图所示,打开Sql表执行语句
SELECT * FROM StdItems WHERE StdMode = 物品编号 ORDER BY Looks
需要注意的是查询结果包含了原端的物品,需要减去.
快速添加另一个端的物品资源步骤(以添加武器为例)
- 将素材端的所以文件(ItemsXXX,DnitemsXXX,StateItemsXXX),直接复制到自己的端,并且将文件名修改为自己端没有被使用的名字,并且保证三个文件的文件名序号和文件内部图片序号一一对应.
- 将复制过来的文件密码添加到Pak,重新打包客户端.
- 打开引擎控制台,将新加入的文件添加入列表
- 打开数据库软件(HeidiSql),加载Sqlite数据库,文件在
MirServer\Mud2\DB\数据库文件.db
.自己的端和素材的数据库都打开. - (这里需要什么物品就写对应的Sql语句)先选中数据库,然后点击查询输入下面的Sql语句,即可返回能使用的素材表格,检查素材是否正确能使用,若不能使用自己修改Sql条件.
SELECT * FROM StdItems WHERE stdmode IN (5, 6) -- 物品类型编号 AND name NOT IN ( '木剑', '青铜剑', '青铜斧', '短剑', '凌风', '匕首', '铁剑', '斩马刀', '银蛇', '罗刹', '修罗', '炼狱', '魔杖', '乌木剑', '八荒', '凝霜', '半月', '降魔', '井中月', '破魂', '无极棍', '血饮', '祈祷之刃', '龙纹剑', '屠龙', '命运之刃', '霸者之刃', '赤血魔剑', '家传宝刀', '怒斩', '逍遥扇', '海魂', '偃月', '鹤嘴锄', '裁决之杖', '嗜魂法杖', '骨玉权杖', '龙牙', '赤月', '无限狂刀', '十步血剑', '封魔' ) -- 原端物品名字,排除原端物品 AND looks IS NOT NULL AND looks >= 10000 -- Intems编号,一般都是大于10000 ORDER BY looks --LIMIT 12 -- 返回个数
- 将下面代码的数据库地址/文件编号/Sql语句修改就可以执行.
import sqlite3
def get_table_schema(db_connection, table_name):
cursor = db_connection.cursor()
cursor.execute(f"PRAGMA table_info({table_name})")
columns = cursor.fetchall()
return {column[1].lower(): column[1] for column in columns}
def main():
conn_db1 = sqlite3.connect(r'D:\玛法大陆\MirServer\Mud2\DB\GEEM2.db') # 自己端的数据库
conn_db2 = sqlite3.connect(r'D:\欲火素材\4月独家百年沉默复古三职业传奇版本\百年沉默解压密码是ruciwan\百年沉默Mirserver\Mirserver\Mud2\DB\ApexM2.db') # 需要查询的数据库也就是数据来源
specified_digit = None # Items的编号例如Items5,则输入 5。输入None则保持原数据不变
try:
# 获取表结构
columns_db1 = get_table_schema(conn_db1, "StdItems")
columns_db2 = get_table_schema(conn_db2, "StdItems")
cur_db1 = conn_db1.cursor()
cur_db2 = conn_db2.cursor()
actual_columns_db1 = list(columns_db1.values())
insert_query = f'''
INSERT INTO StdItems ({', '.join(actual_columns_db1)})
VALUES ({', '.join(['?' for _ in actual_columns_db1])})
'''
# 注意语句需要SELECT 使用*号
query_db2 = '''
SELECT *
FROM StdItems
WHERE stdmode IN (64)
AND name NOT IN ('铁手镯','避邪手镯','银手镯','夏普儿手镯','记忆手镯','钢手镯','幽灵手套','阎罗手套111','死神手套','皮制手套','坚固手套','小手镯','天尊手镯','圣战手镯','法神手镯','道士手镯','大手镯','魔法手镯','金手镯','三眼手镯','骑士手镯','思贝儿手镯','黑檀手镯','祈祷手镯','龙之手镯','神秘腰带','魔力手镯','心灵手镯','魔血手镯','虹魔手镯')
AND looks IS NOT NULL
AND looks >= 10000
ORDER BY looks
LIMIT 5
'''
cur_db2.execute(query_db2)
items_to_insert = cur_db2.fetchall()
cur_db2.execute('PRAGMA table_info(StdItems)')
col_info_db2 = cur_db2.fetchall()
columns_db2 = [info[1].lower() for info in col_info_db2]
cur_db1.execute('SELECT MAX(Idx) FROM StdItems')
max_idx = cur_db1.fetchone()[0] or 0
for i, row in enumerate(items_to_insert):
record_dict = dict(zip(columns_db2, row))
new_record = []
for column in actual_columns_db1:
if column.lower() == "idx":
new_record.append(max_idx + i + 1)
elif column.lower() == "looks":
looks_value = record_dict.get(column.lower(), 0)
if specified_digit is not None and looks_value != 0:
new_looks_value = int(str(specified_digit) + str(looks_value)[1:])
else:
new_looks_value = looks_value
new_record.append(new_looks_value)
else:
new_record.append(record_dict.get(column.lower(), 0))
cur_db1.execute(insert_query, new_record)
conn_db1.commit()
print("数据插入成功!")
except (sqlite3.Error, ValueError) as e:
print("错误:", e)
finally:
conn_db1.close()
conn_db2.close()
if __name__ == "__main__":
main()
EffectList.txt参数含义
没写的直接去软件里调整就行,就不写全了
; 特效编号 物品内观特效资源编号(关闭特效为-1) -1 物品在包裹中的特效资源编号(关闭特效为-1) 物品内观特效开始图片 物品外观特效开始图片 物品在包裹中的特效开始图片 物品内观特效数量 0 物品在包裹中的特效数量 物品内观特效速度 0 物品在包裹中的特效速度 物品内观特效X坐标 物品内观特效Y坐标 0 0 物品在包裹中的特效X坐标 物品在包裹中的特效Y坐标 0 0 1 0 -1 -1 外观特效开始图片 外观特效数量 外观特效速度 0 0 0 0 0 -1 物品在地上特效开始图片 地上数量 物品在地上特效速度 物品在地上特效X坐标 物品在地上特效Y坐标 0 0 0 备注