Commit 32d30f14 authored by nanahira's avatar nanahira

detect long resolve chains

parent 6f525172
[
11110587,
32362575,
43040603,
58577036,
79106360
]
...@@ -220,6 +220,9 @@ if settings.modules.cloud_replay.enabled ...@@ -220,6 +220,9 @@ if settings.modules.cloud_replay.enabled
if settings.modules.windbot.enabled if settings.modules.windbot.enabled
windbots = loadJSON(settings.modules.windbot.botlist).windbots windbots = loadJSON(settings.modules.windbot.botlist).windbots
if settings.modules.heartbeat_detection.enabled
long_resolve_cards = loadJSON('./data/long_resolve_cards.json')
# 组件 # 组件
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist
...@@ -1897,6 +1900,8 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)-> ...@@ -1897,6 +1900,8 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)->
if settings.modules.heartbeat_detection.enabled if settings.modules.heartbeat_detection.enabled
for player in room.players for player in room.players
player.heartbeat_protected = false player.heartbeat_protected = false
delete room.long_resolve_card
delete room.long_resolve_chain
if room and !room.finished and room.dueling_players[pos] if room and !room.finished and room.dueling_players[pos]
room.winner_name = room.dueling_players[pos].name room.winner_name = room.dueling_players[pos].name
#log.info room.dueling_players, pos #log.info room.dueling_players, pos
...@@ -2003,6 +2008,41 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)-> ...@@ -2003,6 +2008,41 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)->
#console.log("Confirming cards:" + client.name) #console.log("Confirming cards:" + client.name)
client.heartbeat_protected = true client.heartbeat_protected = true
# chain detection
if settings.modules.heartbeat_detection.enabled and client.pos == 0
if ygopro.constants.MSG[msg] == 'CHAINING'
card = buffer.readUInt32LE(1)
found = false
for id in long_resolve_cards when id == card
found = true
break
if found
room.long_resolve_card = card
# console.log(0,card)
else
delete room.long_resolve_card
else if ygopro.constants.MSG[msg] == 'CHAINED' and room.long_resolve_card
chain = buffer.readInt8(1)
if !room.long_resolve_chain
room.long_resolve_chain = []
room.long_resolve_chain[chain] = true
# console.log(1,chain)
delete room.long_resolve_card
else if ygopro.constants.MSG[msg] == 'CHAIN_SOLVING' and room.long_resolve_chain
chain = buffer.readInt8(1)
# console.log(2,chain)
if room.long_resolve_chain[chain]
for player in room.get_playing_player()
player.heartbeat_protected = true
else if (ygopro.constants.MSG[msg] == 'CHAIN_NEGATED' or ygopro.constants.MSG[msg] == 'CHAIN_DISABLED') and room.long_resolve_chain
chain = buffer.readInt8(1)
# console.log(3,chain)
delete room.long_resolve_chain[chain]
else if ygopro.constants.MSG[msg] == 'CHAIN_END'
# console.log(4,chain)
delete room.long_resolve_card
delete room.long_resolve_chain
#登场台词 #登场台词
if settings.modules.dialogues.enabled if settings.modules.dialogues.enabled
if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING' or ygopro.constants.MSG[msg] == 'CHAINING' if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING' or ygopro.constants.MSG[msg] == 'CHAINING'
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 1.12.7
(function() { (function() {
var CLIENT_get_authorize_key, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_reconnect, CLIENT_is_player, CLIENT_kick, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, _, addCallback, badwords, ban_user, bunyan, challonge, chat_color, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, import_datas, j, l, len, len1, lflists, list, loadJSON, load_dialogues, load_tips, log, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, tips, url, users_cache, wait_room_start, wait_room_start_arena, windbot_bin, windbot_parameters, windbot_process, windbots, ygopro, zlib; var CLIENT_get_authorize_key, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_reconnect, CLIENT_is_player, CLIENT_kick, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, _, addCallback, badwords, ban_user, bunyan, challonge, chat_color, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, import_datas, j, l, len, len1, lflists, list, loadJSON, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, tips, url, users_cache, wait_room_start, wait_room_start_arena, windbot_bin, windbot_parameters, windbot_process, windbots, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -268,6 +268,10 @@ ...@@ -268,6 +268,10 @@
windbots = loadJSON(settings.modules.windbot.botlist).windbots; windbots = loadJSON(settings.modules.windbot.botlist).windbots;
} }
if (settings.modules.heartbeat_detection.enabled) {
long_resolve_cards = loadJSON('./data/long_resolve_cards.json');
}
ygopro = require('./ygopro.js'); ygopro = require('./ygopro.js');
if (settings.modules.http.websocket_roomlist) { if (settings.modules.http.websocket_roomlist) {
...@@ -2145,7 +2149,7 @@ ...@@ -2145,7 +2149,7 @@
} }
ygopro.stoc_follow('GAME_MSG', true, function(buffer, info, client, server) { ygopro.stoc_follow('GAME_MSG', true, function(buffer, info, client, server) {
var card, check, count, cpos, deck_found, hint_type, i, len2, len3, limbo_found, line, loc, m, max_loop, msg, n, o, oppo_pos, phase, player, playertype, pos, ppos, reason, ref2, ref3, ref4, ref5, ref6, room, trigger_location, val, win_pos; var card, chain, check, count, cpos, deck_found, found, hint_type, i, id, len2, len3, len4, len5, limbo_found, line, loc, m, max_loop, msg, n, o, oppo_pos, p, phase, player, playertype, pos, ppos, q, reason, ref2, ref3, ref4, ref5, ref6, ref7, room, trigger_location, val, win_pos;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
return; return;
...@@ -2289,6 +2293,8 @@ ...@@ -2289,6 +2293,8 @@
player = ref2[m]; player = ref2[m];
player.heartbeat_protected = false; player.heartbeat_protected = false;
} }
delete room.long_resolve_card;
delete room.long_resolve_chain;
} }
if (room && !room.finished && room.dueling_players[pos]) { if (room && !room.finished && room.dueling_players[pos]) {
room.winner_name = room.dueling_players[pos].name; room.winner_name = room.dueling_players[pos].name;
...@@ -2435,14 +2441,60 @@ ...@@ -2435,14 +2441,60 @@
client.heartbeat_protected = true; client.heartbeat_protected = true;
} }
} }
if (settings.modules.heartbeat_detection.enabled && client.pos === 0) {
if (ygopro.constants.MSG[msg] === 'CHAINING') {
card = buffer.readUInt32LE(1);
found = false;
for (o = 0, len3 = long_resolve_cards.length; o < len3; o++) {
id = long_resolve_cards[o];
if (!(id === card)) {
continue;
}
found = true;
break;
}
if (found) {
room.long_resolve_card = card;
console.log(0, card);
} else {
delete room.long_resolve_card;
}
} else if (ygopro.constants.MSG[msg] === 'CHAINED' && room.long_resolve_card) {
chain = buffer.readInt8(1);
if (!room.long_resolve_chain) {
room.long_resolve_chain = [];
}
room.long_resolve_chain[chain] = true;
console.log(1, chain);
delete room.long_resolve_card;
} else if (ygopro.constants.MSG[msg] === 'CHAIN_SOLVING' && room.long_resolve_chain) {
chain = buffer.readInt8(1);
console.log(2, chain);
if (room.long_resolve_chain[chain]) {
ref6 = room.get_playing_player();
for (p = 0, len4 = ref6.length; p < len4; p++) {
player = ref6[p];
player.heartbeat_protected = true;
}
}
} else if ((ygopro.constants.MSG[msg] === 'CHAIN_NEGATED' || ygopro.constants.MSG[msg] === 'CHAIN_DISABLED') && room.long_resolve_chain) {
chain = buffer.readInt8(1);
console.log(3, chain);
delete room.long_resolve_chain[chain];
} else if (ygopro.constants.MSG[msg] === 'CHAIN_END') {
console.log(4, chain);
delete room.long_resolve_card;
delete room.long_resolve_chain;
}
}
if (settings.modules.dialogues.enabled) { if (settings.modules.dialogues.enabled) {
if (ygopro.constants.MSG[msg] === 'SUMMONING' || ygopro.constants.MSG[msg] === 'SPSUMMONING' || ygopro.constants.MSG[msg] === 'CHAINING') { if (ygopro.constants.MSG[msg] === 'SUMMONING' || ygopro.constants.MSG[msg] === 'SPSUMMONING' || ygopro.constants.MSG[msg] === 'CHAINING') {
card = buffer.readUInt32LE(1); card = buffer.readUInt32LE(1);
trigger_location = buffer.readUInt8(6); trigger_location = buffer.readUInt8(6);
if (dialogues.dialogues[card] && (ygopro.constants.MSG[msg] !== 'CHAINING' || (trigger_location & 0x8) && client.ready_trap)) { if (dialogues.dialogues[card] && (ygopro.constants.MSG[msg] !== 'CHAINING' || (trigger_location & 0x8) && client.ready_trap)) {
ref6 = _.lines(dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)]); ref7 = _.lines(dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)]);
for (o = 0, len3 = ref6.length; o < len3; o++) { for (q = 0, len5 = ref7.length; q < len5; q++) {
line = ref6[o]; line = ref7[q];
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment