⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runsock.~pas

📁 M2原代码 M2原代码
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:

        if GateUser = nil then begin
          for I:=0 to Gate.UserList.Count -1 do begin
            if Gate.UserList.Items[I] = nil then Continue;
            if pTGateUserInfo(Gate.UserList.Items[I]).nSocket = MsgHeader.nSocket then begin
              GateUser:=Gate.UserList.Items[I];
              break;
            end;
          end;
        end;
        
        nCheckCode:=6;
        if GateUser <> nil then begin
          if (GateUser.PlayObject <> nil) and (GateUser.UserEngine <> nil) then begin
            if GateUser.boCertification and (nMsgLen >= SizeOf(TDefaultMessage)) then begin
              if nMsgLen = SizeOf(TDefaultMessage) then begin
                UserEngine.ProcessUserMessage(TPlayObject(GateUser.PlayObject),pTDefaultMessage(MsgBuff),nil)
              end else begin//004E161A
                UserEngine.ProcessUserMessage(TPlayObject(GateUser.PlayObject),pTDefaultMessage(MsgBuff),@MsgBuff[SizeOf(TDefaultMessage)]);
              end;
            end;
          end else begin//004E1638
            DoClientCertification(GateIdx,GateUser,MsgHeader.nSocket,StrPas(MsgBuff));
          end;
        end;//004E165C
      end;
    end;
  except
    MainOutMessage(format(sExceptionMsg,[nCheckCode]));
  end;
end;
procedure TRunSocket.SendCheck(Socket:TCustomWinSocket;nIdent:Integer);//004E0984
var
  MsgHeader:TMsgHeader;
begin
  if not Socket.Connected then exit;
  MsgHeader.dwCode  := RUNGATECODE;
  MsgHeader.nSocket := 0;
  MsgHeader.wIdent  := nIdent;
  MsgHeader.nLength := 0;
  if Socket <> nil then
    Socket.SendBuf(MsgHeader,SizeOf(TMsgHeader));
end;
procedure TRunSocket.LoadRunAddr();//004DFBA0
var
  sFileName:String;
begin
  sFileName:='.\RunAddr.txt';
  if FileExists(sFileName) then begin
    m_RunAddrList.LoadFromFile(sFileName);
    TrimStringList(m_RunAddrList);
  end;
end;
//constructor TRunSocket.Create(CreateSuspended: Boolean);//004DFA34
constructor TRunSocket.Create();//004DFA34
var
  I    :Integer;
  Gate :pTGateInfo;
begin
  InitializeCriticalSection(m_RunSocketSection);
  m_RunAddrList:=TStringList.Create;
  for I:= Low(g_GateArr) to High(g_GateArr) do begin
    Gate                  := @g_GateArr[I];
    Gate.boUsed           := False;
    Gate.Socket           := nil;
    Gate.boSendKeepAlive  := False;
    Gate.nSendMsgCount    := 0;
    Gate.nSendRemainCount := 0;
    Gate.dwSendTick       := GetTickCount();
    Gate.nSendMsgBytes    := 0;
    Gate.nSendedMsgCount  := 0;
  end;
  LoadRunAddr();//call    sub_4DFBA0
  n4F8:=0;
end;

procedure TRunSocket.DemoRun;
begin
{$IF SoftVersion = VERDEMO}
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  Run();
{$IFEND}  
end;

destructor TRunSocket.Destroy;//004DFB4C
begin
  m_RunAddrList.Free;
  DeleteCriticalSection(m_RunSocketSection);
  inherited;
end;

function TRunSocket.AddGateBuffer(GateIdx: Integer;Buffer: PChar):Boolean;//004E0C1C
var
  Gate:pTGateInfo;
begin
  Result:=False;
  EnterCriticalSection(m_RunSocketSection);
  try
    if GateIdx < RUNGATEMAX then begin
      Gate:=@g_GateArr[GateIdx];
      if (Gate.BufferList <> nil) and (Buffer <> nil) then begin
        if Gate.boUsed and (Gate.Socket <> nil) then begin
          Gate.BufferList.Add(Buffer);
          Result:=True;
        end;
      end;
    end;
  finally
    LeaveCriticalSection(m_RunSocketSection);
  end;
end;

procedure TRunSocket.SendOutConnectMsg(nGateIdx,nSocket,nGsIdx:integer);//004E08E4
var
  DefMsg    :TDefaultMessage;
  MsgHeader :TMsgHeader;
  nLen      :Integer;
  Buff      :PChar;
