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

📄 dbshare.~pas

📁 2009最新 传奇汉化0599代码 传奇汉化
💻 ~PAS
字号:
unit DBShare;

interface
uses
  svn, Windows,Messages,Classes,SysUtils,JSocket,IniFiles,Grobal2,MudUtil;
type
  TGateInfo = record
    Socket      :TCustomWinSocket;
    sGateaddr   :String;   //0x04
    sText       :String;   //0x08
    UserList    :TList;    //0x0C
    dwTick10    :LongWord; //0x10
    nGateID     :Integer;  //网关ID
  end;
  pTGateInfo = ^TGateInfo;
  TUserInfo = record
    sAccount      :String;     //0x00
    sUserIPaddr   :String;     //0x0B
    sGateIPaddr   :String;
    sConnID       :String;     //0x20
    nSessionID    :Integer;    //0x24
    Socket        :TCustomWinSocket;
    s2C           :String;     //0x2C
    boChrSelected :Boolean;    //0x30
    boChrQueryed  :Boolean;    //0x31
    dwTick34      :LongWord;   //0x34
    dwChrTick     :LongWord;   //0x38
    nSelGateID    :ShortInt;   //角色网关ID
  end;
  pTUserInfo = ^TUserInfo;
  TRouteInfo = record
    nGateCount    :Integer;
    sSelGateIP    :String[15];
    sGameGateIP   :array[0..7] of String[15];
    nGameGatePort :array[0..7] of Integer;
  end;
  pTRouteInfo = ^TRouteInfo;
  procedure LoadConfig();
  procedure LoadIPTable();
  procedure LoadGateID();
  function GetGateID(sIPaddr:String):Integer;
  function GetCodeMsgSize(X: Double):Integer;
  function CheckChrName(sChrName:String):Boolean;
  function InClearMakeIndexList(nIndex:Integer):Boolean;
  procedure OutMainMessage(sMsg:String);
  procedure WriteLogMsg(sMsg:String);
  function  CheckServerIP(sIP:String):Boolean;
  procedure SendGameCenterMsg(wIdent:Word;sSendMsg:String);
var
  PosFile            :String = '.\Positions.Ini';
  sHumDBFilePath     :String = '.\FDB\';
  sDataDBFilePath    :String = '.\FDB\';
  sFeedPath          :String = '.\FDB\';
  sBackupPath        :String = '.\FDB\';
  sConnectPath       :String = '.\Connects\';
  sLogPath           :String = '.\Log\';

  nServerPort        :Integer = 6000;
  sServerAddr        :String  = '0.0.0.0';
  g_nGatePort        :Integer = 5100;
  g_sGateAddr        :String  = '0.0.0.0';
  nIDServerPort      :Integer = 5600;
  sIDServerAddr      :String  ='127.0.0.1';

  g_boEnglishNames   :Boolean = False;

  boViewHackMsg      :Boolean = False;
//  sDBIdxHeaderDesc   :String = 'legend of mir database index file 2001/7';
//  sDBHeaderDesc      :String = 'legend of mir database file 1999/1';
  HumDB_CS           :TRTLCriticalSection; //0x004ADACC

  n4ADAE4            :Integer;
  n4ADAE8            :Integer;
  n4ADAEC            :Integer;
  n4ADAF0            :Integer;
  boDataDBReady      :Boolean;  //0x004ADAF4
  n4ADAFC            :Integer;
  n4ADB00            :Integer;
  n4ADB04            :Integer;
  boHumDBReady       :Boolean;  //0x4ADB08
  n4ADBF4            :Integer;
  n4ADBF8            :Integer;
  n4ADBFC            :Integer;
  n4ADC00            :Integer;
  n4ADC04            :Integer;
  boAutoClearDB      :Boolean;  //0x004ADC08
  g_nQueryChrCount   :Integer;  //0x004ADC0C
  nHackerNewChrCount :Integer;  //0x004ADC10
  nHackerDelChrCount :Integer;  //0x004ADC14
  nHackerSelChrCount :Integer;  //0x004ADC18
  n4ADC1C            :Integer;
  n4ADC20            :Integer;
  n4ADC24            :Integer;
  n4ADC28            :Integer;
  n4ADC2C            :Integer;
  n4ADB10            :Integer;
  n4ADB14            :Integer;
  n4ADB18            :Integer;
  n4ADBB8            :Integer;
  bo4ADB1C           :Boolean;

  sServerName        :String = 'ktest';
  sConfFileName      :String = '.\Dbsrc.ini';
  sGateConfFileName  :String = '.\!ServerInfo.txt';
  sServerIPConfFileNmae:String = '.\!AddrTable.txt';
  sGateIDConfFileName:String = '.\SelectID.txt';

  sMapFile           :String;
  DenyChrNameList    :TStringList;
  ServerIPList       :TStringList;
  GateIDList         :TStringList;
  {
  nClearIndex        :Integer;   //当前清理位置(记录的ID)
  nClearCount        :Integer;   //当前已经清量数量
  nRecordCount       :Integer;   //当前总记录数
  }
  {
  boClearLevel1      :Boolean = True;
  boClearLevel2      :Boolean = True;
  boClearLevel3      :Boolean = True;
  }
  dwInterval         :LongWord = 3000;    //清理时间间隔长度

  nLevel1            :Integer = 1;        //清理等级 1
  nLevel2            :Integer = 7;        //清理等级 2
  nLevel3            :Integer = 14;       //清理等级 3

  nDay1              :Integer = 14;       //清理未登录天数 1
  nDay2              :Integer = 62;       //清理未登录天数 2
  nDay3              :Integer = 124;      //清理未登录天数 3

  nMonth1            :Integer = 0;      //清理未登录月数 1
  nMonth2            :Integer = 0;      //清理未登录月数 2
  nMonth3            :Integer = 0;      //清理未登录月数 3

  g_nClearRecordCount:Integer;
  g_nClearIndex:Integer; //0x324
  g_nClearCount:Integer;//0x328
  g_nClearItemIndexCount:Integer;

  boOpenDBBusy       :Boolean;  //0x350
  g_dwGameCenterHandle :THandle;
  g_boDynamicIPMode    :Boolean = False;
  g_CheckCode          :TCheckCode;
  g_ClearMakeIndex     :TStringList;

  g_RouteInfo         :array [0..19] of TRouteInfo;
