this.inherits(COMMAND); this.command = "login"; this.allow_login = true; this.enter = function (user, id) { if (user.id) return; if (user.serverid !== WORLD.SERVERID) return; user.ip_address = user.socket.remoteAddress; const oldUser = this.check_user(user, id); if (!oldUser) return; if (oldUser.id) { this.relogin(oldUser, user); } else { this.loginIn(user, id); } } this.check_user = function (loginuser, id) { for (var i = 0; i < WORLD.USERS.length; i++) { let user = WORLD.USERS[i]; if (user.id === id) { return user; } //其他检测loginuser } return {}; } this.relogin = function (oldUser, user) { if (oldUser.userid === user.userid) { if (!this.on_user_relogin(oldUser, user) !== false) return; if (oldUser.password !== user.password && oldUser.loginTime > user.loginTime) { return user.send("{type:'loginerror',msg:'密码失效,请重新登录'}"); } oldUser.password = user.password; oldUser.loginTime = user.loginTime; oldUser.ip_address = user.socket.remoteAddress; oldUser.disconnect(true); user.socket.setTimeout(0); return oldUser.relogin(user); } else { WORLD.log(null, "登陆失败:" + oldUser.id + ",原始ID:" + oldUser.userid + ",现在ID:" + user.userid); return user.send("{type:'loginerror',msg:'当前使用的登陆凭证和角色不一致'}"); } } this.on_user_relogin = function (user, me) { if (user.state && user.state.id == "cross") { if (user.state.is_over || Date.now() - user.state.stime > 1800000) { user.moveto(user.query_temp("enter_room") || "yz/wumiao"); return true; } else { me.send("{type:'cross',sid:" + user.state.sid + ",pid:'" + user.id + "',cross_type:'" + user.state.cross_type + "'}"); } return false; } return true; } this.loginIn = async function (user, id) { try { const data = await WORLD.DB.getRoleData(user.userid, id); if (!data) return user.send("{type:'loginerror',msg:'角色读取失败,请重新登陆 '}"); oldUser = WORLD.getUser(id); if (oldUser) return user.send("{type:'loginerror',msg:'重复登录'}"); if (data.pwd !== user.password) return user.send("{type:'loginerror',msg:'密码失效,请重新登录'}"); WORLD.USERS.push(user); user.loadData(data); user.do_login(); user.wait_input = null; if (user.socket) user.socket.setTimeout(0); this.on_user_login(user); } catch (e) { console.error('登陆失败', e); WORLD.log(user, "登陆失败", e.message); user.send("{type:'loginerror',msg:'数据加载失败'}"); } } this.on_user_login = function (user) { user.send("欢迎登陆MUD游戏"); const area = user.environment.parent; area.on_login && area.on_login(user); if (user.force_skill.on_relive) { user.force_skill.on_relive(user); } }