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

📄 localdb.pas

📁 翎风世界..传奇服务端..DELPHI源代码 包括DBServer,LogDataServer,LoginGate,LoginSrv,M2Server等..内容齐全.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit LocalDB;

interface

uses
  Windows, Messages, SysUtils, StrUtils, Variants, Classes, Graphics, Controls, Forms,ActiveX,
  Dialogs, M2Share, ADODB, DB, HUtil32, Grobal2, SDK, ObjNpc, ItmUnit;


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: TADOQuery;

    constructor Create();
    destructor Destroy; override;
    function LoadMonitems(MonName:String;var ItemList:TList):Integer;
    function LoadItemsDB():Integer;
    function LoadMapRoute():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
  i:Integer;
  AdminInfo :pTAdminInfo;
ResourceString
  sSQLString = 'SELECT * FROM TBL_ADMIN';
begin
  Result:=False;
  EnterCriticalSection(ProcessHumanCriticalSection);
  try
  try
    Query.SQL.Clear;
    Query.SQL.Add(sSQLString);
    try
      Query.Open;
    finally
    end;

    UserEngine.m_AdminList.Lock;
    try
      UserEngine.m_AdminList.Clear;
      for i:=0 to Query.RecordCount -1 do begin
        New(AdminInfo);
        AdminInfo.nLv         := Query.FieldByName('FLD_ADMINLEVEL').AsInteger;
        AdminInfo.sChrName    := Query.FieldByName('FLD_PLAYERNAME').AsString;
        AdminInfo.sIPaddr     := Query.FieldByName('FLD_IP').AsString;

        UserEngine.m_AdminList.Add(AdminInfo);

        Query.Next;
      end;
    finally
      UserEngine.m_AdminList.UnLock;
    end;
  finally
    Query.Close;
  end;
  finally
    LeaveCriticalSection(ProcessHumanCriticalSection);
  end;
  Result:=True;
end;

function TFrmDB.SaveAdminList():Boolean;
var
  i:Integer;
  AdminInfo :pTAdminInfo;
ResourceString
  sSQLString = 'DELETE * FROM TBL_ADMIN';
  sSQLString2= 'INSERT TBL_ADMIN(FLD_ADMINLEVEL, FLD_PLAYERNAME, FLD_IP) VALUES( %d, ''%s'', ''%s'' )';
begin
  Result:=False;
  EnterCriticalSection(ProcessHumanCriticalSection);
  try
  try
    Query.SQL.Clear;
    Query.SQL.Add(sSQLString);
    try
      Query.ExecSQL;
    finally
    end;

    try
      UserEngine.m_AdminList.Lock;
      Query.SQL.Clear;
      for I := 0 to UserEngine.m_AdminList.Count - 1 do begin
        AdminInfo:=pTAdminInfo(UserEngine.m_AdminList.Items[I]);

        Query.Close;
      	Query.SQL.Text:=Format(sSQLString2, [AdminInfo.nLv, AdminInfo.sChrName, AdminInfo.sIPaddr]);

      	if (Query.ExecSQL<=0) then begin
					Break;
      	end;
      end;

    finally
      UserEngine.m_AdminList.UnLock;
    end;
  finally
    Query.Close;
  end;
  finally
    LeaveCriticalSection(ProcessHumanCriticalSection);
  end;
  Result:=True;
end;


//00488A68
function TFrmDB.LoadGuardList(): Integer;
var
  i,nX,nY,nDir:Integer;
  sGuardName,sMap:String;
  tGuard:TBaseObject;
ResourceString
  sSQLString = 'SELECT * FROM TBL_GUARD';
begin
  EnterCriticalSection(ProcessHumanCriticalSection);
  try
  try
    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
      sGuardName        := Query.FieldByName('FLD_GUARDNAME').AsString;
      sMap              := Query.FieldByName('FLD_MAPNAME').AsString;
      nX                := Query.FieldByName('FLD_X').AsInteger;
      nY                := Query.FieldByName('FLD_Y').AsInteger;
      nDir              := Query.FieldByName('FLD_DIRECTION').AsInteger;

      if (sGuardName <> '') and (sMap <> '') then begin
        tGuard:=UserEngine.RegenMonsterByName(sMap,nX,nY,sGuardName);
        //sMapName,nX,nY,sName
        if tGuard <> nil then tGuard.m_btDirection:=nDir;
      end;

      Result := 1;
      Query.Next;
    end;
  finally
    Query.Close;
  end;
  finally
    LeaveCriticalSection(ProcessHumanCriticalSection);
  end;
end;
//004855E0
function TFrmDB.LoadItemsDB: Integer;
var
  i,Idx:Integer;
  Item:TItem;