begin
  DefMsg:=MakeDefaultMsg(SM_OUTOFCONNECTION,0,0,0,0);
  MsgHeader.dwCode        := RUNGATECODE;
  MsgHeader.nSocket       := nSocket;
  MsgHeader.wGSocketIdx   := nGsIdx;
  MsgHeader.wIdent        := GM_DATA;
  MsgHeader.nLength       := SizeOf(TDefaultMessage);
  
  nLen:=MsgHeader.nLength + SizeOf(TMsgHeader);
  GetMem(Buff,nLen + SizeOf(Integer));
  Move(nLen,Buff^,SizeOf(Integer));
  Move(MsgHeader,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
  Move(DefMsg,Buff[SizeOf(Integer) + SizeOf(TMsgHeader)],SizeOf(TDefaultMessage));
  if not AddGateBuffer(nGateIdx,Buff) then begin
    FreeMem(Buff);
  end;
end;
procedure TRunSocket.SendScanMsg(DefMsg:pTDefaultMessage;sMsg:String;nGateIdx,nSocket,nGsIdx:integer);
var
  MsgHdr:TMsgHeader;
  nLen:Integer;
  Buff:PChar;
  nSendBytes:Integer;
begin
  MsgHdr.dwCode        := RUNGATECODE;
  MsgHdr.nSocket       := nSocket;
  MsgHdr.wGSocketIdx   := nGsIdx;
  MsgHdr.wIdent        := GM_DATA;
  MsgHdr.nLength       := SizeOf(TDefaultMessage);

    if DefMsg <> nil then begin
      if sMsg <> '' then begin
        MsgHdr.nLength:=Length(sMsg) + SizeOf(TDefaultMessage) + 1;
        nSendBytes:=MsgHdr.nLength + SizeOf(TMsgHeader);
        GetMem(Buff,nSendBytes + SizeOf(Integer));
        Move(nSendBytes,Buff^,SizeOf(Integer));
        Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
        Move(DefMsg^,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
        Move(sMsg[1],Buff[SizeOf(TDefaultMessage) + SizeOf(TMsgHeader) + SizeOf(Integer)],Length(sMsg) + 1);
      end else begin//004CAC29
        MsgHdr.nLength:=SizeOf(TDefaultMessage);
        nSendBytes:=MsgHdr.nLength + SizeOf(TMsgHeader);
        GetMem(Buff,nSendBytes + SizeOf(Integer));
        Move(nSendBytes,Buff^,SizeOf(Integer));
        Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
        Move(DefMsg^,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
      end;
    end else begin//004CAC7F
      if sMsg <> '' then begin
        MsgHdr.nLength:= - (Length(sMsg) + 1);
        nSendBytes:=abs(MsgHdr.nLength) + SizeOf(TMsgHeader);
        GetMem(Buff,nSendBytes + SizeOf(Integer));
        Move(nSendBytes,Buff^,SizeOf(Integer));
        Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
        Move(sMsg[1],Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],Length(sMsg) + 1);
      end;//004CACF0
    end;//004CACF0
    if not RunSocket.AddGateBuffer(nGateIdx,Buff) then begin
      FreeMem(Buff);
    end;
end;
procedure TRunSocket.SetGateUserList(nGateIdx, nSocket: Integer;PlayObject:TPlayObject);//004E0CEC
var
  I            :Integer;
  GateUserInfo :pTGateUserInfo;
  Gate         :pTGateInfo;
begin
  if nGateIdx > high(g_GateArr) then exit;
  Gate:=@g_GateArr[nGateIdx];
  if Gate.UserList = nil then exit;
  EnterCriticalSection(m_RunSocketSection);
  try
    for I := 0 to Gate.UserList.Count - 1 do begin
      GateUserInfo:=Gate.UserList.Items[I];
      if (GateUserInfo <> nil) and (GateUserInfo.nSocket = nSocket) then begin
        GateUserInfo.FrontEngine := nil;
        GateUserInfo.UserEngine  := UserEngine;
        GateUserInfo.PlayObject  := PlayObject;
        break;
      end;       
    end;
  finally
    LeaveCriticalSection(m_RunSocketSection);
  end;
end;

procedure TRunSocket.SendGateTestMsg(nIndex:Integer);//004E0860
var
  MsgHdr:TMsgHeader;
  Buff:PChar;
  nLen:Integer;
  DefMsg:TDefaultMessage;
begin
  MsgHdr.dwCode         := RUNGATECODE;
  MsgHdr.nSocket        := 0;
  MsgHdr.wIdent         := GM_TEST;
  MsgHdr.nLength        := 100;
  nLen:=MsgHdr.nLength + SizeOf(TMsgHeader);
  GetMem(Buff,nLen + SizeOf(Integer));
  Move(nLen,Buff^,SizeOf(Integer));
  Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
  Move(DefMsg,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
  if not AddGateBuffer(nIndex,Buff) then begin
    FreeMem(Buff);
    //MainOutMessage('SendGateTestMsg Buffer Fail ' + IntToStr(nIndex));
  end;
end;

procedure TRunSocket.KickUser(sAccount: String; nSessionID: Integer);//004E0A2C
var
  I            :Integer;
  II           :Integer;
  GateUserInfo :pTGateUserInfo;
  Gate         :pTGateInfo;
  nCheckCode   :Integer;
ResourceString
  sExceptionMsg = '[Exception] TRunSocket::KickUser';
  sKickUserMsg  = '当前登录帐号正在其它位置登录,本机已被强行离线!!!';
begin
try
  nCheckCode:=0;
  for I := Low(g_GateArr) to High(g_GateArr) do begin
    Gate:=@g_GateArr[I];
    nCheckCode:=1;
    if Gate.boUsed and (Gate.Socket <> nil) and (Gate.UserList <> nil) then begin
      nCheckCode:=2;
      EnterCriticalSection(m_RunSocketSection);
      try
        nCheckCode:=3;
        for II := 0 to Gate.UserList.Count - 1 do begin
          nCheckCode:=4;
          GateUserInfo:=Gate.UserList.Items[II];
          if GateUserInfo = nil then Continue;
          nCheckCode:=5;
          if (GateUserInfo.sAccount = sAccount) or (GateUserInfo.nSessionID = nSessionID) then begin
            nCheckCode:=6;
            if GateUserInfo.FrontEngine <> nil then begin
              nCheckCode:=7;
              TFrontEngine(GateUserInfo.FrontEngine).DeleteHuman(I,GateUserInfo.nSocket);
            end;
            nCheckCode:=8;
            if GateUserInfo.PlayObject <> nil then begin
              nCheckCode:=9;
              TPlayObject(GateUserInfo.PlayObject).SysMsg(sKickUserMsg,c_Red,t_Hint);
              TPlayObject(GateUserInfo.PlayObject).m_boEmergencyClose:=True;
              TPlayObject(GateUserInfo.PlayObject).m_boSoftClose:=True;
              //SendOutConnectMsg(I,GateUserInfo.nSocket);
            end;
            nCheckCode:=10;
            Dispose(GateUserInfo);
            nCheckCode:=11;
            Gate.UserList.Items[II]:=nil;
            nCheckCode:=12;
            Dec(Gate.nUserCount);
            break;
          end;
        end;
        nCheckCode:=13;
      finally
        LeaveCriticalSection(m_RunSocketSection);
      end;
      nCheckCode:=14;
    end;
  end;
except
    on e: Exception do begin
      MainOutMessage(format(sExceptionMsg,[nCheckCode]));
      MainOutMessage(E.Message);
    end;
end;
end;
function TRunSocket.GetGateAddr(sIPaddr: String):String;//004DFBE0
var
  I: Integer;
begin
  Result:=sIPaddr;
  for I := 0 to n8 - 1 do begin
    if m_IPaddrArr[I].sIpaddr = sIPaddr then begin
      Result:=m_IPaddrArr[I].dIPaddr;
      break;
    end;      
  end;
end;

procedure TRunSocket.Execute;
begin
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  if (nRunSocketRun >= 0) and Assigned(PlugProcArray[nRunSocketRun].nProcAddr) then begin
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}  
    TClassProc(PlugProcArray[nRunSocketRun].nProcAddr)(Self);
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  end;
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
end;


initialization
begin
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  AddToProcTable(@TRunSocket.Run,DecodeString('QAEqWaIkTriaY>uNYRt'){'TRunSocket.Run'});
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  AddToProcTable(@TRunSocket.ExecGateBuffers,DecodeString('QAEqWaIkTriaY>uAZBQ_MrApUPEqUbUaXcH'){'TRunSocket.ExecGateBuffers'});
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}
  nRunSocketRun:=AddToPulgProcTable(DecodeString('QAEqWaIkTriaY>uNYRt'){'TRunSocket.Run'});
{$IF DEBUG = 0}
  asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
  end;
{$IFEND}  
end;
finalization
begin

end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -