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

📄 humdb.pas

📁 飘飘的传奇服务端院代码 能编译的 要控件 老大就让我传上去吧
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit HumDB;

interface
uses
  Windows, Classes, SysUtils, Forms, MudUtil, Grobal2;
resourcestring
  sDBHeaderDesc = '传奇游戏数据库文件 2006/07/01';
  sDBIdxHeaderDesc = '传奇游戏数据库索引文件 2006/07/01';

type
  TDBHeader = packed record //Size 124
    sDesc: string[$23]; //0x00    36
    n24: Integer; //0x24
    n28: Integer; //0x28
    n2C: Integer; //0x2C
    n30: Integer; //0x30
    n34: Integer; //0x34
    n38: Integer; //0x38
    n3C: Integer; //0x3C
    n40: Integer; //0x40
    n44: Integer; //0x44
    n48: Integer; //0x48
    n4C: Integer; //0x4C
    n50: Integer; //0x50
    n54: Integer; //0x54
    n58: Integer; //0x58
    nLastIndex: Integer; //0x5C
    dLastDate: TDateTime; //0x60
    nHumCount: Integer; //0x68
    n6C: Integer; //0x6C
    n70: Integer; //0x70
    dUpdateDate: TDateTime; //0x74
  end;
  pTDBHeader = ^TDBHeader;

  TIdxHeader = packed record //Size 124
    sDesc: string[39]; //0x00
    n2C: Integer; //0x2C
    n30: Integer; //0x30
    n34: Integer; //0x34
    n38: Integer; //0x38
    n3C: Integer; //0x3C
    n40: Integer; //0x40
    n44: Integer; //0x44
    n48: Integer; //0x48
    n4C: Integer; //0x4C
    n50: Integer; //0x50
    n54: Integer; //0x54
    n58: Integer; //0x58
    n5C: Integer; //0x5C
    n60: Integer; //0x60  95
    n70: Integer; //0x70  99
    nQuickCount: Integer; //0x74  100
    nHumCount: Integer; //0x78
    nDeleteCount: Integer; //0x7C
    nLastIndex: Integer; //0x80
    dUpdateDate: TDateTime; //0x84
  end;
  pTIdxHeader = ^TIdxHeader;

  TNakedAbility = packed record //Size 20
    DC: Word;
    MC: Word;
    SC: Word;
    AC: Word;
    MAC: Word;
    HP: Word;
    MP: Word;
    Hit: Word;
    Speed: Word;
    X2: Word;
  end;
  pTNakedAbility = ^TNakedAbility;

  TAbility = packed record //OK    //Size 44
    Level: Word; //0x198
    AC: Word; //0x19A
    MAC: Word; //0x19C
    DC: Word; //0x19E
    MC: Word; //0x1A0
    SC: Word; //0x1A2
    HP: Word; //0x1A4
    MP: Word; //0x1A6
    MaxHP: Word; //0x1A8
    MaxMP: Word; //0x1AA
    dw1AC: LongWord; //0x1AC
    Exp: LongWord; //0x1B0
    MaxExp: LongWord; //0x1B4
    Weight: Word; //0x1B8
    MaxWeight: Word; //0x1BA
    WearWeight: Word; //0x1BC
    MaxWearWeight: Word; //0x1BD
    HandWeight: Word; //0x1BE
    MaxHandWeight: Word; //0x1BF
  end;

  THumItems = record
    MakeIndex: Integer;
    wIndex: Word; //物品id
    Dura: Word; //当前持久值
    DuraMax: Word; //最大持久值
    btValue: array[0..13] of Byte;
  end;
  pTHumItems = ^THumItems;

  TMagic = record
    wMagIdx: Word;
    btLevel: Byte;
    btKey: Byte;
    nTranPoint: Integer; //当前持久值
  end;
  pTMagic = ^TMagic;

  TRecordHeader = packed record //Size 12
    boDeleted: Boolean;
    nSelectID: Byte;
    w1: Word;
    dCreateDate: TDateTime; //创建时间
    sName: string[15]; //0x15  //角色名称   28
  end;
  pTRecordHeader = ^TRecordHeader;

  TQuestUnit = array[0..34] of Byte;
  TQuestFlag = array[0..82] of Byte;
  TStatusTime = array[0..11] of Word;

  THumData = packed record
    sChrName: string[14]; //0x14  //角色名称
    sCurMap: string[16]; //0x04  //返城地图   57
    wCurX: Word; //0x24  人物所在座标X(2字节) 59
    wCurY: Word; //0x28  人物所在座标Y(2字节) 61
    btDir: Byte; //0x2C  人物所在方向(1字节) 62
    btHair: Byte; //0x2E  人物的头发(1字节)   63
    btSex: Byte; //0x2D  人物的性别(1字节)   64
    btJob: Byte; //0x2F  人物的职业(1字节)   65
    nGold: Integer; //0x30  人物金币数(4字节)   69
    Abil: TAbility; //0x34 -> 0x5B    //44 人物属性  113    50
    BonusAbil: TNakedAbility; //20                 133
    sHomeMap: string[17]; //17  0x78  //回城地图               150
    wHomeX: Word; //0x8C  //回城座标X                 152
    wHomeY: Word; //0x90  //回城座标Y                 154
    N1: array[0..14] of Byte; //未知
    sMasterName: string[14];
    boMaster: Boolean; //是否是师傅
    btCreditPoint: Byte; //声望
    N2: Word; //未知
    sStoragePwd: string[7]; //仓库密码
    btReLevel: Byte; //转生等级
    N3: array[0..22] of Byte; //未知
    nBonusPoint: Integer; //属性点
    nGameGold: Integer; //元宝
    nGamePoint: Integer; //泡点
    nPayMentPoint: Integer; //冲值点
    n4: array[0..3] of Byte;
    nPKPoint: Word; //PK值
    btAllowGroup: Byte; //允许组队
    btF9: Byte;
    btAttatckMode: Byte;
    btIncHealth: Byte;
    btIncSpell: Byte;
    btIncHealing: Byte;
    btFightZoneDieCount: Byte;
    n5: array[0..1] of Byte;
    sAccount: string[10]; //账号
    btEE: Byte;
    boLockLogon: Boolean;
    wContribution: Word; //贡献度
    btEF: Byte;
    nHungerStatus: Integer;
    boAllowGuildReCall: Boolean;
    wGroupRcallTime: Word;
    dBodyLuck: Double;
    boAllowGroupReCall: Boolean; //17
    QuestUnitOpen: TQuestUnit; //35
    QuestUnit: TQuestUnit; //35
    sDearName: string[14]; //老婆名称
    n8: Word;
    btDivorce: Byte; //是否结婚
    n9: Byte;
    btMarryCount: Byte; //结婚次数
    wStatusTimeArr: TStatusTime; //24
    QuestFlag: TQuestFlag; //61
    HumItems: array[0..8] of THumItems; //9格装备 衣服  武器  蜡烛 头盔 项链 手镯 手镯 戒指 戒指
    BagItems: array[0..45] of THumItems; //包裹装备
    Magic: array[0..19] of TMagic; //魔法
    StorageItems: array[0..45] of THumItems; //仓库物品
    HumAddItems: array[0..3] of THumItems; //新增4格 护身符 腰带 鞋子 宝石
  end;
  pTHumData = ^THumData;

  {TQuestUnit = array  [0..29] of Byte;
  TQuestFlag = array  [0..9]  of Byte;
  TStatusTime = array [0..11] of Word;

  THumData    = packed record
    sChrName       :String[14]; //0x14  //角色名称
    sCurMap        :String[16]; //0x04  //返城地图   57
    wCurX          :Word;       //0x24  人物所在座标X(2字节) 59
    wCurY          :Word;       //0x28  人物所在座标Y(2字节) 61
    btDir          :Byte;       //0x2C  人物所在方向(1字节) 62
    btHair         :Byte;       //0x2E  人物的头发(1字节)   63
    btSex          :Byte;       //0x2D  人物的性别(1字节)   64
    btJob          :Byte;       //0x2F  人物的职业(1字节)   65
    nGold          :Integer;    //0x30  人物金币数(4字节)   69
    Abil           :TAbility;   //0x34 -> 0x5B    //44 人物属性  113
    BonusAbil      :TNakedAbility;          //20                 133

    sHomeMap       :String[17]; //17  0x78  //回城地图               150
    wHomeX         :Word;       //0x8C  //回城座标X                 152
    wHomeY         :Word;       //0x90  //回城座标Y                 154
    n1             :array[0..14] of Byte; //未知
    sMasterName    :String[14];
    boMaster       :Boolean;    //是否是师傅
    btCreditPoint  :Byte;       //声望
    n2             :Word;       //未知
    sStoragePwd    :String[7];  //仓库密码
    btReLevel      :Byte;       //转生等级
    n3             :array[0..22] of Byte; //未知
    nBonusPoint    :Integer;        //属性点
    nGameGold      :Integer;        //元宝
    nGamePoint     :Integer;        //泡点
    nPayMentPoint  :Integer;        //冲值点
    n4             :array[0..3] of Byte;
    nPKPoint       :Word;                //PK值

    btAllowGroup   :Byte;       //允许组队
    btF9           :Byte;
    btAttatckMode  :Byte;
    btIncHealth    :Byte;
    btIncSpell     :Byte;
    btIncHealing   :Byte;
    btFightZoneDieCount:Byte;
    n5             :array[0..1] of Byte;
    sAccount       :String[10];//账号
    //n5             :array[0..8] of Byte;     //0..8
    btEE           :Byte;
    boLockLogon    :Boolean;
    //n6             :Word;
    wContribution  :Word;                //贡献度
    btEF           :Byte;
    nHungerStatus  :Integer;
    boAllowGuildReCall :Boolean;
    wGroupRcallTime    :Word;//Double
    dBodyLuck          :Double;
    boAllowGroupReCall :Boolean;       //17

    QuestUnitOpen  :TQuestUnit;    //72
    QuestUnit      :TQuestUnit;
    QuestFlag      :TQuestFlag;
    //n7             :array[0..86] of Byte;//未知
    sDearName      :String[14];          //老婆名称
    n8             :Word;
    btDivorce      :Byte;                //是否结婚
    n9             :Byte;
    btMarryCount   :Byte;                //结婚次数
    wStatusTimeArr :TStatusTime; //? //24  12 * 2
    n10            :array [0..82]  of Byte;//未知
    HumItems       :array [0..8]   of THumItems;  //9格装备 衣服  武器  蜡烛 头盔 项链 手镯 手镯 戒指 戒指
    BagItems       :array [0..45]  of THumItems;  //包裹装备
    Magic          :array [0..19]  of TMagic;     //魔法
    StorageItems   :array [0..45]  of THumItems;  //仓库物品
    HumAddItems    :array [0..3]   of THumItems;  //新增4格 护身符 腰带 鞋子 宝石
  end; }

  THumDataInfo = packed record //Size 3164
    Header: TRecordHeader;
    Data: THumData;
  end;
  pTHumDataInfo = ^THumDataInfo;

  THumInfo = packed record //Size 72
    Header: TRecordHeader;
    sChrName: string[14]; //0x14  //角色名称   44
    sAccount: string[10]; //账号
    boDeleted: Boolean; //是否删除
    bt1: Byte; //未知
    dModDate: TDateTime;
    btCount: Byte; //操作计次
    boSelected: Boolean; //是否选择
    n6: array[0..5] of Byte;
  end;
  pTHumInfo = ^THumInfo;

  TIdxRecord = record
    sChrName: string[15];
    nIndex: Integer;
  end;
  pTIdxRecord = ^TIdxRecord;


  TFileHumDB = class
    n4: Integer; //0x04
    m_nFileHandle: Integer; //0x08
    n0C: Integer; //0x0C
    m_OnChange: TNotifyEvent;

    m_boChanged: Boolean; //0x18
    m_Header: TDBHeader; //0x1C
    m_QuickList: TQuickList; //0x98
    m_QuickIDList: TQuickIDList; //0x9C
    m_DeletedList: TList; //0xA0 已被删除的记录号
    m_sDBFileName: string; //0xA4
  private
    procedure LoadQuickList;
    procedure Lock;
    procedure UnLock;
    function UpdateRecord(nIndex: Integer; HumRecord: THumInfo; boNew: Boolean): Boolean;
    function DeleteRecord(nIndex: Integer): Boolean;
    function GetRecord(n08: Integer; var HumDBRecord: THumInfo): Boolean;
  public
    constructor Create(sFileName: string);
    destructor Destroy; override;

    function Open(): Boolean;
    function OpenEx(): Boolean;
    procedure Close();
    function Index(sName: string): Integer;
    function Get(n08: Integer; var HumDBRecord: THumInfo): Integer;
    function GetBy(n08: Integer; var HumDBRecord: THumInfo): Boolean;
    function FindByName(sChrName: string; ChrList: TStringList): Integer;
    function FindByAccount(sAccount: string; var ChrList: TStringList): Integer;
    function ChrCountOfAccount(sAccount: string): Integer;
    function Add(HumRecord: THumInfo): Boolean;
    function Delete(sName: string): Boolean;
    function Update(nIndex: Integer; var HumDBRecord: THumInfo): Boolean;
    function UpdateBy(nIndex: Integer; var HumDBRecord: THumInfo): Boolean;

  end;
  TFileDB = class
    n4: Integer; //0x4
    m_nFileHandle: Integer; //0x08
    nC: Integer;
    m_OnChange: TNotifyEvent; //0x10
    m_boChanged: Boolean; //0x18
    m_nLastIndex: Integer; //0x1C
    m_dUpdateTime: TDateTime; //0x20
    m_Header: TDBHeader; //0x28
    m_QuickList: TQuickList; //0xA4
    m_DeletedList: TList; //0xA8 已被删除的记录号
    m_sDBFileName: string; //0xAC
    m_sIdxFileName: string; //0xB0
  private
    procedure LoadQuickList;
    function LoadDBIndex(): Boolean;
    procedure SaveIndex();
    function GetRecord(nIndex: Integer; var HumanRCD: THumDataInfo): Boolean;
    function UpdateRecord(nIndex: Integer; var HumanRCD: THumDataInfo; boNew: Boolean): Boolean;
    function DeleteRecord(nIndex: Integer): Boolean;
  public
    constructor Create(sFileName: string);
    destructor Destroy; override;
    procedure Lock;
    procedure UnLock;
    function Open(): Boolean;
    function OpenEx(): Boolean;
    procedure Close();
    function Index(sName: string): Integer;
    function Get(nIndex: Integer; var HumanRCD: THumDataInfo): Integer;
    function Update(nIndex: Integer; var HumanRCD: THumDataInfo): Boolean;
    function Add(var HumanRCD: THumDataInfo): Boolean;
    function Find(sChrName: string; List: TStrings): Integer;
    procedure Rebuild();
    function Count(): Integer;
    function Delete(sChrName: string): Boolean; overload;
    function Delete(nIndex: Integer): Boolean; overload;
  end;
var
  HumChrDB: TFileHumDB;
  HumDataDB: TFileDB;
implementation

uses DBShare, HUtil32;

{ TFileHumDB }

constructor TFileHumDB.Create(sFileName: string); //0x0048B73C
begin
  m_sDBFileName := sFileName;
  m_QuickList := TQuickList.Create;
  m_QuickIDList := TQuickIDList.Create;
  m_DeletedList := TList.Create;

⌨️ 快捷键说明

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