ResourceString
  sSQLString = 'SELECT * FROM TBL_STDITEMS ORDER BY FLD_ID';
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('FLD_ID').AsInteger;
      Item.Name      := Query.FieldByName('FLD_NAME').AsString;
      Item.StdMode   := Query.FieldByName('FLD_STDMode').AsInteger;
      Item.Shape     := Query.FieldByName('FLD_SHAPE').AsInteger;
      Item.Weight    := Query.FieldByName('FLD_WEIGHT').AsInteger;
      Item.AniCount  := Query.FieldByName('FLD_ANICOUNT').AsInteger;
      Item.Source    := Query.FieldByName('FLD_SOURCE').AsInteger;
      Item.Reserved  := Query.FieldByName('FLD_RESERVED').AsInteger;
      Item.Looks     := Query.FieldByName('FLD_IMGINDEX').AsInteger;
      Item.DuraMax   := Word(Query.FieldByName('FLD_DURAMAX').AsInteger);
      Item.AC        := ROUND(Query.FieldByName('FLD_AC').AsInteger * (g_Config.nItemsACPowerRate / 10));
      Item.AC2       := ROUND(Query.FieldByName('FLD_ACMAX').AsInteger * (g_Config.nItemsACPowerRate / 10));
      Item.MAC       := ROUND(Query.FieldByName('FLD_MAC').AsInteger * (g_Config.nItemsACPowerRate / 10));
      Item.MAC2      := ROUND(Query.FieldByName('FLD_MACMAX').AsInteger * (g_Config.nItemsACPowerRate / 10));
      Item.DC        := ROUND(Query.FieldByName('FLD_DC').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.DC2       := ROUND(Query.FieldByName('FLD_DCMAX').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.MC        := ROUND(Query.FieldByName('FLD_MC').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.MC2       := ROUND(Query.FieldByName('FLD_MCMAX').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.SC        := ROUND(Query.FieldByName('FLD_SC').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.SC2       := ROUND(Query.FieldByName('FLD_SCMAX').AsInteger * (g_Config.nItemsPowerRate / 10));
      Item.Need      := Query.FieldByName('FLD_NEED').AsInteger;
      Item.NeedLevel := Query.FieldByName('FLD_NEEDLEVEL').AsInteger;
      Item.Price     := Query.FieldByName('FLD_PRICE').AsInteger;
      Item.Unique    := Query.FieldByName('FLD_UNIQUEITEM').AsBoolean;
      Item.Light     := Query.FieldByName('FLD_LIGHT').AsBoolean;


      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-1 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 TBL_MAGIC ORDER BY FLD_ID';
begin
  Result:= -1;
  EnterCriticalSection(ProcessHumanCriticalSection);
  try
  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('FLD_ID').AsInteger;
      Magic.sMagicName    := Trim(Query.FieldByName('FLD_NAME').AsString);
      Magic.btEffectType  := Query.FieldByName('FLD_EFFECTTYPE').AsInteger;
      Magic.btEffect      := Query.FieldByName('FLD_EFFECT').AsInteger;
      Magic.wSpell        := Query.FieldByName('FLD_SPELL').AsInteger;
      Magic.wPower        := Query.FieldByName('FLD_POWER').AsInteger;
      Magic.wMaxPower     := Query.FieldByName('FLD_MAXPOWER').AsInteger;
      Magic.btJob         := Query.FieldByName('FLD_JOB').AsInteger;
      Magic.TrainLevel[0] := Query.FieldByName('FLD_NEEDL1').AsInteger;
      Magic.TrainLevel[1] := Query.FieldByName('FLD_NEEDL2').AsInteger;
      Magic.TrainLevel[2] := Query.FieldByName('FLD_NEEDL3').AsInteger;
      Magic.TrainLevel[3] := Magic.TrainLevel[2]; //Query.FieldByName('FLD_NEEDL3').AsInteger;
      Magic.MaxTrain[0]   := Query.FieldByName('FLD_L1TRAIN').AsInteger;
      Magic.MaxTrain[1]   := Query.FieldByName('FLD_L2TRAIN').AsInteger;
      Magic.MaxTrain[2]   := Query.FieldByName('FLD_L3TRAIN').AsInteger;
      Magic.MaxTrain[3]   := Magic.MaxTrain[2];
      Magic.btTrainLv     := MaxSkillLevel;
      Magic.dwDelayTime   := Query.FieldByName('FLD_DELAY').AsInteger;
      Magic.btDefSpell    := Query.FieldByName('FLD_DEFSPELL').AsInteger;
      Magic.btDefPower    := Query.FieldByName('FLD_DEFPOWER').AsInteger;
      Magic.btDefMaxPower := Query.FieldByName('FLD_DEFMAXPOWER').AsInteger;
      Magic.sDescr        := Trim(Query.FieldByName('FLD_DESCR').AsString);
      if Magic.wMagicId > 0 then begin
        UserEngine.m_MagicList.Add(Magic);
      end else begin
        Dispose(Magic);
      end;
      Result := 1;
      Query.Next;
    end;
  finally
    Query.Close;
  end;
  finally
    LeaveCriticalSection(ProcessHumanCriticalSection);
  end;
end;

function TFrmDB.LoadMakeItem(): Integer; //00488CDC
var
  I,n14:Integer;
  s18,s20,s24:String;
  LoadList:TStringList;
  sFileName:String;
  List28:TStringList;
begin
  Result:= -1;
  sFileName:=g_Config.sEnvirDir + 'MakeItem.txt';
  if FileExists(sFileName) then begin
    LoadList:=TStringList.Create;
    LoadList.LoadFromFile(sFileName);
    List28:=nil;
    s24:='';
    for I := 0 to LoadList.Count - 1 do begin
      s18:=Trim(LoadList.Strings[I]);
      if (s18 <> '') and (s18[1] <> ';') then begin
        if s18[1] = '[' then begin
          if List28 <> nil then
            g_MakeItemList.AddObject(s24,List28);
          List28:=TStringList.Create;
          ArrestStringEx(s18,'[',']',s24);
        end else begin
          if List28 <> nil then begin
            s18:=GetValidStr3(s18,s20,[' ',#9]);
            n14:=Str_ToInt(Trim(s18),1);
            List28.AddObject(s20,TObject(n14));
          end;
        end;
      end;
    end;    // for
    if List28 <> nil then
      g_MakeItemList.AddObject(s24,List28);
    LoadList.Free;
    Result:=1;
  end;
end;


function TFrmDB.LoadMapInfo: Integer;
  function LoadMapQuest(sName:String):TMerchant;
  var
    QuestNPC:TMerchant;
  begin
    QuestNPC:=TMerchant.Create;
    QuestNPC.m_sMapName:='0';
    QuestNPC.m_nCurrX:=0;
    QuestNPC.m_nCurrY:=0;

⌨️ 快捷键说明

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