This commit is contained in:
memetrollsXD 2022-04-24 16:31:16 +02:00
commit 3661d44dd9
2256 changed files with 796940 additions and 0 deletions

70
README.md Normal file
View File

@ -0,0 +1,70 @@
# Iridium
A KCP packet sniffer + visualizer in one.
# Usage
0. Bring `GenshinData` from Grasscutter's resource folder.
½. `npm i`
1. `node . main` or `npm run main`
2. http://localhost:1984/index.html
From there, you can either start a proxy or read a .pcap file filtered with `udp.port == 22101 or udp.port == 22102`.
Proxy captures will be saved to `captures` folder in a .gcap format and can also be read with this tool.
# Using with Grasscutter on Localhost
0. Set Grasscutter's GameServer port to an available port and set `PublicPort` to 22102.
1. Open config.js and set `useDispatchServer` to false, `UdpTargetIP` to `127.0.0.1` and `UdpTargetPort` to the port that you specified.
2. Start Iridium and enable UDP Proxy from Frontend, then you can start Grasscutter.
# Node module API for your own packets
`startFrontend`: launches the frontend on http://localhost:1984/index.html
`displayPacket`: sends an abstract packet to frontend
```js
iridium.displayPacket({
source: 0=server, 1=client
packetID: numerical ID,
protoName: name of the proto,
object: decoded packet contents/any info to display in the frontend
})
```
`decodePacket`: queues a packet to be decoded by mtxor -> protobuf
```js
iridium.decodePacket({
ip: {
address: src_addr,
address_dst: dst_addr,
port: port_src,
port_dst: port_dst
} - this is used to construct the kcp ingest object and determine direction
crypt: if "uncrypt" is missing: the buffer containing only the data bytes of the raw udp packet (usually offset 28),
overrideKey: if crypt is used, you can supply your own key to XOR with, per-packet.
uncrypt: if "crypt" is missing: a buffer containing the already-dexored datagram to feed into protobuf decoder, must start with packet id at offset 2,
})
```
If `uncrypt` is supplied, `ip` object only needs either `port` or `port_dst` set to `22101` to determine direction.
`updateProxyIP(ip, port)`: Set remote IP and port of the server the proxy should connect to. This is usually determined automatically when the client makes the request to the cur.
# How the proxy works
While you can just drop in a sniffed pcap, the proxy allows you to see traffic realtime. You will need to reach logged-in state, point the dispatch hosts to localhost and activate the Iridium frontend along with the proxy. The dispatch will be running on localhost:80 and localhost:443 - make sure the ports are succesfully bound, you usually need admin access to do that and if there's svchost taking those up, it won't work and you need to kill it first.
After that, you click into the client and it should request the cur - the response cur will point the client to 127.0.0.1 in terms of UDP. If you are using Fiddler to redirect the hosts, you will have to put your own `cur.json` into `www` folder, as it becomes impossible to make a request for the real cur. It will work if you're just using the hosts file.
After you click again (the door), the UDP connection should start being monitored.
- Alg

29
backend/excelPivot.js Normal file
View File

@ -0,0 +1,29 @@
const fs = require('fs');
const path = require('path')
const log = new (require("../util/log"))('Excel', 'redBright');
log.start('Loading Excels...')
const jsonsInDir = fs.readdirSync('./GenshinData/ExcelBinOutput/');
jsonsInDir.push('../TextMap/TextMapEN.json');
const excels = jsonsInDir.map((file) => {
const fileData = fs.readFileSync(path.join('./GenshinData/ExcelBinOutput/', file));
const o = JSON.parse(fileData.toString());
if(file.includes('TextMapEN')) {
return {name: 'TextMap', json: o}
}
const E = {};
if(!o[0]) return;
const key = Object.keys(o[0]).find(key => key == 'Id') ||
Object.keys(o[0]).find(key => key == 'ID') ||
Object.keys(o[0]).find(key => key.includes('Id') || key.includes('ID'));
if(!key) return;
o.forEach(item => {
E[item[key]] = item;
})
return {name: file, json: E};
}).filter(a=>a);
log.log(excels.length + '/' + jsonsInDir.length + ' excels are loaded into memory.')
log.log('ID lookup is now enabled. Select text and press Enter or use q(id) in console.')
module.exports = excels || [];

View File

@ -0,0 +1,80 @@
const http = require('http');
const fs = require('fs');
const path = require('path')
const log = new (require("../util/log"))('Frontend', 'cyanBright');
const packetsToSend = [];
let requestListener = async (req, res) => {
let filePath = path.join(__dirname, "..", "frontend", "public", req.url.split("?")[0]);
// try {
res.writeHead(200);
const file = await fs.promises.readFile(filePath);
res.end(file);
// }
// catch (e) {
// res.writeHead(404, { "Content-Type": "text/html" });
// log.error("404 " + req.url);
// res.end('404 Not Found');
// }
}
const clients = [];
let wss;
function webSocket() {
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({
port: 40510
})
wss.on('connection', function(ws) {
ws.on('message', function(message) {
const msg = JSON.parse(message);
// try {
let endpoint = require(path.join('..','frontend','endpoints',`${msg.cmd}.js`));
log.log(`[${msg.cmd}] ${msg.data}`);
const handler = endpoint.execute(msg.cmd, msg.data).then(data => {
if (data === undefined) return;
ws.send(JSON.stringify({
cmd: msg.cmd.replace('Req', 'Rsp'),
data: data
}));
});
// } catch (e) {
// log.error(`${msg.cmd} event not handled`);
// ws.send(JSON.stringify({
// cmd: msg.cmd.replace('Req', 'Rsp')
// }));
// }
})
})
setInterval(() => {
if (packetsToSend.length) {
let msg = {
cmd: 'PacketNotify',
data: packetsToSend
};
msg = JSON.stringify(msg);
wss.clients.forEach(ws => {
ws.send(msg);
})
packetsToSend.length = 0;
}
}, 20);
}
function queuePacket(packet) {
packetsToSend.push(packet);
}
module.exports = {
execute() {
http.createServer({}, requestListener).listen(1984, () => {
log.start('Frontend running on http://localhost:1984/index.html')
});
webSocket();
},
queuePacket
}

43
backend/http-dispatch.js Normal file
View File

@ -0,0 +1,43 @@
const http = require('http');
const https = require('https');
const fs = require('fs');
const path = require('path');
const log = new(require("../util/log"))('Dispatch', 'yellowBright');
let servers = [];
let requestListener = function(req, res) {
try {
res.writeHead(200, {
"Content-Type": "text/html"
});
const file = require(path.join(path.resolve(path.join(__dirname, "..", "www")), req.url.split("?")[0]));
file.execute(req, res);
if (req.url != "/perf/dataUpload") {
log.log("200", req.url);
}
} catch (e) {
res.writeHead(404, {
"Content-Type": "text/html"
});
// if(e) console.log(e)
log.error("404", req.url);
res.end('');
}
}
const httpsOptions = {
key: fs.readFileSync("./cert/ys.key"),
cert: fs.readFileSync("./cert/ys.crt")
};
module.exports = {
execute() {
servers.push(http.createServer(requestListener).listen(80, () => {
log.start('HTTP:', 'localhost:80')
}))
servers.push(https.createServer(httpsOptions, requestListener).listen(443, () => {
log.start('HTTPS:', 'localhost:443')
}));
},
stop() {
servers.forEach(server => server.close());
}
}

407
backend/sniffer.js Normal file
View File

