Files
2026-05-23 22:10:14 +08:00

185 lines
4.2 KiB
JavaScript

/******************************************************************
*
* 桥接:控制器管理过渡
*
******************************************************************/
const MOD = require( "nx.mod" );
const BridgeMods = cc.Class( {
extends: MOD,
name: "BridgeMods",
// 初始化
initialize: function( _args ) {
// USPER
this._super( _args );
// 单例列表
this.modules = [];
// 访问接口(设置)
nx.bridge.mods = this;
return true;
},
// 销毁
uninitialize: function() {
// 访问接口(关闭)
nx.bridge.mods = null;
// USPER
return this._super();
},
// 模块载入
install: function( _id, _key ) {
// 重复载入
if( CC_DEBUG ) {
if( nx.dt.arrMember( this.modules, null, ( m ) => {
return m && m.__fkey == _key;
} ) ) {
nx.error( "$MODS:模块载入重复! ", _key );
return;
}
}
// 载入
let ref = require( _key );
let mod = ref ? ref.getInstance( _id, _key, true ) : null;
if( !mod ) {
nx.error( "$MODS:模块载入失败! ", _key );
return;
}
// 初始化
mod.setFunctionID( _id, _key );
mod.setFunctionLock( true );
// 记录
this.modules.push( mod );
nx.debug( "$MODS:模块载入 ", _key );
},
// 模块卸载
uninstall: function( _key ) {
nx.debug( "$MODS:模块卸载 ", _key );
nx.dt.arrDelete( this.modules, ( m ) => {
return m && m.__fkey == _key;
} );
},
// 模块清空
uninstallAll: function() {
this.modules = [];
if( this.modTicker ) {
clearTimeout( this.modTicker );
this.modTicker = 0;
}
},
// 初始化所有模块
initModules: function( _cb ) {
nx.debug( "$MODS:初始化所有模块..." );
// 全部锁定
this.modules.forEach( mod => {
mod.setFunctionLock( true );
} );
// 重新解锁
this.checkUnLock( _cb );
},
// 首次解锁判定
checkUnLock: function( _cb ) {
// 统计待更新模块
let mods = [];
for( let i = 0; i < this.modules.length; ++i ) {
// 无效/已经解锁/没有具体功能
let mod = this.modules[ i ];
if( !mod || !mod.__flock ) {
continue;
}
// 未解锁
let ret = nx.bridge.jumper.checkSource( mod.__fid );
if( nx.dt.objNEmpty( ret ) ) {
continue;
}
mod.setFunctionLock( false );
mods.push( mod );
}
// 空
if( nx.dt.arrEmpty( mods ) ) {
nx.dt.fnInvoke( _cb, true );
return;
}
nx.debug( "$MODS:功能模块更新...总共:%s 更新:%s", this.modules.length, mods.length );
// 超时处理
let self = this;
let timout = function( _name, _open ) {
if( self.modTicker ) {
clearTimeout( self.modTicker );
self.modTicker = 0;
}
if( _open ) {
self.modTicker = setTimeout( () => {
nx.warn( nx.text.format( "ErrModTimeout", _name ) );
next();
}, 2000 );
}
};
// 依次更新
let done = false;
let next = function() {
// 结束
if( mods.length == 0 ) {
if( !done ) {
nx.dt.fnInvoke( _cb, true );
done = true;
}
return;
}
let mod = mods.shift();
nx.debug( "$MODS:[%s]\t%s", mods.length, mod.__fkey );
timout( mod.__fkey, true );
mod.reqBaseFromServer( ( _ret, _data ) => {
nx.debug( "$MODS: done.\t\t", mod.__fkey, _ret );
timout( mod.__fkey, false );
next();
} );
}
next();
},
} );
module.exports = BridgeMods;