implementation

uses DBSMain, HUtil32;
procedure LoadGateID();
var
  I         :Integer;
  LoadList  :TStringList;
  sLineText :String;
  sID       :String;
  sIPaddr   :String;
  nID       :Integer;
begin
  GateIDList.Clear;
  if FileExists(sGateIDConfFileName) then begin
    LoadList:=TStringList.Create;
    LoadList.LoadFromFile(sGateIDConfFileName);
    for I := 0 to LoadList.Count - 1 do begin
      sLineText:=LoadList.Strings[I];
      if (sLineText = '') or (sLineText[1] = ';') then Continue;
      sLineText:=GetValidStr3(sLineText,sID,[' ',#9]);
      sLineText:=GetValidStr3(sLineText,sIPaddr,[' ',#9]);
      nID:=Str_ToInt(sID,-1);
      if nID < 0 then Continue;        
      GateIDList.AddObject(sIPaddr,TObject(nID))
    end;   
    LoadList.Free;
  end;
end;
function GetGateID(sIPaddr:String):Integer;
var
  I: Integer;
begin
  Result:=0;
  for I := 0 to GateIDList.Count - 1 do begin
    if GateIDList.Strings[I] = sIPaddr then begin
      Result:=Integer(GateIDList.Objects[I]);
      break;
    end;
      
  end;
end;
procedure LoadIPTable();
begin
  ServerIPList.Clear;
  try
     ServerIPList.LoadFromFile(sServerIPConfFileNmae);
  except
    OutMainMessage('IP table ' + sServerIPConfFileNmae +' failed to load!');
  end;
end;
procedure LoadConfig();
var
  Conf:TIniFile;
  LoadInteger:Integer;
begin
  Conf:=TIniFile.Create(sConfFileName);
  if Conf <> nil then begin
    sDataDBFilePath:=Conf.ReadString('DB','Dir',sDataDBFilePath);
    sHumDBFilePath:=Conf.ReadString('DB','HumDir',sHumDBFilePath);
    sFeedPath:=Conf.ReadString('DB','FeeDir',sFeedPath);
    sBackupPath:=Conf.ReadString('DB','Backup',sBackupPath);
    sConnectPath:=Conf.ReadString('DB','ConnectDir',sConnectPath);
    sLogPath:=Conf.ReadString('DB','LogDir',sLogPath);
    
    nServerPort:=Conf.ReadInteger('Setup','ServerPort',nServerPort);
    sServerAddr:=Conf.ReadString('Setup','ServerAddr',sServerAddr);

    g_nGatePort:=Conf.ReadInteger('Setup','GatePort',g_nGatePort);
    g_sGateAddr:=Conf.ReadString('Setup','GateAddr',g_sGateAddr);

    sIDServerAddr:=Conf.ReadString('Server','IDSAddr',sIDServerAddr);
    nIDServerPort:=Conf.ReadInteger('Server','IDSPort',nIDServerPort);

    boViewHackMsg:=Conf.ReadBool('Setup','ViewHackMsg',boViewHackMsg);
    sServerName:=Conf.ReadString('Setup','ServerName',sServerName);  
    {
    boClearLevel1:=Conf.ReadBool('DBClear','ClearLevel1',boClearLevel1);
    boClearLevel2:=Conf.ReadBool('DBClear','ClearLevel2',boClearLevel2);
    boClearLevel3:=Conf.ReadBool('DBClear','ClearLevel3',boClearLevel3);
    }
    dwInterval:=Conf.ReadInteger('DBClear','Interval',dwInterval);
    nLevel1:=Conf.ReadInteger('DBClear','Level1',nLevel1);
    nLevel2:=Conf.ReadInteger('DBClear','Level2',nLevel2);
    nLevel3:=Conf.ReadInteger('DBClear','Level3',nLevel3);
    nDay1:=Conf.ReadInteger('DBClear','Day1',nDay1);
    nDay2:=Conf.ReadInteger('DBClear','Day2',nDay2);
    nDay3:=Conf.ReadInteger('DBClear','Day3',nDay3);
    nMonth1:=Conf.ReadInteger('DBClear','Month1',nMonth1);
    nMonth2:=Conf.ReadInteger('DBClear','Month2',nMonth2);
    nMonth3:=Conf.ReadInteger('DBClear','Month3',nMonth3);

    LoadInteger:=Conf.ReadInteger('Setup','DynamicIPMode',-1);
    if LoadInteger < 0 then begin
      Conf.WriteBool('Setup','DynamicIPMode',g_boDynamicIPMode);
    end else g_boDynamicIPMode:=LoadInteger = 1;

    g_boEnglishNames:=Conf.ReadBool('Setup','EnglishNameOnly',g_boEnglishNames);

    PosFile := Conf.ReadString('Setup','Positions','.\Positions.ini');
    
    Conf.Free;
  end;
  LoadIPTable();
  LoadGateID();
end;
function GetCodeMsgSize(X: Double):Integer;
begin
  if INT(X) < X then Result:=TRUNC(X) + 1
  else Result:=TRUNC(X)
end;

function CheckChrName(sChrName:String):Boolean;
//0x0045BE60
var
  I: Integer;
  Chr:Char;
  boIsTwoByte:Boolean;
  FirstChr:Char;
begin
  Result:=True;
  boIsTwoByte:=False;
  FirstChr:=#0;
  for I := 1 to length(sChrName) do begin
    Chr:=(sChrName[i]);
    if boIsTwoByte then begin
      //if Chr < #$A1 then Result:=False; //如果小于就是非法字符
//      if Chr < #$81 then Result:=False; //如果小于就是非法字符

      if not ((FirstChr <= #$F7) and (Chr >= #$40) and (Chr <= #$FE)) then
        if not ((FirstChr > #$F7) and (Chr >= #$40) and (Chr <= #$A0)) then Result:=False;




      boIsTwoByte:=False;
    end else begin //0045BEC0
      //if (Chr >= #$B0) and (Chr <= #$C8) then begin
      if (Chr >= #$81) and (Chr <= #$FE) then begin
        boIsTwoByte:=True;
        FirstChr:=Chr;
      end else begin //0x0045BED2
        if not ((Chr >= '0'{#30}) and (Chr <= '9'{#39})) and
           not ((Chr >= 'a'{#61}) and (Chr <= 'z'){#7A}) and
           not ((Chr >= 'A'{#41}) and (Chr <= 'Z'{#5A})) then
          Result:=False;
      end;
    end;
    if not Result then break;
  end;

end;
function InClearMakeIndexList(nIndex:Integer):Boolean;
var
  I: Integer;
begin
  Result:=False;
  for I := 0 to g_ClearMakeIndex.Count - 1 do begin
    if nIndex = Integer(g_ClearMakeIndex.Objects[I]) then begin
      Result:=True;
      break;
    end;      
  end;
end;
procedure OutMainMessage(sMsg:String);
begin
  WriteLogMsg(sMsg);
  FrmDBSrv.MemoLog.Lines.Add(sMsg);
end;
procedure WriteLogMsg(sMsg:String);
begin

end;
function CheckServerIP(sIP: String): Boolean;
var
  i:Integer;
begin
  Result:=False;
  for I := 0 to ServerIPList.Count - 1 do begin
    if CompareText(sIP,ServerIPList.Strings[i]) = 0 then begin
      Result:=True;
      break;
    end;
  end;
end;

procedure SendGameCenterMsg(wIdent:Word;sSendMsg:String);
var
  SendData:TCopyDataStruct;
  nParam:Integer;
begin
  nParam:=MakeLong(Word(tDBServer),wIdent);
  SendData.cbData:=Length (sSendMsg) + 1;
  GetMem(SendData.lpData,SendData.cbData);
  StrCopy (SendData.lpData, PChar(sSendMsg));
  SendMessage(g_dwGameCenterHandle,WM_COPYDATA,nParam,Cardinal(@SendData));
  FreeMem(SendData.lpData);
end;

initialization
begin
  {---- Adjust global SVN revision ----}
  SVNRevision('$Id: DBShare.pas 595 2007-03-09 19:31:34Z damian $');
  InitializeCriticalSection(HumDB_CS);
  DenyChrNameList  :=TStringList.Create;
  ServerIPList     :=TStringList.Create;
  GateIDList       :=TStringList.Create;
  g_ClearMakeIndex :=TStringList.Create;
end;
Finalization
begin
  DenyChrNameList.Free;
  ServerIPList.Free;
  GateIDList.Free;
  g_ClearMakeIndex.Free;
end;

end.

⌨️ 快捷键说明

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