@ -0,0 +1,407 @@
const config = require('../config')
const proxy = require('udp-proxy')
const MHYbuf = require("../util/MHYbuf");
const kcp = require("node-kcp");
const fs = require("fs");
const pcapp = require('pcap-parser');
// const SQLiteCrud = require('sqlite3-promisify');
const DelimiterStream = require('delimiter-stream');
const util = require('util');
const path = require('path');
const execFile = util.promisify(require('child_process').execFile);
const udpPacket = require('udp-packet');
const ipPacket = require('ip-packet')
const {
WSMessage
} = require("../util/classes");
const log = new (require("../util/log"))('Sniffer', 'blueBright');
const chalk = require('chalk');
let Session = {
//filename
//proxy
}
const frontend = require('./frontend-server')
const MT19937_64 = require("../util/mt64");
const packetQueue = [];
const DIR_SERVER = 0;
const DIR_CLIENT = 1;
const GCAP_DELIM = '█▄█\n';
const GCAP_DIR = path.join('.', 'captures')
const PACKET_GetPlayerTokenRsp = MHYbuf.getPacketIDByProtoName('GetPlayerTokenRsp');
const PACKET_UnionCmdNotify = MHYbuf.getPacketIDByProtoName('UnionCmdNotify');
let packetQueueSize = 0;
let unknownPackets = 0,
packetOrderCount = 0;
let MHYKeys = require('../data/MHYkeys.json');
for (let key in MHYKeys) {
MHYKeys[key] = Buffer.from(MHYKeys[key], 'base64');
}
let initialKey;
let yuankey;
var serverBound = {};
var clientBound = {};
async function processMHYPacket(packet) {
let {
crypt,
uncrypt,
ip,
overrideKey
} = packet;
if (uncrypt) return [uncrypt];
if (!crypt) return log.warn("Empty data received.");
let packetSource = (ip.port == 22101 || ip.port == 22102 || ip.port == config.UdpTargetPort) ? DIR_SERVER : DIR_CLIENT;
if (crypt.byteLength <= 20) {
yuankey = undefined;
initialKey = undefined;
serverBound = {};
clientBound = {};
switch (crypt.readInt32BE(0)) {
case 0xFF:
log.log("Handshake", "Connected");
frontend.queuePacket({
source: packetSource,
packetID: 'HND',
protoName: 'Handshake',
object: 'Hamdshanke pls.'
})
break;
case 404:
log.log("Handshake", "Disconnected"); //red
break;
default:
frontend.queuePacket({
source: packetSource,
packetID: 'HND',
protoName: 'Handshake',
object: 'Hamdshanke estamblished.'
})
// log.warn("UNKNOWN HANDSHAKE", crypt.readInt32BE(0));
break;
}
return;
}
let KCPContextMap;
if (packetSource == DIR_SERVER) {
KCPContextMap = serverBound;
} else {
KCPContextMap = clientBound;
}
let peerID = ip.address + '_' + ip.port + '_' + crypt.readUInt32LE(0).toString(16);
if (!KCPContextMap[peerID]) {
KCPContextMap[peerID] = new kcp.KCP(crypt.readUInt32LE(0), ip);
// KCPContextMap[peerID].nodelay(1, 1000, 2, 0)
log.log('KCP', 'Instance created: ' + peerID);
}
let kcpobj = KCPContextMap[peerID];
kcpobj.input(await MHYbuf.reformatKcpPacket(crypt))
var hrTime = process.hrtime();
kcpobj.update(hrTime[0] * 1000000 + hrTime[1] / 1000);
kcpobj.wndsize(1024, 1024);
let packets = [];
let recv;
do {
recv = kcpobj.recv();
if (!recv) break;
if (!initialKey) {
initialKey = MHYKeys[recv.readUInt16BE(0) ^ 0x4567];
}
let keyBuffer = overrideKey || yuankey || initialKey;
MHYbuf.xorData(recv, keyBuffer);
let packetID = recv.readUInt16BE(2);
if (packetID == PACKET_GetPlayerTokenRsp) {
var proto = await MHYbuf.dataToProtobuffer(MHYbuf.removeMagic(recv), "GetPlayerTokenRsp")
log.debug(proto.secretKey.toString())
let initgen = new MT19937_64();
initgen.seed(BigInt(proto.secretKey));
let generator = new MT19937_64();
generator.seed(initgen.int64());
generator.int64();
let key = Buffer.alloc(4096);
for (let i = 0; i < 4096; i += 8) {
let val = generator.int64();
key.writeBigUInt64BE(val, i)
}
yuankey = key;
}
packets.push(recv);
} while (recv);
hrTime = process.hrtime();
kcpobj.update(hrTime[0] * 1000000 + hrTime[1] / 1000)
return packets;
}
function getInfoCharacter(packetName, dir) {
if (!isNaN(+packetName)) return ' X ';
if (packetName.includes('Rsp')) return chalk.yellow('<--');
if (packetName.includes('Req')) return chalk.cyan('-->');
if (packetName.includes('Notify') && !dir) return chalk.yellowBright('<-i');
if (packetName.includes('Notify') && dir) return chalk.cyanBright('i->');
}
function logPacket(packetSource, packetID, protoName, o, union, last) {
let s = '';
if (union)
if (last)
s += (' └─');
else
s += (' ├─');
s += union ? '' : new Date().toLocaleTimeString();
s += packetSource ? chalk.cyan(' [CLIENT] ') : chalk.yellow(' [SERVER] ');
s += `${('' + packetID).padEnd(6)}${getInfoCharacter(protoName, packetSource)} ${('' + (protoName || '')).padEnd(20)}`;
log.plain(s);
log.trail(JSON.stringify(o.object) || '');
if (last) log.log();
}
async function decodePacketProto(packet, ip) {
let packetID = packet.readUInt16BE(2);
let protoName = MHYbuf.getProtoNameByPacketID(packetID);
let { ignoredProtos } = require('../config');
if (ignoredProtos.includes(protoName)) return;
let o = {};
if (packetID != parseInt(protoName)) {
let object = await MHYbuf.dataToProtobuffer(MHYbuf.parsePacketData(packet), packetID);
o = {
packetID,
protoName,
object: object,
packet: MHYbuf.parsePacketData(packet).toString('base64')
}
}
if (packetID == protoName) {
o = {
packetID,
protoName,
object: null,
missing: true,
packet: MHYbuf.parsePacketData(packet).toString('base64')
}
}
let packetSource = (ip.port == 22101 || ip.port == 22102 || ip.port == config.UdpTargetPort) ? DIR_SERVER : DIR_CLIENT;
logPacket(packetSource, packetID, protoName, o);
if (packetID == PACKET_UnionCmdNotify) {
var commands = [];
for (var i = 0; i < o.object.cmdList.length; i++) {
let { messageId, body } = o.object.cmdList[i];
let protoName = MHYbuf.getProtoNameByPacketID(messageId);
let nested = await MHYbuf.dataToProtobuffer(body, messageId);
commands.push({
protoName,
packetID: messageId,
object: nested
})
logPacket(packetSource, messageId, protoName, commands[commands.length - 1], true, i == o.object.cmdList.length - 1);
}
o.object = {}
o.object.cmdList = commands;
}
if (o) o.source = packetSource;
return o;
}
function joinBuffers(buffers, delimiter = ' ') {
let d = Buffer.from(delimiter);
return buffers.reduce((prev, b) => Buffer.concat([prev, d, b]));
}
function delay(t) { return new Promise(resolve => setTimeout(resolve, t)) };
function queuePacket(packet) {
packetQueue.push(packet);
packetQueueSize++;
}
async function execute() {
async function loop() {
if (!packetQueueSize) return setTimeout(loop, 32);
let decryptedDatagram;
let packetObject;
while (packetQueue.length) {
let packet = packetQueue.shift();
packetQueueSize--;
if (packet.ip.port !== config.UdpTargetPort && packet.ip.port_dst !== config.UdpTargetPort &&
packet.ip.port !== 22102 && packet.ip.port_dst !== 22102 &&
packet.ip.port !== 22101 && packet.ip.port_dst !== 22101)
continue;
// await delay(20)
packets = await processMHYPacket(packet);
if (!packets) continue;
for (var i = 0; i < packets.length; i++) {
let decryptedDatagram = packets[i];
if (Session.datagrams) {
let datagram;
if (packet.ip.port === config.UdpTargetPort || packet.ip.port === 22101 || packet.ip.port === 22102) {
datagram = Buffer.concat([Buffer.from([0]), decryptedDatagram])
} else {
datagram = Buffer.concat([Buffer.from([1]), decryptedDatagram])
}
Session.datagrams.push(datagram);
};
packetObject = await decodePacketProto(decryptedDatagram, packet.ip);
if (packetObject) {
packetObject.time = packet.time;
frontend.queuePacket(packetObject);
}
}
}
if (Session.fileHandle && Session.datagrams && Session.datagrams.length > 0) {
await Session.fileHandle.appendFile(Buffer.concat([joinBuffers(Session.datagrams, GCAP_DELIM), Buffer.from(GCAP_DELIM)]));
Session.written = (Session.written || 0) + 1;
Session.datagrams = [];
}
setImmediate(loop);
}
loop();
}
async function pcap(file) {
const { Readable } = require('stream');
const stream = Readable.from(Buffer.from(file, 'base64'));
var parser = pcapp.parse(stream);
parser.on('packet', packet => {
if (packet.data.readInt16LE(12) === 8)
packet.data = packet.data.slice(14);
let udp = MHYbuf.read_pcap_udp_header(packet.data);
let ip = MHYbuf.read_pcap_ipv4_header(packet.data);
queuePacket({
crypt: packet.data.slice(28),
ip: {
address: ip.src_addr,
address_dst: ip.dst_addr,
port: udp.port_src,
port_dst: udp.port_dst
},
time: packet.header.timestampSeconds * 1000 + Math.floor(packet.header.timestampMicroseconds / 1000)
})
});
parser.on('end', async () => {
log.log('Parse finished.')
});
}
async function gcap(file) {
// var fs = require('fs');
var linestream = new DelimiterStream({
delimiter: GCAP_DELIM
});
const { Readable } = require('stream');
const stream = Readable.from(Buffer.from(file, 'base64'));
linestream.on('data', packet => {
ip = {};
if (packet.readInt8(0) == 1) {
ip.port_dst = 22101
ip.port = null
} else {
ip.port = 22101
ip.port_dst = null
}
queuePacket({
uncrypt: packet.slice(1),
ip
})
});
stream.pipe(linestream);
}
const INTERCEPT = false;
function proxyMiddleware(dir, msg, sender, peer, next) {
if (!INTERCEPT) next(msg, sender, peer);
}
async function startProxySession(filename, ip, port) {
Session = {};
if (!filename) filename = new Date().toISOString().replace('T', '_').replace(/:/g, '-').split('.')[0] + '.gcap';
Session.filename = path.resolve(path.join(GCAP_DIR, filename));
Session.fileHandle = await fs.promises.open(Session.filename, 'w');
Session.datagrams = [];
let opt = {
address: config.UdpTargetIP,
port: config.UdpTargetPort,
localaddress: config.UdpListenIP,
localport: config.UdpListenPort,
middleware: {
message: (msg, sender, next) => proxyMiddleware(1, msg, sender, undefined, next),
proxyMsg: (msg, sender, peer, next) => proxyMiddleware(0, msg, sender, peer, next)
}
}
Session.proxy = proxy.createServer(opt);
Session.proxy.on('listening', (details) => {
log.start("UDP", 'Proxy Listening at', chalk.yellowBright(`${config.UdpListenIP}:${config.UdpListenPort}`));
});
Session.proxy.on('bound', (details) => {
log.log('UDP', `Proxy bound to ${details.route.address}:${details.route.port}`);
log.log('UDP', `Peer bound to ${details.peer.address}:${details.peer.port}`);
});
// 'message' is emitted when the server gets a message
Session.proxy.on('message', (packet, ip) => {
ip.address_dst = opt.address;
ip.port_dst = opt.port;
queuePacket({
crypt: packet,
ip: ip
})
});
Session.proxy.on('proxyMsg', (packet, ip, peer) => {
ip.address_dst = peer.address;
ip.port_dst = peer.port;
queuePacket({
crypt: packet,
ip: ip
})
});
}
async function stopProxySession() {
if (Session.proxy) {
Session.proxy.close();
log.stop("UDP", 'proxy stopped')
}
if (Session.fileHandle) await Session.fileHandle.close();
if (!Session.written && Session.filename) fs.unlinkSync(Session.filename);
Session = {};
}
function getSessionStatus() {
return !!Session.proxy;
}
async function updateProxyIP(ip, port) {
if (Session.proxy && proxyIP !== ip || Session.proxy && proxyPort !== port) {
log.refresh('Relaunching proxy with an updated IP and port...')
await stopProxySession();
startProxySession(undefined, ip, port);
}
proxyIP = ip;
proxyPort = port;
console.log
}
module.exports = {
execute,
pcap, gcap,
startProxySession, stopProxySession, getSessionStatus, updateProxyIP,
queuePacket
}

