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

📄 sqldata.pas

📁 RO模拟器!!适合玩仙境传说的玩家们呦~
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{MySQL数据资料读取  --Michen}
unit SQLData;



interface

uses
	Windows, MMSystem, Forms, Classes, SysUtils, IniFiles, Common, DBXpress, DB, SqlExpr, StrUtils, FusionSQL;

//==============================================================================
// 过程&函数

    function  HexToInt(Hex : string) : Cardinal; 
    function  ExecuteSqlCmd(sqlcmd: String) : Boolean;
		procedure SQLDataLoad();
		procedure SQLDataSave();
		function  GetPlayerData(userid: String; AID: cardinal = 0) : Boolean; {取得帐号资料}
		function  GetCharaData(GID: cardinal) : Boolean; {取得人物资料}
		function  GetAccCharaData(AID: cardinal) : Boolean; {取得帐号的人物资料}
		function  GetPetData(AID: cardinal) : Boolean; {取得帐号的宠物资料}
		function  GetCharaGuildData(GID: cardinal) : Boolean; {取得人物的工会资料}
		function  GetCharaPartyGuild(GID: cardinal) : Boolean; {取得人物的工会、组队,以及所有成员资料}
		function  DeleteChar(GID: cardinal) : Boolean; {从数据库删除人物}
		function  DeleteGuildMember(GID: cardinal; mtype: Integer; tgb: TGBan; GDID: cardinal) : Boolean; {从数据库删除工会成员}
		function  DeleteParty(Name: string) : Boolean; {从数据库删除组队}
		function  DeleteGuildAllyInfo(GDID: cardinal; GuildName: String; mtype: Integer) : Boolean; {删除同盟、敌对工会资料}
		function  DeleteGuildInfo(GDID: cardinal) : Boolean; {删除工会资料}
		function  CheckUserExist(userid: String) : Boolean; {检查人物是否存在}
		function  GetNowLoginID() : cardinal; {取得当前的帐号ID编号}
		function  GetNowCharaID() : cardinal; {取得当前的人物ID编号}
		function  GetNowPetID() : cardinal; {取得当前的宠物ID编号}
		function  SaveCharaData(tc : TChara) : Boolean; {保存人物资料}
		function  SavePetData(tpe : Tpet; PIndex: Integer; place: Integer) : Boolean; {保存宠物资料}
		function  SaveGuildMPosition(GDID: cardinal; PosName: string; PosInvite: boolean; PosPunish: boolean; PosEXP: byte; Grade: Integer) : Boolean; {保存工会头衔资料}
		function  SaveGuildAllyInfo(GDID: cardinal; GuildName: String; mtype: Integer) : Boolean; {保存同盟、敌对工会资料}
		function  addslashes(Strings: String) : String; {数据库字符串处理}
		function  unaddslashes(Strings: String) : String; {数据库字符串处理}
//==============================================================================

implementation

var
  SQLDataSet    :TSQLDataSet;
  SQLConnection :TSQLConnection;

//------------------------------------------------------------------------------
// 十六进制转十进制
//------------------------------------------------------------------------------

{ Obsolete - Poor Design - Alex }
function HexToInt(Hex : string) : Cardinal;
const
  cHex = '0123456789ABCDEF';
var
  mult,i,loop : integer;
begin
  result := 0;
  mult := 1;
  for loop := length(Hex) downto 1 do begin
    i := pos(Hex[loop],cHex)-1;
    if (i < 0) then i := 0;
    inc(result,(i*mult));
  mult := mult * 16;
  end;
end;

//------------------------------------------------------------------------------
// 执行数据库查询
//------------------------------------------------------------------------------
function  ExecuteSqlCmd(sqlcmd: String) : Boolean;
begin
  Result := False;

  {初始化数据库}
	if not assigned(SQLConnection) then
	begin
    SQLConnection := TSQLConnection.Create(nil);
    SQLConnection.ConnectionName := 'MySQLConnection';
    SQLConnection.DriverName := 'MySQL';
    SQLConnection.GetDriverFunc := 'getSQLDriverMYSQL';
    SQLConnection.KeepConnection := True;
    SQLConnection.LibraryName := 'dbexpmysql.dll';
    SQLConnection.LoginPrompt := False;
    SQLConnection.VendorLib := 'libmysql.dll';
    SQLConnection.Params.Values['HostName'] := DbHost;
    SQLConnection.Params.Values['Database'] := DbName;
    SQLConnection.Params.Values['User_Name'] := DbUser;
    SQLConnection.Params.Values['Password'] := DbPass;
	end;

  {连接数据库}
	if not SQLConnection.Connected then
	begin
    try
      SQLConnection.Connected := True;
		except		
		  debugout.lines.add('[' + TimeToStr(Now) + '] ' + '*** Error on MySQL Connect.');
      Exit;
		end;
	end;

  if not assigned(SQLDataSet) then
	begin
	  SQLDataSet := TSQLDataSet.Create(nil);
    SQLDataSet.SQLConnection := SQLConnection;
	end;

  if SQLDataSet.Active then
    SQLConnection.Close;

  SQLDataSet.CommandText := sqlcmd;
	if UpperCase(copy(SQLDataSet.CommandText,1,6)) <> 'SELECT' then
  begin
	  try
      SQLDataSet.ExecSQL;
		except
		  debugout.lines.add('[' + TimeToStr(Now) + '] ' +  Format( '*** Execute SQL Error: %s', [sqlcmd] ) );
			exit;
		end;
		Result := True;
		Exit;
  end;
	try
	  SQLDataSet.Open;
	except
		debugout.lines.add('[' + TimeToStr(Now) + '] ' +  Format( '*** Open SQL Data Error: %s', [sqlcmd] ) );
		exit;
	end;
