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

📄 uconnect.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   inherited Destroy;
end;

procedure TConnectorList.Clear;
var
   i : Integer;
   Connector : TConnector;
begin
   UniqueKey.Clear;
   NameKey.Clear;

   for i := 0 to DataList.Count - 1 do begin
      Connector := DataList.Items [i];
      Connector.Free;
   end;
   DataList.Clear;

   SaveBuffer.Clear;
end;

procedure TConnectorList.Update (CurTick : Integer);
var
   i, j, StartPos, nCount, nPos : Integer;
   Connector : TConnector;
   CharData : TDBRecord;
begin
   if SaveBuffer.Count > 0 then begin
      if CurTick >= SaveTick + 10 then begin
         if SaveBuffer.View (@CharData) = true then begin
            if frmGate.AddSendDBServerData (DB_UPDATE, @CharData, SizeOf (TDBRecord)) = true then begin
               SaveBuffer.Flush;
            end;
         end;
         SaveTick := CurTick;
      end;
   end;

   ConnectorProcessCount := (DataList.Count * 4 div 100);
   if ConnectorProcessCount = 0 then ConnectorProcessCount := DataList.Count;

   ConnectorProcessCount := ProcessListCount;

   if DataList.Count > 0 then begin
      StartPos := CurProcessPos;
      for i := 0 to ConnectorProcessCount - 1 do begin
         if CurProcessPos >= DataList.Count then CurProcessPos := 0;
         Connector := DataList.Items [CurProcessPos];
         Connector.Update (CurTick);
         Inc (CurProcessPos);
         if CurProcessPos = StartPos then break;
      end;
   end;
end;

function TConnectorList.GetCount : Integer;
begin
   Result := DataList.Count;
end;

function TConnectorList.GetNameKeyCount : Integer;
begin
   Result := NameKey.Count;
end;

function TConnectorList.GetUniqueKeyCount : Integer;
begin
   Result := UniqueKey.Count;
end;

procedure TConnectorList.CreateConnect (aGateNo : Integer; aPacket : PTPacketData);
var
   nPos : Integer;
   Connector : TConnector;
   pcd : PTDBRecord;
   GateNo, ConnectID : Integer;
begin
   GateNo := aGateNo;
   ConnectID := aPacket^.RequestID;
   pcd := @aPacket^.Data;

   if StrPas (@pcd^.PrimaryKey) = '' then begin
      frmMain.WriteLogInfo ('NOName Char found');
      GateConnectorList.AddSendServerData (GateNo, ConnectID, GM_DISCONNECT, nil, 0);
      exit;
   end;

   Connector := NameKey.Select (StrPas (@pcd^.PrimaryKey));
   if Connector <> nil then begin
      GateConnectorList.AddSendServerData (Connector.GateNo, Connector.ConnectID, GM_DISCONNECT, nil, 0);
      GateConnectorList.AddSendServerData (GateNo, ConnectID, GM_DUPLICATE, nil, 0);

      try
         UniqueKey.Delete (Connector.ConnectID);
         NameKey.Delete (Connector.CharName);
         DataList.Remove (Connector);
         Connector.Free;
      except
         frmMain.WriteLogInfo ('TConnectorList.CreateConnect () failed');
      end;
      exit;
   end;

   Connector := TConnector.Create (GateNo, ConnectID);
   if Connector.StartLayer (@aPacket^.Data) = false then begin
      GateConnectorList.AddSendServerData (GateNo, ConnectID, GM_DUPLICATE, nil, 0);
      Connector.Free;
      CloseConnectByCharName (StrPas (@pcd^.PrimaryKey));
      exit;
   end;

   GateConnectorList.AddSendServerData (GateNo, ConnectID, GM_CONNECT, nil, 0);

   UniqueKey.Insert (ConnectID, Connector);
   NameKey.Insert (Connector.CharName, Connector);
   DataList.Add (Connector);
end;

procedure TConnectorList.DeleteConnect (aGateNo, aConnectID : Integer);
var
   nPos : Integer;
   Connector : TConnector;
begin
   Connector := UniqueKey.Select (aConnectID);
   if Connector <> nil then begin
      try
         nPos := DataList.IndexOf (Connector);
         UniqueKey.Delete (Connector.ConnectID);
         NameKey.Delete (Connector.CharName);
         Connector.Free;
         DataList.Delete (nPos);
      except
         frmMain.WriteLogInfo ('TConnectorList.CreateConnect () failed');
      end;
   end;
end;

procedure TConnectorList.ReStartChar (aConnectID : Integer);
var
   Connector : TConnector;
begin
   Connector := UniqueKey.Select (aConnectID);
   if Connector <> nil then begin
      Connector.ReStartLayer;
   end;
end;

procedure TConnectorList.CloseAllConnect;
var
   i : Integer;
   Connector : TConnector;
