📄 sqldata.pas
字号:
Exit;
end;
end;
debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load User Data From MySQL: userid = %s', [userid]));
if not ExecuteSqlCmd(format('SELECT L.AID,L.ID,L.passwd,L.Gender,L.Mail,L.Banned,I.storeitem,I.money FROM accounts AS L LEFT JOIN storage AS I ON I.AID=L.AID WHERE L.ID=''%s'' LIMIT 1', [addslashes(userid)])) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load User Data From MySQL Error: %s', [userid]));
Exit;
end
end else begin
if assigned(PlayerName) then
begin
if Player.IndexOf(AID) <> -1 then begin
Result := True;
Exit;
end;
end;
debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load User Data From MySQL: AID = %d', [AID]));
if not ExecuteSqlCmd(format('SELECT L.AID,L.ID,L.passwd,L.Gender,L.Mail,L.Banned,I.storeitem,I.money FROM accounts AS L LEFT JOIN storage AS I ON I.AID=L.AID WHERE L.AID=''%d'' LIMIT 1', [AID])) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load User Data From MySQL Error: %d', [AID]));
Exit;
end
end;}
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;
if ExecuteSqlCmd(format('SELECT L.AID,L.ID,L.passwd,L.Gender,L.Mail,L.Banned,I.storeitem,I.money FROM accounts AS L LEFT JOIN storage AS I ON I.AID=L.AID WHERE L.ID=''%s'' LIMIT 1', [addslashes(userid)])) then
begin
SQLDataSet.First;
if not SQLDataSet.Eof then begin
with tp do begin
ID := StrToInt(SQLDataSet.FieldValues['AID']);
Name := unaddslashes(SQLDataSet.FieldValues['ID']);
Pass := unaddslashes(SQLDataSet.FieldValues['passwd']);
Gender := StrToInt(SQLDataSet.FieldValues['Gender']);
Mail := unaddslashes(SQLDataSet.FieldValues['Mail']);
Banned := StrToInt(SQLDataSet.FieldValues['Banned']);
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
Kafra.Item[i+1].ID := strtoint(sl.Strings[0+i*10]);
Kafra.Item[i+1].Amount := strtoint(sl.Strings[1+i*10]);
Kafra.Item[i+1].Equip := strtoint(sl.Strings[2+i*10]);
Kafra.Item[i+1].Identify := strtoint(sl.Strings[3+i*10]);
Kafra.Item[i+1].Refine := strtoint(sl.Strings[4+i*10]);
Kafra.Item[i+1].Attr := strtoint(sl.Strings[5+i*10]);
Kafra.Item[i+1].Card[0] := strtoint(sl.Strings[6+i*10]);
Kafra.Item[i+1].Card[1] := strtoint(sl.Strings[7+i*10]);
Kafra.Item[i+1].Card[2] := strtoint(sl.Strings[8+i*10]);
Kafra.Item[i+1].Card[3] := strtoint(sl.Strings[9+i*10]);
Kafra.Item[i+1].Data := ItemDB.Objects[ItemDB.IndexOf(Kafra.Item[i+1].ID)] as TItemDB;
end;
sl.Free;
CalcInventory(Kafra);
end;
end;
end;
for j:= 0 to 8 do begin
tp.CID[j] := 0;
tp.CName[j] := '';
tp.CData[j] := 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;
end;
//------------------------------------------------------------------------------
// 取得人物资料
//------------------------------------------------------------------------------
function GetCharaData(GID: cardinal) : Boolean;
var
i,j : Integer;
tc : TChara;
ta : TMapList;
tp : TPlayer;
tpa : TParty;
sl : TStringList;
str : string;
begin
sl := TStringList.Create;
sl.QuoteChar := '"';
sl.Delimiter := ',';
Result := False;
debugout.lines.add('[' + TimeToStr(Now) + '] ' + format('Load Character Data From MySQL: CharaID = %d', [GID]));
if ExecuteSqlCmd('SELECT C.*, M.*, S.skillInfo, I.equipItem, T.cartitem, V.flagdata FROM characters AS C ' + format('LEFT JOIN warpmemo AS M ON (C.GID=M.GID) LEFT JOIN skills AS S ON (C.GID=S.GID) 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=''%d'' LIMIT 1', [GID])) then
begin
SQLDataSet.First;
if not SQLDataSet.Eof then begin
//while not SQLDataSet.Eof do begin
tc := TChara.Create;
with tc do begin
CID := StrToInt(SQLDataSet.FieldValues['GID']);
Name := unaddslashes(SQLDataSet.FieldValues['Name']);
str := Name;
if assigned(CharaName) then {如果该人物已经读入,就不用再读了}
begin
if CharaName.IndexOf(Name) <> -1 then
begin
tc := CharaName.Objects[CharaName.Indexof(str)] as TChara;
{Result := True;
Exit; }
//SQLDataSet.Next;
//continue;
end;
end;
JID := StrToInt(SQLDataSet.FieldValues['JID']);
// Colus, 20040305: JID becomes the 'proper' value.
if (JID > LOWER_JOB_END) then JID := JID - LOWER_JOB_END + UPPER_JOB_BEGIN;
BaseLV := StrToInt(SQLDataSet.FieldValues['BaseLV']);
BaseEXP := StrToInt(SQLDataSet.FieldValues['BaseEXP']);
StatusPoint := StrToInt(SQLDataSet.FieldValues['StatusPoint']);
JobLV := StrToInt(SQLDataSet.FieldValues['JobLV']);
JobEXP := StrToInt(SQLDataSet.FieldValues['JobEXP']);
SkillPoint := StrToInt(SQLDataSet.FieldValues['SkillPoint']);
Zeny := StrToInt(SQLDataSet.FieldValues['Zeny']);
Stat1 := StrToInt(SQLDataSet.FieldValues['Stat1']);
Stat2 := StrToInt(SQLDataSet.FieldValues['Stat2']);
Option := StrToInt(SQLDataSet.FieldValues['Options']);
if Option = 4 then Option := 0;
Karma := StrToInt(SQLDataSet.FieldValues['Karma']);
Manner := StrToInt(SQLDataSet.FieldValues['Manner']);
HP := StrToInt(SQLDataSet.FieldValues['HP']);
if (HP < 0) then begin
HP := 0;
end;
SP := StrToInt(SQLDataSet.FieldValues['SP']);
DefaultSpeed := StrToInt(SQLDataSet.FieldValues['DefaultSpeed']);
Hair := StrToInt(SQLDataSet.FieldValues['Hair']);
_2 := StrToInt(SQLDataSet.FieldValues['_2']);
_3 := StrToInt(SQLDataSet.FieldValues['_3']);
Weapon := StrToInt(SQLDataSet.FieldValues['Weapon']);
Shield := StrToInt(SQLDataSet.FieldValues['Shield']);
Head1 := StrToInt(SQLDataSet.FieldValues['Head1']);
Head2 := StrToInt(SQLDataSet.FieldValues['Head2']);
Head3 := StrToInt(SQLDataSet.FieldValues['Head3']);
HairColor := StrToInt(SQLDataSet.FieldValues['HairColor']);
ClothesColor := StrToInt(SQLDataSet.FieldValues['ClothesColor']);
ParamBase[0] := StrToInt(SQLDataSet.FieldValues['STR']);
ParamBase[1] := StrToInt(SQLDataSet.FieldValues['AGI']);
ParamBase[2] := StrToInt(SQLDataSet.FieldValues['VIT']);
ParamBase[3] := StrToInt(SQLDataSet.FieldValues['INTS']);
ParamBase[4] := StrToInt(SQLDataSet.FieldValues['DEX']);
ParamBase[5] := StrToInt(SQLDataSet.FieldValues['LUK']);
CharaNumber := StrToInt(SQLDataSet.FieldValues['CharaNumber']);
Map := unaddslashes(SQLDataSet.FieldValues['Map']);
Point.X := StrToInt(SQLDataSet.FieldValues['X']);
Point.Y := StrToInt(SQLDataSet.FieldValues['Y']);
SaveMap := unaddslashes(SQLDataSet.FieldValues['SaveMap']);
SavePoint.X := StrToInt(SQLDataSet.FieldValues['SX']);
SavePoint.Y := StrToInt(SQLDataSet.FieldValues['SY']);
Plag := StrToInt(SQLDataSet.FieldValues['Plag']);
PLv := StrToInt(SQLDataSet.FieldValues['PLv']);
PartyName := '';
ID := StrToInt(SQLDataSet.FieldValues['AID']);
{读取MEMO记录点资料}
for i := 0 to 2 do begin
if SQLDataSet.FieldByName('mapName' + inttostr(1)).IsNull then continue;
MemoMap[i] := unaddslashes(SQLDataSet.FieldValues['mapName' + IntToStr(i)]);
MemoPoint[i].X := StrToInt(SQLDataSet.FieldValues['xPos' + IntToStr(i)]);
MemoPoint[i].Y := StrToInt(SQLDataSet.FieldValues['yPos' + IntToStr(i)]);
if (MemoMap[i] <> '') and (MapList.IndexOf(MemoMap[i]) = -1) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid MemoMap%d "%s"', [Name, i, MemoMap[i]]));
MemoMap[i] := '';
MemoPoint[i].X := 0;
MemoPoint[i].Y := 0;
end else if MemoMap[i] <> '' then begin
ta := MapList.Objects[MapList.IndexOf(MemoMap[i])] as TMapList;
if (MemoPoint[i].X < 0) or (MemoPoint[i].X >= ta.Size.X) or (MemoPoint[i].Y < 0) or (MemoPoint[i].Y >= ta.Size.Y) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid MemoMap%d Point "%s"[%dx%d] (%d,%d)', [Name, i, MemoMap[i], ta.Size.X, ta.Size.Y, MemoPoint[i].X, MemoPoint[i].Y]));
MemoMap[i] := '';
MemoPoint[i].X := 0;
MemoPoint[i].Y := 0;
end;
end;
end;
if CID < 100001 then CID := CID + 100001;
{检查地图是否存在}
if MapList.IndexOf(Map) = -1 then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid Map "%s"', [Name, Map]));
Map := 'prontera';
Point.X := 158;
Point.Y := 189;
end;
{检查地图坐标是否有效}
ta := MapList.Objects[MapList.IndexOf(Map)] as TMapList;
if (Point.X < 0) or (Point.X >= ta.Size.X) or (Point.Y < 0) or (Point.Y >= ta.Size.Y) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid Map Point "%s"[%dx%d] (%d,%d)',[Name, Map, ta.Size.X, ta.Size.Y, Point.X, Point.Y]));
Map := 'prontera';
Point.X := 158;
Point.Y := 189;
end;
{检查人物记录点地图是否有效}
if MapList.IndexOf(SaveMap) = -1 then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid SaveMap "%s"', [Name, SaveMap]));
SaveMap := 'prontera';
SavePoint.X := 158;
SavePoint.Y := 189;
end;
{检查人物记录点地图坐标是否有效}
ta := MapList.Objects[MapList.IndexOf(SaveMap)] as TMapList;
if (SavePoint.X < 0) or (SavePoint.X >= ta.Size.X) or (SavePoint.Y < 0) or (SavePoint.Y >= ta.Size.Y) then begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('%s : Invalid SaveMap Point "%s"[%dx%d] (%d,%d)', [Name, SaveMap, ta.Size.X, ta.Size.Y, SavePoint.X, SavePoint.Y]));
SaveMap := 'prontera';
SavePoint.X := 158;
SavePoint.Y := 189;
end;
{读入所有技能资料,不知道干嘛要这么做。。。}
for i := 0 to 336 do begin
if SkillDB.IndexOf(i) <> -1 then begin
Skill[i].Data := SkillDB.IndexOfObject(i) as TSkillDB;
end;
end;
if (Plag <> 0) then begin
Skill[tc.Plag].Plag := true;
end;
{读取人物技能等级}
sl.Clear;
sl.DelimitedText := SQLDataSet.FieldValues['skillInfo'];
for i := 0 to ((sl.Count div 2) - 1) do begin
if (SkillDB.IndexOf(strtoint(sl.Strings[0+i*2])) <> -1) then begin
Skill[strtoint(sl.Strings[0+i*2])].Lv := strtoint(sl.Strings[1+i*2]);
Skill[strtoint(sl.Strings[0+i*2])].Card := false;
Skill[strtoint(sl.Strings[0+i*2])].Plag := false;
end;
end;
sl.Clear;
sl.DelimitedText := SQLDataSet.FieldValues['equipItem'];
for i := 0 to ((sl.Count div 10) - 1) do begin
Item[i+1].ID := strtoint(sl.Strings[0+i*10]);
Item[i+1].Amount := strtoint(sl.Strings[1+i*10]);
Item[i+1].Equip := strtoint(sl.Strings[2+i*10]);
Item[i+1].Identify := strtoint(sl.Strings[3+i*10]);
Item[i+1].Refine := strtoint(sl.Strings[4+i*10]);
Item[i+1].Attr := strtoint(sl.Strings[5+i*10]);
Item[i+1].Card[0] := strtoint(sl.Strings[6+i*10]);
Item[i+1].Card[1] := strtoint(sl.Strings[7+i*10]);
Item[i+1].Card[2] := strtoint(sl.Strings[8+i*10]);
Item[i+1].Card[3] := strtoint(sl.Strings[9+i*10]);
Item[i+1].Data := ItemDB.Objects[ItemDB.IndexOf(Item[i+1].ID)] as TItemDB;
end;
sl.Clear;
sl.DelimitedText := SQLDataSet.FieldValues['cartitem'];
for i := 0 to ((sl.Count div 10) - 1) do begin
Cart.Item[i+1].ID := strtoint(sl.Strings[0+i*10]);
Cart.Item[i+1].Amount := strtoint(sl.Strings[1+i*10]);
Cart.Item[i+1].Equip := strtoint(sl.Strings[2+i*10]);
Cart.Item[i+1].Identify := strtoint(sl.Strings[3+i*10]);
Cart.Item[i+1].Refine := strtoint(sl.Strings[4+i*10]);
Cart.Item[i+1].Attr := strtoint(sl.Strings[5+i*10]);
Cart.Item[i+1].Card[0] := strtoint(sl.Strings[6+i*10]);
Cart.Item[i+1].Card[1] := strtoint(sl.Strings[7+i*10]);
Cart.Item[i+1].Card[2] := strtoint(sl.Strings[8+i*10]);
Cart.Item[i+1].Card[3] := strtoint(sl.Strings[9+i*10]);
Cart.Item[i+1].Data := ItemDB.Objects[ItemDB.IndexOf(Cart.Item[i+1].ID)] as TItemDB;
end;
end;
sl.Clear;
sl.DelimitedText := SQLDataSet.FieldValues['flagdata'];
for i := 0 to (sl.Count - 1) do begin
tc.Flag.Add(sl.Strings[i]);
end;
CharaName.AddObject(tc.Name, tc);
Chara.AddObject(tc.CID, tc);
GetPlayerData('', tc.ID);
if Player.IndexOf(tc.ID) <> -1 then begin
tp := Player.Objects[Player.IndexOf(tc.ID)] as TPlayer;
tp.CID[tc.CharaNumber] := tc.CID;
tp.CName[tc.CharaNumber] := tc.Name;
tp.CData[tc.CharaNumber] := tc;
tp.CData[tc.CharaNumber].Gender := tp.Gender;
end;
{读取宠物资料}
GetPetData(tc.ID);
{读取人物工会资料}
GetCharaGuildData(tc.CID);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -