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

📄 fusionsql.pas

📁 RO模拟器!!适合玩仙境传说的玩家们呦~
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit FusionSQL;

interface

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

	function MySQL_Query(sqlcmd: String) : Boolean;
	function Assign_AccountID() : cardinal;
	function Load_Accounts(userid: String; AID: cardinal = 0) : Boolean;
	function Call_Characters(AID: cardinal) : Boolean;
	function Load_Characters(GID: cardinal) : Boolean;
	function Load_Parties(GID: cardinal) : Boolean;
	function Load_Pets(AID: cardinal) : Boolean;
	function Load_Guilds(GID: cardinal) : Boolean;
	function Preload_GuildMembers() : Boolean;
	function Create_Account(username: String; userpass: String; sex: integer) : Boolean;

implementation

var
	SQLDataSet : TSQLDataSet;
	SQLConnection : TSQLConnection;

function MySQL_Query(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;
	Result := True;
end;

function Assign_AccountID() : cardinal;
var
        query : string;
begin
        Result := 100101;
        query := 'SELECT AID FROM accounts ORDER BY AID DESC LIMIT 1';
        if MySQL_Query (query) then begin
                SQLDataSet.First;
                if SQLDataSet.Eof then exit;
                Result := strtoint(SQLDataSet.FieldValues['AID']) + 1;
        end;
end;

function Load_Accounts(userid: String; AID: cardinal = 0) : Boolean;
var
        tp : TPlayer;
        i : Integer;
        sl : TStringList;
        query : string;
begin
        Result := False;
        sl := TStringList.Create;
        sl.QuoteChar := '"';
        sl.Delimiter := ',';
        tp := TPlayer.Create;

        if AID = 0 then begin
                if (PlayerName.IndexOf(userid) <> -1) then begin
                        tp := PlayerName.Objects[PlayerName.IndexOf(userid)] as TPlayer;
                end else begin
                        tp := TPlayer.Create;
                end;
        end

        else begin
                if (assigned(PlayerName)) then begin
                        if (Player.IndexOf(AID) <> -1) then begin
                                Result := True;
                                Exit;
                        end;
                end;
        end;

        query := 'SELECT A.AID, A.ID, A.passwd, A.Gender, A.Mail, A.Banned, A.regDate, S.storeitem, S.money FROM accounts AS A LEFT JOIN storage AS S ON S.AID=A.AID WHERE A.ID = '+''''+userid+''''+' LIMIT 1';
        if MySQL_Query(query) then begin
                SQLDataSet.First;
                if not SQLDataSet.Eof then begin
                        tp.ID := StrToInt(SQLDataSet.FieldValues['AID']);
                        tp.Name := SQLDataSet.FieldValues['ID'];
                        tp.Pass := SQLDataSet.FieldValues['passwd'];
                        tp.Gender := SQLDataSet.FieldValues['Gender'];
                        tp.Mail := SQLDataSet.FieldValues['Mail'];
                        tp.Banned := StrToInt(SQLDataSet.FieldValues['Banned']);
                        tp.ver2 := 9;
                        if (SQLDataSet.FieldValues['storeitem'] <> '') then begin
                                with SQLDataSet do begin
                                        sl.Clear;
                                        sl.DelimitedText := SQLDataSet.FieldValues['storeitem'];

                                        for i := 0 to ((sl.Count div 10) - 1) do begin
                                                tp.Kafra.Item[i+1].ID := strtoint(sl.Strings[0+i*10]);
                                                tp.Kafra.Item[i+1].Amount := strtoint(sl.Strings[1+i*10]);
                                                tp.Kafra.Item[i+1].Equip := strtoint(sl.Strings[2+i*10]);
                                                tp.Kafra.Item[i+1].Identify := strtoint(sl.Strings[3+i*10]);
                                                tp.Kafra.Item[i+1].Refine := strtoint(sl.Strings[4+i*10]);
                                                tp.Kafra.Item[i+1].Attr := strtoint(sl.Strings[5+i*10]);
                                                tp.Kafra.Item[i+1].Card[0] := strtoint(sl.Strings[6+i*10]);
                                                tp.Kafra.Item[i+1].Card[1] := strtoint(sl.Strings[7+i*10]);
                                                tp.Kafra.Item[i+1].Card[2] := strtoint(sl.Strings[8+i*10]);
                                                tp.Kafra.Item[i+1].Card[3] := strtoint(sl.Strings[9+i*10]);
                                                tp.Kafra.Item[i+1].Data := ItemDB.Objects[ItemDB.IndexOf(tp.Kafra.Item[i+1].ID)] as TItemDB;
                                        end;
                                        sl.Free;
                                        CalcInventory(tp.Kafra);
                                end;
                        end;
                end;

                for i := 0 to 8 do begin
                        tp.CID[i] := 0;
                        tp.CName[i] := '';
                        tp.CData[i] := nil;
                end;

                if (AID = 0) then begin
                        if (PlayerName.IndexOf(userid) <> -1) then begin
                        end else begin
                                PlayerName.AddObject(tp.Name, tp);
                                Player.AddObject(tp.ID, tp);
                        end;
                end;

                Result := True;
        end;
end;

function Call_Characters(AID: cardinal) : Boolean;
var
	i : integer;
	tp : TPlayer;
	query : string;
begin
	Result := False;

	tp := Player.Objects[Player.IndexOf(AID)] as TPlayer;

	query := 'SELECT GID, Name, CharaNumber FROM characters WHERE AID='+''''+inttostr(AID)+''''+' LIMIT 9';
	if MySQL_Query(query) then begin
		while not SQLDataSet.Eof do begin
			tp.CID[StrToInt(SQLDataSet.FieldValues['CharaNumber'])] := StrToInt(SQLDataSet.FieldValues['GID']);
			SQLDataSet.Next;
		end;
	end else begin
		Exit;
	end;

	for i := 0 to 8 do begin
		if (tp.CID[i] <> 0) then begin
			Load_Characters(tp.CID[i]);
		end;
	end;
	Result := True;
end;

function Load_Characters(GID: cardinal) : Boolean;
var
	i : integer;
	tc : TChara;
	ta : TMapList;
	tp  : TPlayer;
//	tpa : TParty;
	sl  : TStringList;
	str : string;
	query : string;
	query2 : string;
	addkey : boolean;
begin
        sl := TStringList.Create;
        sl.QuoteChar := '"';
        sl.Delimiter := ',';

        Result := False;
        addkey := True;

        //debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load Character Data From MySQL: CharaID = %d', [GID]));

        query := 'SELECT C.*, M.*, S.skillInfo, I.equipItem, T.cartitem, V.flagdata FROM characters AS C LEFT JOIN warpmemo AS M ON (C.GID=M.GID) LEFT JOIN skills AS S ON (C.GID=S.GID) ';
        query2 := 'LEFT JOIN inventory AS I ON (I.GID=C.GID) LEFT JOIN cart AS T ON (T.GID=C.GID) LEFT JOIN character_flags AS V ON (V.GID=C.GID) WHERE C.GID='+''''+inttostr(GID)+''''+' LIMIT 1';

        if MySQL_Query(query+query2) then begin
                SQLDataSet.First;
                if not SQLDataSet.Eof then begin
                        tc := TChara.Create;
                        tc.CID := StrToInt(SQLDataSet.FieldValues['GID']);
                        tc.Name := SQLDataSet.FieldValues['Name'];
                        str := tc.Name;
                        if assigned (CharaName) then begin
                                if (CharaName.IndexOf(tc.Name) <> -1) then begin
                                        tc := CharaName.Objects[CharaName.IndexOf(str)] as TChara;
                                        addkey := False;
                                end;
                        end;
                        tc.JID := StrToInt(SQLDataSet.FieldValues['JID']);
                        if (tc.JID > LOWER_JOB_END) then tc.JID := tc.JID - LOWER_JOB_END + UPPER_JOB_BEGIN;
                        tc.BaseLV := StrToInt(SQLDataSet.FieldValues['BaseLV']);
                        tc.BaseEXP := StrToInt(SQLDataSet.FieldValues['BaseEXP']);
                        tc.StatusPoint := StrToInt(SQLDataSet.FieldValues['StatusPoint']);
                        tc.JobLV := StrToInt(SQLDataSet.FieldValues['JobLV']);
                        tc.JobEXP := StrToInt(SQLDataSet.FieldValues['JobEXP']);
                        tc.SkillPoint := StrToInt(SQLDataSet.FieldValues['SkillPoint']);
                        tc.Zeny := StrToInt(SQLDataSet.FieldValues['Zeny']);
                        tc.Stat1 := StrToInt(SQLDataSet.FieldValues['Stat1']);
                        tc.Stat2 := StrToInt(SQLDataSet.FieldValues['Stat2']);
                        tc.Option := StrToInt(SQLDataSet.FieldValues['Options']);
                        if tc.Option = 4 then tc.Option := 0;
                        tc.Karma := StrToInt(SQLDataSet.FieldValues['Karma']);
                        tc.Manner := StrToInt(SQLDataSet.FieldValues['Manner']);
                        tc.HP := StrToInt(SQLDataSet.FieldValues['HP']);
                        if (tc.HP < 0) then tc.HP := 0;
                        tc.SP := StrToInt(SQLDataSet.FieldValues['SP']);
                        tc.DefaultSpeed := StrToInt(SQLDataSet.FieldValues['DefaultSpeed']);
                        tc.Hair := StrToInt(SQLDataSet.FieldValues['Hair']);
                        tc._2 := StrToInt(SQLDataSet.FieldValues['_2']);
                        tc._3 := StrToInt(SQLDataSet.FieldValues['_3']);
                        tc.Weapon := StrToInt(SQLDataSet.FieldValues['Weapon']);
                        tc.Shield := StrToInt(SQLDataSet.FieldValues['Shield']);
                        tc.Head1 := StrToInt(SQLDataSet.FieldValues['Head1']);

⌨️ 快捷键说明

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