19
cert/cert.csr Normal file
View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDBzCCAe8CAQAwVjESMBAGA1UEAwwJbG9jYWxob3N0MQswCQYDVQQGEwJDWTEO
MAwGA1UECAwFQ3JlcGUxDjAMBgNVBAcMBUNyZXBlMRMwEQYDVQQKDApDcmVwZSBJ
bmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnPFIkkIHKJdmWdUd
mwja9qENmnmVL7iSFrgMhBRuZadsD1gYb78liWHH/CT45zmVJ44LiON3DjmCP/gA
bFe3epPifB5i6CIh+tolqG8fg9WyyWrP71Z+raaGtlV4NIyybRJI/9Gjysf4aehp
CtEKJf4BAy82lrfBhNhmHf16W65c0NCGMJoB9Wr+wZCdR6PzcKgWNa33YVfXTD8P
iTOU9cLRvRFgwO870f/8jekxVdHggfTdQmVj9rcNet6XMrWvzUI4LnI2JPyyEpMt
lAQnDQ2+aGG5A3GdPPkWeaST+vF6CDCTFkg8Dxw0jQ30jc0uQv/zz0mFuqvvivgp
GSXeuwIDAQABoGwwagYJKoZIhvcNAQkOMV0wWzAOBgNVHQ8BAf8EBAMCBaAwIAYD
VR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCcGA1UdEQQgMB6CDCoubWlo
b3lvLmNvbYIOKi55dWFuc2hlbi5jb20wDQYJKoZIhvcNAQELBQADggEBABY2Mu+B
/QmTxNrYdTAMQ1yKzzuFnhZCgvf7POk6by0/x8XRHuFPM2F9vbsk2uL/O1wo58dv
IV0nO1QVwdgBj0C0/U46Ipo96k//7I4MeV7EtvKR/dQrT29dPjmSwaCKEC+/tCCm
ibnIXnt4uZnNdk8HgvP0HSvmwJ5zS491LhnIFPfVoaJRxJc3QSe/UADvSeCbC+1w
RrBrI/tKxvW+N0xZ2RQ12CYDYBtE7P15D8de3Hgsw7HAOmPRj263j8gdiJU6C3ev
atGB/m/TbTpZpwu9sfSRzgcKR2Ch59AjkLujRdB8uICjzzq3zqmrEBMDrDKANUve
crWZ6H0TrO0hN7Y=
-----END CERTIFICATE REQUEST-----

24
cert/cert.p7b Normal file
View File

@ -0,0 +1,24 @@
-----BEGIN PKCS7-----
MIIECgYJKoZIhvcNAQcCoIID+zCCA/cCAQExADALBgkqhkiG9w0BBwGgggPdMIID
2TCCAsGgAwIBAgIUO4lg/Dj+kZ9fv+AFxQBrMNUJc9cwDQYJKoZIhvcNAQELBQAw
VjESMBAGA1UEAwwJbG9jYWxob3N0MQswCQYDVQQGEwJDWTEOMAwGA1UECAwFQ3Jl
cGUxDjAMBgNVBAcMBUNyZXBlMRMwEQYDVQQKDApDcmVwZSBJbmMuMB4XDTIxMTIx
MjE2NDY0NloXDTMxMTIxMDE2NDY0NlowVjESMBAGA1UEAwwJbG9jYWxob3N0MQsw
CQYDVQQGEwJDWTEOMAwGA1UECAwFQ3JlcGUxDjAMBgNVBAcMBUNyZXBlMRMwEQYD
VQQKDApDcmVwZSBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
nPFIkkIHKJdmWdUdmwja9qENmnmVL7iSFrgMhBRuZadsD1gYb78liWHH/CT45zmV
J44LiON3DjmCP/gAbFe3epPifB5i6CIh+tolqG8fg9WyyWrP71Z+raaGtlV4NIyy
bRJI/9Gjysf4aehpCtEKJf4BAy82lrfBhNhmHf16W65c0NCGMJoB9Wr+wZCdR6Pz
cKgWNa33YVfXTD8PiTOU9cLRvRFgwO870f/8jekxVdHggfTdQmVj9rcNet6XMrWv
zUI4LnI2JPyyEpMtlAQnDQ2+aGG5A3GdPPkWeaST+vF6CDCTFkg8Dxw0jQ30jc0u
Qv/zz0mFuqvvivgpGSXeuwIDAQABo4GeMIGbMB0GA1UdDgQWBBS8E5THWThfTVAw
TnGez4druLTacDAfBgNVHSMEGDAWgBS8E5THWThfTVAwTnGez4druLTacDAOBgNV
HQ8BAf8EBAMCBaAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCcG
A1UdEQQgMB6CDCoubWlob3lvLmNvbYIOKi55dWFuc2hlbi5jb20wDQYJKoZIhvcN
AQELBQADggEBAIVqx99S1DYtyLqsi15KwTUawShW9iJVsvpk59vK6qbbzuGZL72D
rRJVTMxodv4WLaiM+te1TsW0WmdrhUYUBfIi+JpB67QB6aWKkOCP8fYq+mWnQ3vu
AEC6KpWH30j+0S58LVV+2iaGVetXYmYDXKoNslyVuJAM4iZSutTZhctO2FxmVicp
0fiPq/HJzxsmKHxyFJsgsdV0Dl9ElnlhpH77qxi/nXuUz9YlWZwwQI8KSsKmsOzT
UpSHHHpDocT24Yx73bR3Hd8CJam2bCEOOIIJG7sPx2lhTEJ+sKHDh4jHmRUI3rVk
5R+x1CcIrAgin+8nH28PhZFdOKs+CYMYGk2hADEA
-----END PKCS7-----

23
cert/ys.crt Normal file
View File

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID2TCCAsGgAwIBAgIUO4lg/Dj+kZ9fv+AFxQBrMNUJc9cwDQYJKoZIhvcNAQEL
BQAwVjESMBAGA1UEAwwJbG9jYWxob3N0MQswCQYDVQQGEwJDWTEOMAwGA1UECAwF
Q3JlcGUxDjAMBgNVBAcMBUNyZXBlMRMwEQYDVQQKDApDcmVwZSBJbmMuMB4XDTIx
MTIxMjE2NDY0NloXDTMxMTIxMDE2NDY0NlowVjESMBAGA1UEAwwJbG9jYWxob3N0
MQswCQYDVQQGEwJDWTEOMAwGA1UECAwFQ3JlcGUxDjAMBgNVBAcMBUNyZXBlMRMw
EQYDVQQKDApDcmVwZSBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAnPFIkkIHKJdmWdUdmwja9qENmnmVL7iSFrgMhBRuZadsD1gYb78liWHH/CT4
5zmVJ44LiON3DjmCP/gAbFe3epPifB5i6CIh+tolqG8fg9WyyWrP71Z+raaGtlV4
NIyybRJI/9Gjysf4aehpCtEKJf4BAy82lrfBhNhmHf16W65c0NCGMJoB9Wr+wZCd
R6PzcKgWNa33YVfXTD8PiTOU9cLRvRFgwO870f/8jekxVdHggfTdQmVj9rcNet6X
MrWvzUI4LnI2JPyyEpMtlAQnDQ2+aGG5A3GdPPkWeaST+vF6CDCTFkg8Dxw0jQ30
jc0uQv/zz0mFuqvvivgpGSXeuwIDAQABo4GeMIGbMB0GA1UdDgQWBBS8E5THWThf
TVAwTnGez4druLTacDAfBgNVHSMEGDAWgBS8E5THWThfTVAwTnGez4druLTacDAO
BgNVHQ8BAf8EBAMCBaAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MCcGA1UdEQQgMB6CDCoubWlob3lvLmNvbYIOKi55dWFuc2hlbi5jb20wDQYJKoZI
hvcNAQELBQADggEBAIVqx99S1DYtyLqsi15KwTUawShW9iJVsvpk59vK6qbbzuGZ
L72DrRJVTMxodv4WLaiM+te1TsW0WmdrhUYUBfIi+JpB67QB6aWKkOCP8fYq+mWn
Q3vuAEC6KpWH30j+0S58LVV+2iaGVetXYmYDXKoNslyVuJAM4iZSutTZhctO2Fxm
Vicp0fiPq/HJzxsmKHxyFJsgsdV0Dl9ElnlhpH77qxi/nXuUz9YlWZwwQI8KSsKm
sOzTUpSHHHpDocT24Yx73bR3Hd8CJam2bCEOOIIJG7sPx2lhTEJ+sKHDh4jHmRUI
3rVk5R+x1CcIrAgin+8nH28PhZFdOKs+CYMYGk0=
-----END CERTIFICATE-----