begin
   for i := 0 to DataList.Count - 1 do begin
      Connector := DataList.Items [i];
      GateConnectorList.AddSendServerData (Connector.GateNo, Connector.ConnectID, GM_DISCONNECT, nil, 0);
   end;
end;

procedure TConnectorList.CloseConnectByCharName (aName : String);
var
   i : Integer;
   Connector : TConnector;
begin
   for i := DataList.Count - 1 downto 0 do begin
      Connector := DataList.Items [i];
      if Connector.CharName = aName then begin
         GateConnectorList.AddSendServerData (Connector.GateNo, Connector.ConnectID, GM_DISCONNECT, nil, 0);
         exit;
      end;
   end;
end;

procedure TConnectorList.CloseConnectByGateNo (aGateNo : Integer);
var
   i : Integer;
   Connector : TConnector;
begin
   for i := DataList.Count - 1 downto 0 do begin
      Connector := DataList.Items [i];
      if Connector.GateNo = aGateNo then begin
         DeleteConnect (aGateNo, Connector.ConnectID);
      end;
   end;
end;

procedure TConnectorList.AddReceiveData (aGateNo : Integer; aPacket : PTPacketData);
var
   ComData : TWordComData;
   Connector : TConnector;
begin
   Connector := UniqueKey.Select (aPacket^.RequestID);
   if Connector <> nil then begin
      if Connector.BattleConnectState = bcs_none then begin
         ComData.Size := aPacket^.PacketSize - (SizeOf (Word) + SizeOf (Integer) + SizeOf (Byte) * 2);
         Move (aPacket^.Data, ComData.Data, ComData.Size);
         Connector.AddReceiveData (@ComData, ComData.Size + SizeOf (Word));
      end else begin
         ComData.Size := aPacket^.PacketSize - (SizeOf (Word) + SizeOf (Integer) + SizeOf (Byte) * 2);
         Move (aPacket^.Data, ComData.Data, ComData.Size);
         frmGate.AddSendBattleData (aPacket^.RequestID, GB_GAMEDATA, 0, @ComData.Data, ComData.Size);
      end;
      exit;
   end;
end;

procedure TConnectorList.AddSendData (aPacket : PTPacketData);
var
   ComData : TWordComData;
   Connector : TConnector;
begin
   Connector := UniqueKey.Select (aPacket^.RequestID);
   if Connector <> nil then begin
      ComData.Size := aPacket^.PacketSize - (SizeOf (Word) + SizeOf (Integer) + SizeOf (Byte) * 2);
      Move (aPacket^.Data, ComData.Data, ComData.Size);
      Connector.AddSendData (@ComData.Data, ComData.Size);
      exit;
   end;
end;

procedure TConnectorList.AddSaveData (aData : PChar; aSize : Integer);
begin
   SaveBuffer.Put (aData, aSize);
end;

function TConnectorList.GetSaveListCount : Integer;
begin
   Result := SaveBuffer.Count;
end;

procedure TConnectorList.ProcessNoticeServerMessage (aPacketData : PTPacketData);
var
   i : integer;
   User: TUser;
   Connector : TConnector;
   pnd : PTNoticeData;
   nd : TNoticeData;
   Str : String;
begin
   if aPacketData^.RequestMsg <> PACKET_NOTICE then exit;
   
   pnd := @aPacketData^.Data;
   case pnd^.rMsg of
      NGM_REQUESTCLOSE :
         begin
            Str := pnd^.rCharName;
            Connector := NameKey.Select (Str);
            if Connector <> nil then begin
               User := UserList.GetUserPointer (Str);
               if User <> nil then begin
                  User.SendClass.SendChatMessage ('吝汗 立加, 肚绰 荤侩矫埃檬苞肺 牢秦辑 立加捞 谗绢笼聪促', SAY_COLOR_SYSTEM);
               end;
               CloseConnectByCharName (Str);
            end;
         end;
      NGM_REQUESTALLUSER :
         begin
            FillChar (nd, SizeOf (TNoticeData), 0);
            nd.rMsg := GNM_ALLCLEAR;
            FrmSockets.AddDataToNotice (@nd, SizeOf (TNoticeData));
            for i := 0 to DataList.Count - 1 do begin
               Connector := DataList.Items [i];
               if Connector.CharName <> '' then begin
                  FrmSockets.AddDataToNotice (@Connector.NTData, SizeOf (TNoticeData));
               end;
            end;
         end;
   end;
end;

procedure TConnectorList.SendConnectInfo (aInfoStr: String);
var
   cnt : integer;
   usd : TStringData;
begin
   usd.rmsg := 1;
   SetWordString (usd.rWordString, aInfoStr + ',');
   cnt := sizeof(usd) - sizeof(TWordString) + sizeofwordstring (usd.rwordstring);

   FrmSockets.UdpConnectAddData (cnt, @usd);
end;

end.

⌨️ 快捷键说明

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