📄 uconnect.pas
字号:
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 + -