Commit 9c6b6df1 authored by nanahira's avatar nanahira

Merge branch 'mc'

parents 7bb45ae3 43738d22
...@@ -939,7 +939,7 @@ CLIENT_heartbeat_unregister = (client) -> ...@@ -939,7 +939,7 @@ CLIENT_heartbeat_unregister = (client) ->
return true return true
CLIENT_heartbeat_register = (client, send) -> CLIENT_heartbeat_register = (client, send) ->
if !settings.modules.heartbeat_detection.enabled or client.closed or client.is_post_watcher or client.pre_reconnecting or client.reconnecting or client.waiting_for_last or client.pos > 3 or client.heartbeat_protected if !settings.modules.heartbeat_detection.enabled or client.closed or client.is_post_watcher or client.pre_reconnecting or client.reconnecting or client.pos > 3 or client.heartbeat_protected
return false return false
if client.heartbeat_timeout if client.heartbeat_timeout
CLIENT_heartbeat_unregister(client) CLIENT_heartbeat_unregister(client)
...@@ -991,6 +991,12 @@ CLIENT_send_replays = (client, room) -> ...@@ -991,6 +991,12 @@ CLIENT_send_replays = (client, room) ->
ygopro.stoc_send(client, "REPLAY", buffer) ygopro.stoc_send(client, "REPLAY", buffer)
return true return true
SOCKET_flush_data = (sk, datas) ->
for buffer in datas
sk.write(buffer)
datas.splice(0, datas.length)
return
class Room class Room
constructor: (name, @hostinfo) -> constructor: (name, @hostinfo) ->
@name = name @name = name
...@@ -1568,9 +1574,9 @@ net.createServer (client) -> ...@@ -1568,9 +1574,9 @@ net.createServer (client) ->
struct._setBuff(b) struct._setBuff(b)
info = _.clone(struct.fields) info = _.clone(struct.fields)
if ygopro.ctos_follows[ctos_proto].synchronous if ygopro.ctos_follows[ctos_proto].synchronous
cancel = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server cancel = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
else else
ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
datas.push ctos_buffer.slice(0, 2 + ctos_message_length) unless cancel datas.push ctos_buffer.slice(0, 2 + ctos_message_length) unless cancel
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length) ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0 ctos_message_length = 0
...@@ -1637,9 +1643,9 @@ net.createServer (client) -> ...@@ -1637,9 +1643,9 @@ net.createServer (client) ->
struct._setBuff(b) struct._setBuff(b)
info = _.clone(struct.fields) info = _.clone(struct.fields)
if ygopro.stoc_follows[stoc_proto].synchronous if ygopro.stoc_follows[stoc_proto].synchronous
cancel = ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server cancel = ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas
else else
ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas
datas.push stoc_buffer.slice(0, 2 + stoc_message_length) unless cancel datas.push stoc_buffer.slice(0, 2 + stoc_message_length) unless cancel
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length) stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0 stoc_message_length = 0
...@@ -1669,7 +1675,7 @@ if settings.modules.stop ...@@ -1669,7 +1675,7 @@ if settings.modules.stop
# 功能模块 # 功能模块
# return true to cancel a synchronous message # return true to cancel a synchronous message
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server, datas)->
# checkmate use username$password, but here don't # checkmate use username$password, but here don't
# so remove the password # so remove the password
name_full =info.name.split("$") name_full =info.name.split("$")
...@@ -1728,7 +1734,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> ...@@ -1728,7 +1734,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.lang=settings.modules.i18n.fallback client.lang=settings.modules.i18n.fallback
return false return false
ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
#log.info info #log.info info
info.pass=info.pass.trim() info.pass=info.pass.trim()
client.pass = info.pass client.pass = info.pass
...@@ -2196,7 +2202,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -2196,7 +2202,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
room.connect(client) room.connect(client)
return return
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
#欢迎信息 #欢迎信息
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and !client.reconnecting return unless room and !client.reconnecting
...@@ -2332,7 +2338,7 @@ if settings.modules.dialogues.get ...@@ -2332,7 +2338,7 @@ if settings.modules.dialogues.get
if settings.modules.dialogues.get_custom if settings.modules.dialogues.get_custom
load_dialogues_custom() load_dialogues_custom()
ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)-> ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and !client.reconnecting return unless room and !client.reconnecting
msg = buffer.readInt8(0) msg = buffer.readInt8(0)
...@@ -2601,7 +2607,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)-> ...@@ -2601,7 +2607,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)->
return false return false
#房间管理 #房间管理
ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server)-> ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
if room.no_watch if room.no_watch
...@@ -2615,7 +2621,7 @@ ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server)-> ...@@ -2615,7 +2621,7 @@ ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server)->
return true return true
return false return false
ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)-> ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
for player in room.players for player in room.players
...@@ -2633,7 +2639,7 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)-> ...@@ -2633,7 +2639,7 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)->
ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_player}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_player}", ygopro.constants.COLORS.RED)
return false return false
ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server)-> ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server, datas)->
selftype = info.type & 0xf selftype = info.type & 0xf
is_host = ((info.type >> 4) & 0xf) != 0 is_host = ((info.type >> 4) & 0xf) != 0
# if room and room.no_watch and selftype == 7 # if room and room.no_watch and selftype == 7
...@@ -2644,7 +2650,7 @@ ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server)-> ...@@ -2644,7 +2650,7 @@ ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server)->
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host #console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
return false return false
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and room.max_player and client.is_host return unless room and room.max_player and client.is_host
pos = info.status >> 4 pos = info.status >> 4
...@@ -2690,29 +2696,32 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ...@@ -2690,29 +2696,32 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
setTimeout (()-> wait_room_start(ROOM_all[client.rid], settings.modules.random_duel.ready_time);return), 1000 setTimeout (()-> wait_room_start(ROOM_all[client.rid], settings.modules.random_duel.ready_time);return), 1000
return return
ygopro.ctos_follow 'REQUEST_FIELD', true, (buffer, info, client, server)-> ygopro.ctos_follow 'REQUEST_FIELD', true, (buffer, info, client, server, datas)->
return true return true
ygopro.stoc_follow 'FIELD_FINISH', true, (buffer, info, client, server)-> ygopro.stoc_follow 'FIELD_FINISH', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return true unless room and settings.modules.reconnect.enabled return true unless room and settings.modules.reconnect.enabled
client.reconnecting = false client.reconnecting = false
if client.time_confirm_required # client did not send TIME_CONFIRM #if client.time_confirm_required # client did not send TIME_CONFIRM
client.waiting_for_last = true # client.waiting_for_last = true
else if client.last_game_msg and client.last_game_msg_title != 'WAITING' # client sent TIME_CONFIRM #else
if client.last_game_msg and client.last_game_msg_title != 'WAITING' # client sent TIME_CONFIRM
SOCKET_flush_data(client, datas)
if client.last_hint_msg if client.last_hint_msg
ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg) ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg)
ygopro.stoc_send(client, 'GAME_MSG', client.last_game_msg) ygopro.stoc_send(client, 'GAME_MSG', client.last_game_msg)
return true return true
ygopro.stoc_follow 'DUEL_END', false, (buffer, info, client, server)-> ygopro.stoc_follow 'DUEL_END', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and settings.modules.replay_delay and room.hostinfo.mode == 1 return unless room and settings.modules.replay_delay and room.hostinfo.mode == 1
SOCKET_flush_data(client, datas)
CLIENT_send_replays(client, room) CLIENT_send_replays(client, room)
if !room.replays_sent_to_watchers if !room.replays_sent_to_watchers
room.replays_sent_to_watchers = true room.replays_sent_to_watchers = true
for player in room.players when player and player.pos > 3 # for player in room.players when player and player.pos > 3
CLIENT_send_replays(player, room) # CLIENT_send_replays(player, room)
for player in room.watchers when player for player in room.watchers when player
CLIENT_send_replays(player, room) CLIENT_send_replays(player, room)
...@@ -2802,7 +2811,7 @@ if settings.modules.tips.enabled ...@@ -2802,7 +2811,7 @@ if settings.modules.tips.enabled
return return
, 30000 , 30000
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and !client.reconnecting return unless room and !client.reconnecting
unless room.started #first start unless room.started #first start
...@@ -2861,7 +2870,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ...@@ -2861,7 +2870,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.deck_saved = true client.deck_saved = true
return return
ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server)-> ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
if !room.started if !room.started
...@@ -2901,7 +2910,7 @@ report_to_big_brother = (roomname, sender, ip, level, content, match) -> ...@@ -2901,7 +2910,7 @@ report_to_big_brother = (roomname, sender, ip, level, content, match) ->
return return
return return
ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
msg = _.trim(info.msg) msg = _.trim(info.msg)
...@@ -3157,7 +3166,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ...@@ -3157,7 +3166,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}") ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}")
return cancel return cancel
ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server)-> ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server, datas)->
if settings.modules.reconnect.enabled and client.pre_reconnecting if settings.modules.reconnect.enabled and client.pre_reconnecting
if !CLIENT_is_able_to_reconnect(client) and !CLIENT_is_able_to_kick_reconnect(client) if !CLIENT_is_able_to_reconnect(client) and !CLIENT_is_able_to_kick_reconnect(client)
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED)
...@@ -3248,13 +3257,13 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server)-> ...@@ -3248,13 +3257,13 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server)->
ygopro.stoc_send_chat(client, "#{client.name}${deck_not_found}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "#{client.name}${deck_not_found}", ygopro.constants.COLORS.RED)
return false return false
ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server)-> ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and (room.random_type or room.arena) return unless room and (room.random_type or room.arena)
room.last_active_time = moment() room.last_active_time = moment()
return return
ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server)-> ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
if settings.modules.reconnect.enabled if settings.modules.reconnect.enabled
...@@ -3290,16 +3299,16 @@ ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server)-> ...@@ -3290,16 +3299,16 @@ ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server)->
CLIENT_heartbeat_register(client, false) CLIENT_heartbeat_register(client, false)
return false return false
ygopro.ctos_follow 'TIME_CONFIRM', false, (buffer, info, client, server)-> ygopro.ctos_follow 'TIME_CONFIRM', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
if settings.modules.reconnect.enabled if settings.modules.reconnect.enabled
if client.waiting_for_last #if client.waiting_for_last
client.waiting_for_last = false # client.waiting_for_last = false
if client.last_game_msg and client.last_game_msg_title != 'WAITING' # if client.last_game_msg and client.last_game_msg_title != 'WAITING'
if client.last_hint_msg # if client.last_hint_msg
ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg) # ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg)
ygopro.stoc_send(client, 'GAME_MSG', client.last_game_msg) # ygopro.stoc_send(client, 'GAME_MSG', client.last_game_msg)
client.time_confirm_required = false client.time_confirm_required = false
if settings.modules.heartbeat_detection.enabled if settings.modules.heartbeat_detection.enabled
client.heartbeat_protected = false client.heartbeat_protected = false
...@@ -3307,7 +3316,7 @@ ygopro.ctos_follow 'TIME_CONFIRM', false, (buffer, info, client, server)-> ...@@ -3307,7 +3316,7 @@ ygopro.ctos_follow 'TIME_CONFIRM', false, (buffer, info, client, server)->
CLIENT_heartbeat_unregister(client) CLIENT_heartbeat_unregister(client)
return return
ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)-> ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
client.selected_preduel = true client.selected_preduel = true
...@@ -3317,7 +3326,7 @@ ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)-> ...@@ -3317,7 +3326,7 @@ ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)->
room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's') room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's')
return return
ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server)-> ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
client.selected_preduel = true client.selected_preduel = true
...@@ -3326,7 +3335,7 @@ ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server)-> ...@@ -3326,7 +3335,7 @@ ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server)->
room.last_active_time = moment() room.last_active_time = moment()
return return
ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server)-> ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
pid = info.player pid = info.player
return unless room and pid < 4 and settings.modules.chat_color.enabled return unless room and pid < 4 and settings.modules.chat_color.enabled
...@@ -3352,7 +3361,7 @@ ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server)-> ...@@ -3352,7 +3361,7 @@ ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server)->
return true return true
return return
ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)-> ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
client.selected_preduel = false client.selected_preduel = false
...@@ -3367,7 +3376,7 @@ ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)-> ...@@ -3367,7 +3376,7 @@ ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)->
room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's') room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's')
return return
ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server)-> ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
client.selected_preduel = false client.selected_preduel = false
...@@ -3379,7 +3388,7 @@ ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server)-> ...@@ -3379,7 +3388,7 @@ ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server)->
room.last_active_time = moment() room.last_active_time = moment()
return return
ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
room.changing_side = true room.changing_side = true
...@@ -3425,7 +3434,7 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)-> ...@@ -3425,7 +3434,7 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)->
room.last_active_time = moment() room.last_active_time = moment()
return return
ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server)-> ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.replay_safe and settings.modules.tournament_mode.block_replay_to_player or settings.modules.replay_delay and room.hostinfo.mode == 1 unless room return settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.replay_safe and settings.modules.tournament_mode.block_replay_to_player or settings.modules.replay_delay and room.hostinfo.mode == 1 unless room
if settings.modules.cloud_replay.enabled and room.random_type if settings.modules.cloud_replay.enabled and room.random_type
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 1.12.7
(function() { (function() {
var CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_vip_status, CLIENT_use_cdkey, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, VIP_generate_cdkeys, _, addCallback, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbots, words, ygopro, zlib; var CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_vip_status, CLIENT_use_cdkey, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SOCKET_flush_data, VIP_generate_cdkeys, _, addCallback, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbots, words, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -1221,7 +1221,7 @@ ...@@ -1221,7 +1221,7 @@
}; };
CLIENT_heartbeat_register = function(client, send) { CLIENT_heartbeat_register = function(client, send) {
if (!settings.modules.heartbeat_detection.enabled || client.closed || client.is_post_watcher || client.pre_reconnecting || client.reconnecting || client.waiting_for_last || client.pos > 3 || client.heartbeat_protected) { if (!settings.modules.heartbeat_detection.enabled || client.closed || client.is_post_watcher || client.pre_reconnecting || client.reconnecting || client.pos > 3 || client.heartbeat_protected) {
return false; return false;
} }
if (client.heartbeat_timeout) { if (client.heartbeat_timeout) {
...@@ -1292,6 +1292,15 @@ ...@@ -1292,6 +1292,15 @@
return true; return true;
}; };
SOCKET_flush_data = function(sk, datas) {
var buffer, len2, m;
for (m = 0, len2 = datas.length; m < len2; m++) {
buffer = datas[m];
sk.write(buffer);
}
datas.splice(0, datas.length);
};
Room = (function() { Room = (function() {
function Room(name, hostinfo) { function Room(name, hostinfo) {
var draw_count, lflist, param, rule, start_hand, start_lp, time_limit; var draw_count, lflist, param, rule, start_hand, start_lp, time_limit;
...@@ -1729,18 +1738,18 @@ ...@@ -1729,18 +1738,18 @@
}; };
Room.prototype.send_replays = function() { Room.prototype.send_replays = function() {
var len2, len3, m, n, player, ref2, ref3; var len2, len3, m, n, player, ref3, ref4;
if (!(settings.modules.replay_delay && this.replays.length && this.hostinfo.mode === 1)) { if (!(settings.modules.replay_delay && this.replays.length && this.hostinfo.mode === 1)) {
return false; return false;
} }
ref2 = this.players; ref3 = this.players;
for (m = 0, len2 = ref2.length; m < len2; m++) { for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref2[m]; player = ref3[m];
CLIENT_send_replays(player, this); CLIENT_send_replays(player, this);
} }
ref3 = this.watchers; ref4 = this.watchers;
for (n = 0, len3 = ref3.length; n < len3; n++) { for (n = 0, len3 = ref4.length; n < len3; n++) {
player = ref3[n]; player = ref4[n];
CLIENT_send_replays(player, this); CLIENT_send_replays(player, this);
} }
return true; return true;
...@@ -2016,9 +2025,9 @@ ...@@ -2016,9 +2025,9 @@
info = _.clone(struct.fields); info = _.clone(struct.fields);
} }
if (ygopro.ctos_follows[ctos_proto].synchronous) { if (ygopro.ctos_follows[ctos_proto].synchronous) {
cancel = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server); cancel = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
} else { } else {
ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server); ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
} }
} }
if (!cancel) { if (!cancel) {
...@@ -2098,9 +2107,9 @@ ...@@ -2098,9 +2107,9 @@
info = _.clone(struct.fields); info = _.clone(struct.fields);
} }
if (ygopro.stoc_follows[stoc_proto].synchronous) { if (ygopro.stoc_follows[stoc_proto].synchronous) {
cancel = ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server); cancel = ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas);
} else { } else {
ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server); ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas);
} }
} }
if (!cancel) { if (!cancel) {
...@@ -2136,7 +2145,7 @@ ...@@ -2136,7 +2145,7 @@
log.info("NOTE: server not open due to config, ", settings.modules.stop); log.info("NOTE: server not open due to config, ", settings.modules.stop);
} }
ygopro.ctos_follow('PLAYER_INFO', true, function(buffer, info, client, server) { ygopro.ctos_follow('PLAYER_INFO', true, function(buffer, info, client, server, datas) {
var geo, lang, name, name_full, struct, vpass; var geo, lang, name, name_full, struct, vpass;
name_full = info.name.split("$"); name_full = info.name.split("$");
name = name_full[0]; name = name_full[0];
...@@ -2201,7 +2210,7 @@ ...@@ -2201,7 +2210,7 @@
return false; return false;
}); });
ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) { ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) {
var buffer_pos, check, decrypted_buffer, finish, i, id, len2, len3, len4, len5, len6, len7, len8, len9, line, m, n, name, o, oppo_pos, p, player, player_string, pre_room, q, r, ref3, ref4, ref5, ref6, ref7, ref8, replay_id, room, room_buffer, room_players, room_showed, s, secret, t; var buffer_pos, check, decrypted_buffer, finish, i, id, len2, len3, len4, len5, len6, len7, len8, len9, line, m, n, name, o, oppo_pos, p, player, player_string, pre_room, q, r, ref3, ref4, ref5, ref6, ref7, ref8, replay_id, room, room_buffer, room_players, room_showed, s, secret, t;
info.pass = info.pass.trim(); info.pass = info.pass.trim();
client.pass = info.pass; client.pass = info.pass;
...@@ -2738,7 +2747,7 @@ ...@@ -2738,7 +2747,7 @@
} }
}); });
ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server) { ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) {
var len2, len3, len4, line, m, n, o, player, recorder, ref3, ref4, ref5, room, watcher; var len2, len3, len4, line, m, n, o, player, recorder, ref3, ref4, ref5, room, watcher;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
...@@ -2902,7 +2911,7 @@ ...@@ -2902,7 +2911,7 @@
load_dialogues_custom(); load_dialogues_custom();
} }
ygopro.stoc_follow('GAME_MSG', true, function(buffer, info, client, server) { ygopro.stoc_follow('GAME_MSG', true, function(buffer, info, client, server, datas) {
var act_pos, card, chain, check, count, cpos, deck_found, found, hint_type, i, id, len10, len2, len3, len4, len5, len6, len7, len8, len9, limbo_found, line, loc, m, max_loop, msg, n, o, oppo_pos, p, phase, player, playertype, pos, ppos, q, r, r_player, reason, ref10, ref11, ref12, ref13, ref3, ref4, ref5, ref6, ref7, ref8, ref9, room, s, t, trigger_location, val, win_pos, x, y; var act_pos, card, chain, check, count, cpos, deck_found, found, hint_type, i, id, len10, len2, len3, len4, len5, len6, len7, len8, len9, limbo_found, line, loc, m, max_loop, msg, n, o, oppo_pos, p, phase, player, playertype, pos, ppos, q, r, r_player, reason, ref10, ref11, ref12, ref13, ref3, ref4, ref5, ref6, ref7, ref8, ref9, room, s, t, trigger_location, val, win_pos, x, y;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
...@@ -3259,7 +3268,7 @@ ...@@ -3259,7 +3268,7 @@
return false; return false;
}); });
ygopro.ctos_follow('HS_TOOBSERVER', true, function(buffer, info, client, server) { ygopro.ctos_follow('HS_TOOBSERVER', true, function(buffer, info, client, server, datas) {
var len2, m, player, ref3, room; var len2, m, player, ref3, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -3283,7 +3292,7 @@ ...@@ -3283,7 +3292,7 @@
return false; return false;
}); });
ygopro.ctos_follow('HS_KICK', true, function(buffer, info, client, server) { ygopro.ctos_follow('HS_KICK', true, function(buffer, info, client, server, datas) {
var len2, m, player, ref3, room; var len2, m, player, ref3, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -3311,7 +3320,7 @@ ...@@ -3311,7 +3320,7 @@
return false; return false;
}); });
ygopro.stoc_follow('TYPE_CHANGE', true, function(buffer, info, client, server) { ygopro.stoc_follow('TYPE_CHANGE', true, function(buffer, info, client, server, datas) {
var is_host, selftype; var is_host, selftype;
selftype = info.type & 0xf; selftype = info.type & 0xf;
is_host = ((info.type >> 4) & 0xf) !== 0; is_host = ((info.type >> 4) & 0xf) !== 0;
...@@ -3320,7 +3329,7 @@ ...@@ -3320,7 +3329,7 @@
return false; return false;
}); });
ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) { ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server, datas) {
var is_ready, len2, len3, m, n, p1, p2, player, pos, ref3, ref4, room; var is_ready, len2, len3, m, n, p1, p2, player, pos, ref3, ref4, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && room.max_player && client.is_host)) { if (!(room && room.max_player && client.is_host)) {
...@@ -3390,20 +3399,19 @@ ...@@ -3390,20 +3399,19 @@
} }
}); });
ygopro.ctos_follow('REQUEST_FIELD', true, function(buffer, info, client, server) { ygopro.ctos_follow('REQUEST_FIELD', true, function(buffer, info, client, server, datas) {
return true; return true;
}); });
ygopro.stoc_follow('FIELD_FINISH', true, function(buffer, info, client, server) { ygopro.stoc_follow('FIELD_FINISH', true, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && settings.modules.reconnect.enabled)) { if (!(room && settings.modules.reconnect.enabled)) {
return true; return true;
} }
client.reconnecting = false; client.reconnecting = false;
if (client.time_confirm_required) { if (client.last_game_msg && client.last_game_msg_title !== 'WAITING') {
client.waiting_for_last = true; SOCKET_flush_data(client, datas);
} else if (client.last_game_msg && client.last_game_msg_title !== 'WAITING') {
if (client.last_hint_msg) { if (client.last_hint_msg) {
ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg); ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg);
} }
...@@ -3412,26 +3420,20 @@ ...@@ -3412,26 +3420,20 @@
return true; return true;
}); });
ygopro.stoc_follow('DUEL_END', false, function(buffer, info, client, server) { ygopro.stoc_follow('DUEL_END', false, function(buffer, info, client, server, datas) {
var len2, len3, m, n, player, ref3, ref4, results, room; var len2, m, player, ref3, results, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && settings.modules.replay_delay && room.hostinfo.mode === 1)) { if (!(room && settings.modules.replay_delay && room.hostinfo.mode === 1)) {
return; return;
} }
SOCKET_flush_data(client, datas);
CLIENT_send_replays(client, room); CLIENT_send_replays(client, room);
if (!room.replays_sent_to_watchers) { if (!room.replays_sent_to_watchers) {
room.replays_sent_to_watchers = true; room.replays_sent_to_watchers = true;
ref3 = room.players; ref3 = room.watchers;
results = [];
for (m = 0, len2 = ref3.length; m < len2; m++) { for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[m]; player = ref3[m];
if (player && player.pos > 3) {
CLIENT_send_replays(player, room);
}
}
ref4 = room.watchers;
results = [];
for (n = 0, len3 = ref4.length; n < len3; n++) {
player = ref4[n];
if (player) { if (player) {
results.push(CLIENT_send_replays(player, room)); results.push(CLIENT_send_replays(player, room));
} }
...@@ -3568,7 +3570,7 @@ ...@@ -3568,7 +3570,7 @@
}, 30000); }, 30000);
} }
ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) { ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server, datas) {
var deck_arena, deck_name, deck_text, len2, m, player, ref3, room; var deck_arena, deck_name, deck_text, len2, m, player, ref3, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
...@@ -3651,7 +3653,7 @@ ...@@ -3651,7 +3653,7 @@
} }
}); });
ygopro.ctos_follow('SURRENDER', true, function(buffer, info, client, server) { ygopro.ctos_follow('SURRENDER', true, function(buffer, info, client, server, datas) {
var room, sur_player; var room, sur_player;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -3704,7 +3706,7 @@ ...@@ -3704,7 +3706,7 @@
}); });
}; };
ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server) { ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server, datas) {
var buy_result, cancel, ccolor, cip, cmd, cmsg, cname, code, color, cvalue, key, msg, name, oldmsg, ref3, room, struct, sur_player, uname, windbot, word; var buy_result, cancel, ccolor, cip, cmd, cmsg, cname, code, color, cvalue, key, msg, name, oldmsg, ref3, room, struct, sur_player, uname, windbot, word;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4035,7 +4037,7 @@ ...@@ -4035,7 +4037,7 @@
return cancel; return cancel;
}); });
ygopro.ctos_follow('UPDATE_DECK', true, function(buffer, info, client, server) { ygopro.ctos_follow('UPDATE_DECK', true, function(buffer, info, client, server, datas) {
var buff_main, buff_side, card, current_deck, deck, deck_array, deck_main, deck_side, deck_text, deckbuf, decks, found_deck, i, len2, len3, line, m, n, oppo_pos, room, struct, win_pos; var buff_main, buff_side, card, current_deck, deck, deck_array, deck_main, deck_side, deck_text, deckbuf, decks, found_deck, i, len2, len3, line, m, n, oppo_pos, room, struct, win_pos;
if (settings.modules.reconnect.enabled && client.pre_reconnecting) { if (settings.modules.reconnect.enabled && client.pre_reconnecting) {
if (!CLIENT_is_able_to_reconnect(client) && !CLIENT_is_able_to_kick_reconnect(client)) { if (!CLIENT_is_able_to_reconnect(client) && !CLIENT_is_able_to_kick_reconnect(client)) {
...@@ -4166,7 +4168,7 @@ ...@@ -4166,7 +4168,7 @@
return false; return false;
}); });
ygopro.ctos_follow('RESPONSE', false, function(buffer, info, client, server) { ygopro.ctos_follow('RESPONSE', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && (room.random_type || room.arena))) { if (!(room && (room.random_type || room.arena))) {
...@@ -4175,7 +4177,7 @@ ...@@ -4175,7 +4177,7 @@
room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.stoc_follow('TIME_LIMIT', true, function(buffer, info, client, server) { ygopro.stoc_follow('TIME_LIMIT', true, function(buffer, info, client, server, datas) {
var check, cur_players, room; var check, cur_players, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4226,22 +4228,13 @@ ...@@ -4226,22 +4228,13 @@
return false; return false;
}); });
ygopro.ctos_follow('TIME_CONFIRM', false, function(buffer, info, client, server) { ygopro.ctos_follow('TIME_CONFIRM', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
return; return;
} }
if (settings.modules.reconnect.enabled) { if (settings.modules.reconnect.enabled) {
if (client.waiting_for_last) {
client.waiting_for_last = false;
if (client.last_game_msg && client.last_game_msg_title !== 'WAITING') {
if (client.last_hint_msg) {
ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg);
}
ygopro.stoc_send(client, 'GAME_MSG', client.last_game_msg);
}
}
client.time_confirm_required = false; client.time_confirm_required = false;
} }
if (settings.modules.heartbeat_detection.enabled) { if (settings.modules.heartbeat_detection.enabled) {
...@@ -4251,7 +4244,7 @@ ...@@ -4251,7 +4244,7 @@
} }
}); });
ygopro.ctos_follow('HAND_RESULT', false, function(buffer, info, client, server) { ygopro.ctos_follow('HAND_RESULT', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4267,7 +4260,7 @@ ...@@ -4267,7 +4260,7 @@
room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's'); room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's');
}); });
ygopro.ctos_follow('TP_RESULT', false, function(buffer, info, client, server) { ygopro.ctos_follow('TP_RESULT', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4280,7 +4273,7 @@ ...@@ -4280,7 +4273,7 @@
room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.stoc_follow('CHAT', true, function(buffer, info, client, server) { ygopro.stoc_follow('CHAT', true, function(buffer, info, client, server, datas) {
var len2, m, pid, player, ref3, room, tcolor, tplayer; var len2, m, pid, player, ref3, room, tcolor, tplayer;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
pid = info.player; pid = info.player;
...@@ -4319,7 +4312,7 @@ ...@@ -4319,7 +4312,7 @@
} }
}); });
ygopro.stoc_follow('SELECT_HAND', false, function(buffer, info, client, server) { ygopro.stoc_follow('SELECT_HAND', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4341,7 +4334,7 @@ ...@@ -4341,7 +4334,7 @@
room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's'); room.last_active_time = moment().subtract(settings.modules.random_duel.hang_timeout - 19, 's');
}); });
ygopro.stoc_follow('SELECT_TP', false, function(buffer, info, client, server) { ygopro.stoc_follow('SELECT_TP', false, function(buffer, info, client, server, datas) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4357,7 +4350,7 @@ ...@@ -4357,7 +4350,7 @@
} }
}); });
ygopro.stoc_follow('CHANGE_SIDE', false, function(buffer, info, client, server) { ygopro.stoc_follow('CHANGE_SIDE', false, function(buffer, info, client, server, datas) {
var room, sinterval, temp_log; var room, sinterval, temp_log;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
...@@ -4412,7 +4405,7 @@ ...@@ -4412,7 +4405,7 @@
} }
}); });
ygopro.stoc_follow('REPLAY', true, function(buffer, info, client, server) { ygopro.stoc_follow('REPLAY', true, function(buffer, info, client, server, datas) {
var duellog, dueltime, i, len2, len3, m, n, player, ref3, ref4, replay_filename, room; var duellog, dueltime, i, len2, len3, m, n, player, ref3, ref4, replay_filename, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
......
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