//	debugout.lines.add('[' + TimeToStr(Now) + '] ' + sqlcmd);
	Result := True;
end;

//------------------------------------------------------------------------------
// 读取全部的玩家资料
//------------------------------------------------------------------------------
procedure SQLDataLoad();
var
	i,j :integer;
//	i1  :integer;
	sl  :TStringList;
//	tpa	:TParty;
  tgc :TCastle;
//	tg  :TGuild;
//	tgb :TGBan;
//	tgl :TGRel;
	txt :TextFile;
	str :string;
begin
	sl := TStringList.Create;
	sl.QuoteChar := '"';
	sl.Delimiter := ',';

	if not FileExists(AppPath + 'status.txt') then begin
		AssignFile(txt, AppPath + 'status.txt');
		Rewrite(txt);
		Writeln(txt, '##Weiss.StatusData.0x0002');
		Writeln(txt, '0');
		CloseFile(txt);
	end else begin
		debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Server Flag loading...');
		Application.ProcessMessages;
		AssignFile(txt, AppPath + 'status.txt');
		Reset(txt);
		Readln(txt, str);
		sl.Clear;
		Readln(txt, str);
		sl.DelimitedText := str;
		j := StrToInt(sl.Strings[0]);
		for i := 1 to j do ServerFlag.Add('\' + sl.Strings[i]);
		CloseFile(txt);
		debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Server Flag loaded.', [ServerFlag.Count]));
		Application.ProcessMessages;
	end;


        if (ExecuteSqlCmd('SELECT GDID FROM guild_info ORDER BY GDID DESC LIMIT 1')) then begin
                while not SQLDataSet.Eof do begin
                        NowGuildID := SQLDataSet.FieldValues['GDID'];
                        SQLDataSet.Next;
                end;
        end;

  {读取工会城资料}
	debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Castle data loading from SQL...');
	Application.ProcessMessages;

	if ExecuteSqlCmd('SELECT * FROM guild_castle') then
	begin
	  while not SQLDataSet.Eof do
    begin
      tgc := TCastle.Create;
      with tgc do begin
			  Name     := unaddslashes(SQLDataSet.FieldValues['Name']);
        GID      := StrToInt(SQLDataSet.FieldValues['GDID']);
        GName    := unaddslashes(SQLDataSet.FieldValues['GName']);
        GMName   := unaddslashes(SQLDataSet.FieldValues['GMName']);
        GKafra   := StrToInt(SQLDataSet.FieldValues['GKafra']);
        EDegree  := StrToInt(SQLDataSet.FieldValues['EDegree']);
        ETrigger := StrToInt(SQLDataSet.FieldValues['ETrigger']);
        DDegree  := StrToInt(SQLDataSet.FieldValues['DDegree']);
        DTrigger := StrToInt(SQLDataSet.FieldValues['DTrigger']);
        GuardStatus[0] := StrToInt(SQLDataSet.FieldValues['GuardStatus0']);
        GuardStatus[1] := StrToInt(SQLDataSet.FieldValues['GuardStatus1']);
        GuardStatus[2] := StrToInt(SQLDataSet.FieldValues['GuardStatus2']);
        GuardStatus[3] := StrToInt(SQLDataSet.FieldValues['GuardStatus3']);
        GuardStatus[4] := StrToInt(SQLDataSet.FieldValues['GuardStatus4']);
        GuardStatus[5] := StrToInt(SQLDataSet.FieldValues['GuardStatus5']);
        GuardStatus[6] := StrToInt(SQLDataSet.FieldValues['GuardStatus6']);
        GuardStatus[7] := StrToInt(SQLDataSet.FieldValues['GuardStatus7']);
      end;

      CastleList.AddObject(tgc.Name, tgc);
	    SQLDataSet.Next;
	  end;
	end else begin
	  debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Castle data loading error...');
		Exit;
	end;
	debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Castle(s) data loaded.', [CastleList.Count]));
	Application.ProcessMessages;

  {读取组队资料}
	{debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Party data loading from SQL...');
	Application.ProcessMessages;

	if ExecuteSqlCmd('SELECT * FROM party') then
	begin
	  while not SQLDataSet.Eof do
    begin
      tpa := TParty.Create;
      with tpa do begin
			  Name     := unaddslashes(SQLDataSet.FieldValues['Name']);
        EXPShare      := StrToInt(SQLDataSet.FieldValues['EXPShare']);
        ITEMShare    := StrToInt(SQLDataSet.FieldValues['ITEMShare']);
        MemberID[0]   := StrToInt(SQLDataSet.FieldValues['MemberID0']);
        MemberID[1]   := StrToInt(SQLDataSet.FieldValues['MemberID1']);
        MemberID[2]   := StrToInt(SQLDataSet.FieldValues['MemberID2']);
        MemberID[3]   := StrToInt(SQLDataSet.FieldValues['MemberID3']);
        MemberID[4]   := StrToInt(SQLDataSet.FieldValues['MemberID4']);
        MemberID[5]   := StrToInt(SQLDataSet.FieldValues['MemberID5']);
        MemberID[6]   := StrToInt(SQLDataSet.FieldValues['MemberID6']);
        MemberID[7]   := StrToInt(SQLDataSet.FieldValues['MemberID7']);
        MemberID[8]   := StrToInt(SQLDataSet.FieldValues['MemberID8']);
        MemberID[9]   := StrToInt(SQLDataSet.FieldValues['MemberID9']);
        MemberID[10]   := StrToInt(SQLDataSet.FieldValues['MemberID10']);
        MemberID[11]   := StrToInt(SQLDataSet.FieldValues['MemberID11']);
      end;

      PartyNameList.AddObject(tpa.Name, tpa);
			debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('Add Party Name : %s.', [tpa.Name]));
	    SQLDataSet.Next;
	  end;
	end else begin
	  debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Party data loading error...');
		Exit;
	end;

	debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Party(s) data loaded.', [PartyNameList.Count]));
	Application.ProcessMessages;}

  {读取工会资料}
	{debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Guild data loading from SQL...');
	Application.ProcessMessages;

  if ExecuteSqlCmd('SELECT * FROM guild_info') then
	begin
	  while not SQLDataSet.Eof do
    begin
      tg := TGuild.Create;
      with tg do begin
			  ID := StrToInt(SQLDataSet.FieldValues['GDID']);
			  if (ID > NowGuildID) then NowGuildID := ID;
			  Name := unaddslashes(SQLDataSet.FieldValues['Name']);
			  LV := StrToInt(SQLDataSet.FieldValues['LV']);
			  EXP := StrToInt(SQLDataSet.FieldValues['EXP']);
			  GSkillPoint := StrToInt(SQLDataSet.FieldValues['GSkillPoint']);
			  Notice[0] := unaddslashes(SQLDataSet.FieldValues['Subject']);
			  Notice[1] := unaddslashes(SQLDataSet.FieldValues['Notice']);
			  Agit := unaddslashes(SQLDataSet.FieldValues['Agit']);
			  Emblem := StrToInt(SQLDataSet.FieldValues['Emblem']);
			  Present := StrToInt(SQLDataSet.FieldValues['Present']);
			  DisposFV := StrToInt(SQLDataSet.FieldValues['DisposFV']);
			  DisposRW := StrToInt(SQLDataSet.FieldValues['DisposRW']);
				
				for i := 0 to 35 do begin
					MemberID[i] := 0;
					MemberPos[i] := 0;
					MemberEXP[i] := 0;
				end;



			  for i := 10000 to 10004 do
				begin
			  	if GSkillDB.IndexOf(i) <> -1 then
					begin
			  		GSkill[i].Data := GSkillDB.IndexOfObject(i) as TSkillDB;
			  	end;
			  end;



                sl.Clear;
                sl.DelimitedText := SQLDataSet.FieldValues['skill'];

                for i := 0 to ((sl.Count div 2) - 1) do begin
                    if (GSkillDB.IndexOf(strtoint(sl.Strings[0+i*2])) <> -1) then begin
                        GSkill[strtoint(sl.Strings[0+i*2])].Lv := strtoint(sl.Strings[1+i*2]);
                        GSkill[strtoint(sl.Strings[0+i*2])].Card := false;
                    end;
                end;

      end;

      GuildList.AddObject(tg.ID, tg);
	    SQLDataSet.Next;
	  end;
	end else begin
	  debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Guild data loading error...');
		Exit;
	end;

	Application.ProcessMessages;

  {循环所有工会,读取工会成员等资料}
  {for i := 0 to GuildList.Count - 1 do
	begin
		tg := GuildList.Objects[i] as TGuild;
		with tg do
		begin
		  {读取工会成员资料}
		  {if ExecuteSqlCmd(Format('SELECT * FROM guild_members WHERE GDID=''%d'' LIMIT 36', [ID])) then
			begin
			  j := 0;

⌨️ 快捷键说明

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