2015-06-17 5 views
0

Я делаю многопользовательскую игру, используя node.js, socket.io и MongoDB.Как отложить чтение до написания?

Когда игрок умирает, они могут перезагрузить браузер непосредственно перед смертельным ударом и все еще быть в живых, даже несмотря на то, что убийство было зарегистрировано. Я использую следующее решение для сохранения/загрузки игрока:

socket.sockets.on('connection', onSocketConnection); 

function onSocketConnection(client) { 
    util.log('New player has connected: '+client.id); 

    client.on('new player', function() { 
     db.collection('players').findOne({uuid: uid}, function(err, data) { 
      var player = new Player(data); 
      players.push(player); 
     }); 
    }); 

    client.on('disconnect', function() { 
     db.collection('players').update({uuid: player.uuid}, {$set: player}, {w: 1}, function(err, result) { 
      console.log('player written'); 
     }); 
    }); 
}; 

То, что я думаю, что происходит в том, что «разрыв» событие начинает писать, но прежде, чем это делается в «новый игрок» пожары событий, загружает плеер из базы данных и снова инициализирует его. Таким образом, чтение происходит до того, как запись будет выполнена (это означает, что они будут получать состояние игрока от разъединения до того, как это происходит прямо сейчас).

В этом проблема? Если нет, есть ли что-нибудь еще в моем подходе, которое может вызвать это? Если это действительно проблема, как я могу это решить?

+0

вы можете найти и убить их из обратного вызова обновления соединения? – dandavis

ответ

1

В многопользовательской игре вам необходимо сделать важную логику состояния на сервере или, по крайней мере, выполнить некоторую проверку состояния на стороне сервера.

Вы только замечаете этот «взлом», потому что это легко сделать. Вы должны создать свой многопользовательский сервер, чтобы быть стойким против кого-то, кто имеет опыт написания своего собственного клиента с socket.io. В основном это означает, что вы не должны автоматически доверять важным данным, поступающим от любого клиента.

В вашей ситуации вам необходимо отправить запрос в кратчайшие сроки без возврата до смерти. Это, вероятно, не позволит большинству людей выполнить этот эксплойт, но любой, кто знает javascript и имеет хром, сможет предотвратить отправку этого запроса.

Смежные вопросы