From 9a59abdb5e365db1b49c539d61fc01f3b083d46d Mon Sep 17 00:00:00 2001 From: azw Date: Sun, 29 Oct 2023 11:36:56 +0000 Subject: [PATCH] 1 --- .gitignore | 6 +- server/notifyserver/build.rs | 4 +- server/notifyserver/proto/cs_msgid.proto | 65 + server/notifyserver/proto/cs_proto.proto | 1687 +++++++++++++++++ server/notifyserver/src/main.rs | 6 + server/notifyserver/tools/pbtools/app.js | 405 ++++ .../tools/pbtools/package-lock.json | 162 ++ .../notifyserver/tools/pbtools/package.json | 13 + 8 files changed, 2346 insertions(+), 2 deletions(-) create mode 100644 server/notifyserver/proto/cs_msgid.proto create mode 100755 server/notifyserver/proto/cs_proto.proto create mode 100644 server/notifyserver/tools/pbtools/app.js create mode 100644 server/notifyserver/tools/pbtools/package-lock.json create mode 100644 server/notifyserver/tools/pbtools/package.json diff --git a/.gitignore b/.gitignore index f215256..87f6f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ server/bin target/ Cargo.lock mt.rs -node_modules/ \ No newline at end of file +node_modules/ +*# +*#* +cs_msgid.rs +cs_proto.rs \ No newline at end of file diff --git a/server/notifyserver/build.rs b/server/notifyserver/build.rs index 841a1e7..a0ff496 100644 --- a/server/notifyserver/build.rs +++ b/server/notifyserver/build.rs @@ -1,7 +1,9 @@ fn main() { protobuf_codegen_pure::Codegen::new() .out_dir("src") - .inputs(&["proto/mt.proto"]) + .inputs(&["proto/mt.proto", + "proto/cs_msgid.proto", + "proto/cs_proto.proto"]) .include("proto") .run() .expect("Codegen failed."); diff --git a/server/notifyserver/proto/cs_msgid.proto b/server/notifyserver/proto/cs_msgid.proto new file mode 100644 index 0000000..e8ee382 --- /dev/null +++ b/server/notifyserver/proto/cs_msgid.proto @@ -0,0 +1,65 @@ +package cs; + +//消息id定义 +enum CMMessageId_e +{ + _CMKcpHandshake = 99; + _CMPing = 101; + + _CMJoin = 103; + _CMReconnect = 104; + _CMMove = 201; + _CMEmote = 204; + _CMVoice = 206; + _CMGameOver = 207; + _CMWatchWar = 208; + _CMLeave = 209; + _CMRevive = 210; + _CMCancelRevive = 211; + _CMExecCommand = 217; + _CMMatchCancel = 218; + _CMMatchChoose = 219; + _CMMatchStartGame = 220; + _CMMatchCancelStartGame = 221; + _CMMatchSendMsg = 222; + _CMMatchBroadcastMsg = 223; + _CMRequestBulletDmg = 230; + _CMStowShield = 231; + _CMImmediateMsg = 232; + _CMTeamMarkTargetPos = 233; + _CMRequestThrowDmg = 236; +} + +enum SMMessageId_e +{ + _SMKcpHandshake = 99; + _SMPing = 101; + _SMRpcError = 102; + _SMReconnect = 104; + + _SMWatchWar = 208; + _SMLeave = 209; + _SMMatchCancel = 218; + + _SMJoinedNotify = 103; + _SMMapInfo = 1002; + _SMPlayerInfo = 1003; + _SMUpdate = 1004; + _SMRollMsg = 1005; + _SMVoiceNotify = 1007; + _SMDisconnectNotify = 1008; + _SMGameOver = 1009; + _SMDebugMsg = 1010; + _SMUiUpdate = 1012; + _SMGameStart = 1013; + _SMSysPiaoMsg = 1014; + _SMShowCountdown = 1015; + _SMShowTeamUI = 1016; + _SMUpdateMatchInfo = 1017; + _SMGetItemNotify = 1018; + _SMMatchMemberMsgNotify = 1019; + _SMPvePassWave = 1020; + _SMTeamMarkTargetPosList = 1021; + _SMDebugCmd = 1022; + _SMNewBieEnd = 1023; +} diff --git a/server/notifyserver/proto/cs_proto.proto b/server/notifyserver/proto/cs_proto.proto new file mode 100755 index 0000000..80afdb7 --- /dev/null +++ b/server/notifyserver/proto/cs_proto.proto @@ -0,0 +1,1687 @@ +package cs; + +/* + 约定: + CM前缀:客户端发给服务器的消息(client message) + SM前缀:服务器发给客户的的消息(server message) + MF前缀:消息的内嵌字段,只能作为其他消息的内嵌字段不能send(message field) + _e后缀:枚举类型 + _uniid后缀:唯一id + union_前缀:联合体 + _前缀:该字段仅服务器使用客户端无需处理 + + 网络包格式:msghead + msgbody + msghead: packagelen + msgid + seqid + magiccode + reserved = 2 + 2 + 4 + 2 + 2 = 12字节 + msgbody: protobuf数据 + msghead说明 + packagelen(unsigned short): 双字节网络包长度, + msgid(unsigned short): 双字节消息id + seqid(unsigned int): 4字节序号id + magiccode(unsigned short): 2字节魔数,并且为固定常数KS,占位符客户端不需什么处理 + reserved(unsigned short): 保留 + + 十六进制位运算数据表示法 + 0x01 == 1<<0 + 0x02 == 1<<1 + 0x04 == 1<<2 + + data_flags字段的意义 + 由于protobuf的二义性无法描述repeated字段是否有值(非repeated的字段可以通过msg.xxx == null来a判断) + 所以给协议添加了data_flags这样的字段用来描述字段是否有值 + data_flags32:描述id 1-31的字段哪些是赋值 + data_flags64: 描述id 31-63直接的字段是否赋值 + data_flags128...... 以此类推 + message MFRoleInfo + { + optional int32 role_id = 1; + optional int32 role_name = 2; + + optional int32 role_level = 34; + + optional uint32 data_flags32 = 256; + optional uint32 data_flags64 = 257; + } + role_id是否赋值 (data_flags32 & (1<<(1 - 1))) != 0 + role_name是否赋值 (data_flags32 & (1<<(2 - 1))) != 0 + role_level是否赋值 (data_flags64 & (1<<(34 - 33)) != 0 + 客户端可以根据protobuf反射得到字段名和字段id的对应关系做到自动化判断 +*/ + +//常量 +enum Constant_e +{ + ProtoVersion = 2022111601; //系统版本 +} + +//心跳 +message CMPing +{ +} +message SMPing +{ + optional int32 param1 = 1; + optional int32 source = 2 [default = 0]; //0:tcp 1:udp +} + +//kcp握手 +message CMKcpHandshake +{ + optional int32 proto_version = 1; //协议版本号Constant_e.ProtoVersion + optional string account_id = 2; //账号id + optional string session_id = 3; //session id + optional string team_uuid = 4; //保留 +} + +message SMKcpHandshake +{ + optional int32 errcode = 1; //errcode != 0时表示不支持kcp + optional string errmsg = 2; //errmsg + optional int32 conv = 3; //用来作为客户端的conv + optional bytes secret_key = 4; //secret key客户端每次上报的时候加在包头之前 + optional string remote_host = 5; //host + optional int32 remote_port = 6; //port +} + +//rpc调用错误 +message SMRpcError +{ + optional int32 error_code = 1; + optional string error_msg = 2; + optional string debug_msg = 3; + optional string file = 4; + optional int32 lineno = 5; + optional int32 error_param = 6; +} + +//int32键值对 +message MFPair +{ + optional int32 key = 1; //key + optional int32 value = 2; //val +} + +//int64键值对 +message MFPair64 +{ + optional int64 key = 1; //key + optional int64 value = 2; //val +} + +//int32元组 +message MFTuple +{ + repeated int32 values = 1; //values +} + +//string元组 +message MFTupleString +{ + repeated string values = 1; //values +} + +//向量3d +message MFVec3 +{ + optional float x = 1 [default = 0]; //x轴 + optional float y = 2 [default = 0]; //y轴 + optional float z = 3 [default = 0]; //z轴 +} + +//属性变更 +/* + property_type: 1 血量 + property_type: 2 最大血量 + property_type: 3 背包 + property_subtype: 索引 + valule: 當前數量 + value2:數量上限 + property_type: 4 技能cd时间(剩余时间) + property_type: 5 技能cd时间(总时间) + property_type: 6 载具剩余子弹数 + property_type: 7 载具油量 + property_subtype: 0(当前油量)1(总油量)) 在同步当前油量前必然同步过总油量! + property_type: 8 当前武器的子弹剩余数量 + property_type: 9 当前道具(目前只有伪装) + property_subtype: 道具id + valule: 当前数量(数量<=0时除) + property_type: 10 更新武器子弹数和弹夹上限 + property_subtype: 武器索引 + valule: 当前数量 + valule2: 当前弹夹上限 + property_type: 11 载具 + property_subtype: car_uniid + valule: seat + property_type: 23 charid + valule: charid + property_type: 24 技能cd时间 + property_subtype: 技能id + valule: 技能cd时间(剩余时间) + property_type: 25 技能次数 + property_subtype: 技能id + valule: 当前可用次数 + property_type: 26 技能次数上限 + property_subtype: 技能id + valule: 次数上限 + property_type: 27 载具油量 + property_subtype: 当前油量 + valule: 最大油量 + property_type: 28 绝对值属性加成 + property_subtype: 属性id + valule: 属性绝对值 + property_type: 29 百分比属性加成 + property_subtype: 属性id + valule: 百分比绝对值 + property_type: 30 跟随目标id + valule: 目标id + property_type: 31 下潜后氧气 + property_subtype: 总量 + valule: 当前量 + property_type: 32 更新技能经验(需要容错,skill_id可能在本地找不到) + property_subtype: skill_id + valule: 经验 + property_type: 33 更新盾牌血量 + property_subtype: 血量上限 + valule: 当前血量 + property_type: 34 被谁抓了(猫的钩子技能) + property_subtype: + valule: 谁抓的你 + property_type: 35 更新主动技能副模式信息 + property_subtype: 副状态类型 + valule: 副状态cd时间(剩余时间) + value2: 副状态cd时间(总时间) + value3: 技能id + property_type: 36 复活币数量 + property_subtype: + valule: 数量 + property_type: 37 被暴击 + property_subtype: + valule: 暴击伤害 + property_type: 38 降落伞 + property_subtype: 降落伞id + valule: + property_type: 39 播放飞行特效 + property_subtype: 特效id,读取flyEffect表 + valule: 目标对象 + value3: 回传值,当目标对象是自己的时候才需要传(value3==0 || value3==null不用传) + property_type: 40 能量护盾 + property_subtype: 当前护盾值 + value: max护盾值 + property_type: 41 宝石 + value: 宝石数量 + property_type: 42 捡物品 + value: 物品对象uniid + property_type: 43 队伍成员数 + value: 成员数 + property_type: 44 队伍id + value: 队伍id + property_type: 45 兔子隐身提示时间 + property_subtype: 时间(单位毫秒) + value: max时间(单位毫秒) + property_type: 46 更新当前新手战引导步骤 + property_subtype: 第几步 <= 0时表示完成了所有步骤 +*/ +message MFPropertyChg +{ + optional int32 obj_id = 1; //对象id + optional int32 property_type = 2; //属性类型 + optional int32 property_subtype = 3; //属性子类型 + optional float value = 4; //属性值 + optional float value2 = 5; //属性值2 + optional float value3 = 6; //属性值3 +} + +//碰撞体 +message MFCollider +{ + optional int32 shape = 1; //形状 1:矩形 2:圆形(当是圆形的时候width=height) + optional int32 width = 2; //宽度 + optional int32 height = 3; //高度 +} + +//地图物件 +message MFMapObject +{ + optional int32 object_id = 1; //物件id(mapThing表id) + optional MFVec3 pos = 2; //位置 +} + +//武器 +message MFWeapon +{ + optional int32 weapon_id = 1; //武器id 当weapon_id == 0时表示无装备(装备位置显示空) + optional int32 weapon_lv = 2; //武器等级 + optional string weapon_uniid = 3; //武器唯一id + optional int32 ammo = 4; //弹药数 + optional int32 volume = 5; //弹夹容量 +} + +//皮肤 +message MFSkin +{ + optional int32 skin_id = 1; //皮肤id + optional int32 skin_lv = 2; //皮肤等级 +} + +//玩家信息-部分 +message MFPlayerPart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + optional float speed = 4; //速度 +} + +//属性增量 +message MFAttrAddition +{ + optional int32 attr_id = 1; //属性id + optional float abs_val = 2; //绝对值加成 + optional float rate_val = 3; //百分比 +} + +//角色形象-本地如果没有full信息则忽略 +message MFCharacterImage +{ + optional int32 obj_uniid = 1; //唯一id + optional int32 cur_weapon_idx = 2; //当前武器索引 0-4 + optional MFWeapon weapon = 3; //武器 +} + +//组队标记目标位置 +message MFTeamMarkPos +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 +} + +//玩家信息-全量 +message MFPlayerFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + optional int64 guild_id = 4; //公会id + + optional float max_health = 5; //血量 + optional float health = 6; //血量 + optional bool dead = 7; //是否已死亡 + optional bool downed = 8; //是否跌倒 + optional bool disconnected = 9; //是否断网 + repeated MFSkin skin = 13; //皮肤id + optional int32 backpack = 14; //背包 + optional int32 helmet = 16; //头盔 + optional int32 chest = 17; //防弹衣 + optional MFWeapon weapon = 18; //武器 + optional int32 energy_shield = 19; //能量护盾 + optional int32 vip = 20; //vip + optional int32 max_energy_shield = 22; //最大能量护盾 + repeated MFBodyState states = 23; //角色状态 + optional int32 kill_count = 24; //击杀数 + optional int32 emoji1 = 25; //表情1 + optional int32 emoji2 = 26; //表情2 + optional int32 parachute = 27; //降落伞 + repeated MFBuff buff_list = 28; //buff列表 + repeated MFEffect effect_list = 67; //特效列表 + optional int32 car_uniid = 29; //载具id + optional int32 car_seat = 34; //载具-座位0-3 + + optional bool can_revive = 30; //是否可复活 + optional int32 revive_countdown = 31; //复活倒计时 + optional string killer_name = 32; //杀手名称 + optional int32 killer_id = 33; //杀手id(自杀时为自己) 特殊id: -1:倒在安全区 + + optional int32 vip_lv = 35 [default = 0]; //vip等级 + optional int32 head_frame = 36 [default = 0]; //头像框 + optional int32 sex = 37 [default = 0]; //性别 + + repeated MFSkill skill_list = 38; //技能列表 + + repeated MFAttrAddition attr_addition= 61; //属性加成 + optional int32 follow_target = 62 [default = 0]; //跟随的目标id 0: 未跟随 + + optional int32 charid = 44; //人物id + optional float speed = 45; //速度 + optional int32 team_id = 71; //队伍id + + optional float shoot_offset_x = 50 [default = 0]; //射击偏移量-x + optional float shoot_offset_y = 51 [default = 0]; //射击偏移量-y + + optional string user_data = 60 [default = ""]; //用户自定义数据 + + optional int32 shield_hp = 65; //护盾血量 + optional int32 shield_max_hp = 66; //护盾血量上限 + + optional int32 gemstone = 68; //宝石 + optional int32 level = 69; //等级 + optional int32 hero_level = 72; //hero等级 + + optional int32 team_member_num = 70 [default = 0]; //队伍成员数 +} + +//阻挡物-部分 +message MFObstaclePart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional float scale = 3; //缩放比 +} + +//阻挡物-全量 +message MFObstacleFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 size = 33; //大小(和pos rotate构成boxcollider) + optional float scale = 3; //缩放比 + optional float rotate = 5; //旋转,单位弧度,360度=2π弧度 + //出生帧号 born_frameno == SMUpdate.frmanoe时表示在当前这帧出生(可能出现为0的情况比如静态物件) + optional int32 born_frameno = 4 [default = 0]; + + optional int32 obstacle_id = 6; //阻挡物id + optional float health = 7; //血量 + optional bool dead = 8; //是否已死亡 + optional bool dead_at_thisframe = 9; //是否当前帧死亡(播放死亡特效) + optional int32 dead_reason = 42 [default = 0]; //死亡原因 0:被打 1:被开 + + optional bool is_door = 20; //是否门 + //只有当is_door==ture时以下字段才有意义 + //门状态定义: 0:关 1:开 当door_old_state != door_new_state时播动画(开/关门) + optional int32 door_id = 22; //门id + optional int32 door_old_state = 23; //门前一个状态 + optional int32 door_new_state = 24; //门当前状态 + optional int32 door_house_uniid = 25; //门所属房间唯一id + optional int32 door_house_id = 26; //门所属房间id + optional float door_width = 27; //门宽度 + optional float door_height = 28; //门高度 + optional int32 door_open_times = 29; //门开启次数,每次开/关 ++times 0:客户端自动开 + optional string button_name = 30; //按钮名(不为空是显示按钮,靠近时显示) + optional MFCollider collider = 31; //碰撞体(有值的时候读取没值的时候还是读取配置表里的碰撞) + + optional int32 team_id = 41; //队伍id +} + +//建筑物-部分 +message MFBuildingPart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 +} + +//建筑物-全量 +message MFBuildingFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional int32 building_id = 3; //建筑物id + + optional bool ceiling_dead = 6; +} + +//loot-部分 +message MFLootPart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 +} + +//loot-全量 +message MFLootFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 size = 10; //大小(和pos rotate构成boxcollider) + optional float rotate = 11 [default = 0]; //旋转 单位弧度,360度=2π弧度 + optional MFVec3 born_pos = 3; //出生位置 + optional bool show_anim = 4; //是否显示动画 + + optional int32 item_id = 6; //道具id + optional int32 count = 7; //数量 + optional int32 age_ms = 8; + optional int32 item_level = 9 [default = 1]; //道具等级 +} + +//英雄(分身)-部分 +message MFHeroPart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + +} + +//英雄(分身)-全量 +message MFHeroFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + optional int32 heroid = 4; //配置表id + optional int32 master_uniid = 5; //主人id + optional float health = 10; //血量 + optional bool dead = 11; //是否已死亡 + repeated MFBuff buff_list = 12; //buff列表 + optional float max_health = 13; //最大血量 + repeated MFEffect effect_list = 14; //特效列表 + optional int32 team_id = 15; //队伍id + optional int32 hero_level = 16; //hero等级 +} + +//载具-部分 +message MFCarPart +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 +} + +//载具-全量 +message MFCarFull +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + optional int32 car_id = 4; //载具id + optional int32 driver = 5; //驾驶员id + optional int32 heroid = 7; //配置表id + optional float health = 10; //血量 + optional bool dead = 11; //是否已死亡 + repeated MFBuff buff_list = 12; //buff列表 + optional float max_health = 13; //最大血量 + optional int32 oil = 14; //当前油量 + optional int32 max_oil = 15; //最大油量 + optional int32 bullet_num = 16; //子弹数量 + repeated MFEffect effect_list = 18; //特效列表 + optional int32 team_id = 19; //队伍id + + /* + 乘客列表(包含驾驶员) + !!!注意这里只返回客户端必要的用于显示玩家外观的信息而不是全量信息 + */ + repeated MFPlayerFull passengers = 6; + optional int32 seat_num = 17; //座位数 + optional int32 born_frameno = 8; //出生帧号 born_frameno == SMUpdate.frmanoe时表示在当前这帧出生 +} + +//对象信息-部分 +message MFObjectPart +{ + //1:player 2:obstacle 3:building 5:loot 10:hero 11:car + optional int32 object_type = 1; + + optional MFPlayerPart union_obj_1 = 2; + optional MFObstaclePart union_obj_2 = 3; + optional MFBuildingPart union_obj_3 = 4; + optional MFLootPart union_obj_5 = 6; + optional MFHeroPart union_obj_10 = 11; + optional MFCarPart union_obj_11 = 12; +} + +//对象信息-全量 +message MFObjectFull +{ + //1:player 2:obstacle 3:building 5:loot 10:hero 11:car + optional int32 object_type = 1; + + optional MFPlayerFull union_obj_1 = 2; + optional MFObstacleFull union_obj_2 = 3; + optional MFBuildingFull union_obj_3 = 4; + optional MFLootFull union_obj_5 = 6; + optional MFHeroFull union_obj_10 = 11; + optional MFCarFull union_obj_11 = 12; + + optional int32 obj_uniid = 14; //唯一id + optional int32 object_flags = 15; //对象标志位 1<<0: 存缓存 1<<1:读缓存 +} + +//活跃玩家数据(当前) +message MFActivePlayerData +{ + optional int32 action_type = 3; //0: none 1:reload 2:useitem 3:relive 4: rescue + optional int32 action_duration = 5; //持续时间毫秒 + optional int32 action_item_id = 6; + optional int32 action_target_id = 7; + optional int32 action_param = 36; //公共参数当是治疗时表示治疗量 + /* + action触发的帧号,当服务器下发的action_type和客户端本地的action_type相同时 + action_frameno不同也要播放对应的动画,视为同一种action_type的不同触发 + */ + optional int32 action_frameno = 1; + + repeated MFPair items = 8; //存放玩家身上携带的装备信息(目前只存伪装) key:道具id value:数量 + + repeated MFSkin skin = 30; //皮肤id + optional int32 backpack = 31; //背包 + optional int32 helmet = 32; //头盔 + optional int32 chest = 33; //防弹衣 + + optional float max_health = 34; //血量 + optional float health = 35; //血量 + + optional int32 cur_scope = 10; //当前视野倍数 1 2 4 8 15 + /* + 0: 9mm + 1: 556mm + 2: 762mm + 3: 12gauge + 4: rpg火药(榴弹炮) + 5: frag 手雷 + 6: smoke 烟雾弹 + 7: healthkit 医疗包 + 8: 止痛药 + 9: + 10: + 11: + + 12: 1xscope + 13: 2xscope + 14: 4xscope + 15: 8xscope + 16: 15xscope + */ + repeated int32 inventory = 11; //库存 + + optional int32 cur_weapon_idx = 15; //当前武器索引 0-4 + /* + 武器列表1-4 + 0:拳头 + 1:枪1 + 2:枪2 + 3:手雷 + 4:烟雾弹 + 5: 地雷 + 6: 燃烧瓶 + 7: 陷阱 + 8: 毒气弹 + 9: c4 + 10: 盾墙 + 11: 信号抢 + 12: 汽油桶 + */ + repeated MFWeapon weapons = 16; + + optional int32 energy_shield = 40; //能量护盾 + optional int32 max_energy_shield = 41; //最大能量护盾 + + optional int32 shield_hp = 65; //护盾血量 + optional int32 shield_max_hp = 66; //护盾血量上限 + + optional int32 spectator_count = 20; + repeated MFBodyState states = 27; //角色状态 + + repeated MFSkill skill_list = 28; //技能列表 + + repeated MFAttrAddition attr_addition= 61; //属性加成 + optional string name = 62; //昵称,不为undefine的时候覆盖本地 + + optional float shoot_offset_x = 50 [default = 0]; //射击偏移量-x + optional float shoot_offset_y = 51 [default = 0]; //射击偏移量-y + + optional int32 dive_oxygen_max = 63; //下潜时氧气总量 + optional int32 dive_oxygen_curr = 64; //下潜时氧气当前量 + + optional int32 gemstone = 68; //宝石 +} + +//毒圈数据 +message MFGasData +{ + /* + 0: 进入战前准备 + 3:跳伞状态 + 1: 辐射区将在多少时间后扩大 + 2: 辐射区正在扩大 + */ + optional int32 mode = 1; //0:inactive 1:waiting 2:moving 3:jump + optional float duration = 2; //持续时间(秒) + optional MFVec3 pos_old = 3; //前一个圆心 + optional MFVec3 pos_new = 4; //新圆心 + optional float rad_old = 5; //前一个圆半径 + optional float rad_new = 6; //新圆半径 +} + +//队伍数据 +message MFTeamData +{ + optional int32 team_id = 61; //队伍Id + optional int32 player_id = 1; //玩家id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //方向 + optional float health = 4; //血量 + optional bool disconnected = 5 [default = false]; //是否短线 + optional bool dead = 6 [default = false]; //是否死亡 + optional bool downed = 7 [default = false]; //是否倒下 + optional string name = 8; //名字(只同步一次) + optional float max_health = 9; //最大血量 + optional bool riding = 40 [default = false]; //是否倒 下 + optional string user_data = 60 [default = ""]; //用户自定义数据(只同步一次) + optional int32 score = 63 [default = 0]; //pve模式积分 + optional int32 hero_id = 64 [default = 0]; //英雄id(只同步一次) + optional int32 level = 65 [default = 0]; //等级 + optional int32 hero_level = 72; //hero等级 + + //一下字段只在结算的时候该字段才有内容 + optional string account_id = 10; //账号id + optional string avatar_url = 11; //头像 + optional int64 user_value1 = 31; //对应好友系统的user_value1 + optional int64 user_value2 = 32; //对应好友系统的user_value2 + optional int64 user_value3 = 33; //对应好友系统的user_value3 + optional int64 guild_id = 34; //公会id + optional int32 vip_lv = 35 [default = 0]; //等级 + optional int32 head_frame = 36 [default = 0]; //头像框 + optional int32 sex = 37 [default = 0]; //性别 + repeated MFSkin skin = 39; //皮肤id +} + +//子弹 +message MFBullet +{ + optional int32 player_id = 1; //玩家id + optional int32 bullet_id = 2; //子弹id + optional MFVec3 pos = 3; //位置 + optional MFVec3 dir = 4; //方向 + optional int32 gun_lv = 5; //枪等级 + optional int32 bulletskin = 6; //子弹皮肤 未用到 + optional int32 gun_id = 10; //枪id + optional float fly_distance = 11; //只有手雷和烟雾弹时这个字段才有意义 + optional int32 bullet_uniid = 12; //子弹唯一id + optional int32 hand = 16 [default = 0]; //手 0:右手 1:左手 + + //追踪型子弹以下字段才有意义(trace_target_uniid != 0) + optional int32 trace_target_uniid = 13 [default = 0]; //不为空和0的时候表示要追踪的目标对象uniid + optional float track_change_time = 14 [default = 0]; //变轨时间间隔(毫秒) + optional int32 is_through = 15 [default = 0]; //是否穿墙 + + //客户端上报型子弹一下字段才有意义(reporter_list.size() > 0) + repeated int32 reporter_list = 20; //上报者列表 +} + +//射击 +message MFShot +{ + optional int32 player_id = 1; //玩家id + optional MFWeapon weapon = 2; //武器id + optional int32 hole = 5 [default = 0]; //炮孔(从0开始) + optional int32 aiming = 6 [default = 0]; //是否瞄准中 +} + +//投掷 +message MFThrow +{ + optional int32 weapon_id = 1; //枪id + optional int32 throw_uniid = 2; //唯一id > 0 (客户端维持唯一) + optional MFVec3 pos = 3; //位置 + optional MFVec3 dir = 4; //方向 + optional float fly_distance = 5; //飞行距离 + optional int32 estimated_time = 6; //预估时间(单位毫秒) +} + +//爆炸 +message MFExplosion +{ + optional int32 item_id = 1; //配置表id + optional MFVec3 pos = 2; //位置 + optional int32 player_id = 3; //玩家id + optional int32 effect = 4 [default = 0]; //爆照效果 0:普通爆照 1:核爆炸 + optional float rotate = 5; //旋转 + optional float rad = 6; //半径 + optional int32 bullet_uniid = 7; //子弹唯一id,如果是子弹产生的爆炸 +} + +//烟雾 +message MFSmoke +{ + optional int32 item_id = 1; //配置表id + optional MFVec3 pos = 2; //位置 + optional int32 player_id = 4; //玩家id + optional float time_addition = 5; //烟雾弹时间加成(单位毫秒) +} + +//表情 +message MFEmote +{ + optional int32 emote_id = 1; //表情id + optional int32 player_id = 3; //玩家id + optional string msg = 5; +} + +//英雄结算信息 +message MFHeroStats +{ + optional string hero_uniid = 1 [default = ""]; //英雄唯一id + optional string hero_name = 2 [default = ""]; //英雄名称 + optional int32 hero_id = 3 [default = 0]; //英雄唯id + optional int32 reward_ceg = 4 [default = 0]; //英雄获得的ceg数量 + optional int32 ceg_uplimit = 5 [default = 0]; //英雄获得的ceg数量上限 + optional int32 today_get_ceg = 6 [default = 0]; //英雄今天获得的ceg数量 +} + +//武器结算信息 +message MFWeaponStats +{ + optional string weapon_uniid = 1 [default = ""]; //武器唯一id + optional string weapon_name = 2 [default = ""]; //武器名称 + optional int32 weapon_id = 3 [default = 0]; //武器唯id + optional int32 reward_ceg = 4 [default = 0]; //武器获得的ceg数量 + optional int32 ceg_uplimit = 5 [default = 0]; //武器获得的ceg数量上限 + optional int32 today_get_ceg = 6 [default = 0]; //武器今天获得的ceg数量 +} + +//游戏结束时玩家统计信息 +message MFPlayerStats +{ + optional int32 player_id = 1; //玩家id + optional string player_avatar_url = 2; //玩家头像 + + //本次成绩 + optional int32 time_alive = 3; //存活时间(毫秒) + optional int32 kills = 4; //击杀敌人数 + optional int32 damage_amount = 8; //伤害总量 + optional int32 heal_amount = 20; //治疗总量 + optional int32 assist = 50; //助攻 + optional int32 rescue = 51; //救援 + optional int32 pve_wave = 52; //pve波次 + optional int32 revive = 53; //复活次数 + optional int32 rank_chg = 54; //排行变更 + //历史最佳成绩 + optional int32 history_time_alive = 30; //存活时间(毫秒) + optional int32 history_kills = 31; //击杀敌人数 + optional int32 history_damage_amount = 32; //伤害总量 + optional int32 history_heal_amount = 33; //治疗总量 + + optional int32 gold = 10; //金币 + optional int32 score = 11; //积分 + repeated MFPair items = 6; //奖励道具 key:item_id value:数量 + optional int32 pass_score = 9; //通行证积分 + optional int32 rank_score = 13; //排名积分 + optional bool has_pass = 27; //是否有通行证 + + repeated MFPair extra_drop = 12; //额外掉落,key:item_id value:数量(看广告) + + optional bool dead = 5; //是否已死亡 + optional int32 killer_id = 7; //杀手id(自杀时为自己) 特殊id: -1:倒在安全区 + optional string killer_name = 40; //杀手名称 + optional string killer_avatar_url = 41; //杀手头像(机器人头像为空) + optional string killer_account_id = 42; //杀手accountid(机器人为空) + + optional string account_id = 21; //账号id + optional int64 guild_id = 22; //公会id + optional int32 rescue_guild_member = 23; //救起公会成员次数 + + optional int32 vip_lv = 35 [default = 0]; //等级 + optional int32 head_frame = 36 [default = 0]; //头像框 + optional int32 sex = 37 [default = 0]; //性别 + optional int32 charid = 38; //人物id + optional int32 team_id = 39; //tamid + optional string nickname = 43; //昵称 + + repeated MFSkin skin = 45; //皮肤id + + optional MFHeroStats hero_stats = 46; //英雄结算信息 + repeated MFWeaponStats weapons_stats = 47; //武器结算信息 +} + +//空投 +message MFAirDrop +{ + optional int32 appear_time = 1; //箱子出现时间(毫秒) + optional int32 box_id = 2; //箱子id + optional MFVec3 pos = 3; //位置 +} + +//空袭 +message MFAirRaid +{ + optional int32 appear_time = 1; //空袭出现时间(毫秒) + optional MFVec3 pos = 3; //空袭位置 + optional float rad = 4; //空袭半径 +} + +//buff +message MFBuff +{ + optional int32 buff_id = 1; //buff id + optional float left_time = 2; //剩余时间(单位毫秒) + optional float lasting_time = 3; //持续时间(总时间毫秒) + repeated float params = 4; //当是驾驶员或者乘客状时 params[0]:car_id + optional int32 buff_uniid = 5; //buff唯一id + optional float res_scale = 6 [default = 1]; //客户端资源缩放 +} + +//effect +message MFEffect +{ + optional int32 effect_uniid = 1; //特效唯一id + optional int32 effect_id = 5; //特效id +} + +//buff变更 +message MFBuffChg +{ + optional int32 obj_id = 1; //对象id + optional int32 chg = 2; //0:新增/更新 1:删除 + optional MFBuff buff = 3; //buff +} + +//特效变更 +message MFEffectChg +{ + optional int32 obj_id = 1; //对象id + optional int32 chg = 2; //0:新增/更新 1:删除 + optional MFEffect effect = 3; //effect +} + +//对象状态(只同步一次客户端自己到及时,有变化时服务器会再次下发) +message MFBodyState +{ + /* + 1: 止痛药持续加血 + 2: 在飞机上(这时left_time、lasting_time无意义) + 3: 跳伞中 + + 4: 隐身中(队友可见) + 5: 加速中 + 6: 伤害加深 + 7: 护盾 + 8: 回血 + 9: 反伤 + 10: 分身 + 11:攻击加成 + */ + optional int32 state_type = 1; + optional float left_time = 2; //剩余时间(单位毫秒) + optional float lasting_time = 3; //持续时间(总时间毫秒) +} + +//飞机 +message MFPlane +{ + optional MFVec3 start_point = 1; //飞机起点 + optional MFVec3 end_point = 2; //飞机终点 + optional MFVec3 pos = 3; //飞机当前位置 + optional float plane_speed = 4; //飞机速度(像素/秒) +} + +//载具信息(用于小地图显示) +message MFMapCarInfo +{ + optional int32 car_id = 1; //载具id(读equip表) + optional MFVec3 pos = 2; //载具坐标 + optional MFVec3 size = 3; //载具坐标 大小(和pos rotate构成boxcollider) + optional float rotate = 4 [default = 0]; //旋转 单位弧度,360度=2π弧度 +} + +//队友信息 +message MFTeamMember +{ + optional string account_id = 1; //账号id + optional int32 rank = 2; //段位 + optional bool is_leader = 3; //是否队长 + optional int32 game_times = 4; //游戏次数 + optional int32 win_times = 5; //吃鸡次数 + optional int32 kill_times = 6; //击杀数 + optional int32 create_time = 7; //账号创建时间 +} + +//位置信息 +message MFPosition +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec3 pos = 2; //位置 + optional MFVec3 dir = 3; //朝向 + optional int32 race = 4; //1:人 2:僵尸 +} + +message MFSkill +{ + optional int32 skill_id = 1; //技能id + optional int32 left_time = 2; //技能cd时间(剩余时间) + optional int32 cd_time = 3; //技能cd时间(总时间) + optional int32 curr_times = 4; //当前可用次数 + optional int32 max_times = 5; //次数上限 + optional int32 exp = 7; //当前经验 + optional int32 max_exp = 8; //经验上限(当满级以后exp=0 max_exp=0) + /* + 副状态:当有副状态的时候客户端优先显示副状态 + */ + optional int32 minor_type = 9 [default = 0]; // 1: 闪烁 + optional int32 minor_left_time = 10 [default = 0]; // 副状态cd时间(剩余时间) + optional int32 minor_cd_time = 11 [default = 0]; // 副状态cd时间(总时间) +} + +message MFPlaySkill +{ + optional int32 obj_uniid = 1; //技能id + optional int32 skill_id = 2; //技能id +} + +message MFTextElement +{ + optional string text = 1; //文本内容 + optional int32 color = 2 [default = 0xFFFFFF]; //默认系统颜色rgb +} + +message MFImageElement +{ + optional int32 id = 1; //装备id +} + +message MFRichTextElement +{ + //1:TextElement 2:ImageElement + optional int32 element_type = 1; //富文本类型 + optional MFTextElement union_obj_1 = 2; //文本元素 + optional MFImageElement union_obj_2 = 3; //图片元素 +} + +message MFMatchTeamMember +{ + optional string account_id = 1; //账号id account_id + optional string name = 2; //角色名 + optional string avatar_url = 3; //头像 + optional int32 hero_id = 4; //英雄id + repeated MFWeapon weapons = 5; //武器列表 + optional bool is_leader = 8; //是否队长 + optional int32 state = 9; //0:准备 1:已准备 + optional int32 head_frame = 10; //头像框 +} + +//该消息每秒同步 +message MFMatchInfo +{ + repeated MFMatchTeamMember members = 1; //成员列表 + optional int32 phase = 2; //阶段 1:合并队伍(匹配中) 2:选择角色 3:锁定(已准备) + optional int32 countdown = 3; //倒计时(单位秒) + optional int32 predict_time = 4; //预计时间(单位秒) +} + +//结算奖励项 +message MFOverRewardItem +{ + optional string obtain_gold = 1 [default = "0"]; //实际获得金币数 + optional string gold_limit = 2 [default = "0"]; //今天可获得的金币上限 + optional int32 id = 3; //英雄或者武器id + optional string curr_gold = 4 [default = "0"]; //当前金币数 +} + +//结算奖励 +message MFOverReward +{ + optional MFOverRewardItem hero = 1; //英雄 + optional MFOverRewardItem weapon1 = 2; //武器1 + optional MFOverRewardItem weapon2 = 3; //武器2 + optional string bounds = 4 [default = "0"]; + optional string total = 5 [default = "0"]; //总数 +} + +//结算英雄奖励 +message MFOverRewardHero +{ + optional string hero_uniid = 1 [default = "0"]; //英雄唯一id + optional int32 id = 2 [default = 0]; //id + optional string gold_limit = 3 [default = "0"]; //ceg数量上限 + optional string obtain_gold = 4 [default = "0"]; //实际获得ceg数量 + optional string curr_gold = 5 [default = "0"]; //当前ceg数量 +} + +//结算奖励项 +message MFOverRewardItemNew +{ + optional int32 item_id = 1; //道具id + optional int32 item_num = 2; //道具数量 +} + +//结算奖励 +message MFOverRewardNew +{ + optional MFOverRewardHero hero = 1; //英雄 + repeated MFOverRewardItemNew items = 2; //碎片奖励 +} + +message MFRewardItem +{ + optional int32 item_id = 1; //道具id + optional string item_num = 2; //道具数量 +} + +//游戏结束时玩家统计信息 +message MFPlayerStats2 +{ + optional int32 id = 1; //玩家id + optional string account_id = 2; //账号id(客户端不用使用) + optional string name = 4; //玩家名字 + optional int32 head = 3; //头像id + optional int32 head_frame = 5 [default = 0]; //头像框 + optional int32 sex = 6 [default = 0]; //性别 + optional int32 hero_id = 7; //英雄id + optional int32 dead = 8; //是否已死亡 + optional int32 is_myself = 9; //是否自己 + optional int32 is_mvp = 10; //是否mvp + + //本次成绩 + optional int32 pvp_kill = 11; //pvp击杀敌人数 + optional int32 pvp_damage = 12; //pvp伤害总量 + optional int32 pvp_assist = 14; //pvp助攻 + optional int32 pvp_survia_time = 16; //pvp存活时间(毫秒) + optional int32 pvp_recover = 13; //pvp治疗总量 + optional int32 pvp_rescue = 15; //pvp救援 + + optional int32 pve_order = 20; //pve波次 + optional int32 pve_score = 21; //pve分数 + optional int32 pve_star = 22; //pve星 + optional int32 pve_damage = 23; //pve伤害总量 + optional int32 pve_revive = 25; //pve复活次数 + optional int32 pve_survia_time = 26; //pvp存活时间(毫秒) + optional int32 pve_wave = 30; //pve波次 + optional int32 pve_max_wave = 31; //pve总波次 +} + +//结算信息 +message MFSettlement +{ + optional int32 version = 1; //版本 + optional string room_uuid = 2; //房间唯一id + optional int32 room_mode = 3; //0:吃鸡模式 1:歼灭模式 2:生存模式 + optional int32 match_mode = 4; //比赛模式 0: pvp 1:排位赛(只有吃鸡模式下该字段才有意义) + optional int32 team_mode = 5; //0:个人 1:组队 + optional int32 game_over = 6; //是否结束 + optional int32 victory = 7; //是否胜利 + optional int32 watchable = 8; //是否可观战 + optional int32 team_id = 9; //队伍id + optional string account_id = 50; //自己的账号id + optional int32 temmate_all_dead = 51; //队友是否全部阵亡 + + optional int32 map_id = 10; //地图id + optional string map_name = 12; //地图名称 + optional int32 rank_score_chg = 14; //排位赛积分变更 + repeated MFRewardItem spoils_items = 15; //战利品 0: 道具id 1:道具数量 + + //已下字段只在排位赛有效 + optional int32 old_rank = 16; //老段位 + optional int32 new_rank = 17; //新段位 + optional int32 old_score = 18; //老段位积分 + optional int32 new_score = 19; //新段位积分 + + optional int32 pvp_settlement_type = 52; //結算類型0:個人 1:組隊 + optional int32 pvp_settlement_color = 53; // 0:灰 1:黃 + optional int32 pvp_team_rank = 20; //队伍排名 + optional int32 pvp_personal_rank = 21; //个人排名 + optional int32 pvp_my_rank = 22; //我的排名 + optional int32 pvp_max_rank = 23; //最大排名 + optional int32 pvp_total_human_num = 24; //房间总人数 + optional int32 pvp_alive_human_num = 25; //房间剩余存活人数 + optional int32 pvp_total_team_num = 26; //本次战斗队伍总数 + + optional int32 pve_settlement_color = 60; // 0:灰 1:黃 + optional int32 pve_wave = 30; //pve波次 + optional int32 pve_max_wave = 31; //pve总波次 + optional int32 pve_instance_id = 32; //pve副本id + optional int32 pve_boss_killed = 33; //pve副本boos是否被击杀 + + optional MFOverReward reward = 40; //结算奖励 + repeated MFPlayerStats2 members_stats = 42; //队伍成员信息统计 +} + +//成员结算信息 +message MFSettlementMember +{ + optional int32 obj_uniid = 1; //玩家id + optional string account_id = 2; //账号id(真人才有account_id) + optional string name = 4; //玩家名字 + optional int32 head = 3; //头像id + optional int32 head_frame = 5 [default = 0]; //头像框 + optional int32 sex = 6 [default = 0]; //性别 + optional int32 hero_id = 7; //英雄id + optional int32 dead = 8; //是否已死亡 + optional int32 is_mvp = 10; //是否mvp + + //已下字段只在排位赛有效 + optional int32 old_rank = 16; //老段位 + optional int32 new_rank = 17; //新段位 + optional int32 old_score = 18; //老段位积分 + optional int32 new_score = 19; //新段位积分 + + //本次成绩 + optional int32 pvp_kill = 101; //pvp击杀敌人数 + optional int32 pvp_damage = 102; //pvp伤害总量 + optional int32 pvp_assist = 103; //pvp助攻 + optional int32 pvp_survia_time = 104; //pvp存活时间(毫秒) + optional int32 pvp_recover = 105; //pvp治疗总量 + optional int32 pvp_rescue = 106; //pvp救援 + optional int32 pvp_personal_rank = 109; //个人排名 + + optional int32 pve_order = 201; //pve波次 + optional int32 pve_score = 202; //pve分数 + optional int32 pve_star = 203; //pve星 + optional int32 pve_damage = 204; //pve伤害总量 + optional int32 pve_revive = 205; //pve复活次数 + optional int32 pve_survia_time = 206; //pvp存活时间(毫秒) + optional int32 pve_wave = 207; //pve波次 + optional int32 pve_max_wave = 208; //pve总波次 + optional int32 pve_boss_killed = 209; //pve副本boos是否被击杀 + + optional MFOverReward _reward = 301; //结算奖励 + repeated MFRewardItem _spoils_items = 302; //战利品 0: 道具id 1:道具数量 + optional MFOverRewardNew reward = 303; //结算奖励 +} + +//结算信息 +/* + pvp_my_rank + pvp_max_rank + 这两个字段在新版里处理方式 + + 当是组队结算时 + pvp_my_rank: pvp_team_rank + pvp_max_rank: pvp_total_team_num + 当是个人结算时 + pvp_my_rank: member.pvp_personal_rank + pvp_max_rank: pvp_total_human_num + + 1、先判断settlement_status == 0 则表示用战斗数据(个人结算pvp_settlement_type=0) ,1则调用小胡的接口 + +settlement_status == 0 的时候: member.reward、member.spoils_items、 pvp_team_rank为空 + */ +message MFSettlementNew +{ + optional int32 version = 1; //版本 + optional int32 team_id = 2; //队伍id + optional string room_uuid = 3; //房间唯一id + optional int32 room_mode = 4; //0:pvp 1: pve + optional int32 team_mode = 6; //0:个人 1:组队(保留) + optional int32 game_over = 7; //游戏是否结束 + optional int32 victory = 8; //是否胜利(pvp:吃鸡 pve:是否通关) + optional int32 watchable = 9; //是否可观战,小胡那的接口写死0(看历史不可观战) + optional int32 map_id = 10; //地图id + optional string battle_uuid = 11; //本次战斗唯一id + optional int32 settlement_status = 12; //0: 结算中(读取个人结算数据) 1:已结算(请求小胡接口) + + optional int32 pvp_settlement_type = 101; //結算類型0:個人 1:組隊(保留) + optional int32 pvp_settlement_color = 102; // 0:灰 1:黃 + optional int32 pvp_team_rank = 103; //队伍排名 + optional int32 pvp_total_human_num = 105; //房间总人数 + optional int32 pvp_alive_human_num = 106; //房间剩余存活人数 + optional int32 pvp_total_team_num = 107; //本次战斗队伍总数 + optional int32 pvp_match_mode = 108; //比赛模式 0: pvp 1:排位赛 + + optional int32 pve_settlement_color = 201; // 0:灰 1:黃 + optional int32 pve_wave = 202; //pve波次 + optional int32 pve_max_wave = 203; //pve总波次 + optional int32 pve_instance_id = 304; //pve副本id + + repeated MFSettlementMember members = 401; //队伍成员信息统计 +} + +//end mfmsg + +//加入 +message CMJoin +{ + optional int32 server_id = 1; //serverid + optional string team_uuid = 2; //队伍唯一id (没组队时为空字符串) + optional string account_id = 3; //账号id account_id + optional int32 team_mode = 4; //队伍模式 0:单人 1:多人 + optional int32 proto_version = 5; //协议版本号Constant_e.ProtoVersion + optional bool auto_fill = 6; //是否自动填充玩家 + optional string name = 8; //角色名 + optional string avatar_url = 11; //头像 + repeated MFWeapon weapons = 17; //武器列表 + optional string session_id = 20; //session_id + optional int32 head_frame = 36 [default = 0]; //头像框 + optional int32 sex = 37 [default = 0]; //性别 + repeated MFTeamMember team_members = 51; //包括自己 + optional int32 room_mode = 52; //0:吃鸡模式 1:pve 2:排位赛 + optional int32 mapid = 53; //地图id 0:随机地图 + optional string user_data = 60 [default = ""]; //用户自定义数据 + optional int32 hero_id = 61; //英雄id + optional string hero_uniid = 71; //英雄唯一id + optional int32 pve_instance_id = 72; //pve副本id + optional int32 team_slot_num = 73; //队伍槽位数1-4 + optional int32 force_enter_newbie_room = 74; //强制进新手房 +} + +//断线重连 +message CMReconnect +{ + optional int32 server_id = 1; //保留 + optional string team_uuid = 2; //保留 + optional string account_id = 3; //账号id + optional string session_id = 4; //session_id + optional string room_uuid = 5; //房间唯一id + optional string server_info = 6; //服务器信息 +} + +//断线重连回复 +message SMReconnect +{ + optional int32 errcode = 1; //错误码 0:成功 1:重连失败 + optional string errmsg = 2; //错误描述 +} + +//移动 +message CMMove +{ + optional int32 seq = 1; //序号 + + optional MFVec3 move_dir = 2; //移动-方向 + optional MFVec3 attack_dir = 3; //攻击方向(朝向) + + optional bool shot_start = 4; //射击-单发 + optional bool shot_hold = 5; //射击-连发 + optional bool reload = 6; //装弹 + optional float fly_distance = 7; //子弹飞行距离(只有手雷和烟雾弹时这个字段才有意义) + + optional int32 select_weapon = 8; //切换武器(没切换是不用发) + optional int32 drop_weapon = 9; //丢弃武器 101:医疗包 102:止痛药 103:肾上腺速 + optional int32 drop_num = 43; //丢弃武器(数量) + + optional bool cancel_action = 10; //取消当前操作(比如取消使用道具装弹等) + optional int32 use_item_idx = 11; //使用道具(对应库存索引0-16) + optional int32 use_item_id = 12; //使用道具 (道具id目前只有伪装) + optional int32 use_scope = 13; //使用倍镜 0-4 + + optional bool interaction = 14; //是否有交互 + repeated int32 interaction_objids = 15; //交互的对象id列表 + optional bool aiming = 16; //是否瞄准中 + + optional bool use_skill = 17; //使用技能 + optional int32 skill_id = 18; //技能id + optional int32 skill_target_id = 19; //技能目标(单体攻击) + optional MFVec3 skill_dir = 20; //技能方向 + optional float skill_distance = 21; //技能目标距离 + optional float skill_param1 = 22; //辅助参数 + + optional bool spectate = 30; //自杀 + + optional int32 emote = 31; //表情id + + optional bool jump = 32; //跳伞 + optional bool get_down = 33; //下车 + /*上车 + loot的uniid或者队友的uniid + 注意:当客户端同时发了下车和上车的时候服务器只处理上车,忽略下车 + */ + optional int32 get_on = 36; + optional int32 switch_seat = 37; //切换座位 + + optional int32 follow = 38; //跟随0:取消跟随 其他:玩家uniid + + optional int32 dive = 39; //下潜 + + optional int32 trace_target_uniid = 41; //自动追踪目标uniid + + repeated int32 hit_fly_effects = 42; //飞行特效命中(飞到目的地)时回传value3 + + optional MFThrow throw_bomb = 44; //投掷 +} + +//立刻消息 +message CMImmediateMsg +{ + optional int32 stop_move = 1; //停止移动 + optional int32 stop_shot = 2; //停止射击 +} + +//组队标记目标位置 +message CMTeamMarkTargetPos +{ + optional MFVec3 pos = 1; //目标位置,如果不传表示取消 +} + +//执行GM指令 +message CMExecCommand +{ + optional string cmd = 1; //指令 +} + +//丢弃道具 +message CMDropItem +{ + optional int32 item_id = 1; //道具id + optional int32 weapon_idx = 2; //武器索引 0-4 +} + +//发送表情 +message CMEmote +{ + optional int32 type = 1; + optional MFVec3 pos = 2; + optional bool team_only = 4; +} + +//语音 +message CMVoice +{ + optional string download_url = 2; //语音下载地址 +} + +//请求结算 +message CMGameOver +{ +} + +//请求观战 +message CMWatchWar +{ + +} + +//离开 在飞机起飞前视为:逃跑 起飞后视为自杀 +message CMLeave +{ + +} + +//复活死亡后15秒内,如果超过15秒服务器发SMGameOver +message CMRevive +{ + optional int32 target_uniid = 1; //需要复活的对象的uniid 复活自己时候传自己的id +} + +//取消复活 +message CMCancelRevive +{ +} + +//组队匹配-取消 +message CMMatchCancel +{ +} + +//组队匹配-选取英雄 +message CMMatchChoose +{ + optional int32 hero_id = 1; //英雄id + repeated MFWeapon weapons = 2; //武器列表 + repeated MFPair skill_list = 4; //技能列表 key:技能id value:预留给之后扩展,目前传0就行 + optional string hero_uniid = 7; //英雄唯一id +} + +//组队匹配-出击 +message CMMatchStartGame +{ +} + +//组队匹配-出击 +message CMMatchCancelStartGame +{ +} + +//组队匹配-指定成员发送消息 +message CMMatchSendMsg +{ + //成员将收到SMMatchMemberMsgNotify消息 + repeated string target_list = 1; //目标列表,目标收到SMMatchMemberMsgNotify消息 + optional string content = 2; //消息内容 +} + +//组队匹配-队伍内广播消息 +message CMMatchBroadcastMsg +{ + //成员将收到SMMatchMemberMsgNotify消息 + optional int32 exclude_self = 1; //include_self!=0时排除自己 + optional string content = 2; //消息内容 +} + +/* + 请求子弹伤害(追踪型子弹、上报型子弹) +*/ +message CMRequestBulletDmg +{ + optional int32 bullet_uniid = 1; //子弹唯一id + optional int32 shield_hit = 2; //打中盾牌 + optional int32 strengthen_wall_uniid = 3; //能量墙uniid + optional int32 target_uniid = 4; //命中目标id + optional MFVec3 pos = 5; //子弹当前位置 +} + +//请求投掷物伤害 +message CMRequestThrowDmg +{ + optional int32 throw_uniid = 1; //投掷唯一id +} + +//收起盾牌 +message CMStowShield +{ + +} + +//endcmmsg + +//观战error_code == 0 时关闭结算界面,回到战斗界面 +message SMWatchWar +{ + optional int32 error_code = 1 [default = 0]; //错误码 0:成功 1:失败 + optional string error_msg = 2; //错误信息 + optional string name = 3; //昵称 +} + +//加入成功 +message SMJoinedNotify +{ + optional int32 team_mode = 1; //队伍模式 0:单人 1:多人 + + optional int32 error_code = 7; //错误 1:服务器维护中 2:服务器繁忙请稍后再进入 + optional int32 error_msg = 10; //错误描述 + + optional string server_info = 9; //服务器信息(重连时使用) 已经废弃移动到SMMapInfo + + optional int32 adjust_bullet = 12; //是否矫正子弹出生点(默认不矫正 1:矫正) + + optional int32 is_newbie_room = 13; //是否新手房间 +} + +//地图信息 +message SMMapInfo +{ + optional int32 map_id = 1; //地图id + optional float map_width = 2; //地图宽度 + optional float map_height = 3; //地图高度 + repeated MFMapObject objects = 6; //地图对象 + optional int32 player_id = 7; //玩家id(自己) + optional bool started = 8; //游戏是否已开始 + optional string room_uuid = 9; //房间唯一id + optional string server_info = 10; //服务器信息(重连时使用) + optional int32 room_mode = 11; //0:吃鸡模式 1:歼灭模式 2:生存模式 + optional int32 match_mode = 13; //比赛模式 0: pvp 1:排位赛(只有吃鸡模式下该字段才有意义) + optional int32 pve_instance_id = 16; //pve副本id + optional int32 mapid = 17; //地图id之后会删除,目前只给老版本用 +} + +//帧事件 +message SMUpdate +{ + repeated int32 out_objids = 1; //对象-移出视野 + repeated int32 del_objids = 2; //对象-待删除 + repeated MFObjectFull full_objects = 3; //对象-全量(出现在视野) + repeated MFObjectPart part_objects = 4; //对象-部分(用于插值更新) + optional int32 active_player_id = 5; //当前活跃玩家id(如果玩家死亡后是观战对象的id) + optional MFActivePlayerData active_player_data = 6; //活跃玩家数据(如果玩家死亡后是观战对象的数据) + optional int32 alive_count = 15; //存活数量 + optional int32 gas_progress = 16; //毒圈进度,表示缩进的像素数(只有当gas_data.mode == moving时才会发进度) + optional MFVec3 gas_pos_old = 30; //毒圈当前圆心坐标 + optional MFGasData gas_data = 17; //毒圈数据 + repeated MFTeamData team_data = 18; //队伍数据 + repeated MFBullet bullets = 20; //子弹 + repeated MFShot shots = 21; //射击 + repeated MFExplosion explosions = 22; //爆炸 + repeated MFSmoke smokes = 25; //烟雾 + repeated MFEmote emotes = 23; //表情 + optional MFAirDrop airdrop = 26; //空投 + optional MFPlane plane = 27; //飞机 + repeated MFBuffChg chged_buff_list = 28; //buff变更列表 + repeated MFEffectChg chged_effect_list = 51; //特效变更列表 + repeated MFPropertyChg chged_property_list = 31; //property变更列表 + repeated MFPlaySkill play_skill_list = 32; //播放技能 + optional MFAirRaid airraid = 33; //空袭 + + repeated MFTuple dead_alive_objs = 42; //玩家values[0]:objid values[1]:多少毫秒后复活 values[2]: 0:死亡 1:复活 + //一下字段只有僵尸模式才有效 + repeated MFPosition object_positions = 43; //对象坐标信息,如果对象已经在part_objects则可能不发,这时客户端可以读取part_objects里的左边更新小地图 + optional int32 game_left_time = 45; //游戏剩余时间(毫秒, 战斗开始后字段才有意义) + optional int32 frameno = 46; + repeated int32 del_bullets = 47; //子弹删除 + + repeated MFCharacterImage image_objects = 50; //角色形象-本地如果没有full信息则忽略 +} + +//滚动消息 +message SMRollMsg +{ + repeated MFRichTextElement elements = 1; //富文本信息 +} + +//游戏结束 +message SMGameOver +{ + optional int32 team_id = 1; //队伍id + optional int32 team_rank = 2; //队伍排名 + optional int32 personal_rank = 15; //个人排名 + optional bool game_over = 4; //是否结束 + optional bool victory = 5; //是否胜利 + optional int32 total_human_num = 12; //房间总人数 + optional int32 alive_human_num = 13; //房间剩余存活人数 + optional int32 watchable = 8; //是否可观战 + + repeated MFPlayerStats player_stats = 6; //玩家信息统计 + optional string room_uuid = 7; //房间唯一id + repeated MFTeamData team_data = 10; //队伍数据 + repeated MFTupleString spoils_items = 11; //战利品 0: 道具id 1:道具数量 + + optional MFOverReward reward = 14; //结算奖励 + + optional int32 total_team_num = 16; //本次战斗队伍总数 + optional int32 pve_wave = 17; //pve波次 + optional int32 pve_max_wave = 18; //pve总波次 + optional int32 pve_instance_id = 19; //pve副本id + optional int32 pve_boss_killed = 25; //pve副本boos是否被击杀 + optional int32 map_id = 20; //地图id + + optional int32 mode = 21; //1:个人 2:组队 + optional int32 my_rank = 22; //我的排名 + optional int32 max_rank = 23; //最大排名 + + optional int32 room_mode = 30; //0:吃鸡模式 1:歼灭模式 2:生存模式 + optional int32 match_mode = 32; //比赛模式 0: pvp 1:排位赛(只有吃鸡模式下该字段才有意义) + + optional MFSettlement settlement = 33; //结算信息 + optional MFSettlementNew settlement_new = 34; //结算信息new + + repeated MFPlayerFull victory_team = 35; //吃鸡队伍信息 +} + +//离开 +message SMLeave +{ +} + +//取消匹配 +message SMMatchCancel +{ +} + +//断线通知 +message SMDisconnectNotify +{ + optional string reason = 1; //断线原因 +} + +//语音通知 +message SMVoiceNotify +{ + optional string account_id = 2; //唯一id + optional string download_url = 3; //语音下载地址 +} + +//调试信息 +message SMDebugMsg +{ + optional string debug_msg = 3; //调试信息 +} + +//ui界面更新,一些不需要实时更新的数据 +message SMUiUpdate +{ + optional int32 alive_count = 1; //存活数量 + optional int32 kill_count = 2; //击杀数 + repeated MFMapCarInfo car_list = 3; //载具列表 + + //一下只有pve模式有意义 + optional int32 score = 10; //积分 + optional int32 wave = 11; //第几波 + optional int32 max_wave = 12; //总波数 + optional int32 mon_num = 13; // + optional int32 boss_state = 14; //0:boss未出现 1:已出现 2:boss已挂 +} + +//游戏开始 +message SMGameStart +{ +} + +//系统飘字 +message SMSysPiaoMsg +{ + optional string msg = 1; //消息内容 + optional int32 color = 2; //字体颜色rgb + optional int32 duration = 3; //持续时间(毫秒) +} + +//线上倒计时面板 +message SMShowCountdown +{ + optional string msg = 1; //消息内容 + optional int32 countdown = 2; //倒计时(单位秒),倒计时用来替换msg里的%d标识 + optional int32 msg_type = 3; //保留字段 +} + +//显示匹配队伍ui +message SMShowTeamUI +{ +} + +//更新匹配信息 +message SMUpdateMatchInfo +{ + optional MFMatchInfo info = 1; //匹配信息 +} + +//匹配-队伍成员消息 +message SMMatchMemberMsgNotify +{ + optional string sender = 1; //消息发送者 + optional string content = 2; //消息内容 +} + +//获得物品 +message SMGetItemNotify +{ + repeated MFPair items = 8; //key:道具id value:数量 +} + +//通过了这一波 +message SMPvePassWave +{ + optional int32 new_wave = 17; //新pve波次 + optional int32 pve_max_wave = 18; //pve总波次 + optional int32 wait_time = 2; //下一波开始时间(单位秒) +} + +//组队标记目标位置列表 +message SMTeamMarkTargetPosList +{ + repeated MFTeamMarkPos pos_list = 1; //位置列表 +} + +//调试指令 +message SMDebugCmd +{ + optional string cmd = 1; //指令 + repeated float params = 2; //参数 +} + +//新手战引导结束 +message SMNewBieEnd +{ + repeated MFPlayerFull victory_team = 1; //吃鸡队伍信息 +} \ No newline at end of file diff --git a/server/notifyserver/src/main.rs b/server/notifyserver/src/main.rs index 15670f1..4cbbdab 100755 --- a/server/notifyserver/src/main.rs +++ b/server/notifyserver/src/main.rs @@ -1,6 +1,10 @@ use f9::app::App; +use protobuf::Message; pub mod app; +pub mod mt; +pub mod cs_msgid; +pub mod cs_proto; fn main() { App::instance().borrow_mut().init( @@ -8,4 +12,6 @@ fn main() { ); App::instance().borrow_mut().run(); App::instance().borrow_mut().uninit(); + let data: Vec = Vec::new(); + let psystem = crate::mt::AliKeyConf::parse_from_bytes(&data).unwrap(); } diff --git a/server/notifyserver/tools/pbtools/app.js b/server/notifyserver/tools/pbtools/app.js new file mode 100644 index 0000000..95ff98a --- /dev/null +++ b/server/notifyserver/tools/pbtools/app.js @@ -0,0 +1,405 @@ +const protobuf = require('protobufjs'); +const parseArgs = require('minimist'); +const fs = require('fs'); +const assert = require('assert'); + +class PBTools { + + constructor() { + this.csMsgIdPb = null; + this.csProtoPb = null; + this.ssMsgIdPb = null; + this.ssProtoPb = null; + this.mtPb = null; + this.protoDir = './proto/'; + } + + async init() { + { + this.csProtoPb = await (new protobuf.Root()).load( + this.protoDir + 'cs_proto.proto', + { + 'keepCase': true + } + ); + } + { + this.csMsgIdPb = await (new protobuf.Root()).load( + this.protoDir + 'cs_msgid.proto', + { + 'keepCase': true + } + ); + this.csCmMsgId = this.csMsgIdPb.lookup('CMMessageId_e'); + this.csSmMsgId = this.csMsgIdPb.lookup('SMMessageId_e'); + } + { + this.ssProtoPb = await (new protobuf.Root()).load( + this.protoDir + 'ss_proto.proto', + { + 'keepCase': true + } + ); + } + { + this.ssMsgIdPb = await (new protobuf.Root()).load( + this.protoDir + 'ss_msgid.proto', + { + 'keepCase': true + } + ); + this.ssSSmMsgId = this.ssMsgIdPb.lookup('SSMMessageId_e'); + } + { + this.mtPb = await (new protobuf.Root()).load( + this.protoDir + 'mt.proto', + { + 'keepCase': true + } + ); + } + await this.genCsAutoGen(); + await this.genMtbAutoGen(); + await this.genSsAutoGen(); + } + + async genCsAutoGen() { + let data = `package cs + +import ( + "f5" + proto "github.com/golang/protobuf/proto" +) + +type CsNetMsgHandler f5.NetMsgHandler[MsgHandler]; + +type MsgHandlerImpl struct { +} + +var handlers [2000]*CsNetMsgHandler + +func GetNetMsgHandler(msgId uint16) *CsNetMsgHandler { + handler := handlers[msgId] + return handler +} + +func DispatchMsg(handler *CsNetMsgHandler, hdr *f5.MsgHdr, msgHandler MsgHandler) { + handler.Cb(hdr, msgHandler) +} + +func RegHandlerId(msgId int, handlerId int) { + handler := handlers[msgId] + handler.HandlerId = handlerId +} + +func ParsePb(msgId uint16, data []byte) interface{} { + handler := handlers[msgId] + if handler == nil { + return nil + } + return handler.ParseCb(data) +} +`; + data += ` +type MsgHandler interface {`; + this.csProtoPb.nested.cs.nestedArray.forEach( + (item) => { + if (item.name[0] == 'C' && + item.name[1] == 'M') { + data += ` + ${item.name}(*f5.MsgHdr, *${item.name})`; + } + }); + data += ` +} +`; + this.csProtoPb.nested.cs.nestedArray.forEach( + (item) => { + if (item.name[0] == 'C' && + item.name[1] == 'M') { + data += ` +func (this *MsgHandlerImpl) ${item.name}(hdr *f5.MsgHdr, msg *${item.name}) { +} +`; + } + }); + this.csProtoPb.nested.cs.nestedArray.forEach( + (item) => { + if (item.name[0] == 'C' && + item.name[1] == 'M') { + data += ` +func (this *${item.name}) GetNetMsgId() uint16 { + return uint16(CMMessageIdE__${item.name}) +} +`; + } else if (item.name[0] == 'S' && + item.name[1] == 'M') { + data += ` +func (this *${item.name}) GetNetMsgId() uint16 { + return uint16(SMMessageIdE__${item.name}) +} +`; + } + }); + data += ` +func init() { +`; + this.csProtoPb.nested.cs.nestedArray.forEach( + (item) => { + if (item.name[0] == 'C' && + item.name[1] == 'M') { + data += ` + handlers[int(CMMessageIdE__${item.name})] = &CsNetMsgHandler{ + MsgId: int(CMMessageIdE__${item.name}), + ParseCb: func (data []byte) interface{} { + msg := &${item.name}{} + proto.Unmarshal(data, msg) + return msg + }, + Cb: func (hdr *f5.MsgHdr, handler MsgHandler) { + handler.${item.name}(hdr, hdr.Msg.(*${item.name})) + }, + } +`; + } + }); + data += ` +}`; + fs.writeFileSync('./cs/cs.auto_gen.go', data); + } + + async genSsAutoGen() { + let data = `package ss + +import ( + "f5" + proto "github.com/golang/protobuf/proto" +) + +type SsNetMsgHandler f5.NetMsgHandler[MsgHandler]; + +type MsgHandlerImpl struct { +} + +var handlers [2000]*SsNetMsgHandler + +func GetNetMsgHandler(msgId uint16) *SsNetMsgHandler { + handler := handlers[msgId] + return handler +} + +func DispatchMsg(handler *SsNetMsgHandler, hdr *f5.MsgHdr, msgHandler MsgHandler) { + handler.Cb(hdr, msgHandler) +} + +func RegHandlerId(msgId int, handlerId int) { + handler := handlers[msgId] + handler.HandlerId = handlerId +} + +func ParsePb(msgId uint16, data []byte) interface{} { + handler := handlers[msgId] + if handler == nil { + return nil + } + return handler.ParseCb(data) +} +`; + data += ` +type MsgHandler interface {`; + this.ssProtoPb.nested.ss.nestedArray.forEach( + (item) => { + if (item.name[0] == 'S' && + item.name[1] == 'S') { + data += ` + ${item.name}(*f5.MsgHdr, *${item.name})`; + } + }); + data += ` +} +`; + this.ssProtoPb.nested.ss.nestedArray.forEach( + (item) => { + if (item.name[0] == 'S' && + item.name[1] == 'S') { + data += ` +func (this *MsgHandlerImpl) ${item.name}(hdr *f5.MsgHdr, msg *${item.name}) { +} +`; + } + }); + this.ssProtoPb.nested.ss.nestedArray.forEach( + (item) => { + if (item.name[0] == 'S' && + item.name[1] == 'S') { + data += ` +func (this *${item.name}) GetNetMsgId() uint16 { + return uint16(SSMessageIdE__${item.name}) +} +`; + } else if (item.name[0] == 'S' && + item.name[1] == 'M') { + data += ` +func (this *${item.name}) GetNetMsgId() uint16 { + return uint16(SMMessageIdE__${item.name}) +} +`; + } + }); + data += ` +func init() { +`; + this.ssProtoPb.nested.ss.nestedArray.forEach( + (item) => { + if (item.name[0] == 'S' && + item.name[1] == 'S') { + data += ` + handlers[int(SSMessageIdE__${item.name})] = &SsNetMsgHandler{ + MsgId: int(SSMessageIdE__${item.name}), + ParseCb: func (data []byte) interface{} { + msg := &${item.name}{} + proto.Unmarshal(data, msg) + return msg + }, + Cb: func (hdr *f5.MsgHdr, handler MsgHandler) { + handler.${item.name}(hdr, hdr.Msg.(*${item.name})) + }, + } +`; + } + }); + data += ` +}`; + fs.writeFileSync('./ss/ss.auto_gen.go', data); + } + + async genMtbAutoGen() { + let data = `package mtb + +import ( + "f5" +) + +`; + this.mtPb.nested.mt.nestedArray.forEach( + (item) => { + data += `type ${item.name} struct {\n`; + item.fieldsArray.forEach + ( + (item2, index) => { + assert(item2.id <= 127); + data += ` ${item2.name} ` + this.dumpClassField(item, item2, index) + `\n`; + } + ); + data += ` + _flags1_ uint64 + _flags2_ uint64 +} + +`; + } + ); + data += ''; + this.mtPb.nested.mt.nestedArray.forEach( + (item) => { + item.fieldsArray.forEach + ( + (item2, index) => { + const newName = this.converUpperCamelCaseName(item2.name); + data += `func (this *${item.name}) Get${newName}() ` + + this.dumpClassField(item, item2, index) + ` {\n`; + data += ` return this.${item2.name}\n`; + data += `}\n\n`; + data += `func (this *${item.name}) Has${newName}() bool {\n`; + if (item2.id < 64) { + data += ` return (this._flags1_ & (uint64(1) << ${item2.id})) > 0\n`; + } else { + data += ` return (this._flags2_ & (uint64(1) << (${item2.id} - 64))) > 0\n`; + } + data += `}\n\n`; + } + ); + } + ); + this.mtPb.nested.mt.nestedArray.forEach( + (item) => { + data += ` +func (this *${item.name}) LoadFromKv(kv map[string]interface{}) { +`; + item.fieldsArray.forEach + ( + (item2, index) => { + if (item2.id < 64) { + data += ` f5.ReadMetaTableField(&this.${item2.name}, "${item2.name}", &this._flags1_, ${item2.id}, kv)\n`; + } else { + data += ` f5.ReadMetaTableField(&this.${item2.name}, "${item2.name}", &this._flags2_, ${item2.id} - 64, kv)\n`; + } + } + ); + data += '}\n'; + } + ); + fs.writeFileSync('./mtb/mtb.auto_gen.go', data); + } + + dumpClassField(cls, field, index) { + const fieldName = field.name; + switch (field.type) { + case 'int32': + { + return `int32`; + } + break; + case 'int64': + { + return `int64`; + } + break; + case 'float': + { + return `float32`; + } + break; + case 'double': + { + return `float64`; + } + break; + case 'string': + { + return `string`; + } + break; + default: + console.log(field); + assert(false, 'error field type:' + field.type); + break; + } + } + + converUpperCamelCaseName(name) { + let newName = ''; + let preIs_ = false; + for (let i = 0; i < name.length; ++i) { + if (i == 0) { + newName += name[i].toUpperCase(); + preIs_ = name[i] == '_'; + } else { + if (preIs_) { + if (name[i] != '_') { + newName += name[i].toUpperCase(); + } + } else { + if (name[i] != '_') { + newName += name[i]; + } + } + preIs_ = name[i] == '_'; + } + } + return newName; + } + +} + +(new PBTools).init(); diff --git a/server/notifyserver/tools/pbtools/package-lock.json b/server/notifyserver/tools/pbtools/package-lock.json new file mode 100644 index 0000000..94137e7 --- /dev/null +++ b/server/notifyserver/tools/pbtools/package-lock.json @@ -0,0 +1,162 @@ +{ + "name": "pbtools", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/node": { + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "nodejs-websocket": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/nodejs-websocket/-/nodejs-websocket-1.7.2.tgz", + "integrity": "sha512-PFX6ypJcCNDs7obRellR0DGTebfUhw1SXGKe2zpB+Ng1DQJhdzbzx1ob+AvJCLzy2TJF4r8cCDqMQqei1CZdPQ==" + }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + } + } +} diff --git a/server/notifyserver/tools/pbtools/package.json b/server/notifyserver/tools/pbtools/package.json new file mode 100644 index 0000000..b08985f --- /dev/null +++ b/server/notifyserver/tools/pbtools/package.json @@ -0,0 +1,13 @@ +{ + "name": "pbtools", + "version": "1.0.0", + "description": "", + "private": true, + "scripts": {}, + "dependencies": { + "axios": "^0.27.0", + "nodejs-websocket": "^1.7.2", + "protobufjs": "^6.11.2", + "minimist": "^1.2.6" + } +}