public void SendStateChangeNotification(RPCObject target, bnet.protocol.presence.ChannelState state) { var channelState = bnet.protocol.channel.ChannelState.CreateBuilder().SetExtension(bnet.protocol.presence.ChannelState.Presence, state); var notification = bnet.protocol.channel.UpdateChannelStateNotification.CreateBuilder().SetStateChange(channelState).Build(); this.MakeTargetedRPC(target, () => bnet.protocol.channel.ChannelSubscriber.CreateStub(this).NotifyUpdateChannelState(null, notification, callback => { })); }
/// <summary> /// Allows you target an RPCObject while issuing a RPC. /// </summary> /// <param name="targetObject"><see cref="RPCObject"/></param> /// <param name="rpc">The rpc action.</param> public void MakeTargetedRPC(RPCObject targetObject, Action rpc) { this._listenerId = this.GetRemoteObjectId(targetObject.DynamicId); Logger.Trace("[RPC: {0}] Method: {1} Target: {2} [localId: {3}, remoteId: {4}].", this, rpc.Method, targetObject.ToString(), targetObject.DynamicId, this._listenerId); rpc(); }
public RPCObject RPCGetChildObject(int limitLevel, int Index, RPCObject obj) { if (mChildObjects[Index] == null) { System.Diagnostics.Debug.WriteLine("RPCGetChildObject Indexer Over Ranged:" + Index); return(null); } return((RPCObject)(mChildObjects[Index].GetValue(obj, null))); }
public RPCObject RPCGetIndexerExecuter(int limitLevel, int Index, RPCObject obj, PackageProxy pkg) { if (mIndexers[Index] == null) { System.Diagnostics.Debug.WriteLine("RPCGetIndexerExecuter Indexer Over Ranged:", Index); return(null); } if (limitLevel < mIndexers[Index].LimitLevel) { //此处应该记录有人越权调用函数 Log.Log.Common.Print("发现有超越权限的索引器调用"); return(null); } return(mIndexers[Index].Execute(obj, pkg)); }
public static System.Object Execute(int limitLevel, Iocp.NetConnection connect, RPCObject rootObj, PackageProxy pkg, RPCForwardInfo fwd) { if (rootObj == null) { return(null); } try { if (EntranceExecute != null) { return(EntranceExecute(limitLevel, connect, rootObj, pkg, fwd)); } else { RPCObject curExe = rootObj; for (Int16 i = 0; i < pkg.GetMaxStack(); i++) { if (curExe == null) { return(null); } System.Byte stk = pkg.GetStack(i); if (stk == (Byte)ERPCHeader.StackUnused) { break; } else if (stk < (Byte)ERPCHeader.StackIndexBegin) { //curExe = curExe.RPCGetChildObject(limitLevel,stk); curExe = curExe.GetRPCClassInfo().RPCGetChildObject(limitLevel, stk, curExe); //curExe = (RPCObject)curExe.GetRPCClassInfo().mChildObjects[stk].GetValue(curExe,null); } else { //curExe = curExe.RPCGetIndexObject(limitLevel,stk-RPCHeader.StackIndexBegin,pkg); curExe = curExe.GetRPCClassInfo().RPCGetIndexerExecuter(limitLevel, stk - (Byte)ERPCHeader.StackIndexBegin, curExe, pkg); } } if (curExe == null) { return(null); } //return curExe.GetRPCClassInfo().RPCExecuteMethod(limitLevel,connect,pkg.GetMethod(),pkg,fwd); return(curExe.GetRPCClassInfo().RPCGetMethordExecuter(limitLevel, connect, pkg.GetMethod(), curExe, pkg, fwd)); } } catch (System.Exception e) { System.Diagnostics.Debug.WriteLine(e.Message + "==>"); System.Diagnostics.Debug.WriteLine(e.StackTrace.ToString()); Log.Log.Common.Print(e.Message + "==>"); Log.Log.Common.Print(e.StackTrace.ToString()); //如果发生RPC函数内部异常,尽量返回一个-128的值,免得服务器之间的调用因为没有返回WaitHandle没有机会清空 PackageWriter retPkg = new PackageWriter(); retPkg.Write((System.SByte)(-128)); retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId); return(null); } }
public virtual RPCObject Execute(RPCObject obj, PackageProxy pkg) { return(null); }
public System.Object RPCGetMethordExecuter(int limitLevel, Iocp.NetConnection connect, int Index, RPCObject obj, PackageProxy pkg, RPCForwardInfo fwd) { if (mMethods[Index] == null) { System.Diagnostics.Debug.WriteLine("RPCGetMethordExecuter Indexer Over Ranged:" + Index); return(null); } if (limitLevel < mMethods[Index].LimitLevel) { //此处应该记录有人越权调用函数 RPCPlanesServerSpecialRoot cb = RPCNetworkMgr.Instance.mPlanesServerSpecialRoot; if (cb == null) { Log.Log.Common.Print("发现有超越权限的函数调用({0})", mMethods[Index].mMethodName); System.Diagnostics.Debug.WriteLine("发现有超越权限的函数调用({0})", mMethods[Index].mMethodName); } else { System.String str = cb.GetPlayerInfoString(fwd); Log.Log.Common.Print("发现有超越权限的函数调用({0}:{1})", mMethods[Index].mMethodName, str); System.Diagnostics.Debug.WriteLine("发现有超越权限的函数调用({0}:{1})", mMethods[Index].mMethodName, str); } return(null); } return(mMethods[Index].Execute(connect, obj, pkg, fwd)); }
public virtual System.Object Execute(Iocp.NetConnection connect, RPCObject obj, PackageProxy pkg, RPCForwardInfo fwd) { return(null); }