/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.DefineBag
{
import flash.utils.Dictionary;
public interface IMsgListener
{
function OnEvt( _evt:Object ):Boolean;
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.DefineBag
{
import flash.utils.Dictionary;
public interface IMsgServer
{
function AddListener( _msg:String, _lst:IMsgListener ):Boolean;
function RemoveListener( _msg:String, _lst:IMsgListener ):void;
function DispatchEvt( _msg:String, _evt:Object ):Boolean;
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.DefineBag
{
import flash.utils.Dictionary;
public interface IMsgSvrManager
{
function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean;
function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void;
function DispatchEvt( _msg:String, _evt:Object ):void;
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgListen
{
import MsgServer.DefineBag.IMsgListener;
import MsgServer.MsgServerBag.MsgServerManagerHelper;
public class ActionHelper extends BaseEvtHelper
{
public function ActionHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
{
super(_msg_svr, _msg, _callback, _condition);
}
public function Init() : Boolean
{
return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.ACTION, this);
}
public function Uninit() : void
{
m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.ACTION, this);
}
public override function OnEvt( _buf:Object ):Boolean
{
if( null != m_condition && null != _buf )
{
var sign:String = "";
for( sign in m_condition )
{
if( m_condition[sign] != _buf[sign] )
{
return true;
}
}
}
m_fun(_buf);
return true;
}
};
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgListen
{
import MsgServer.DefineBag.IMsgListener;
import MsgServer.MsgServerBag.MsgServerManagerHelper;
public class BaseEvtHelper implements IMsgListener
{
protected var m_msg_svr:MsgServerManagerHelper = null;
protected var m_msg:String = "";
protected var m_fun:Function = null;
protected var m_condition:Object = null;
public function BaseEvtHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
{
m_msg_svr = _msg_svr;
m_msg = _msg;
m_fun = _callback;
m_condition = _condition;
}
public function OnEvt( _buf:Object ):Boolean{ return true; }
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgListen
{
import MsgServer.DefineBag.IMsgListener;
import MsgServer.MsgServerBag.MsgServerManagerHelper;
public class VoteHelper extends BaseEvtHelper
{
public function VoteHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
{
super(_msg_svr, _msg, _callback, _condition);
}
public function Init() : Boolean
{
return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.VOTE, this);
}
public function Uninit() : void
{
m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.VOTE, this);
}
public override function OnEvt( _buf:Object ):Boolean
{
if( null != m_condition && null != _buf )
{
var sign:String = "";
for( sign in m_condition )
{
if( m_condition[sign] != _buf[sign] )
{
return false;
}
}
}
return m_fun(_buf);
}
};
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgServerBag
{
import MsgServer.DefineBag.IMsgListener;
import flash.utils.Dictionary;
public class ActionMsgSvr extends BaseMsgSvr
{
protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
{
++run_count;
var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
{
if( null != msg_lst[id] )
{
msg_lst[id].OnEvt(_evt)
}
if( null == msg_lst[id] )
{
had_null_node = true;
}
}
--run_count;
return true;
}
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgServerBag
{
import MsgServer.DefineBag.IMsgListener;
import MsgServer.DefineBag.IMsgServer;
import flash.utils.Dictionary;
public class BaseMsgSvr implements IMsgServer
{
private const IS_DEBUG:Boolean = false;
protected var m_msg_table:Dictionary = new Dictionary();
public function AddListener( _msg:String, _lst:IMsgListener ):Boolean
{
if( null == m_msg_table[_msg] )
m_msg_table[_msg] = new Vector.<IMsgListener>();
var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
if( IS_DEBUG )
{
var i:int = msg_lst.indexOf(_lst);
if( -1 != i )
{
trace("<-------------- 警告!!! 相同对象相同监听执行多次! -------------->");
return false;
}
}
msg_lst.push(_lst);
return true;
}
public function RemoveListener( _msg:String, _lst:IMsgListener ):void
{
if( null != m_msg_table[_msg] )
{
var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
var i:int = msg_lst.indexOf(_lst);
if( -1 != i )
{
msg_lst[i] = null;
}
}
}
private var msg_backups:Vector.<IMsgListener> = new Vector.<IMsgListener>();
protected var run_count:int = 0;
protected var had_null_node:Boolean = false;
public function DispatchEvt( _msg:String, _evt:Object ):Boolean
{
if( null != m_msg_table[_msg] )
{
if( run_count >= 10 )
{
trace("消息相互调用超过10层,极有可能是游戏逻辑的实现有BUG!");
}
var ret:Boolean = DoDispatchEvt(_msg, _evt);
if( 0 == run_count && had_null_node )
{
//非递归层的情况,才进行清理垃圾操作的结点
var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
{
if( null != msg_lst[id] )
msg_backups.push(msg_lst[id]);
}
var msg_temp:Vector.<IMsgListener> = m_msg_table[_msg];
m_msg_table[_msg] = msg_backups;
msg_backups = msg_temp;
msg_backups.splice(0, msg_backups.length);
had_null_node = false;
}
return ret;
}
return true;
}
protected function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
{
return true;
}
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgServerBag
{
public class MsgServerManagerHelper
{
public const VOTE:int = 1;
public const INIT:int = 2;
public const ACTION:int = 3;
public const UNINIT:int = 4;
private var g_msg_svr_mng:MsgSvrManager = new MsgSvrManager();
private var g_vote_msg_svr:VoteMsgSvr = new VoteMsgSvr();
private var g_init_msg_svr:ActionMsgSvr = new ActionMsgSvr();
private var g_action_msg_svr:ActionMsgSvr = new ActionMsgSvr();
private var g_uninit_msg_svr:ActionMsgSvr = new ActionMsgSvr();
public function Init():void
{
g_msg_svr_mng.PushSvr(VOTE, g_vote_msg_svr);
g_msg_svr_mng.PushSvr(INIT, g_init_msg_svr);
g_msg_svr_mng.PushSvr(ACTION, g_action_msg_svr);
g_msg_svr_mng.PushSvr(UNINIT, g_uninit_msg_svr);
}
public function UnInit():void
{
g_msg_svr_mng.Clear();
}
public function GetSvr():MsgSvrManager
{
return g_msg_svr_mng;
}
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgServerBag
{
import MsgServer.DefineBag.IMsgListener;
import MsgServer.DefineBag.IMsgServer;
import MsgServer.DefineBag.IMsgSvrManager;
import flash.utils.Dictionary;
public class MsgSvrManager implements IMsgSvrManager
{
private var svr_vct:Vector.<MakePair> = new Vector.<MakePair>();
public function PushSvr( _sign:int, _msg_svr:IMsgServer ):void
{
var lst:MakePair = new MakePair(_sign, _msg_svr);
svr_vct.push(lst);
}
public function Clear():void
{
svr_vct.splice(0,svr_vct.length);
}
public function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean
{
for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
{
var node:MakePair = svr_vct[id];
if( node.SIGN == _lst_type )
{
return node.MSG_SVR.AddListener(_msg, _lst);
}
}
return false;
}
public function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void
{
for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
{
var node:MakePair = svr_vct[id];
if( node.SIGN == _lst_type )
{
return node.MSG_SVR.RemoveListener(_msg, _lst);
}
}
}
public function DispatchEvt( _msg:String, _evt:Object ):void
{
for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
{
var node:MakePair = svr_vct[id];
if( false == node.MSG_SVR.DispatchEvt(_msg, _evt) )
{
return;
}
}
}
}
}
import MsgServer.DefineBag.IMsgServer;
class MakePair
{
public var SIGN:int = 0;
public var MSG_SVR:IMsgServer = null;
public function MakePair( _sign:int, _msg_svr:IMsgServer ):void
{
SIGN = _sign;
MSG_SVR = _msg_svr;
}
}
/**
* VERSION: 3
* DATE: 2013-10-12
* CLK/陈泽丹
**/
package MsgServer.MsgServerBag
{
import MsgServer.DefineBag.IMsgListener;
import flash.utils.Dictionary;
public class VoteMsgSvr extends BaseMsgSvr
{
protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
{
++run_count;
var ret:Boolean = true;
var temp:Boolean = false;
var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
{
if( null != msg_lst[id] )
{
temp = msg_lst[id].OnEvt(_evt)
}
if( null == msg_lst[id] )
{
had_null_node = true;
}
if( temp )
{
break;
}
}
--run_count;
return ret;
}
}
}