📄 localdb.pas
字号:
unit LocalDB;
interface
uses
Windows, Messages, SysUtils, StrUtils, Variants, Classes, Graphics, Controls, Forms,ActiveX,
Dialogs, M2Share, DB, HUtil32, Grobal2, SDK, ObjNpc, ItmUnit, DBTABLES;
type
TDefineInfo = record
sName:String;
sText:String;
end;
pTDefineInfo = ^TDefineInfo;
TQDDinfo = record
n00 :Integer;
s04 :String;
sList :TStringList;
end;
pTQDDinfo = ^TQDDinfo;
TGoodFileHeader = record
nItemCount :Integer;
Resv :array[0..251] of Integer;
end;
TFrmDB = class{(TForm)}
private
procedure QMangeNPC;
procedure QFunctionNPC;
procedure RobotNPC();
procedure DeCodeStringList(StringList:TStringList);
{ Private declarations }
public
Query: TQuery;
constructor Create();
destructor Destroy; override;
function LoadMonitems(MonName:String;var ItemList:TList):Integer;
function LoadItemsDB():Integer;
function LoadMinMap():Integer;
function LoadMapInfo():Integer;
function LoadMonsterDB():Integer;
function LoadMagicDB():Integer;
function LoadMonGen():Integer;
function LoadUnbindList():Integer;
function LoadMapQuest():Integer;
function LoadQuestDiary():Integer;
function LoadAdminList():Boolean;
function LoadMerchant():Integer;
function LoadGuardList():Integer;
function LoadNpcs():Integer;
function LoadMakeItem():Integer;
function LoadStartPoint():Integer;
function LoadNpcScript(NPC:TNormNpc;sPatch,sScritpName:String):Integer;
function LoadScriptFile(NPC:TNormNpc;sPatch,sScritpName:String;boFlag:Boolean):Integer;
function LoadGoodRecord(NPC:TMerchant;sFile:String):Integer;
function LoadGoodPriceRecord(NPC:TMerchant;sFile:String):Integer;
function SaveGoodRecord(NPC:TMerchant;sFile:String):Integer;
function SaveGoodPriceRecord(NPC:TMerchant;sFile:String):Integer;
function LoadUpgradeWeaponRecord(sNPCName:String;DataList:TList):Integer;
function SaveUpgradeWeaponRecord(sNPCName:String;DataList:TList):Integer;
procedure ReLoadMerchants();
procedure ReLoadNpc();
function SaveAdminList():Boolean;
{ Public declarations }
end;
var
FrmDB: TFrmDB;
nDeCryptString:Integer= -1;
implementation
uses ObjBase, Envir;
//{$R *.dfm}
{ TFrmDB }
//00487630
function TFrmDB.LoadAdminList(): Boolean;
var
sFileName: string;
sLineText: string;
sIPaddr: string;
sCharName: string;
sData: string;
LoadList: TStringList;
AdminInfo: pTAdminInfo;
i: Integer;
nLv: Integer;
begin
Result := False;
;
sFileName := g_Config.sEnvirDir + 'AdminList.txt';
if not FileExists(sFileName) then
Exit;
UserEngine.m_AdminList.Lock;
try
UserEngine.m_AdminList.Clear;
LoadList := TStringList.Create;
LoadList.LoadFromFile(sFileName);
for i := 0 to LoadList.Count - 1 do
begin
sLineText := LoadList.Strings[i];
nLv := -1;
if (sLineText <> '') and (sLineText[1] <> ';') then
begin
if sLineText[1] = '*' then
nLv := 10
else if sLineText[1] = '1' then
nLv := 9
else if sLineText[1] = '2' then
nLv := 8
else if sLineText[1] = '3' then
nLv := 7
else if sLineText[1] = '4' then
nLv := 6
else if sLineText[1] = '5' then
nLv := 5
else if sLineText[1] = '6' then
nLv := 4
else if sLineText[1] = '7' then
nLv := 3
else if sLineText[1] = '8' then
nLv := 2
else if sLineText[1] = '9' then
nLv := 1;
if nLv > 0 then
begin
sLineText := GetValidStrCap(sLineText, sData, ['/', '\', ' ', #9]);
sLineText := GetValidStrCap(sLineText, sCharName, ['/', '\', ' ',
#9]);
sLineText := GetValidStrCap(sLineText, sIPaddr, ['/', '\', ' ', #9]);
{$IF VEROWNER = WL}
if (sCharName <= '') or (sIPaddr = '') then
Continue;
{$IFEND}
New(AdminInfo);
AdminInfo.nLv := nLv;
AdminInfo.sChrName := sCharName;
AdminInfo.sIPaddr := sIPaddr;
UserEngine.m_AdminList.Add(AdminInfo);
end;
end;
end;
LoadList.Free;
finally
UserEngine.m_AdminList.UnLock;
end;
Result := True;
end;
//00488A68
function TFrmDB.SaveAdminList(): Boolean;
var
i: Integer;
sFileName: string;
SaveList: TStringList;
sPermission: string;
nPermission: Integer;
AdminInfo: pTAdminInfo;
begin
sFileName := g_Config.sEnvirDir + 'AdminList.txt';
SaveList := TStringList.Create;
UserEngine.m_AdminList.Lock;
try
for i := 0 to UserEngine.m_AdminList.Count - 1 do
begin
AdminInfo := pTAdminInfo(UserEngine.m_AdminList.Items[i]);
nPermission := AdminInfo.nLv;
if nPermission = 10 then
sPermission := '*';
if nPermission = 9 then
sPermission := '1';
if nPermission = 8 then
sPermission := '2';
if nPermission = 7 then
sPermission := '3';
if nPermission = 6 then
sPermission := '4';
if nPermission = 5 then
sPermission := '5';
if nPermission = 4 then
sPermission := '6';
if nPermission = 3 then
sPermission := '7';
if nPermission = 2 then
sPermission := '8';
if nPermission = 1 then
sPermission := '9';
{$IF VEROWNER = WL}
SaveList.Add(sPermission + #9 + AdminInfo.sChrName + #9 +
AdminInfo.sIPaddr);
{$ELSE}
SaveList.Add(sPermission + #9 + AdminInfo.sChrName);
{$IFEND}
end;
SaveList.SaveToFile(sFileName);
finally
UserEngine.m_AdminList.UnLock;
end;
Result := True;
end;
//00488A68
function TFrmDB.LoadGuardList(): Integer;
var
sFileName, s14, s1C, s20, s24, s28, s2C: string;
tGuardList: TStringList;
i: Integer;
tGuard: TBaseObject;
begin
Result := -1;
sFileName := g_Config.sEnvirDir + 'GuardList.txt';
if FileExists(sFileName) then
begin
tGuardList := TStringList.Create;
tGuardList.LoadFromFile(sFileName);
for i := 0 to tGuardList.Count - 1 do
begin
s14 := tGuardList.Strings[i];
if (s14 <> '') and (s14[1] <> ';') then
begin
s14 := GetValidStrCap(s14, s1C, [' ']);
if (s1C <> '') and (s1C[1] = '"') then
ArrestStringEx(s1C, '"', '"', s1C);
s14 := GetValidStr3(s14, s20, [' ']);
s14 := GetValidStr3(s14, s24, [' ', ',']);
s14 := GetValidStr3(s14, s28, [' ', ',', ':']);
s14 := GetValidStr3(s14, s2C, [' ', ':']);
if (s1C <> '') and (s20 <> '') and (s2C <> '') then
begin
tGuard := UserEngine.RegenMonsterByName(s20, Str_ToInt(s24, 0),
Str_ToInt(s28, 0), s1C);
//sMapName,nX,nY,sName
if tGuard <> nil then
tGuard.m_btDirection := Str_ToInt(s2C, 0);
end;
end;
end;
tGuardList.Free;
Result := 1;
end;
end;
//004855E0
function TFrmDB.LoadItemsDB: Integer;
var
i, Idx: Integer;
Item: TItem;
resourcestring
sSQLString = 'SELECT * FROM STDITEMS';
begin
EnterCriticalSection(ProcessHumanCriticalSection);
try
try
for i := 0 to UserEngine.StdItemList.Count - 1 do
begin
TItem(UserEngine.StdItemList.Items[i]).Free;
end;
UserEngine.StdItemList.Clear;
Result := -1;
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result := -2;
end;
for i := 0 to Query.RecordCount - 1 do
begin
Item := TItem.Create;
Idx := Query.FieldByName('IDX').AsInteger;
Item.Name := Query.FieldByName('NAME').AsString;
Item.StdMode := Query.FieldByName('STDMode').AsInteger;
Item.Shape := Query.FieldByName('SHAPE').AsInteger;
Item.Weight := Query.FieldByName('WEIGHT').AsInteger;
Item.AniCount := Query.FieldByName('ANICOUNT').AsInteger;
Item.Source := Query.FieldByName('SOURCE').AsInteger;
Item.Reserved := Query.FieldByName('RESERVED').AsInteger;
Item.Looks := Query.FieldByName('Looks').AsInteger;
Item.DuraMax := Word(Query.FieldByName('DURAMAX').AsInteger);
Item.AC := Round(Query.FieldByName('AC').AsInteger * (g_Config.nItemsACPowerRate / 10));
Item.AC2 := Round(Query.FieldByName('AC2').AsInteger * (g_Config.nItemsACPowerRate / 10));
Item.MAC := Round(Query.FieldByName('MAC').AsInteger * (g_Config.nItemsACPowerRate / 10));
Item.MAC2 := Round(Query.FieldByName('MAC2').AsInteger * (g_Config.nItemsACPowerRate / 10));
Item.DC := Round(Query.FieldByName('DC').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.DC2 := Round(Query.FieldByName('DC2').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.MC := Round(Query.FieldByName('MC').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.MC2 := Round(Query.FieldByName('MC2').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.SC := Round(Query.FieldByName('SC').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.SC2 := Round(Query.FieldByName('SC2').AsInteger * (g_Config.nItemsPowerRate / 10));
Item.Need := Query.FieldByName('NEED').AsInteger;
Item.NeedLevel := Query.FieldByName('NEEDLEVEL').AsInteger;
Item.Price := Query.FieldByName('PRICE').AsInteger;
// Item.Unique := Query.FieldByName('UNIQUEITEM').AsBoolean;
// Item.Light:= Query.FieldByName('LIGHT').AsBoolean;
Item.stock := Query.FieldByName('stock').AsInteger;
Item.NeedIdentify := GetGameLogItemNameList(Item.Name);
case Item.StdMode of
5, 6: Item.ItemType := ITEM_WEAPON;
10, 11: Item.ItemType := ITEM_ARMOR;
15, 19, 20, 21, 22, 23, 24, 26, 51, 52, 53, 54, 62, 63, 64: Item.ItemType := ITEM_ACCESSORY;
else Item.ItemType := ITEM_ETC;
end;
if UserEngine.StdItemList.Count = Idx then
begin
UserEngine.StdItemList.Add(Item);
Result := 1;
end else
begin
Memo.Lines.Add(Format('加载物品(Idx:%d Name:%s)数据失败!!!', [Idx, Item.Name]));
Result := -100;
Exit;
end;
Query.Next;
end;
g_boGameLogGold := GetGameLogItemNameList(sSTRING_GOLDNAME) = 1;
g_boGameLogHumanDie := GetGameLogItemNameList(g_sHumanDieEvent) = 1;
g_boGameLogGameGold := GetGameLogItemNameList(g_Config.sGameGoldName) = 1;
g_boGameLogGamePoint := GetGameLogItemNameList(g_Config.sGamePointName) = 1;
finally
Query.Close;
end;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
//00486330
function TFrmDB.LoadMagicDB(): Integer;
var
i: Integer;
Magic: pTMagic;
resourcestring
sSQLString = 'select * from Magic';
begin
Result := -1;
EnterCriticalSection(ProcessHumanCriticalSection);
try
UserEngine.SwitchMagicList();
{
for I := 0 to UserEngine.MagicList.Count - 1 do begin
Dispose(pTMagic(UserEngine.MagicList.Items[I]));
end;
UserEngine.MagicList.Clear;
}
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result := -2;
end;
for i := 0 to Query.RecordCount - 1 do
begin
New(Magic);
Magic.wMagicId := Query.FieldByName('MagId').AsInteger;
Magic.sMagicName := Query.FieldByName('MagName').AsString;
Magic.btEffectType := Query.FieldByName('EffectType').AsInteger;
Magic.btEffect := Query.FieldByName('Effect').AsInteger;
Magic.wSpell := Query.FieldByName('Spell').AsInteger;
Magic.wPower := Query.FieldByName('Power').AsInteger;
Magic.wMaxPower := Query.FieldByName('MaxPower').AsInteger;
Magic.btJob := Query.FieldByName('Job').AsInteger;
Magic.TrainLevel[0] := Query.FieldByName('NeedL1').AsInteger;
Magic.TrainLevel[1] := Query.FieldByName('NeedL2').AsInteger;
Magic.TrainLevel[2] := Query.FieldByName('NeedL3').AsInteger;
Magic.TrainLevel[3] := Query.FieldByName('NeedL3').AsInteger;
Magic.MaxTrain[0] := Query.FieldByName('L1Train').AsInteger;
Magic.MaxTrain[1] := Query.FieldByName('L2Train').AsInteger;
Magic.MaxTrain[2] := Query.FieldByName('L3Train').AsInteger;
Magic.MaxTrain[3] := Magic.MaxTrain[2];
Magic.btTrainLv := 3;
Magic.dwDelayTime := Query.FieldByName('Delay').AsInteger;
Magic.btDefSpell := Query.FieldByName('DefSpell').AsInteger;
Magic.btDefPower := Query.FieldByName('DefPower').AsInteger;
Magic.btDefMaxPower := Query.FieldByName('DefMaxPower').AsInteger;
Magic.sDescr := Query.FieldByName('Descr').AsString;
if Magic.wMagicId > 0 then
begin
UserEngine.m_MagicList.Add(Magic);
end
else
begin
Dispose(Magic);
end;
Result := 1;
Query.Next;
end;
Query.Close;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
function TFrmDB.LoadMakeItem(): Integer; //00488CDC
var
I,n14:Integer;
s18,s20,s24:String;
LoadList:TStringList;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -