Commit 9c4b7ccc authored by 神楽坂玲奈's avatar 神楽坂玲奈

fix

parent 1657f74c
#标准库
net = require 'net'
http = require 'http'
url = require 'url'
path = require 'path'
fs = require 'fs'
execFile = require('child_process').execFile
#三方库
_ = require 'underscore'
_.str = require 'underscore.string'
_.mixin(_.str.exports());
Inotify = require('inotify').Inotify
request = require 'request'
bunyan = require 'bunyan'
#配置文件
settings = require './config.json'
#组件
ygopro = require './ygopro.js'
mycard = require './mycard.js'
Room = require './room.js'
User = require './user.js' if settings.modules.database
Deck = require './deck.js' if settings.modules.database
victories = require './victories.json'
#debug模式 端口号+1
debug = false
log = null
if process.argv[2] == '--debug'
settings.port++
settings.modules.http.port++ if settings.modules.http
log = bunyan.createLogger name: "mycard-debug"
else
log = bunyan.createLogger name: "mycard"
#网络连接
net.createServer (client) ->
server = new net.Socket()
client.server = server
#释放处理
client.on 'close', (had_error) ->
log.info "client closed", client.name, had_error
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
client.closed = true
client.room.disconnect(client) if client.room
server.end()
client.on 'error', (error)->
log.info "client error", client.name, error
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
client.closed = error
client.room.disconnect(client, error) if client.room
server.end()
server.on 'close', (had_error) ->
log.info "server closed", client.name, had_error
server.closed = true unless server.closed
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接")
client.end()
server.on 'error', (error)->
log.info "server error", client.name, error
server.closed = error
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}")
client.end()
#需要重构
#客户端到服务端(ctos)协议分析
ctos_buffer = new Buffer(0)
ctos_message_length = 0
ctos_proto = 0
client.pre_establish_buffers = new Array()
client.on 'data', (data) ->
if client.is_post_watcher
client.room.watcher.write data
else
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
if client.established
server.write data
else
client.pre_establish_buffers.push data
while true
if ctos_message_length == 0
if ctos_buffer.length >= 2
ctos_message_length = ctos_buffer.readUInt16LE(0)
else
break
else if ctos_proto == 0
if ctos_buffer.length >= 3
ctos_proto = ctos_buffer.readUInt8(2)
else
break
else
if ctos_buffer.length >= 2 + ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
if ygopro.ctos_follows[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3)
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]
struct._setBuff(b)
ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server
else
ygopro.ctos_follows[ctos_proto].callback b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0
ctos_proto = 0
else
break
#服务端到客户端(stoc)
stoc_buffer = new Buffer(0)
stoc_message_length = 0
stoc_proto = 0
server.on 'data', (data)->
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
#unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client.write data
while true
if stoc_message_length == 0
if stoc_buffer.length >= 2
stoc_message_length = stoc_buffer.readUInt16LE(0)
else
break
else if stoc_proto == 0
if stoc_buffer.length >= 3
stoc_proto = stoc_buffer.readUInt8(2)
else
break
else
if stoc_buffer.length >= 2 + stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
if ygopro.stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
struct._setBuff(b)
ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server
else
ygopro.stoc_follows[stoc_proto].callback b, null, client, server
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0
stoc_proto = 0
else
break
.listen settings.port, ->
log.info "server started", settings.ip, settings.port
#功能模块
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.name = info.name #在创建room之前暂存
ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#log.info info
if info.version != settings.version
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 4
code: settings.version
}
client.end()
else if !info.pass.length
ygopro.stoc_send_chat(client,"房间为空,请修改房间名")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if !Room.validate(info.pass)
#ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#}
ygopro.stoc_send_chat(client,"房间密码不正确")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if client.name == '[INCORRECT]' #模拟用户验证
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
log.info 'join_game',info.pass, client.name
client.room = Room.find_or_create_by_name(info.pass)
if client.room.started
if settings.modules.post_start_watching
client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
client.room.watchers.push client
for buffer in client.room.watcher_buffers
client.write buffer
ygopro.stoc_send_chat client, "观战中."
else
ygopro.stoc_send_chat(client,"决斗已开始")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
client.room.connect(client)
######################################################################################################################
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#欢迎信息
if settings.modules.welcome
ygopro.stoc_send_chat client, settings.modules.welcome
if settings.modules.database
if _.startsWith(client.room.name, 'M#')
User.findOne { name: client.name }, (err, user)->
if !user
user = new User({name: client.name, points: 0})
user.save()
User.count {points:{$gt:user.points}}, (err, count)->
rank = count + 1
ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置")
if settings.modules.post_start_watching and !client.room.watcher
client.room.watcher = watcher = net.connect client.room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother"
}
ygopro.ctos_send watcher, 'JOIN_GAME', {
version: settings.version,
gameid: 2577,
some_unknown_mysterious_fucking_thing: 0
pass: ""
}
ygopro.ctos_send watcher, 'HS_TOOBSERVER'
watcher.on 'data', (data)->
client.room.watcher_buffers.push data
for w in client.room.watchers
w.write data if w #a WTF fix
watcher.on 'error', (error)->
log.error "watcher error", error
#登场台词
if settings.modules.dialogues
dialogues = {}
request
url: settings.modules.dialogues
json: true
, (error, response, body)->
if _.isString body
log.warn "dialogues bad json", body
else if error or !body
log.warn 'dialogues error', error, response
else
log.info "dialogues loaded", _.size body
dialogues = body
ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
msg = buffer.readInt8(0)
#log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START'
playertype = buffer.readUInt8(1)
client.is_first = !(playertype & 0xf);
client.lp = client.room.hostinfo.start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2
reason = buffer.readUInt8(2)
log.info {winner: pos, reason: reason}
client.room.duels.push {winner: pos, reason: reason}
#lp跟踪
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!")
if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp += val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp = val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "背水一战!")
#登场台词
if settings.modules.dialogues
if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING'
card = buffer.readUInt32LE(1)
if dialogues[card]
for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)]
ygopro.stoc_send_chat client, line
###
#房间管理
ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
#room = client.room
#if !room
# console.log "[WARN]player_enter: can't find room by player #{client.player}"
# return
#room.pos_name[info.pos] = info.name
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0
#client.pos = info.status >> 4
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
###
ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
selftype = info.type & 0xf;
is_host = ((info.type >> 4) & 0xf) != 0;
client.is_host = is_host
client.pos = selftype
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
#tip
ygopro.stoc_send_random_tip = (client)->
ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips
tips = null
request
url: settings.modules.tips
json: true
, (error, response, body)->
tips = body
log.info "tips loaded", tips.length
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
unless client.room.started #first start
client.room.started = true
client.room.duels = []
client.room.dueling_players = []
for player in client.room.players when player.pos != 7
client.room.dueling_players[player.pos] = player
if !player.main
log.error 'WTF', client
else
player.deck = mycard.load_card_usages_from_cards(player.main, player.side)
if !client.room.dueling_players[0] or !client.room.dueling_players[1]
log.error 'incomplete room', client.room.dueling_players, client.room.players
if settings.modules.tips
ygopro.stoc_send_random_tip(client)
ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)->
switch _.trim(info.msg)
when '/ping'
execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)->
if error
ygopro.stoc_send_chat_to_room client.room, error
else
line = _.lines(stdout)[2]
if line.indexOf('rtt') != -1
ygopro.stoc_send_chat_to_room client.room, line
else
log.warn 'ping', stdout
ygopro.stoc_send_chat_to_room client.room, stdout
when '/ranktop'
if settings.modules.database
User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)->
if err
return log.error 'ranktop', err
for index, user of users
ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ')
when '/help'
ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助")
ygopro.stoc_send_chat(client,"/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips
ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组")
when '/tip'
ygopro.stoc_send_random_tip(client) if settings.modules.tips
#发送卡组
when '/senddeck'
if client.deck?
ygopro.stoc_send_chat(client, "正在读取卡组信息... ")
mycard.deck_url_short client.name, client.deck, (url)->
ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url)
else
ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败")
when '/admin showroom'
log.info client.room
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
log.info info
main = (info.deckbuf[i] for i in [0...info.mainc])
side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec])
client.main = main
client.side = side
if settings.modules.skip_empty_side
ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)->
if not _.any(client.deck, (card_usage)->card_usage.side)
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: client.main.length,
sidec: 0,
deckbuf: client.main
}
ygopro.stoc_send_chat client, '等待更换副卡组中...'
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ygopro.ctos_send server, 'HS_READY'
###
#http
if settings.modules.http
level_points = require './level_points.json'
waiting = [[]]
for i of level_points
waiting.push []
log.info 'level_points loaded', level_points
http.createServer (request, response)->
#http://122.0.65.70:7922/?operation=getroomjson
url = url.parse(request.url)
#log.info url
if url.pathname == '/count.json'
response.writeHead(200);
response.end(Room.all.length.toString())
else if url.pathname == '/match'
if request.headers['authorization']
[name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':')
User.findOne { name: name }, (err, user)->
if !user
user = new User({name: name, points: 0, elo: 1400})
user.save()
level = level_points.length
for index, points of level_points
if user.points < points
level = index
break
response.allowance = 0
waiting[level].push response
request.on 'close', ()->
index = waiting[level].indexOf(response)
waiting[level].splice(index, 1) unless index == -1
else
#log.info 'unauth match'
#response.writeHead(401);
#response.end("请更新mycard到1.2.8版本");
level = 1
response.allowance = 0
waiting[level].push response
request.on 'close', ()->
index = waiting[level].indexOf(response)
waiting[level].splice(index, 1) unless index == -1
else if url.pathname == '/rooms.json'
response.writeHead(404);
response.end();
else if url.query == 'operation=getroomjson'
response.writeHead(200);
response.end JSON.stringify rooms: (for room in Room.all when room.established
roomid: room.port.toString(),
roomname: room.name.split('$',2)[0],
needpass: (room.name.indexOf('$') != -1).toString(),
users: (for player in room.players when player.pos?
id: (-1).toString(),
name: player.name,
pos: player.pos
),
istart: if room.started then "start" else "wait"
)
else
response.writeHead(404);
response.end();
.listen settings.modules.http.port
setInterval ()->
for level in [level_points.length..0]
for index, player of waiting[level]
opponent_level = null
opponent = _.find waiting[level], (opponent)->
log.info opponent,player
opponent isnt player
log.info '--------1--------', waiting, opponent
if opponent
opponent_level = level
else if player.allowance > 0
for displacement in [1..player.allowance]
if level+displacement <= level_points.length
opponent = waiting[level+displacement][0]
if opponent
opponent_level = level+displacement
break
if level-displacement >= 0
opponent = waiting[level-displacement][0]
if opponent
opponent_level = level-displacement
break
if opponent
if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1
log.info waiting, player, level, opponent, opponent_level
throw 'WTF'
waiting[level].splice(waiting[level].indexOf(player), 1)
waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1)
index--
room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}"
log.info 'matched', room
headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"}
player.writeHead(200, headers)
player.end room
opponent.writeHead(200, headers)
opponent.end room
else
player.allowance++
, 2000
#清理90s没活动的房间
inotify = new Inotify()
inotify.addWatch
path: 'ygocore/replay',
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
callback: (event)->
mask = event.mask
if event.name
port = parseInt path.basename(event.name, '.yrp')
room = Room.find_by_port port
if room
if mask & Inotify.IN_CREATE
else if mask & Inotify.IN_CLOSE_WRITE
fs.unlink path.join('ygocore/replay'), (err)->
else if mask & Inotify.IN_MODIFY
room.alive = true
else
log.error "event without filename"
setInterval ()->
for room in Room.all
if room.alive
room.alive = false
else
log.info "kill room", room.port
for player in room.players
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed
room.process.kill()
#标准库
net = require 'net'
http = require 'http'
url = require 'url'
path = require 'path'
fs = require 'fs'
execFile = require('child_process').execFile
#三方库
_ = require 'underscore'
_.str = require 'underscore.string'
_.mixin(_.str.exports());
Inotify = require('inotify').Inotify
request = require 'request'
bunyan = require 'bunyan'
#配置文件
settings = require './config.json'
#组件
ygopro = require './ygopro.js'
mycard = require './mycard.js'
Room = require './room.js'
User = require './user.js' if settings.modules.database
Deck = require './deck.js' if settings.modules.database
victories = require './victories.json'
#debug模式 端口号+1
debug = false
log = null
if process.argv[2] == '--debug'
settings.port++
settings.modules.http.port++ if settings.modules.http
log = bunyan.createLogger name: "mycard-debug"
else
log = bunyan.createLogger name: "mycard"
#网络连接
net.createServer (client) ->
server = new net.Socket()
client.server = server
#释放处理
client.on 'close', (had_error) ->
log.info "client closed", client.name, had_error
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
client.closed = true
client.room.disconnect(client) if client.room
server.end()
client.on 'error', (error)->
log.info "client error", client.name, error
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
client.closed = error
client.room.disconnect(client, error) if client.room
server.end()
server.on 'close', (had_error) ->
log.info "server closed", client.name, had_error
server.closed = true unless server.closed
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接")
client.end()
server.on 'error', (error)->
log.info "server error", client.name, error
server.closed = error
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}")
client.end()
#需要重构
#客户端到服务端(ctos)协议分析
ctos_buffer = new Buffer(0)
ctos_message_length = 0
ctos_proto = 0
client.pre_establish_buffers = new Array()
client.on 'data', (data) ->
if client.is_post_watcher
client.room.watcher.write data
else
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
if client.established
server.write data
else
client.pre_establish_buffers.push data
while true
if ctos_message_length == 0
if ctos_buffer.length >= 2
ctos_message_length = ctos_buffer.readUInt16LE(0)
else
break
else if ctos_proto == 0
if ctos_buffer.length >= 3
ctos_proto = ctos_buffer.readUInt8(2)
else
break
else
if ctos_buffer.length >= 2 + ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
if ygopro.ctos_follows[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3)
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]
struct._setBuff(b)
ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server
else
ygopro.ctos_follows[ctos_proto].callback b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0
ctos_proto = 0
else
break
#服务端到客户端(stoc)
stoc_buffer = new Buffer(0)
stoc_message_length = 0
stoc_proto = 0
server.on 'data', (data)->
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
#unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client.write data
while true
if stoc_message_length == 0
if stoc_buffer.length >= 2
stoc_message_length = stoc_buffer.readUInt16LE(0)
else
break
else if stoc_proto == 0
if stoc_buffer.length >= 3
stoc_proto = stoc_buffer.readUInt8(2)
else
break
else
if stoc_buffer.length >= 2 + stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
if ygopro.stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
struct._setBuff(b)
ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server
else
ygopro.stoc_follows[stoc_proto].callback b, null, client, server
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0
stoc_proto = 0
else
break
.listen settings.port, ->
log.info "server started", settings.ip, settings.port
#功能模块
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.name = info.name #在创建room之前暂存
ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#log.info info
if info.version != settings.version
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 4
code: settings.version
}
client.end()
else if !info.pass.length
ygopro.stoc_send_chat(client,"房间为空,请修改房间名")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if !Room.validate(info.pass)
#ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#}
ygopro.stoc_send_chat(client,"房间密码不正确")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if client.name == '[INCORRECT]' #模拟用户验证
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
log.info 'join_game',info.pass, client.name
client.room = Room.find_or_create_by_name(info.pass)
if client.room.started
if settings.modules.post_start_watching
client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
client.room.watchers.push client
for buffer in client.room.watcher_buffers
client.write buffer
ygopro.stoc_send_chat client, "观战中."
else
ygopro.stoc_send_chat(client,"决斗已开始")
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
client.room.connect(client)
######################################################################################################################
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#欢迎信息
if settings.modules.welcome
ygopro.stoc_send_chat client, settings.modules.welcome
if settings.modules.database
if _.startsWith(client.room.name, 'M#')
User.findOne { name: client.name }, (err, user)->
if !user
user = new User({name: client.name, points: 0})
user.save()
User.count {points:{$gt:user.points}}, (err, count)->
rank = count + 1
ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置")
if settings.modules.post_start_watching and !client.room.watcher
client.room.watcher = watcher = net.connect client.room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother"
}
ygopro.ctos_send watcher, 'JOIN_GAME', {
version: settings.version,
gameid: 2577,
some_unknown_mysterious_fucking_thing: 0
pass: ""
}
ygopro.ctos_send watcher, 'HS_TOOBSERVER'
watcher.on 'data', (data)->
client.room.watcher_buffers.push data
for w in client.room.watchers
w.write data if w #a WTF fix
watcher.on 'error', (error)->
log.error "watcher error", error
#登场台词
if settings.modules.dialogues
dialogues = {}
request
url: settings.modules.dialogues
json: true
, (error, response, body)->
if _.isString body
log.warn "dialogues bad json", body
else if error or !body
log.warn 'dialogues error', error, response
else
log.info "dialogues loaded", _.size body
dialogues = body
ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
msg = buffer.readInt8(0)
#log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START'
playertype = buffer.readUInt8(1)
client.is_first = !(playertype & 0xf);
client.lp = client.room.hostinfo.start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2
reason = buffer.readUInt8(2)
log.info {winner: pos, reason: reason}
client.room.duels.push {winner: pos, reason: reason}
#lp跟踪
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!")
if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp += val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp = val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "背水一战!")
#登场台词
if settings.modules.dialogues
if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING'
card = buffer.readUInt32LE(1)
if dialogues[card]
for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)]
ygopro.stoc_send_chat client, line
###
#房间管理
ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
#room = client.room
#if !room
# console.log "[WARN]player_enter: can't find room by player #{client.player}"
# return
#room.pos_name[info.pos] = info.name
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0
#client.pos = info.status >> 4
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
###
ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
selftype = info.type & 0xf;
is_host = ((info.type >> 4) & 0xf) != 0;
client.is_host = is_host
client.pos = selftype
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
#tip
ygopro.stoc_send_random_tip = (client)->
ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips
tips = null
if settings.modules.tips
request
url: settings.modules.tips
json: true
, (error, response, body)->
tips = body
log.info "tips loaded", tips.length
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
unless client.room.started #first start
client.room.started = true
client.room.duels = []
client.room.dueling_players = []
for player in client.room.players when player.pos != 7
client.room.dueling_players[player.pos] = player
if !player.main
log.error 'WTF', client
else
player.deck = mycard.load_card_usages_from_cards(player.main, player.side)
if !client.room.dueling_players[0] or !client.room.dueling_players[1]
log.error 'incomplete room', client.room.dueling_players, client.room.players
if settings.modules.tips
ygopro.stoc_send_random_tip(client)
ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)->
switch _.trim(info.msg)
when '/ping'
execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)->
if error
ygopro.stoc_send_chat_to_room client.room, error
else
line = _.lines(stdout)[2]
if line.indexOf('rtt') != -1
ygopro.stoc_send_chat_to_room client.room, line
else
log.warn 'ping', stdout
ygopro.stoc_send_chat_to_room client.room, stdout
when '/ranktop'
if settings.modules.database
User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)->
if err
return log.error 'ranktop', err
for index, user of users
ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ')
when '/help'
ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助")
ygopro.stoc_send_chat(client,"/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips
ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组")
when '/tip'
ygopro.stoc_send_random_tip(client) if settings.modules.tips
#发送卡组
when '/senddeck'
if client.deck?
ygopro.stoc_send_chat(client, "正在读取卡组信息... ")
mycard.deck_url_short client.name, client.deck, (url)->
ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url)
else
ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败")
when '/admin showroom'
log.info client.room
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
log.info info
main = (info.deckbuf[i] for i in [0...info.mainc])
side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec])
client.main = main
client.side = side
if settings.modules.skip_empty_side
ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)->
if not _.any(client.deck, (card_usage)->card_usage.side)
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: client.main.length,
sidec: 0,
deckbuf: client.main
}
ygopro.stoc_send_chat client, '等待更换副卡组中...'
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ygopro.ctos_send server, 'HS_READY'
###
#http
if settings.modules.http
level_points = require './level_points.json'
waiting = [[]]
for i of level_points
waiting.push []
log.info 'level_points loaded', level_points
http.createServer (request, response)->
#http://122.0.65.70:7922/?operation=getroomjson
url = url.parse(request.url)
#log.info url
if url.pathname == '/count.json'
response.writeHead(200);
response.end(Room.all.length.toString())
else if url.pathname == '/match'
if request.headers['authorization']
[name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':')
User.findOne { name: name }, (err, user)->
if !user
user = new User({name: name, points: 0, elo: 1400})
user.save()
level = level_points.length
for index, points of level_points
if user.points < points
level = index
break
response.allowance = 0
waiting[level].push response
request.on 'close', ()->
index = waiting[level].indexOf(response)
waiting[level].splice(index, 1) unless index == -1
else
#log.info 'unauth match'
#response.writeHead(401);
#response.end("请更新mycard到1.2.8版本");
level = 1
response.allowance = 0
waiting[level].push response
request.on 'close', ()->
index = waiting[level].indexOf(response)
waiting[level].splice(index, 1) unless index == -1
else if url.pathname == '/rooms.json'
response.writeHead(404);
response.end();
else if url.query == 'operation=getroomjson'
response.writeHead(200);
response.end JSON.stringify rooms: (for room in Room.all when room.established
roomid: room.port.toString(),
roomname: room.name.split('$',2)[0],
needpass: (room.name.indexOf('$') != -1).toString(),
users: (for player in room.players when player.pos?
id: (-1).toString(),
name: player.name,
pos: player.pos
),
istart: if room.started then "start" else "wait"
)
else
response.writeHead(404);
response.end();
.listen settings.modules.http.port
setInterval ()->
for level in [level_points.length..0]
for index, player of waiting[level]
opponent_level = null
opponent = _.find waiting[level], (opponent)->
log.info opponent,player
opponent isnt player
log.info '--------1--------', waiting, opponent
if opponent
opponent_level = level
else if player.allowance > 0
for displacement in [1..player.allowance]
if level+displacement <= level_points.length
opponent = waiting[level+displacement][0]
if opponent
opponent_level = level+displacement
break
if level-displacement >= 0
opponent = waiting[level-displacement][0]
if opponent
opponent_level = level-displacement
break
if opponent
if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1
log.info waiting, player, level, opponent, opponent_level
throw 'WTF'
waiting[level].splice(waiting[level].indexOf(player), 1)
waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1)
index--
room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}"
log.info 'matched', room
headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"}
player.writeHead(200, headers)
player.end room
opponent.writeHead(200, headers)
opponent.end room
else
player.allowance++
, 2000
#清理90s没活动的房间
inotify = new Inotify()
inotify.addWatch
path: 'ygocore/replay',
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
callback: (event)->
mask = event.mask
if event.name
port = parseInt path.basename(event.name, '.yrp')
room = Room.find_by_port port
if room
if mask & Inotify.IN_CREATE
else if mask & Inotify.IN_CLOSE_WRITE
fs.unlink path.join('ygocore/replay'), (err)->
else if mask & Inotify.IN_MODIFY
room.alive = true
else
log.error "event without filename"
setInterval ()->
for room in Room.all
if room.alive
room.alive = false
else
log.info "kill room", room.port
for player in room.players
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed
room.process.kill()
, 900000
\ No newline at end of file
......@@ -464,13 +464,15 @@
tips = null;
request({
url: settings.modules.tips,
json: true
}, function(error, response, body) {
tips = body;
return log.info("tips loaded", tips.length);
});
if (settings.modules.tips) {
request({
url: settings.modules.tips,
json: true
}, function(error, response, body) {
tips = body;
return log.info("tips loaded", tips.length);
});
}
ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) {
var player, _i, _len, _ref;
......
......@@ -6,5 +6,5 @@
"ygopro-server.coffee"
],
"names": [],
"mappings": "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"
"mappings": "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"
}
\ No newline at end of file
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