28
cert/ys.key Normal file
View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCc8UiSQgcol2ZZ
1R2bCNr2oQ2aeZUvuJIWuAyEFG5lp2wPWBhvvyWJYcf8JPjnOZUnjguI43cOOYI/
+ABsV7d6k+J8HmLoIiH62iWobx+D1bLJas/vVn6tpoa2VXg0jLJtEkj/0aPKx/hp
6GkK0Qol/gEDLzaWt8GE2GYd/XpbrlzQ0IYwmgH1av7BkJ1Ho/NwqBY1rfdhV9dM
Pw+JM5T1wtG9EWDA7zvR//yN6TFV0eCB9N1CZWP2tw163pcyta/NQjgucjYk/LIS
ky2UBCcNDb5oYbkDcZ08+RZ5pJP68XoIMJMWSDwPHDSNDfSNzS5C//PPSYW6q++K
+CkZJd67AgMBAAECggEBAJv3KQC4f3a2Zu+1XBObTEc2rFcsprbi/MN5Km8EAuYg
6MGi8b3zvrD1rJGGiJj5X6IMhqgGLWXEfw1lP75ruZomZzij1fUNHqm1qyDlNfOF
JoUGEhiu43tc95kx/SB0Bklgl40rYFQAQH23itRGA4jYEVeBzwUfHkEP8QOyyKtc
YKJHa1jCEvE4XHxLqxFC+z7aNmpFonrW8OerVwrDPIkFbXYrC1alzxqMcNBJVeKE
LFFc6EK9ppoPSsm600yac5gOX2ima9JkaYkGKhK25D4NXCd511Ea/TJNctA8IkYA
QB7mCzLHdapRlhSplDwwwgNRzlrkImbqyS2+768ejYkCgYEAzyatfH62cDSDP5e1
oukWI46AqybfIhd9kHzIbIyPjuSb3RvvuxIfNBFjUxRyh+ggCjnRA14HcZzDcGRd
6VpApq80LQk6mhklKicJNRrcuEvdmj+kRJ+XtSbNZhJVUkNf7nmHCOoJkEwRsblL
kIZCVmfkWAKFjHnCEqH5RHvTbacCgYEAwfObyw0eMD+X23IpyEsCsTKIwIk4Zl8J
iTNnR9yp6B9JdwLSdEWQjhXSltkfmNZ3WXYoyh6kr3jp8d5EqWX1P8JrZBaZikTD
y526kKIvs/I/iW3obOoE6CX6LJEGob8bAPkvu2u37Rghign57W02fYtzJUuqPAoK
b5mtrQ/ycM0CgYBsR8pthgq1Mi3dAt82DeK9qVKGpGYEewTujttxKjQsPEFg3aZ9
Qaa/38rsdYa8ldCRp9EikncPoyLh0ATq4nti5bg/RlC0lipAE3GTqbvwNe/bHiMu
n8F8NpEtJq4ktwUhMbMtLLDdFXY2USY3oIZyhhHtEzxdxpN0i+gxLQzChwKBgQCG
FFztYGIwRKY8hI2x83km+qJjR/l/e8/h03Fg0oF7ALYO2hqXWsf2EcwFkJAxXoIf
jHniUJDU5agFFv0shlmm/Ea1aJI4bhVVG/MvrY+AvMWDwkFdmeJOgoKScKe/BZgr
chi3Xl5GP9pfzUnEAy4aWF7/t3E2FFLml7zi2RVnOQKBgQCYmzwikvHpR+HRiZL9
m0TB6mayGbwQO3xU/naZ1UyCydsRORQnbKaTWSMZgrr7nTAqDhegfUyJXX+uxhGQ
cGu9uLENZWrysXROpMZBhgyNUbDPdO0okIMoJ3kUSocC7L7lpWyZGOxgMwi0a4qK
nV1QDKXsA3oBZn9MJpkuQ81jCw==
-----END PRIVATE KEY-----

42
config.js Normal file
View File

@ -0,0 +1,42 @@
module.exports = {
UdpListenIP: "127.0.0.1",
UdpListenPort: 22102,
UdpTargetIP: "47.90.134.247", // America: 47.90.134.247, Europe: 47.245.143.151
UdpTargetPort: 22102,
useDispatchServer: true,
ignoredProtos: [
// "QueryPathReq",
// "PingReq",
// "PingRsp",
"UnionCmdNotify",
// "EvtAiSyncCombatThreatInfoNotify",
// "WorldPlayerRTTNotify",
// "QueryPathRsp",
// "EvtAiSyncSkillCdNotify",
// "SetEntityClientDataNotify",
// "ObstacleModifyNotify",
// "ClientReportNotify",
// "ClientAbilityInitFinishNotify",
// "EntityConfigHashNotify",
// "MonsterAIConfigHashNotify",
// "EntityAiSyncNotify",
// //currently broken packets
"TakeAchievementRewardRsp",
"ActivityPlayOpenAnimNotify",
"FurnitureCurModuleArrangeCountNotify",
"HomeAvatarTalkFinishInfoNotify",
"GroupLinkAllNotify",
"UnlockedFurnitureSuiteDataNotify",
"HomeAvatarRewardEventNotify",
"H5ActivityIdsNotify",
"HomePriorCheckNotify",
"HomePlantInfoNotify",
"HomeResourceNotify",
"HomeAvatarAllFinishRewardNotify",
"HomeBasicInfoNotify",
"FurnitureMakeRsp"
]
}

7
data/MHYkeys.json Normal file

File diff suppressed because one or more lines are too long

