Commit 2ca3c28c authored by mercury233's avatar mercury233

change client.room to client.rid

parent 8ada11cf
...@@ -168,7 +168,7 @@ ROOM_find_or_create_random = (type, player_ip)-> ...@@ -168,7 +168,7 @@ ROOM_find_or_create_random = (type, player_ip)->
max_player = if type == 'T' then 4 else 2 max_player = if type == 'T' then 4 else 2
playerbanned = (bannedplayer and bannedplayer.count > 3 and moment() < bannedplayer.time) playerbanned = (bannedplayer and bannedplayer.count > 3 and moment() < bannedplayer.time)
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
return room.random_type != '' and !room.started and return room and room.random_type != '' and !room.started and
((type == '' and room.random_type != 'T') or room.random_type == type) and ((type == '' and room.random_type != 'T') or room.random_type == type) and
room.get_playing_player().length < max_player and room.get_playing_player().length < max_player and
(room.get_host() == null or room.get_host().remoteAddress != ROOM_players_oppentlist[player_ip]) and (room.get_host() == null or room.get_host().remoteAddress != ROOM_players_oppentlist[player_ip]) and
...@@ -190,13 +190,13 @@ ROOM_find_or_create_random = (type, player_ip)-> ...@@ -190,13 +190,13 @@ ROOM_find_or_create_random = (type, player_ip)->
ROOM_find_by_name = (name)-> ROOM_find_by_name = (name)->
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
room.name == name return room and room.name == name
#log.info 'find_by_name', name, result #log.info 'find_by_name', name, result
return result return result
ROOM_find_by_port = (port)-> ROOM_find_by_port = (port)->
_.find ROOM_all, (room)-> _.find ROOM_all, (room)->
room.port == port return room and room.port == port
ROOM_validate = (name)-> ROOM_validate = (name)->
client_name_and_pass = name.split('$', 2) client_name_and_pass = name.split('$', 2)
...@@ -204,6 +204,7 @@ ROOM_validate = (name)-> ...@@ -204,6 +204,7 @@ ROOM_validate = (name)->
client_pass = client_name_and_pass[1] client_pass = client_name_and_pass[1]
return true if !client_pass return true if !client_pass
!_.find ROOM_all, (room)-> !_.find ROOM_all, (room)->
return false unless room
room_name_and_pass = room.name.split('$', 2) room_name_and_pass = room.name.split('$', 2)
room_name = room_name_and_pass[0] room_name = room_name_and_pass[0]
room_pass = room_name_and_pass[1] room_pass = room_name_and_pass[1]
...@@ -454,8 +455,8 @@ class Room ...@@ -454,8 +455,8 @@ class Room
@watcher.end() if @watcher @watcher.end() if @watcher
@deleted = true @deleted = true
index = _.indexOf(ROOM_all, this) index = _.indexOf(ROOM_all, this)
#ROOM_all[index] = null unless index == -1 ROOM_all[index] = null unless index == -1
ROOM_all.splice(index, 1) unless index == -1 #ROOM_all.splice(index, 1) unless index == -1
roomlist.delete @name if !@private and !@started and @established and settings.modules.enable_websocket_roomlist roomlist.delete @name if !@private and !@started and @established and settings.modules.enable_websocket_roomlist
return return
...@@ -504,8 +505,8 @@ class Room ...@@ -504,8 +505,8 @@ class Room
else else
index = _.indexOf(@players, client) index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1 @players.splice(index, 1) unless index == -1
#log.info(@started,@disconnector,client.room.random_type) #log.info(@started,@disconnector,@random_type)
if @started and @disconnector != 'server' and client.room.random_type if @started and @disconnector != 'server' and @random_type
ROOM_ban_player(client.name, client.ip, "强退") ROOM_ban_player(client.name, client.ip, "强退")
if @players.length if @players.length
ygopro.stoc_send_chat_to_room this, "#{client.name} 离开了游戏" + if error then ": #{error}" else '' ygopro.stoc_send_chat_to_room this, "#{client.name} 离开了游戏" + if error then ": #{error}" else ''
...@@ -528,19 +529,21 @@ net.createServer (client) -> ...@@ -528,19 +529,21 @@ net.createServer (client) ->
#释放处理 #释放处理
client.on 'close', (had_error) -> client.on 'close', (had_error) ->
#log.info "client closed", client.name, had_error #log.info "client closed", client.name, had_error
room=ROOM_all[client.rid]
tribute(client) tribute(client)
unless client.closed unless client.closed
client.closed = true client.closed = true
client.room.disconnect(client) if client.room room.disconnect(client) if room
server.end() server.end()
return return
client.on 'error', (error)-> client.on 'error', (error)->
#log.info "client error", client.name, error #log.info "client error", client.name, error
room=ROOM_all[client.rid]
tribute(client) tribute(client)
unless client.closed unless client.closed
client.closed = error client.closed = error
client.room.disconnect(client, error) if client.room room.disconnect(client, error) if room
server.end() server.end()
return return
...@@ -550,8 +553,9 @@ net.createServer (client) -> ...@@ -550,8 +553,9 @@ net.createServer (client) ->
server.on 'close', (had_error) -> server.on 'close', (had_error) ->
#log.info "server closed", client.name, had_error #log.info "server closed", client.name, had_error
room=ROOM_all[client.rid]
tribute(server) tribute(server)
client.room.disconnector = 'server' room.disconnector = 'server' if room
server.closed = true unless server.closed server.closed = true unless server.closed
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "服务器关闭了连接", ygopro.constants.COLORS.RED)
...@@ -560,8 +564,9 @@ net.createServer (client) -> ...@@ -560,8 +564,9 @@ net.createServer (client) ->
server.on 'error', (error)-> server.on 'error', (error)->
#log.info "server error", client.name, error #log.info "server error", client.name, error
room=ROOM_all[client.rid]
tribute(server) tribute(server)
client.room.disconnector = 'server' room.disconnector = 'server' if room
server.closed = error server.closed = error
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "服务器错误: #{error}", ygopro.constants.COLORS.RED)
...@@ -594,7 +599,8 @@ net.createServer (client) -> ...@@ -594,7 +599,8 @@ net.createServer (client) ->
client.on 'data', (data) -> client.on 'data', (data) ->
if client.is_post_watcher if client.is_post_watcher
client.room.watcher.write data room=ROOM_all[client.rid]
room.watcher.write data if room
else else
ctos_buffer = new Buffer(0) ctos_buffer = new Buffer(0)
ctos_message_length = 0 ctos_message_length = 0
...@@ -786,8 +792,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -786,8 +792,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else else
room.windbot = windbot room.windbot = windbot
room.private = true room.private = true
client.room = room #client.room = room
client.room.connect(client) client.rid = _.indexOf(ROOM_all, room)
room.connect(client)
else if info.pass.length and settings.modules.mycard_auth else if info.pass.length and settings.modules.mycard_auth
ygopro.stoc_send_chat(client, '正在读取用户信息...', ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, '正在读取用户信息...', ygopro.constants.COLORS.BABYBLUE)
...@@ -861,8 +868,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -861,8 +868,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else if room.error else if room.error
ygopro.stoc_die(client, room.error) ygopro.stoc_die(client, room.error)
else else
client.room = room #client.room = room
client.room.connect(client) client.rid = _.indexOf(ROOM_all, room)
room.connect(client)
return return
if id = users_cache[client.name] if id = users_cache[client.name]
...@@ -920,31 +928,34 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -920,31 +928,34 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
ygopro.stoc_die(client, room.error) ygopro.stoc_die(client, room.error)
else if room.started else if room.started
if settings.modules.enable_halfway_watch if settings.modules.enable_halfway_watch
client.room = room #client.room = room
client.rid = _.indexOf(ROOM_all, room)
client.is_post_watcher = true client.is_post_watcher = true
ygopro.stoc_send_chat_to_room(client.room, "#{client.name} 加入了观战") ygopro.stoc_send_chat_to_room(room, "#{client.name} 加入了观战")
client.room.watchers.push client room.watchers.push client
ygopro.stoc_send_chat(client, "观战中", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "观战中", ygopro.constants.COLORS.BABYBLUE)
for buffer in client.room.watcher_buffers for buffer in room.watcher_buffers
client.write buffer client.write buffer
else else
ygopro.stoc_die(client, "决斗已开始,不允许观战") ygopro.stoc_die(client, "决斗已开始,不允许观战")
else else
client.room = room #client.room = room
client.room.connect(client) client.rid = _.indexOf(ROOM_all, room)
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)->
#欢迎信息 #欢迎信息
return unless client.room room=ROOM_all[client.rid]
return unless room
if settings.modules.welcome if settings.modules.welcome
ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN) ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN)
if client.room.welcome if room.welcome
ygopro.stoc_send_chat(client, client.room.welcome, ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE)
#log.info (client.room) #log.info(ROOM_all)
if !client.room.recorder if !room.recorder
client.room.recorder = recorder = net.connect client.room.port, -> room.recorder = recorder = net.connect room.port, ->
ygopro.ctos_send recorder, 'PLAYER_INFO', { ygopro.ctos_send recorder, 'PLAYER_INFO', {
name: "Marshtomp" name: "Marshtomp"
} }
...@@ -958,14 +969,15 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -958,14 +969,15 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
return return
recorder.on 'data', (data)-> recorder.on 'data', (data)->
return unless client.room and settings.modules.enable_cloud_replay room=ROOM_all[client.rid]
client.room.recorder_buffers.push data return unless room and settings.modules.enable_cloud_replay
room.recorder_buffers.push data
recorder.on 'error', (error)-> recorder.on 'error', (error)->
return return
if settings.modules.enable_halfway_watch and !client.room.watcher if settings.modules.enable_halfway_watch and !room.watcher
client.room.watcher = watcher = net.connect client.room.port, -> room.watcher = watcher = net.connect room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', { ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother" name: "the Big Brother"
} }
...@@ -979,9 +991,10 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -979,9 +991,10 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
return return
watcher.on 'data', (data)-> watcher.on 'data', (data)->
return unless client.room room=ROOM_all[client.rid]
client.room.watcher_buffers.push data return unless room
for w in client.room.watchers room.watcher_buffers.push data
for w in room.watchers
w.write data if w #a WTF fix w.write data if w #a WTF fix
return return
...@@ -1010,27 +1023,29 @@ if settings.modules.dialogues ...@@ -1010,27 +1023,29 @@ if settings.modules.dialogues
load_dialogues() load_dialogues()
ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
room=ROOM_all[client.rid]
return unless room
msg = buffer.readInt8(0) msg = buffer.readInt8(0)
if msg >= 10 and msg < 30 #SELECT开头的消息 if msg >= 10 and msg < 30 #SELECT开头的消息
client.room.waiting_for_player = client room.waiting_for_player = client
client.room.last_active_time = moment() room.last_active_time = moment()
#log.info("#{ygopro.constants.MSG[msg]}等待#{client.room.waiting_for_player.name}") #log.info("#{ygopro.constants.MSG[msg]}等待#{room.waiting_for_player.name}")
#log.info 'MSG', ygopro.constants.MSG[msg] #log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START' if ygopro.constants.MSG[msg] == 'START'
playertype = buffer.readUInt8(1) playertype = buffer.readUInt8(1)
client.is_first = !(playertype & 0xf) client.is_first = !(playertype & 0xf)
client.lp = client.room.hostinfo.start_lp client.lp = room.hostinfo.start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}") #ygopro.stoc_send_chat_to_room(room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
### ###
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(room.name, 'M#') and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2 pos = 1 - pos unless client.is_first or pos == 2
reason = buffer.readUInt8(2) reason = buffer.readUInt8(2)
#log.info {winner: pos, reason: reason} #log.info {winner: pos, reason: reason}
client.room.duels.push {winner: pos, reason: reason} room.duels.push {winner: pos, reason: reason}
### ###
#lp跟踪 #lp跟踪
...@@ -1038,29 +1053,29 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -1038,29 +1053,29 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val room.dueling_players[pos].lp -= val
if 0 < client.room.dueling_players[pos].lp <= 100 if 0 < room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!", ygopro.constants.COLORS.PINK) ygopro.stoc_send_chat_to_room(room, "你的生命已经如风中残烛了!", ygopro.constants.COLORS.PINK)
if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp += val room.dueling_players[pos].lp += val
if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp = val room.dueling_players[pos].lp = val
if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val room.dueling_players[pos].lp -= val
if 0 < client.room.dueling_players[pos].lp <= 100 if 0 < room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "背水一战!", ygopro.constants.COLORS.PINK) ygopro.stoc_send_chat_to_room(room, "背水一战!", ygopro.constants.COLORS.PINK)
#登场台词 #登场台词
if settings.modules.dialogues if settings.modules.dialogues
...@@ -1073,10 +1088,11 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -1073,10 +1088,11 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
#房间管理 #房间管理
ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)-> ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)->
return unless client.room room=ROOM_all[client.rid]
for player in client.room.players return unless room
for player in room.players
if player and player.pos == info.pos and player != client if player and player.pos == info.pos and player != client
ygopro.stoc_send_chat_to_room(client.room, "#{player.name} 被请出了房间", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{player.name} 被请出了房间", ygopro.constants.COLORS.RED)
return false return false
ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
...@@ -1088,19 +1104,20 @@ ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)-> ...@@ -1088,19 +1104,20 @@ ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
return return
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
return unless client.room and client.room.max_player and client.is_host room=ROOM_all[client.rid]
return unless room and room.max_player and client.is_host
pos = info.status >> 4 pos = info.status >> 4
is_ready = (info.status & 0xf) == 9 is_ready = (info.status & 0xf) == 9
if pos < client.room.max_player if pos < room.max_player
client.room.ready_player_count_without_host = 0 room.ready_player_count_without_host = 0
for player in client.room.players for player in room.players
if player.pos == pos if player.pos == pos
player.is_ready = is_ready player.is_ready = is_ready
unless player.is_host unless player.is_host
client.room.ready_player_count_without_host += player.is_ready room.ready_player_count_without_host += player.is_ready
if client.room.ready_player_count_without_host >= client.room.max_player - 1 if room.ready_player_count_without_host >= room.max_player - 1
#log.info "all ready" #log.info "all ready"
setTimeout (()-> wait_room_start(client.room, 20);return), 1000 setTimeout (()-> wait_room_start(ROOM_all[client.rid], 20);return), 1000
return return
wait_room_start = (room, time)-> wait_room_start = (room, time)->
...@@ -1144,7 +1161,7 @@ load_tips = ()-> ...@@ -1144,7 +1161,7 @@ load_tips = ()->
if settings.modules.tips if settings.modules.tips
load_tips() load_tips()
setInterval ()-> setInterval ()->
for room in ROOM_all for room in ROOM_all when room and room.established
ygopro.stoc_send_random_tip_to_room(room) unless room and room.started ygopro.stoc_send_random_tip_to_room(room) unless room and room.started
return return
, 30000 , 30000
...@@ -1161,25 +1178,27 @@ if settings.modules.mycard_auth and process.env.MYCARD_AUTH_DATABASE ...@@ -1161,25 +1178,27 @@ if settings.modules.mycard_auth and process.env.MYCARD_AUTH_DATABASE
console.log("users loaded", _.keys(users_cache).length) console.log("users loaded", _.keys(users_cache).length)
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
return unless client.room room=ROOM_all[client.rid]
unless client.room.started #first start return unless room
client.room.started = true unless room.started #first start
roomlist.delete client.room.name if settings.modules.enable_websocket_roomlist and not client.room.private room.started = true
#client.room.duels = [] roomlist.delete room.name if settings.modules.enable_websocket_roomlist and not room.private
client.room.dueling_players = [] #room.duels = []
for player in client.room.players when player.pos != 7 room.dueling_players = []
client.room.dueling_players[player.pos] = player for player in room.players when player.pos != 7
client.room.player_datas.push ip: player.remoteAddress, name: player.name room.dueling_players[player.pos] = player
if client.room.windbot room.player_datas.push ip: player.remoteAddress, name: player.name
client.room.dueling_players[1 - player.pos] = {} if room.windbot
room.dueling_players[1 - player.pos] = {}
if settings.modules.tips if settings.modules.tips
ygopro.stoc_send_random_tip(client) ygopro.stoc_send_random_tip(client)
return return
ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
return unless client.room room=ROOM_all[client.rid]
return unless room
cancel = _.startsWith(_.trim(info.msg), "/") cancel = _.startsWith(_.trim(info.msg), "/")
client.room.last_active_time = moment() unless cancel or not client.room.random_type room.last_active_time = moment() unless cancel or not room.random_type
switch _.trim(info.msg) switch _.trim(info.msg)
when '/help' when '/help'
ygopro.stoc_send_chat(client, "YGOSrv233 指令帮助") ygopro.stoc_send_chat(client, "YGOSrv233 指令帮助")
...@@ -1191,10 +1210,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ...@@ -1191,10 +1210,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
ygopro.stoc_send_random_tip(client) if settings.modules.tips ygopro.stoc_send_random_tip(client) if settings.modules.tips
when '/roomname' when '/roomname'
ygopro.stoc_send_chat(client, "您当前的房间名是 " + client.room.name, ygopro.constants.COLORS.BABYBLUE) if client.room ygopro.stoc_send_chat(client, "您当前的房间名是 " + room.name, ygopro.constants.COLORS.BABYBLUE) if room
#when '/test' #when '/test'
# ygopro.stoc_send_hint_card_to_room(client.room, 2333365) # ygopro.stoc_send_hint_card_to_room(room, 2333365)
return cancel return cancel
...@@ -1204,51 +1223,58 @@ ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)-> ...@@ -1204,51 +1223,58 @@ ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
side = (info.deckbuf[i] for i in [info.mainc...info.mainc + info.sidec]) side = (info.deckbuf[i] for i in [info.mainc...info.mainc + info.sidec])
client.main = main client.main = main
client.side = side client.side = side
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
return unless room and room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player = client.room.waiting_for_player2 room.waiting_for_player = room.waiting_for_player2
client.room.last_active_time = moment() room.last_active_time = moment()
return return
ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server)-> ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
client.room.last_active_time = moment() return unless room and room.random_type
room.last_active_time = moment()
return return
ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)-> ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
return unless room and room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player = client.room.waiting_for_player2 room.waiting_for_player = room.waiting_for_player2
client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's') room.last_active_time = moment().subtract(settings.modules.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)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
client.room.last_active_time = moment() return unless room and room.random_type
room.last_active_time = moment()
return return
ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)-> ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
return unless room and room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player = client room.waiting_for_player = client
else else
client.room.waiting_for_player2 = client room.waiting_for_player2 = client
client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's') room.last_active_time = moment().subtract(settings.modules.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)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
client.room.waiting_for_player = client return unless room and room.random_type
client.room.last_active_time = moment() room.waiting_for_player = client
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)->
return unless client.room and client.room.random_type room=ROOM_all[client.rid]
return unless room and room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player = client room.waiting_for_player = client
else else
client.room.waiting_for_player2 = client room.waiting_for_player2 = client
client.room.last_active_time = moment() room.last_active_time = moment()
return return
setInterval ()-> setInterval ()->
...@@ -1279,7 +1305,7 @@ if settings.modules.http ...@@ -1279,7 +1305,7 @@ if settings.modules.http
response.end(u.query.callback + '( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );') response.end(u.query.callback + '( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );')
else else
response.writeHead(200) response.writeHead(200)
roomsjson = JSON.stringify rooms: (for room in ROOM_all when room.established roomsjson = JSON.stringify rooms: (for room in ROOM_all when room and room.established
pid: room.process.pid.toString(), pid: room.process.pid.toString(),
roomid: room.port.toString(), roomid: room.port.toString(),
roomname: if pass_validated then room.name else room.name.split('$', 2)[0], roomname: if pass_validated then room.name else room.name.split('$', 2)[0],
...@@ -1300,7 +1326,7 @@ if settings.modules.http ...@@ -1300,7 +1326,7 @@ if settings.modules.http
return return
if u.query.shout if u.query.shout
for room in ROOM_all for room in ROOM_all when room and room.established
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW) ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW)
response.writeHead(200) response.writeHead(200)
response.end(u.query.callback + "( ['shout ok', '" + u.query.shout + "'] );") response.end(u.query.callback + "( ['shout ok', '" + u.query.shout + "'] );")
......
...@@ -250,7 +250,7 @@ ...@@ -250,7 +250,7 @@
max_player = type === 'T' ? 4 : 2; max_player = type === 'T' ? 4 : 2;
playerbanned = bannedplayer && bannedplayer.count > 3 && moment() < bannedplayer.time; playerbanned = bannedplayer && bannedplayer.count > 3 && moment() < bannedplayer.time;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
return room.random_type !== '' && !room.started && ((type === '' && room.random_type !== 'T') || room.random_type === type) && room.get_playing_player().length < max_player && (room.get_host() === null || room.get_host().remoteAddress !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated); return room && room.random_type !== '' && !room.started && ((type === '' && room.random_type !== 'T') || room.random_type === type) && room.get_playing_player().length < max_player && (room.get_host() === null || room.get_host().remoteAddress !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated);
}); });
if (result) { if (result) {
result.welcome = '对手已经在等你了,开始决斗吧!'; result.welcome = '对手已经在等你了,开始决斗吧!';
...@@ -272,14 +272,14 @@ ...@@ -272,14 +272,14 @@
ROOM_find_by_name = function(name) { ROOM_find_by_name = function(name) {
var result; var result;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
return room.name === name; return room && room.name === name;
}); });
return result; return result;
}; };
ROOM_find_by_port = function(port) { ROOM_find_by_port = function(port) {
return _.find(ROOM_all, function(room) { return _.find(ROOM_all, function(room) {
return room.port === port; return room && room.port === port;
}); });
}; };
...@@ -293,6 +293,9 @@ ...@@ -293,6 +293,9 @@
} }
return !_.find(ROOM_all, function(room) { return !_.find(ROOM_all, function(room) {
var room_name, room_name_and_pass, room_pass; var room_name, room_name_and_pass, room_pass;
if (!room) {
return false;
}
room_name_and_pass = room.name.split('$', 2); room_name_and_pass = room.name.split('$', 2);
room_name = room_name_and_pass[0]; room_name = room_name_and_pass[0];
room_pass = room_name_and_pass[1]; room_pass = room_name_and_pass[1];
...@@ -596,7 +599,7 @@ ...@@ -596,7 +599,7 @@
this.deleted = true; this.deleted = true;
index = _.indexOf(ROOM_all, this); index = _.indexOf(ROOM_all, this);
if (index !== -1) { if (index !== -1) {
ROOM_all.splice(index, 1); ROOM_all[index] = null;
} }
if (!this["private"] && !this.started && this.established && settings.modules.enable_websocket_roomlist) { if (!this["private"] && !this.started && this.established && settings.modules.enable_websocket_roomlist) {
roomlist["delete"](this.name); roomlist["delete"](this.name);
...@@ -668,7 +671,7 @@ ...@@ -668,7 +671,7 @@
if (index !== -1) { if (index !== -1) {
this.players.splice(index, 1); this.players.splice(index, 1);
} }
if (this.started && this.disconnector !== 'server' && client.room.random_type) { if (this.started && this.disconnector !== 'server' && this.random_type) {
ROOM_ban_player(client.name, client.ip, "强退"); ROOM_ban_player(client.name, client.ip, "强退");
} }
if (this.players.length) { if (this.players.length) {
...@@ -693,21 +696,25 @@ ...@@ -693,21 +696,25 @@
client.server = server; client.server = server;
client.setTimeout(300000); client.setTimeout(300000);
client.on('close', function(had_error) { client.on('close', function(had_error) {
var room;
room = ROOM_all[client.rid];
tribute(client); tribute(client);
if (!client.closed) { if (!client.closed) {
client.closed = true; client.closed = true;
if (client.room) { if (room) {
client.room.disconnect(client); room.disconnect(client);
} }
} }
server.end(); server.end();
}); });
client.on('error', function(error) { client.on('error', function(error) {
var room;
room = ROOM_all[client.rid];
tribute(client); tribute(client);
if (!client.closed) { if (!client.closed) {
client.closed = error; client.closed = error;
if (client.room) { if (room) {
client.room.disconnect(client, error); room.disconnect(client, error);
} }
} }
server.end(); server.end();
...@@ -716,8 +723,12 @@ ...@@ -716,8 +723,12 @@
server.end(); server.end();
}); });
server.on('close', function(had_error) { server.on('close', function(had_error) {
var room;
room = ROOM_all[client.rid];
tribute(server); tribute(server);
client.room.disconnector = 'server'; if (room) {
room.disconnector = 'server';
}
if (!server.closed) { if (!server.closed) {
server.closed = true; server.closed = true;
} }
...@@ -727,8 +738,12 @@ ...@@ -727,8 +738,12 @@
} }
}); });
server.on('error', function(error) { server.on('error', function(error) {
var room;
room = ROOM_all[client.rid];
tribute(server); tribute(server);
client.room.disconnector = 'server'; if (room) {
room.disconnector = 'server';
}
server.closed = error; server.closed = error;
if (!client.closed) { if (!client.closed) {
ygopro.stoc_send_chat(client, "服务器错误: " + error, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "服务器错误: " + error, ygopro.constants.COLORS.RED);
...@@ -759,9 +774,12 @@ ...@@ -759,9 +774,12 @@
} }
client.pre_establish_buffers = new Array(); client.pre_establish_buffers = new Array();
client.on('data', function(data) { client.on('data', function(data) {
var b, buffer, cancel, ctos_buffer, ctos_message_length, ctos_proto, datas, k, l, len, len1, looplimit, struct; var b, buffer, cancel, ctos_buffer, ctos_message_length, ctos_proto, datas, k, l, len, len1, looplimit, room, struct;
if (client.is_post_watcher) { if (client.is_post_watcher) {
client.room.watcher.write(data); room = ROOM_all[client.rid];
if (room) {
room.watcher.write(data);
}
} else { } else {
ctos_buffer = new Buffer(0); ctos_buffer = new Buffer(0);
ctos_message_length = 0; ctos_message_length = 0;
...@@ -961,8 +979,8 @@ ...@@ -961,8 +979,8 @@
} else { } else {
room.windbot = windbot; room.windbot = windbot;
room["private"] = true; room["private"] = true;
client.room = room; client.rid = _.indexOf(ROOM_all, room);
client.room.connect(client); room.connect(client);
} }
} else if (info.pass.length && settings.modules.mycard_auth) { } else if (info.pass.length && settings.modules.mycard_auth) {
ygopro.stoc_send_chat(client, '正在读取用户信息...', ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, '正在读取用户信息...', ygopro.constants.COLORS.BABYBLUE);
...@@ -1041,8 +1059,8 @@ ...@@ -1041,8 +1059,8 @@
} else if (room.error) { } else if (room.error) {
ygopro.stoc_die(client, room.error); ygopro.stoc_die(client, room.error);
} else { } else {
client.room = room; client.rid = _.indexOf(ROOM_all, room);
client.room.connect(client); room.connect(client);
} }
}; };
if (id = users_cache[client.name]) { if (id = users_cache[client.name]) {
...@@ -1104,12 +1122,12 @@ ...@@ -1104,12 +1122,12 @@
ygopro.stoc_die(client, room.error); ygopro.stoc_die(client, room.error);
} else if (room.started) { } else if (room.started) {
if (settings.modules.enable_halfway_watch) { if (settings.modules.enable_halfway_watch) {
client.room = room; client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
ygopro.stoc_send_chat_to_room(client.room, client.name + " 加入了观战"); ygopro.stoc_send_chat_to_room(room, client.name + " 加入了观战");
client.room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "观战中", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "观战中", ygopro.constants.COLORS.BABYBLUE);
ref1 = client.room.watcher_buffers; ref1 = room.watcher_buffers;
for (l = 0, len1 = ref1.length; l < len1; l++) { for (l = 0, len1 = ref1.length; l < len1; l++) {
buffer = ref1[l]; buffer = ref1[l];
client.write(buffer); client.write(buffer);
...@@ -1118,25 +1136,26 @@ ...@@ -1118,25 +1136,26 @@
ygopro.stoc_die(client, "决斗已开始,不允许观战"); ygopro.stoc_die(client, "决斗已开始,不允许观战");
} }
} else { } else {
client.room = room; client.rid = _.indexOf(ROOM_all, room);
client.room.connect(client); room.connect(client);
} }
} }
}); });
ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server) { ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var recorder, watcher; var recorder, room, watcher;
if (!client.room) { room = ROOM_all[client.rid];
if (!room) {
return; return;
} }
if (settings.modules.welcome) { if (settings.modules.welcome) {
ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN);
} }
if (client.room.welcome) { if (room.welcome) {
ygopro.stoc_send_chat(client, client.room.welcome, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE);
} }
if (!client.room.recorder) { if (!room.recorder) {
client.room.recorder = recorder = net.connect(client.room.port, function() { room.recorder = recorder = net.connect(room.port, function() {
ygopro.ctos_send(recorder, 'PLAYER_INFO', { ygopro.ctos_send(recorder, 'PLAYER_INFO', {
name: "Marshtomp" name: "Marshtomp"
}); });
...@@ -1149,15 +1168,16 @@ ...@@ -1149,15 +1168,16 @@
ygopro.ctos_send(recorder, 'HS_TOOBSERVER'); ygopro.ctos_send(recorder, 'HS_TOOBSERVER');
}); });
recorder.on('data', function(data) { recorder.on('data', function(data) {
if (!(client.room && settings.modules.enable_cloud_replay)) { room = ROOM_all[client.rid];
if (!(room && settings.modules.enable_cloud_replay)) {
return; return;
} }
return client.room.recorder_buffers.push(data); return room.recorder_buffers.push(data);
}); });
recorder.on('error', function(error) {}); recorder.on('error', function(error) {});
} }
if (settings.modules.enable_halfway_watch && !client.room.watcher) { if (settings.modules.enable_halfway_watch && !room.watcher) {
client.room.watcher = watcher = net.connect(client.room.port, function() { room.watcher = watcher = net.connect(room.port, function() {
ygopro.ctos_send(watcher, 'PLAYER_INFO', { ygopro.ctos_send(watcher, 'PLAYER_INFO', {
name: "the Big Brother" name: "the Big Brother"
}); });
...@@ -1171,11 +1191,12 @@ ...@@ -1171,11 +1191,12 @@
}); });
watcher.on('data', function(data) { watcher.on('data', function(data) {
var k, len, ref, w; var k, len, ref, w;
if (!client.room) { room = ROOM_all[client.rid];
if (!room) {
return; return;
} }
client.room.watcher_buffers.push(data); room.watcher_buffers.push(data);
ref = client.room.watchers; ref = room.watchers;
for (k = 0, len = ref.length; k < len; k++) { for (k = 0, len = ref.length; k < len; k++) {
w = ref[k]; w = ref[k];
if (w) { if (w) {
...@@ -1208,25 +1229,29 @@ ...@@ -1208,25 +1229,29 @@
} }
ygopro.stoc_follow('GAME_MSG', false, function(buffer, info, client, server) { ygopro.stoc_follow('GAME_MSG', false, function(buffer, info, client, server) {
var card, k, len, line, msg, playertype, pos, ref, ref1, ref2, val; var card, k, len, line, msg, playertype, pos, ref, ref1, ref2, room, val;
room = ROOM_all[client.rid];
if (!room) {
return;
}
msg = buffer.readInt8(0); msg = buffer.readInt8(0);
if (msg >= 10 && msg < 30) { if (msg >= 10 && msg < 30) {
client.room.waiting_for_player = client; room.waiting_for_player = client;
client.room.last_active_time = moment(); room.last_active_time = moment();
} }
if (ygopro.constants.MSG[msg] === 'START') { if (ygopro.constants.MSG[msg] === 'START') {
playertype = buffer.readUInt8(1); playertype = buffer.readUInt8(1);
client.is_first = !(playertype & 0xf); client.is_first = !(playertype & 0xf);
client.lp = client.room.hostinfo.start_lp; client.lp = room.hostinfo.start_lp;
} }
/* /*
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(room.name, 'M#') and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2 pos = 1 - pos unless client.is_first or pos == 2
reason = buffer.readUInt8(2) reason = buffer.readUInt8(2)
#log.info {winner: pos, reason: reason} #log.info {winner: pos, reason: reason}
client.room.duels.push {winner: pos, reason: reason} room.duels.push {winner: pos, reason: reason}
*/ */
if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.is_host) { if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.is_host) {
pos = buffer.readUInt8(1); pos = buffer.readUInt8(1);
...@@ -1234,9 +1259,9 @@ ...@@ -1234,9 +1259,9 @@
pos = 1 - pos; pos = 1 - pos;
} }
val = buffer.readInt32LE(2); val = buffer.readInt32LE(2);
client.room.dueling_players[pos].lp -= val; room.dueling_players[pos].lp -= val;
if ((0 < (ref = client.room.dueling_players[pos].lp) && ref <= 100)) { if ((0 < (ref = room.dueling_players[pos].lp) && ref <= 100)) {
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!", ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, "你的生命已经如风中残烛了!", ygopro.constants.COLORS.PINK);
} }
} }
if (ygopro.constants.MSG[msg] === 'RECOVER' && client.is_host) { if (ygopro.constants.MSG[msg] === 'RECOVER' && client.is_host) {
...@@ -1245,7 +1270,7 @@ ...@@ -1245,7 +1270,7 @@
pos = 1 - pos; pos = 1 - pos;
} }
val = buffer.readInt32LE(2); val = buffer.readInt32LE(2);
client.room.dueling_players[pos].lp += val; room.dueling_players[pos].lp += val;
} }
if (ygopro.constants.MSG[msg] === 'LPUPDATE' && client.is_host) { if (ygopro.constants.MSG[msg] === 'LPUPDATE' && client.is_host) {
pos = buffer.readUInt8(1); pos = buffer.readUInt8(1);
...@@ -1253,7 +1278,7 @@ ...@@ -1253,7 +1278,7 @@
pos = 1 - pos; pos = 1 - pos;
} }
val = buffer.readInt32LE(2); val = buffer.readInt32LE(2);
client.room.dueling_players[pos].lp = val; room.dueling_players[pos].lp = val;
} }
if (ygopro.constants.MSG[msg] === 'PAY_LPCOST' && client.is_host) { if (ygopro.constants.MSG[msg] === 'PAY_LPCOST' && client.is_host) {
pos = buffer.readUInt8(1); pos = buffer.readUInt8(1);
...@@ -1261,9 +1286,9 @@ ...@@ -1261,9 +1286,9 @@
pos = 1 - pos; pos = 1 - pos;
} }
val = buffer.readInt32LE(2); val = buffer.readInt32LE(2);
client.room.dueling_players[pos].lp -= val; room.dueling_players[pos].lp -= val;
if ((0 < (ref1 = client.room.dueling_players[pos].lp) && ref1 <= 100)) { if ((0 < (ref1 = room.dueling_players[pos].lp) && ref1 <= 100)) {
ygopro.stoc_send_chat_to_room(client.room, "背水一战!", ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, "背水一战!", ygopro.constants.COLORS.PINK);
} }
} }
if (settings.modules.dialogues) { if (settings.modules.dialogues) {
...@@ -1281,15 +1306,16 @@ ...@@ -1281,15 +1306,16 @@
}); });
ygopro.ctos_follow('HS_KICK', true, function(buffer, info, client, server) { ygopro.ctos_follow('HS_KICK', true, function(buffer, info, client, server) {
var k, len, player, ref; var k, len, player, ref, room;
if (!client.room) { room = ROOM_all[client.rid];
if (!room) {
return; return;
} }
ref = client.room.players; ref = room.players;
for (k = 0, len = ref.length; k < len; k++) { for (k = 0, len = ref.length; k < len; k++) {
player = ref[k]; player = ref[k];
if (player && player.pos === info.pos && player !== client) { if (player && player.pos === info.pos && player !== client) {
ygopro.stoc_send_chat_to_room(client.room, player.name + " 被请出了房间", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, player.name + " 被请出了房间", ygopro.constants.COLORS.RED);
} }
} }
return false; return false;
...@@ -1304,27 +1330,28 @@ ...@@ -1304,27 +1330,28 @@
}); });
ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) { ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) {
var is_ready, k, len, player, pos, ref; var is_ready, k, len, player, pos, ref, room;
if (!(client.room && client.room.max_player && client.is_host)) { room = ROOM_all[client.rid];
if (!(room && room.max_player && client.is_host)) {
return; return;
} }
pos = info.status >> 4; pos = info.status >> 4;
is_ready = (info.status & 0xf) === 9; is_ready = (info.status & 0xf) === 9;
if (pos < client.room.max_player) { if (pos < room.max_player) {
client.room.ready_player_count_without_host = 0; room.ready_player_count_without_host = 0;
ref = client.room.players; ref = room.players;
for (k = 0, len = ref.length; k < len; k++) { for (k = 0, len = ref.length; k < len; k++) {
player = ref[k]; player = ref[k];
if (player.pos === pos) { if (player.pos === pos) {
player.is_ready = is_ready; player.is_ready = is_ready;
} }
if (!player.is_host) { if (!player.is_host) {
client.room.ready_player_count_without_host += player.is_ready; room.ready_player_count_without_host += player.is_ready;
} }
} }
if (client.room.ready_player_count_without_host >= client.room.max_player - 1) { if (room.ready_player_count_without_host >= room.max_player - 1) {
setTimeout((function() { setTimeout((function() {
wait_room_start(client.room, 20); wait_room_start(ROOM_all[client.rid], 20);
}), 1000); }), 1000);
} }
} }
...@@ -1389,8 +1416,10 @@ ...@@ -1389,8 +1416,10 @@
var k, len, room; var k, len, room;
for (k = 0, len = ROOM_all.length; k < len; k++) { for (k = 0, len = ROOM_all.length; k < len; k++) {
room = ROOM_all[k]; room = ROOM_all[k];
if (!(room && room.started)) { if (room && room.established) {
ygopro.stoc_send_random_tip_to_room(room); if (!(room && room.started)) {
ygopro.stoc_send_random_tip_to_room(room);
}
} }
} }
}, 30000); }, 30000);
...@@ -1419,29 +1448,30 @@ ...@@ -1419,29 +1448,30 @@
} }
ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) { ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) {
var k, len, player, ref; var k, len, player, ref, room;
if (!client.room) { room = ROOM_all[client.rid];
if (!room) {
return; return;
} }
if (!client.room.started) { if (!room.started) {
client.room.started = true; room.started = true;
if (settings.modules.enable_websocket_roomlist && !client.room["private"]) { if (settings.modules.enable_websocket_roomlist && !room["private"]) {
roomlist["delete"](client.room.name); roomlist["delete"](room.name);
} }
client.room.dueling_players = []; room.dueling_players = [];
ref = client.room.players; ref = room.players;
for (k = 0, len = ref.length; k < len; k++) { for (k = 0, len = ref.length; k < len; k++) {
player = ref[k]; player = ref[k];
if (!(player.pos !== 7)) { if (!(player.pos !== 7)) {
continue; continue;
} }
client.room.dueling_players[player.pos] = player; room.dueling_players[player.pos] = player;
client.room.player_datas.push({ room.player_datas.push({
ip: player.remoteAddress, ip: player.remoteAddress,
name: player.name name: player.name
}); });
if (client.room.windbot) { if (room.windbot) {
client.room.dueling_players[1 - player.pos] = {}; room.dueling_players[1 - player.pos] = {};
} }
} }
} }
...@@ -1451,13 +1481,14 @@ ...@@ -1451,13 +1481,14 @@
}); });
ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server) { ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server) {
var cancel; var cancel, room;
if (!client.room) { room = ROOM_all[client.rid];
if (!room) {
return; return;
} }
cancel = _.startsWith(_.trim(info.msg), "/"); cancel = _.startsWith(_.trim(info.msg), "/");
if (!(cancel || !client.room.random_type)) { if (!(cancel || !room.random_type)) {
client.room.last_active_time = moment(); room.last_active_time = moment();
} }
switch (_.trim(info.msg)) { switch (_.trim(info.msg)) {
case '/help': case '/help':
...@@ -1474,15 +1505,15 @@ ...@@ -1474,15 +1505,15 @@
} }
break; break;
case '/roomname': case '/roomname':
if (client.room) { if (room) {
ygopro.stoc_send_chat(client, "您当前的房间名是 " + client.room.name, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "您当前的房间名是 " + room.name, ygopro.constants.COLORS.BABYBLUE);
} }
} }
return cancel; return cancel;
}); });
ygopro.ctos_follow('UPDATE_DECK', false, function(buffer, info, client, server) { ygopro.ctos_follow('UPDATE_DECK', false, function(buffer, info, client, server) {
var i, main, side; var i, main, room, side;
main = (function() { main = (function() {
var k, ref, results; var k, ref, results;
results = []; results = [];
...@@ -1501,69 +1532,82 @@ ...@@ -1501,69 +1532,82 @@
})(); })();
client.main = main; client.main = main;
client.side = side; client.side = side;
if (!(client.room && client.room.random_type)) { room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
if (client.is_host) { if (client.is_host) {
client.room.waiting_for_player = client.room.waiting_for_player2; room.waiting_for_player = room.waiting_for_player2;
} }
client.room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.ctos_follow('RESPONSE', false, function(buffer, info, client, server) { ygopro.ctos_follow('RESPONSE', false, function(buffer, info, client, server) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
client.room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.ctos_follow('HAND_RESULT', false, function(buffer, info, client, server) { ygopro.ctos_follow('HAND_RESULT', false, function(buffer, info, client, server) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
if (client.is_host) { if (client.is_host) {
client.room.waiting_for_player = client.room.waiting_for_player2; room.waiting_for_player = room.waiting_for_player2;
} }
client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's'); room.last_active_time = moment().subtract(settings.modules.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) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
client.room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.stoc_follow('SELECT_HAND', false, function(buffer, info, client, server) { ygopro.stoc_follow('SELECT_HAND', false, function(buffer, info, client, server) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
if (client.is_host) { if (client.is_host) {
client.room.waiting_for_player = client; room.waiting_for_player = client;
} else { } else {
client.room.waiting_for_player2 = client; room.waiting_for_player2 = client;
} }
client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's'); room.last_active_time = moment().subtract(settings.modules.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) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
client.room.waiting_for_player = client; room.waiting_for_player = client;
client.room.last_active_time = moment(); room.last_active_time = moment();
}); });
ygopro.stoc_follow('CHANGE_SIDE', false, function(buffer, info, client, server) { ygopro.stoc_follow('CHANGE_SIDE', false, function(buffer, info, client, server) {
if (!(client.room && client.room.random_type)) { var room;
room = ROOM_all[client.rid];
if (!(room && room.random_type)) {
return; return;
} }
if (client.is_host) { if (client.is_host) {
client.room.waiting_for_player = client; room.waiting_for_player = client;
} else { } else {
client.room.waiting_for_player2 = client; room.waiting_for_player2 = client;
} }
client.room.last_active_time = moment(); room.last_active_time = moment();
}); });
setInterval(function() { setInterval(function() {
...@@ -1603,7 +1647,7 @@ ...@@ -1603,7 +1647,7 @@
results = []; results = [];
for (k = 0, len = ROOM_all.length; k < len; k++) { for (k = 0, len = ROOM_all.length; k < len; k++) {
room = ROOM_all[k]; room = ROOM_all[k];
if (room.established) { if (room && room.established) {
results.push({ results.push({
pid: room.process.pid.toString(), pid: room.process.pid.toString(),
roomid: room.port.toString(), roomid: room.port.toString(),
...@@ -1643,7 +1687,9 @@ ...@@ -1643,7 +1687,9 @@
if (u.query.shout) { if (u.query.shout) {
for (k = 0, len = ROOM_all.length; k < len; k++) { for (k = 0, len = ROOM_all.length; k < len; k++) {
room = ROOM_all[k]; room = ROOM_all[k];
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW); if (room && room.established) {
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW);
}
} }
response.writeHead(200); response.writeHead(200);
response.end(u.query.callback + "( ['shout ok', '" + u.query.shout + "'] );"); response.end(u.query.callback + "( ['shout ok', '" + u.query.shout + "'] );");
......
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