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