1205
data/packetIds.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
syntax = "proto3";
import "AISnapshotEntitySkillCycle.proto";
message AISnapshotEntityData {
uint32 entity_id = 1;
float real_time = 2;
float tick_time = 3;
uint32 tactic = 4;
float distance_to_player = 5;
uint32 threat_list_size = 6;
uint32 threat_target_id = 7;
uint32 ai_target_id = 8;
uint32 attack_target_id = 9;
float moved_distance = 10;
repeated AISnapshotEntitySkillCycle finished_skill_cycles = 11;
map<uint32, uint32> hitting_avatars = 12;
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message AISnapshotEntitySkillCycle {
uint32 skill_id = 1;
bool selected = 2;
bool trydoskill = 3;
bool success = 4;
bool failed = 5;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "AISnapshotEntityData.proto";
message AISnapshotInfo {
repeated AISnapshotEntityData ai_snapshots = 1;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionBlink {
Vector pos = 1;
Vector rot = 2;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionCreateGadget {
Vector pos = 1;
Vector rot = 2;
uint32 room_id = 3;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionCreateTile {
Vector pos = 1;
Vector rot = 2;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionDestroyTile {
Vector pos = 1;
Vector rot = 2;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionFireAfterImgae {
Vector dir = 1;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionGenerateElemBall {
Vector pos = 1;
Vector rot = 2;
uint32 room_id = 3;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityActionServerMonsterLog {
repeated int32 param_list = 1;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionSetCrashDamage {
float damage = 1;
Vector hit_pos = 2;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityActionSetRandomOverrideMapValue {
float random_value = 1;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityActionSummon {
Vector pos = 1;
Vector rot = 2;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityActionTriggerAbility {
uint32 other_id = 1;
}

View File

@ -0,0 +1,11 @@
syntax = "proto3";
import "AbilityString.proto";
import "AbilityScalarValueEntry.proto";
message AbilityAppliedAbility {
AbilityString ability_name = 1;
AbilityString ability_override = 2;
repeated AbilityScalarValueEntry override_map = 3;
uint32 instanced_ability_id = 4;
}

View File

@ -0,0 +1,21 @@
syntax = "proto3";
import "AbilityString.proto";
import "AbilityAttachedModifier.proto";
import "ModifierDurability.proto";
message AbilityAppliedModifier {
int32 modifier_local_id = 1;
uint32 parent_ability_entity_id = 2;
AbilityString parent_ability_name = 3;
AbilityString parent_ability_override = 4;
uint32 instanced_ability_id = 5;
uint32 instanced_modifier_id = 6;
float exist_duration = 7;
AbilityAttachedModifier attached_instanced_modifier = 8;
uint32 apply_entity_id = 9;
bool is_attached_parent_ability = 10;
ModifierDurability modifier_durability = 11;
uint32 sbuff_uid = 12;
bool is_serverbuff_modifier = 13;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityApplyLevelModifier {
uint32 apply_entity_id = 1;
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message AbilityArgument {
oneof Arg {
uint32 int_arg = 1;
float float_arg = 2;
string str_arg = 3;
}
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message AbilityAttachedModifier {
bool is_invalid = 1;
uint32 owner_entity_id = 2;
uint32 instanced_modifier_id = 3;
bool is_serverbuff_modifier = 4;
int32 attach_name_hash = 5;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "Vector.proto";
message AbilityBornType {
Vector pos = 1;
Vector rot = 2;
Vector move_dir = 3;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "AbilityControlBlock.proto";
message AbilityChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1112;
}
uint32 entity_id = 1;
AbilityControlBlock ability_control_block = 2;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "AbilityEmbryo.proto";
message AbilityControlBlock {
repeated AbilityEmbryo ability_embryo_list = 1;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
message AbilityEmbryo {
uint32 ability_id = 1;
fixed32 ability_name_hash = 2;
fixed32 ability_override_name_hash = 3;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityFloatValue {
float value = 1;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
message AbilityGadgetInfo {
uint32 camp_id = 1;
uint32 camp_target_type = 2;
uint32 target_entity_id = 3;
}

View File

@ -0,0 +1,11 @@
syntax = "proto3";
message AbilityIdentifier {
uint32 instanced_ability_id = 1;
uint32 ability_caster_id = 2;
int32 local_id = 3;
uint32 instanced_modifier_id = 4;
uint32 modifier_owner_id = 5;
bool is_serverbuff_modifier = 6;
}

View File

@ -0,0 +1,17 @@
syntax = "proto3";
import "AbilityInvokeEntry.proto";
message AbilityInvocationFailNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1200;
}
uint32 entity_id = 1;
AbilityInvokeEntry invoke = 2;
string reason = 3;
}

View File

@ -0,0 +1,21 @@
syntax = "proto3";
import "AbilityInvokeEntry.proto";
message AbilityInvocationFixedNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1149;
}
AbilityInvokeEntry invoke1_st = 1;
AbilityInvokeEntry invoke2_nd = 2;
AbilityInvokeEntry invoke3_rd = 3;
AbilityInvokeEntry invoke4_th = 4;
AbilityInvokeEntry invoke5_th = 5;
AbilityInvokeEntry invoke6_th = 6;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "AbilityInvokeEntry.proto";
message AbilityInvocationsNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1118;
}
repeated AbilityInvokeEntry invokes = 1;
}

View File

@ -0,0 +1,52 @@
syntax = "proto3";
enum AbilityInvokeArgument {
ABILITY_NONE = 0;
ABILITY_META_MODIFIER_CHANGE = 1;
ABILITY_META_COMMAND_MODIFIER_CHANGE_REQUEST = 2;
ABILITY_META_SPECIAL_FLOAT_ARGUMENT = 3;
ABILITY_META_OVERRIDE_PARAM = 4;
ABILITY_META_CLEAR_OVERRIDE_PARAM = 5;
ABILITY_META_REINIT_OVERRIDEMAP = 6;
ABILITY_META_GLOBAL_FLOAT_VALUE = 7;
ABILITY_META_CLEAR_GLOBAL_FLOAT_VALUE = 8;
ABILITY_META_ABILITY_ELEMENT_STRENGTH = 9;
ABILITY_META_ADD_OR_GET_ABILITY_AND_TRIGGER = 10;
ABILITY_META_SET_KILLED_SETATE = 11;
ABILITY_META_SET_ABILITY_TRIGGER = 12;
ABILITY_META_ADD_NEW_ABILITY = 13;
ABILITY_META_REMOVE_ABILITY = 14;
ABILITY_META_SET_MODIFIER_APPLY_ENTITY = 15;
ABILITY_META_MODIFIER_DURABILITY_CHANGE = 16;
ABILITY_META_ELEMENT_REACTION_VISUAL = 17;
ABILITY_META_SET_POSE_PARAMETER = 18;
ABILITY_META_UPDATE_BASE_REACTION_DAMAGE = 19;
ABILITY_META_TRIGGER_ELEMENT_REACTION = 20;
ABILITY_META_LOSE_HP = 21;
ABILITY_ACTION_TRIGGER_ABILITY = 50;
ABILITY_ACTION_SET_CRASH_DAMAGE = 51;
ABILITY_ACTION_EFFECT = 52;
ABILITY_ACTION_SUMMON = 53;
ABILITY_ACTION_BLINK = 54;
ABILITY_ACTION_CREATE_GADGET = 55;
ABILITY_ACTION_APPLY_LEVEL_MODIFIER = 56;
ABILITY_ACTION_GENERATE_ELEM_BALL = 57;
ABILITY_ACTION_SET_RANDOM_OVERRIDE_MAP_VALUE = 58;
ABILITY_ACTION_SERVER_MONSTER_LOG = 59;
ABILITY_ACTION_CREATE_TILE = 60;
ABILITY_ACTION_DESTROY_TILE = 61;
ABILITY_ACTION_FIRE_AFTER_IMAGE = 62;
ABILITY_MIXIN_AVATAR_STEER_BY_CAMERA = 100;
ABILITY_MIXIN_MONSTER_DEFEND = 101;
ABILITY_MIXIN_WIND_ZONE = 102;
ABILITY_MIXIN_COST_STAMINA = 103;
ABILITY_MIXIN_ELITE_SHIELD = 104;
ABILITY_MIXIN_ELEMENT_SHIELD = 105;
ABILITY_MIXIN_GLOBAL_SHIELD = 106;
ABILITY_MIXIN_SHIELD_BAR = 107;
ABILITY_MIXIN_WIND_SEED_SPAWNER = 108;
ABILITY_MIXIN_DO_ACTION_BY_ELEMENT_REACTION = 109;
ABILITY_MIXIN_FIELD_ENTITY_COUNT_CHANGE = 110;
ABILITY_MIXIN_SCENE_PROP_SYNC = 111;
ABILITY_MIXIN_WIDGET_MP_SUPPORT = 112;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "AbilityInvokeEntryHead.proto";
import "AbilityInvokeArgument.proto";
import "ForwardType.proto";
message AbilityInvokeEntry {
AbilityInvokeEntryHead head = 1;
AbilityInvokeArgument argument_type = 2;
bytes ability_data = 3;
uint32 entity_id = 4;
ForwardType forward_type = 5;
uint32 forward_peer = 6;
uint32 event_id = 7;
double total_tick_time = 8;
}

View File

@ -0,0 +1,12 @@
syntax = "proto3";
message AbilityInvokeEntryHead {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;
int32 local_id = 3;
int32 modifier_config_local_id = 4;
uint32 target_id = 5;
bool is_serverbuff_modifier = 6;
uint32 server_buff_uid = 7;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "AbilityAppliedAbility.proto";
message AbilityMetaAddAbility {
AbilityAppliedAbility ability = 1;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "AbilityString.proto";
message AbilityMetaAddOrGetAbilityAndTrigger {
AbilityString ability_name = 1;
AbilityString ability_override = 2;
float trigger_argument = 3;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
message AbilityMetaElementReactionVisual {
uint32 element_reaction_type = 1;
uint32 element_source_type = 2;
uint32 element_reactor_type = 3;
int32 hit_index = 4;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMetaLoseHp {
uint32 lose_hp_config_idx = 1;
}

View File

@ -0,0 +1,19 @@
syntax = "proto3";
import "ModifierAction.proto";
import "AbilityString.proto";
import "AbilityAttachedModifier.proto";
import "ModifierProperty.proto";
message AbilityMetaModifierChange {
ModifierAction action = 1;
AbilityString parent_ability_name = 2;
AbilityString parent_ability_override = 3;
AbilityAttachedModifier attached_instanced_modifier = 4;
repeated ModifierProperty properties = 5;
int32 modifier_local_id = 6;
bool is_mute_remote = 7;
uint32 apply_entity_id = 8;
bool is_attached_parent_ability = 9;
uint32 server_buff_uid = 10;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
message AbilityMetaModifierDurabilityChange {
float reduce_durability = 1;
float remain_durability = 2;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "AbilityScalarValueEntry.proto";
message AbilityMetaReInitOverrideMap {
repeated AbilityScalarValueEntry override_map = 1;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMetaSetAbilityTrigger {
uint32 trigger_ability_entity_id = 1;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMetaSetKilledState {
bool killed = 1;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMetaSetModifierApplyEntityId {
uint32 apply_entity_id = 1;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
import "AnimatorParameterValueInfoPair.proto";
message AbilityMetaSetPoseParameter {
AnimatorParameterValueInfoPair value = 1;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
message AbilityMetaSpecialFloatArgument {
float argument_value = 1;
bool is_on = 2;
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message AbilityMetaTriggerElementReaction {
uint32 element_reaction_type = 1;
uint32 element_source_type = 2;
uint32 element_reactor_type = 3;
int32 hit_index = 4;
uint32 trigger_entity_id = 5;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "AbilityString.proto";
message AbilityMetaUpdateBaseReactionDamage {
uint32 source_caster_id = 1;
uint32 reaction_type = 2;
AbilityString global_value_key = 3;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
import "Vector.proto";
message AbilityMixinAvatarSteerByCamera {
Vector target_pos = 1;
Vector target_dir = 2;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMixinCostStamina {
bool is_swim = 1;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMixinDoActionByElementReaction {
uint32 target_entity_id = 1;
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message AbilityMixinElementShield {
float sub_shield = 1;
bool is_shield_broken = 2;
float shield = 3;
float max_shield = 4;
uint32 absorb_type = 5;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMixinEliteShield {
float sub_shield = 1;
}

View File

@ -0,0 +1,5 @@
syntax = "proto3";
message AbilityMixinEmpty {
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMixinFieldEntityCountChange {
uint32 field_entity_count = 1;
}

View File

@ -0,0 +1,11 @@
syntax = "proto3";
message AbilityMixinGlobalShield {
float sub_shield = 1;
uint32 avatar_id = 2;
string shield_effect_name = 3;
float height_offset = 4;
bool is_create_effect = 5;
float max_shield = 6;
}

View File

@ -0,0 +1,14 @@
syntax = "proto3";
import "MassivePropSyncInfo.proto";
message AbilityMixinRecoverInfo {
oneof Source {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;
}
uint32 local_id = 3;
repeated uint32 data_list = 4;
bool is_serverbuff_modifier = 5;
repeated MassivePropSyncInfo massive_prop_list = 6;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
import "MassivePropSyncInfo.proto";
message AbilityMixinScenePropSync {
repeated MassivePropSyncInfo massive_prop_list = 1;
repeated int64 delete_id_list = 2;
bool is_clear_all = 3;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
message AbilityMixinShieldBar {
uint32 element_type = 1;
float shield = 2;
float max_shield = 3;
}

View File

@ -0,0 +1,6 @@
syntax = "proto3";
message AbilityMixinWidgetMpSupport {
uint32 target_entity_id = 1;
}

View File

@ -0,0 +1,20 @@
syntax = "proto3";
import "Vector.proto";
message AbilityMixinWindSeedSpawner {
message AddSignal {
}
message RefreshSeed {
repeated Vector pos_list = 1;
}
message CatchSeed {
uint32 entity_id = 1;
}
oneof Cmd {
AddSignal add_signal = 1;
RefreshSeed refresh_seed = 2;
CatchSeed catch_seed = 3;
}
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
message AbilityMixinWindZone {
repeated uint32 entity_ids = 1;
repeated uint32 zone_id_list = 2;
}

View File

@ -0,0 +1,11 @@
syntax = "proto3";
enum AbilityScalarType {
UNKNOW = 0;
FLOAT = 1;
INT = 2;
BOOL = 3;
TRIGGER = 4;
STRING = 5;
UINT = 6;
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
import "AbilityString.proto";
import "AbilityScalarType.proto";
message AbilityScalarValueEntry {
oneof Value {
float float_value = 3;
string string_value = 4;
int32 int_value = 5;
uint32 uint_value = 6;
}
AbilityString key = 1;
AbilityScalarType value_type = 2;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
message AbilityString {
oneof Type {
string str = 1;
uint32 hash = 2;
}
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
import "AbilityScalarValueEntry.proto";
import "AbilityAppliedAbility.proto";
import "AbilityAppliedModifier.proto";
import "AbilityMixinRecoverInfo.proto";
message AbilitySyncStateInfo {
bool is_inited = 1;
repeated AbilityScalarValueEntry dynamic_value_map = 2;
repeated AbilityAppliedAbility applied_abilities = 3;
repeated AbilityAppliedModifier applied_modifiers = 4;
repeated AbilityMixinRecoverInfo mixin_recover_infos = 5;
repeated AbilityScalarValueEntry sgv_dynamic_value_map = 6;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message AcceptCityReputationRequestReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2842;
}
uint32 city_id = 1;
uint32 request_id = 2;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message AcceptCityReputationRequestRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2861;
}
int32 retcode = 1;
uint32 city_id = 2;
uint32 request_id = 3;
}

View File

@ -0,0 +1,21 @@
syntax = "proto3";
enum AccountType {
ACCOUNT_MIHOYO_GUEST = 0;
ACCOUNT_MIHOYO = 1;
ACCOUNT_XIAOMI = 11;
ACCOUNT_COOLPAD = 12;
ACCOUNT_YYB = 13;
ACCOUNT_BILI = 14;
ACCOUNT_HUAWEI = 15;
ACCOUNT_MEIZU = 16;
ACCOUNT360 = 17;
ACCOUNT_OPPO = 18;
ACCOUNT_VIVO = 19;
ACCOUNT_UC = 20;
ACCOUNT_WANDOJIA = 21;
ACCOUNT_LENOVO = 22;
ACCOUNT_JINLI = 23;
ACCOUNT_BAIDU = 25;
ACCOUNT_DANGLE = 26;
}

View File

@ -0,0 +1,17 @@
syntax = "proto3";
message Achievement {
enum Status {
INVALID = 0;
UNFINISHED = 1;
FINISHED = 2;
REWARD_TAKEN = 3;
}
uint32 id = 1;
Status status = 2;
uint32 cur_progress = 3;
uint32 total_progress = 4;
uint32 finish_timestamp = 5;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "Achievement.proto";
message AchievementAllDataNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2653;
}
repeated Achievement achievement_list = 1;
repeated uint32 reward_taken_goal_id_list = 2;
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
import "Achievement.proto";
message AchievementUpdateNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2693;
}
repeated Achievement achievement_list = 1;
}

View File

@ -0,0 +1,209 @@
syntax = "proto3";
enum ActionReasonType {
ACTION_REASON_NONE = 0;
ACTION_REASON_QUEST_ITEM = 1;
ACTION_REASON_QUEST_REWARD = 2;
ACTION_REASON_TRIFLE = 3;
ACTION_REASON_SHOP = 4;
ACTION_REASON_PLAYER_UPGRADE_REWARD = 5;
ACTION_REASON_ADD_AVATAR = 6;
ACTION_REASON_GADGET_ENV_ANIMAL = 7;
ACTION_REASON_MONSTER_ENV_ANIMAL = 8;
ACTION_REASON_COMPOUND = 9;
ACTION_REASON_COOK = 10;
ACTION_REASON_GATHER = 11;
ACTION_REASON_MAIL_ATTACHMENT = 12;
ACTION_REASON_CITY_LEVELUP_RETURN = 15;
ACTION_REASON_CITY_LEVELUP_REWARD = 17;
ACTION_REASON_AREA_EXPLORE_REWARD = 18;
ACTION_REASON_UNLOCK_POINT_REWARD = 19;
ACTION_REASON_DUNGEON_FIRST_PASS = 20;
ACTION_REASON_DUNGEON_PASS = 21;
ACTION_REASON_CHANGE_ELEM_TYPE = 23;
ACTION_REASON_FETTER_OPEN = 25;
ACTION_REASON_DAILY_TASK_SCORE = 26;
ACTION_REASON_DAILY_TASK_HOST = 27;
ACTION_REASON_RAND_TASK_HOST = 28;
ACTION_REASON_EXPEDITION = 29;
ACTION_REASON_GACHA = 30;
ACTION_REASON_COMBINE = 31;
ACTION_REASON_RAND_TASK_GUEST = 32;
ACTION_REASON_DAILY_TASK_GUEST = 33;
ACTION_REASON_FORGE_OUTPUT = 34;
ACTION_REASON_FORGE_RETURN = 35;
ACTION_REASON_INIT_AVATAR = 36;
ACTION_REASON_MONSTER_DIE = 37;
ACTION_REASON_GM = 38;
ACTION_REASON_OPEN_CHEST = 39;
ACTION_REASON_GADGET_DIE = 40;
ACTION_REASON_MONSTER_CHANGE_HP = 41;
ACTION_REASON_SUBFIELD_DROP = 42;
ACTION_REASON_PUSH_TIPS_REWARD = 43;
ACTION_REASON_ACTIVITY_MONSTER_DROP = 44;
ACTION_REASON_ACTIVITY_GATHER = 45;
ACTION_REASON_ACTIVITY_SUBFIELD_DROP = 46;
ACTION_REASON_TOWER_SCHEDULE_REWARD = 47;
ACTION_REASON_TOWER_FLOOR_STAR_REWARD = 48;
ACTION_REASON_TOWER_FIRST_PASS_REWARD = 49;
ACTION_REASON_TOWER_DAILY_REWARD = 50;
ACTION_REASON_HIT_CLIENT_TRIVIAL_ENTITY = 51;
ACTION_REASON_OPEN_WORLD_BOSS_CHEST = 52;
ACTION_REASON_MATERIAL_DELETE_RETURN = 53;
ACTION_REASON_SIGN_IN_REWARD = 54;
ACTION_REASON_OPEN_BLOSSOM_CHEST = 55;
ACTION_REASON_RECHARGE = 56;
ACTION_REASON_BONUS_ACTIVITY_REWARD = 57;
ACTION_REASON_TOWER_COMMEMORATIVE_REWARD = 58;
ACTION_REASON_TOWER_SKIP_FLOOR_REWARD = 59;
ACTION_REASON_RECHARGE_BONUS = 60;
ACTION_REASON_RECHARGE_CARD = 61;
ACTION_REASON_RECHARGE_CARD_DAILY = 62;
ACTION_REASON_RECHARGE_CARD_REPLACE = 63;
ACTION_REASON_RECHARGE_CARD_REPLACE_FREE = 64;
ACTION_REASON_RECHARGE_PLAY_REPLACE = 65;
ACTION_REASON_MP_PLAY_TAKE_REWARD = 66;
ACTION_REASON_ACTIVITY_WATCHER = 67;
ACTION_REASON_SALESMAN_DELIVER_ITEM = 68;
ACTION_REASON_SALESMAN_REWARD = 69;
ACTION_REASON_REBATE = 70;
ACTION_REASON_MCOIN_EXCHANGE_HCOIN = 71;
ACTION_REASON_DAILY_TASK_EXCHANGE_LEGENDARY_KEY = 72;
ACTION_REASON_UNLOCK_PERSON_LINE = 73;
ACTION_REASON_FETTER_LEVEL_REWARD = 74;
ACTION_REASON_BUY_RESIN = 75;
ACTION_REASON_RECHARGE_PACKAGE = 76;
ACTION_REASON_DELIVERY_DAILY_REWARD = 77;
ACTION_REASON_CITY_REPUTATION_LEVEL = 78;
ACTION_REASON_CITY_REPUTATION_QUEST = 79;
ACTION_REASON_CITY_REPUTATION_REQUEST = 80;
ACTION_REASON_CITY_REPUTATION_EXPLORE = 81;
ACTION_REASON_OFFERGING_LEVEL = 82;
ACTION_REASON_ROUTINE_HOST = 83;
ACTION_REASON_ROUTINE_GUEST = 84;
ACTION_REASON_TREASURE_MAP_SPOT_TOKEN = 89;
ACTION_REASON_TREASURE_MAP_BONUS_LEVEL_REWARD = 90;
ACTION_REASON_TREASURE_MAP_MP_REWARD = 91;
ACTION_REASON_CONVERT = 92;
ACTION_REASON_OVERFLOW_TRANSFORM = 93;
ACTION_REASON_ACTIVITY_AVATAR_SELECTION_REWARD = 96;
ACTION_REASON_ACTIVITY_WATCHER_BATCH = 97;
ACTION_REASON_HIT_TREE_DROP = 98;
ACTION_REASON_GET_HOME_LEVELUP_REWARD = 99;
ACTION_REASON_HOME_DEFAULT_FURNITURE = 100;
ACTION_REASON_ACTIVITY_COND = 101;
ACTION_REASON_BATTLE_PASS_NOTIFY = 102;
ACTION_REASON_RELIQUARY_DECOMPOSE = 103;
ACTION_REASON_RECHARGE_GOOGLE_GIFT_GARD = 104;
ACTION_REASON_RECHARGE_CONCERT_PRODUCT = 105;
ACTION_REASON_RECHARGE_CONCERT_PRODUCT_REPLACE = 106;
ACTION_REASON_SEND_CONCERT_PRODUCT_BY_MUIP = 107;
ACTION_REASON_RECHARGE_APPLE_GIFT_GARD = 108;
ACTION_REASON_PLAYER_USE_ITEM = 1001;
ACTION_REASON_DROP_ITEM = 1002;
ACTION_REASON_WEAPON_UPGRADE = 1011;
ACTION_REASON_WEAPON_PROMOTE = 1012;
ACTION_REASON_WEAPON_AWAKEN = 1013;
ACTION_REASON_RELIC_UPGRADE = 1014;
ACTION_REASON_ABILITY = 1015;
ACTION_REASON_DUNGEON_STATUE_DROP = 1016;
ACTION_REASON_OFFLINE_MSG = 1017;
ACTION_REASON_AVATAR_UPGRADE = 1018;
ACTION_REASON_AVATAR_PROMOTE = 1019;
ACTION_REASON_QUEST_ACTION = 1021;
ACTION_REASON_CITY_LEVELUP = 1022;
ACTION_REASON_UPGRADE_SKILL = 1024;
ACTION_REASON_UNLOCK_TALENT = 1025;
ACTION_REASON_UPGRADE_PROUD_SKILL = 1026;
ACTION_REASON_PLAYER_LEVEL_LIMIT_UP = 1027;
ACTION_REASON_DUNGEON_DAILY = 1028;
ACTION_REASON_ITEM_GIVING = 1030;
ACTION_REASON_FORGE_COST = 1031;
ACTION_REASON_INVESTIGATION_REWARD = 1032;
ACTION_REASON_INVESTIGATION_TARGET_REWARD = 1033;
ACTION_REASON_GADGET_INTERACT = 1034;
ACTION_REASON_SEA_LAMP_CI_MATERIAL = 1036;
ACTION_REASON_SEA_LAMP_CONTRIBUTION_REWARD = 1037;
ACTION_REASON_SEA_LAMP_PHASE_REWARD = 1038;
ACTION_REASON_SEA_LAMP_FLY_LAMP = 1039;
ACTION_REASON_AUTO_RECOVER = 1040;
ACTION_REASON_ACTIVITY_EXPIRE_ITEM = 1041;
ACTION_REASON_SUB_COIN_NEGATIVE = 1042;
ACTION_REASON_BARGAIN_DEDUCT = 1043;
ACTION_REASON_BATTLE_PASS_PAID_REWARD = 1044;
ACTION_REASON_BATTLE_PASS_LEVEL_REWARD = 1045;
ACTION_REASON_TRIAL_AVATAR_ACTIVITY_FIRST_PASS_REWARD = 1046;
ACTION_REASON_BUY_BATTLE_PASS_LEVEL = 1047;
ACTION_REASON_GRANT_BIRTHDAY_BENEFIT = 1048;
ACTION_REASON_ACHIEVEMENT_REWARD = 1049;
ACTION_REASON_ACHIEVEMENT_GOAL_REWARD = 1050;
ACTION_REASON_FIRST_SHARE_TO_SOCIAL_NETWORK = 1051;
ACTION_REASON_DESTROY_MATERIAL = 1052;
ACTION_REASON_CODEX_LEVELUP_REWARD = 1053;
ACTION_REASON_HUNTING_OFFER_REWARD = 1054;
ACTION_REASON_USE_WIDGET_ANCHOR_POINT = 1055;
ACTION_REASON_USE_WIDGET_BONFIRE = 1056;
ACTION_REASON_UNGRADE_WEAPON_RETURN_MATERIAL = 1057;
ACTION_REASON_USE_WIDGET_ONEOFF_GATHER_POINT_DETECTOR = 1058;
ACTION_REASON_USE_WIDGET_CLIENT_COLLECTOR = 1059;
ACTION_REASON_USE_WIDGET_CLIENT_DETECTOR = 1060;
ACTION_REASON_TAKE_GENERAL_REWARD = 1061;
ACTION_REASON_ASTER_TAKE_SPECIAL_REWARD = 1062;
ACTION_REASON_REMOVE_CODEX_BOOK = 1063;
ACTION_REASON_OFFERING_ITEM = 1064;
ACTION_REASON_USE_WIDGET_GADGET_BUILDER = 1065;
ACTION_REASON_EFFIGY_FIRST_PASS_REWARD = 1066;
ACTION_REASON_EFFIGY_REWARD = 1067;
ACTION_REASON_REUNION_FIRST_GIFT_REWARD = 1068;
ACTION_REASON_REUNION_SIGN_IN_REWARD = 1069;
ACTION_REASON_REUNION_WATCHER_REWARD = 1070;
ACTION_REASON_SALESMAN_MP_REWARD = 1071;
ACTION_REASION_AVATAR_PROMOTE_REWARD = 1072;
ACTION_REASON_BLESSING_REDEEM_REWARD = 1073;
ACTION_MIRACLE_RING_REWARD = 1074;
ACTION_REASON_EXPEDITION_REWARD = 1075;
ACTION_REASON_TREASURE_MAP_REMOVE_DETECTOR = 1076;
ACTION_REASON_MECHANICUS_DUNGEON_TICKET = 1077;
ACTION_REASON_MECHANICUS_LEVELUP_GEAR = 1078;
ACTION_REASON_MECHANICUS_BATTLE_SETTLE = 1079;
ACTION_REASON_REGION_SEARCH_REWARD = 1080;
ACTION_REASON_UNLOCK_COOP_CHAPTER = 1081;
ACTION_REASON_TAKE_COOP_REWARD = 1082;
ACTION_REASON_FLEUR_FAIR_DUNGEON_REWARD = 1083;
ACTION_REASON_ACTIVITY_SCORE = 1084;
ACTION_REASON_CHANNELLER_SLAB_ONEOFF_DUNGEON_REWARD = 1085;
ACTION_REASON_FURNITURE_MAKE_START = 1086;
ACTION_REASON_FURNITURE_MAKE_TAKE = 1087;
ACTION_REASON_FURNITURE_MAKE_CANCEL = 1088;
ACTION_REASON_FURNITURE_MAKE_FAST_FINISH = 1089;
ACTION_REASON_CHANNELLER_SLAB_LOOP_DUNGEON_FIRST_PASS_REWARD = 1090;
ACTION_REASON_CHANNELLER_SLAB_LOOP_DUNGEON_SCORE_REWARD = 1091;
ACTION_REASON_HOME_LIMITED_SHOP_BUY = 1092;
ACTION_REASON_HOME_COIN_COLLECT = 1093;
ACTION_REASON_SUMMER_TIME_SENTRY_TOWER_REWARD = 1094;
ACTION_REASON_SUMMER_TIME_SPRINT_BOAT_REWARD = 1095;
ACTION_REASON_SUMMER_TIME_BOSS_REWARD = 1096;
ACTION_REASON_SUMMER_TIME_BOMB_REWARD = 1097;
ACTION_REASON_HOME_FETTER_COLLECT = 1098;
ACTION_REASON_ECHO_SHELL_REWARD = 1099;
ACTION_REASON_HOME_EVENT_REWARD = 1100;
ACTION_REASON_BLITZ_RUSH_DUNGEON_REWARD = 1101;
ACTION_REASON_FURNITURE_MAKE_RETURN = 1102;
ACTION_REASON_HOME_PLANT_BOX_GATHER = 1103;
ACTION_REASON_HOME_PLANT_SEED = 1104;
ACTION_REASON_HOME_PLANT_GATHER = 1105;
ACTION_REASON_CHESS_DUNGEON_REWARD = 1106;
ACTION_REASON_GROUP_LINK_BUNDLE_FINISH = 1107;
ACTION_REASON_LUNA_RITE_SACRIFICE = 1108;
ACTION_REASON_LUNA_RITE_TAKE_SACRIFICE_REWARD = 1109;
ACTION_REASON_FISH_BITE = 1110;
ACTION_REASON_FISH_SUCC = 1111;
ACTION_REASON_PLANT_FLOWER_REWARD = 1112;
ACTION_REASON_PLANT_FLOWER_DELIVER_ITEM = 1113;
ACTION_REASON_PLANT_FLOWER_GIVE_FLOWER = 1114;
ACTION_REASON_PLANT_FLOWER_RECV_FLOWER = 1115;
ACTION_REASON_ROGUE_CHALLENGE_SETTLE = 1116;
ACTION_REASON_ROGUE_TAKE_FIRST_PASS_REWARD = 1117;
ACTION_REASON_ROGUE_UPGRADE_SHIKIGAMI = 1118;
ACTION_REASON_ROGUE_REFRESH_CARD = 1119;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivityCoinInfoNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2151;
}
uint32 schedule_id = 1;
map<uint32, uint32> activity_coin_map = 2;
uint32 activity_id = 3;
}

View File

@ -0,0 +1,20 @@
syntax = "proto3";
import "Uint32Pair.proto";
message ActivityCondStateChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2166;
}
uint32 schedule_id = 1;
uint32 activity_id = 2;
repeated uint32 meet_cond_list = 3;
repeated uint32 expire_cond_list = 4;
repeated uint32 activated_sale_id_list = 5;
repeated Uint32Pair disable_transfer_point_interaction_list = 6;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "Uint32Pair.proto";
message ActivityDisableTransferPointInteractionNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 8016;
}
Uint32Pair scene_point_pair = 1;
bool is_disable = 2;
}

View File

@ -0,0 +1,92 @@
syntax = "proto3";
import "SeaLampActivityDetailInfo.proto";
import "CrucibleActivityDetailInfo.proto";
import "SalesmanActivityDetailInfo.proto";
import "TrialAvatarActivityDetailInfo.proto";
import "DeliveryActivityDetailInfo.proto";
import "AsterActivityDetailInfo.proto";
import "FlightActivityDetailInfo.proto";
import "DragonSpineActivityDetailInfo.proto";
import "EffigyActivityDetailInfo.proto";
import "TreasureMapActivityDetailInfo.proto";
import "BlessingActivityDetailInfo.proto";
import "SeaLampActivityInfo.proto";
import "ExpeditionActivityDetailInfo.proto";
import "ArenaChallengeActivityDetailInfo.proto";
import "FleurFairActivityDetailInfo.proto";
import "WaterSpiritActivityDetailInfo.proto";
import "ChannelerSlabActivityDetailInfo.proto";
import "MistTrialActivityDetailInfo.proto";
import "HideAndSeekActivityDetailInfo.proto";
import "FindHilichurlDetailInfo.proto";
import "SummerTimeDetailInfo.proto";
import "BuoyantCombatDetailInfo.proto";
import "EchoShellDetailInfo.proto";
import "BounceConjuringActivityDetailInfo.proto";
import "BlitzRushActivityDetailInfo.proto";
import "ChessActivityDetailInfo.proto";
import "SumoActivityDetailInfo.proto";
import "MoonfinTrialActivityDetailInfo.proto";
import "LunaRiteDetailInfo.proto";
import "PlantFlowerActivityDetailInfo.proto";
import "MusicGameActivityDetailInfo.proto";
import "RoguelikeDungeonActivityDetailInfo.proto";
import "DigActivityDetailInfo.proto";
import "ActivityWatcherInfo.proto";
message ActivityInfo {
oneof Detail {
SeaLampActivityDetailInfo sam_lamp_info = 11;
CrucibleActivityDetailInfo crucible_info = 12;
SalesmanActivityDetailInfo salesman_info = 13;
TrialAvatarActivityDetailInfo trial_avatar_info = 14;
DeliveryActivityDetailInfo delivery_info = 16;
AsterActivityDetailInfo aster_info = 21;
FlightActivityDetailInfo flight_info = 25;
DragonSpineActivityDetailInfo dragon_spine_info = 31;
EffigyActivityDetailInfo effigy_info = 32;
TreasureMapActivityDetailInfo treasure_map_info = 35;
BlessingActivityDetailInfo blessing_info = 41;
SeaLampActivityInfo sea_lamp_info = 42;
ExpeditionActivityDetailInfo expedition_info = 43;
ArenaChallengeActivityDetailInfo arena_challenge_info = 44;
FleurFairActivityDetailInfo fleur_fair_info = 51;
WaterSpiritActivityDetailInfo water_spirit_info = 52;
ChannelerSlabActivityDetailInfo challneler_slab_info = 61;
MistTrialActivityDetailInfo mist_trial_activity_info = 62;
HideAndSeekActivityDetailInfo hide_and_seek_info = 63;
FindHilichurlDetailInfo find_hilichurl_info = 64;
SummerTimeDetailInfo summer_time_info = 65;
BuoyantCombatDetailInfo buoyant_combat_info = 66;
EchoShellDetailInfo echo_shell_info = 67;
BounceConjuringActivityDetailInfo bounce_conjuring_info = 68;
BlitzRushActivityDetailInfo blitz_rush_info = 69;
ChessActivityDetailInfo chess_info = 70;
SumoActivityDetailInfo sumo_info = 71;
MoonfinTrialActivityDetailInfo moonfin_trial_info = 72;
LunaRiteDetailInfo luna_rite_info = 73;
PlantFlowerActivityDetailInfo plant_flower_info = 74;
MusicGameActivityDetailInfo music_game_info = 75;
RoguelikeDungeonActivityDetailInfo roguelike_dungoen_info = 76;
DigActivityDetailInfo dig_info = 77;
}
uint32 activity_id = 1;
uint32 schedule_id = 2;
uint32 begin_time = 3;
uint32 end_time = 4;
uint32 activity_type = 5;
bool is_play_open_anim = 6;
bool is_finished = 7;
bool is_starting = 8;
repeated ActivityWatcherInfo watcher_info_list = 9;
repeated uint32 meet_cond_list = 10;
repeated uint32 expire_cond_list = 15;
uint32 selected_avatar_reward_id = 17;
map<uint32, uint32> activity_coin_map = 18;
uint32 score_limit = 19;
uint32 cur_score = 20;
repeated uint32 taken_reward_list = 24;
bool is_hidden = 26;
uint32 first_day_start_time = 27;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
import "ActivityInfo.proto";
message ActivityInfoNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2177;
}
ActivityInfo activity_info = 1;
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
message ActivityPlayOpenAnimNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2081;
}
uint32 activity_id = 1;
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
message ActivitySaleChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2100;
}
uint32 sale_id = 1;
bool is_close = 2;
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
message ActivityScheduleInfo {
uint32 activity_id = 1;
bool is_open = 2;
uint32 schedule_id = 3;
uint32 begin_time = 4;
uint32 end_time = 5;
}

View File

@ -0,0 +1,17 @@
syntax = "proto3";
import "ActivityScheduleInfo.proto";
message ActivityScheduleInfoNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2068;
}
repeated ActivityScheduleInfo activity_schedule_list = 1;
uint32 remain_fly_sea_lamp_num = 2;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivitySelectAvatarCardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2002;
}
uint32 activity_id = 1;
uint32 reward_id = 2;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivitySelectAvatarCardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 2133;
}
int32 retcode = 1;
uint32 activity_id = 2;
uint32 reward_id = 3;
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
message ActivityShopSheetInfo {
uint32 sheet_id = 1;
uint32 begin_time = 2;
uint32 end_time = 3;
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
message ActivityTakeAllScoreRewardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 8011;
}
uint32 activity_id = 1;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivityTakeAllScoreRewardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 8864;
}
int32 retcode = 1;
uint32 activity_id = 2;
repeated uint32 reward_config_list = 3;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivityTakeScoreRewardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 8122;
}
uint32 activity_id = 1;
uint32 reward_config_id = 2;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivityTakeScoreRewardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 8206;
}
int32 retcode = 1;
uint32 activity_id = 2;
uint32 reward_config_id = 3;
}

View File

@ -0,0 +1,16 @@
syntax = "proto3";
message ActivityTakeWatcherRewardBatchReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 2049;
}
uint32 activity_id = 1;
repeated uint32 watcher_id_list = 2;
}

Some files were not shown because too many files have changed in this diff Show More