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

📄 usrengn.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit UsrEngn;

interface
uses
  Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, ObjNpc, Envir, Grobal2,
  MudUtil, FrnEngn,mylist ;
type
  TMonGenInfo = record
    sMapName: string[14];
    nX: Integer;
    nY: Integer;
    sMonName: string[14];
    nAreaX: Integer;
    nAreaY: Integer;
    nCount: Integer;
    nRange: Integer;
    nMissionGenRate: Integer;
    nRace: Integer;
    dwZenTime: LongWord;
    dwStartTime: LongWord;
    CertList: TMyList;
    Envir: TEnvirnoment;
    dwStartTick: Dword;
  end;
  pTMonGenInfo = ^TMonGenInfo;


  TUserEngine = class
    m_LoadPlaySection: TRTLCriticalSection;
    m_LoadPlayList: TStringList;                            //从DB读取人物数据
    m_PlayObjectList: TStringList;                          //0x8
    m_StringList_0C: TStringList;
    m_PlayObjectFreeList: TMyList;                            //0x10
    m_ChangeHumanDBGoldList: TMyList;                         //0x14
    dwShowOnlineTick: LongWord;                             //0x18
    dwSendOnlineHumTime: LongWord;                          //0x1C
    dwProcessMapDoorTick: LongWord;                         //0x20
    dwProcessMissionsTime: LongWord;                        //0x24
    dwRegenMonstersTick: LongWord;                          //0x28
    CalceTime: LongWord;                                    //0x2C
    m_dwProcessLoadPlayTick: LongWord;                      //0x30
 //   dwTime_34: LongWord;                                    //0x34
    m_nCurrMonGen: Integer;                                 //0x38
    m_nMonGenListPosition: Integer;                         //0x3C
    m_nMonGenCertListPosition: Integer;                     //0x40
    m_nProcHumIDx: Integer; //0x44 处理人物开始索引(每次处理人物数限制)
    nProcessHumanLoopTime: Integer;
    nMerchantPosition: Integer;                             //0x4C
    nNpcPosition: Integer;                                  //0x50
    StdItemList: TMyList;                                     //List_54
    MonsterList: TMyList;                                     //List_58
    m_MonGenList: TMyList;                                    //List_5C
    m_MonFreeList: TMyList;
    m_MagicList: TMyList;                                     //List_60
    m_AdminList: TGList;                                    //List_64
    m_MerchantList: TGList;                                 //List_68
    QuestNPCList: TMyList;                                    //0x6C
   // List_70: TList;
    m_ChangeServerList: TMyList;
    m_MagicEventList: TMyList;                                //0x78
    nMonsterCount: Integer;                                 //怪物总数
    nMonsterProcessPostion: Integer; //0x80处理怪物总数位置,用于计算怪物总数
    n84: Integer;
    nMonsterProcessCount: Integer; //0x88处理怪物数,用于统计处理怪物个数
    boItemEvent: Boolean;                                   //ItemEvent
    n90: Integer;
    dwProcessMonstersTick: LongWord;
    dwProcessMerchantTimeMin: Integer;
    dwProcessMerchantTimeMax: Integer;
    dwProcessNpcTimeMin: LongWord;
    dwProcessNpcTimeMax: LongWord;
    m_NewHumanList: TMyList;
    m_ListOfGateIdx: TMyList;
    m_ListOfSocket: TMyList;
    OldMagicList: TMyList;
  private
    procedure ProcessHumans();
    procedure ProcessMonsters();
    procedure ProcessMerchants();
    procedure ProcessNpcs();
    procedure ProcessMissions();
    procedure Process4AECFC();
    procedure ProcessEvents();
    procedure ProcessMapDoor();
    procedure NPCinitialize;
    procedure MerchantInitialize;
    function MonGetRandomItems(mon: TBaseObject): Integer;
    function RegenMonsters(MonGen: pTMonGenInfo; nCount: Integer): Boolean;
    procedure WriteShiftUserData;
    function GetGenMonCount(MonGen: pTMonGenInfo): Integer;
    function AddBaseObject(sMapName: string; nX, nY: Integer; nMonRace: Integer;
      sMonName: string): TBaseObject;
    procedure GenShiftUserData();
    procedure KickOnlineUser(sChrName: string);
    function SendSwitchData(PlayObject: TPlayObject; nServerIndex: Integer):
      Boolean;
    procedure SendChangeServer(PlayObject: TPlayObject; nServerIndex: Integer);
    procedure AddToHumanFreeList(PlayObject: TPlayObject);

    procedure GetHumData(PlayObject: TPlayObject; var HumanRcd: THumDataInfo);
    function GetHomeInfo(var nX: Integer; var nY: Integer): string;
    function GetRandHomeX(PlayObject: TPlayObject): Integer;
    function GetRandHomeY(PlayObject: TPlayObject): Integer;
    function GetSwitchData(sChrName: string; nCode: Integer): pTSwitchDataInfo;
    procedure LoadSwitchData(SwitchData: pTSwitchDataInfo; var PlayObject:
      TPlayObject);
    procedure DelSwitchData(SwitchData: pTSwitchDataInfo);
    procedure MonInitialize(BaseObject: TBaseObject; sMonName: string);
    function MapRageHuman(sMapName: string; nMapX, nMapY, nRage: Integer):
      Boolean;
    function GetOnlineHumCount(): Integer;
    function GetUserCount(): Integer;
    function GetLoadPlayCount(): Integer;

  public
    constructor Create();
    destructor Destroy; override;
    procedure Initialize();
    procedure ClearItemList(); virtual;
    procedure SwitchMagicList();
        procedure SaveHumanRcd(PlayObject: TPlayObject);

    procedure Run();
    procedure PrcocessData();
    procedure Execute;
    function RegenMonsterByName(sMAP: string; nX, nY: Integer; sMonName:
      string): TBaseObject;
    function GetStdItem(nItemIdx: Integer): pTStdItem; overload;
    function GetStdItem(sItemName: string): pTStdItem; overload;
    function GetStdItemWeight(nItemIdx: Integer): Integer;
    function GetStdItemName(nItemIdx: Integer): string;
    function GetStdItemIdx(sItemName: string): Integer;
    function FindOtherServerUser(sName: string; var nServerIndex): Boolean;
    procedure CryCry(wIdent: Word; pMap: TEnvirnoment; nX, nY, nWide: Integer;
      btFColor, btBColor: Byte; sMsg: string);
    procedure ProcessUserMessage(PlayObject: TPlayObject; DefMsg:
      pTDefaultMessage; Buff: PChar);
    procedure SendServerGroupMsg(nCode, nServerIdx: Integer; sMsg: string);
    function GetMonRace(sMonName: string): Integer;
    function GetPlayObject(sName: string): TPlayObject;
    function FindPlayObject(Playobject: TObject): TPlayObject;

    function GetPlayObjectEx(sName: string;dbindex:Integer): TPlayObject;
    procedure KickPlayObjectEx(sName: string);
    function FindMerchant(Merchant: TObject): TMerchant;
    function FindNPC(GuildOfficial: TObject): TGuildOfficial;
    function CopyToUserItemFromName(sItemName: string; item: pTUserItem):
      Boolean;
    function GetMapOfRangeHumanCount(Envir: TEnvirnoment; nX, nY, nRange:
      Integer): Integer;
    function GetHumPermission(sUserName: string;   var
      btPermission: Byte): Boolean;
    procedure AddUserOpenInfo(UserOpenInfo: pTUserOpenInfo);
    procedure RandomUpgradeItem(item: pTUserItem);
    procedure GetUnknowItemValue(item: pTUserItem);
    function OpenDoor(Envir: TEnvirnoment; nX, nY: Integer): Boolean;
    function CloseDoor(Envir: TEnvirnoment; Door: pTDoorInfo): Boolean;
    procedure SendDoorStatus(Envir: TEnvirnoment; nX, nY: Integer; wIdent, wX:
      Word; nDoorX, nDoorY, nA: Integer; sStr: string);
    function FindMagic(sMagicName: string): pTMagic; overload;
    function FindMagic(nMagIdx: Integer): pTMagic; overload;
    procedure AddMerchant(Merchant: TMerchant);
    function GetMerchantList(Envir: TEnvirnoment; nX, nY, nRange: Integer;
      TmpList: TMyList): Integer;
    function GetNpcList(Envir: TEnvirnoment; nX, nY, nRange: Integer; TmpList:
      TMyList): Integer;
    procedure ReloadMerchantList();
    procedure ReloadNpcList();
    procedure HumanExpire(sAccount: string);
    function GetMapMonster(Envir: TEnvirnoment; List: TMyList): Integer;
    function GetMapRangeMonster(Envir: TEnvirnoment; nX, nY, nRange: Integer;
      List: TMyList): Integer;
    function GetMapHuman(sMapName: string): Integer;
    function GetMapRageHuman(Envir: TEnvirnoment; nRageX, nRageY, nRage:
      Integer; List: TmyList): Integer;
    procedure SendBroadCastMsg(sMsg: string; MsgType: TMsgType);
    procedure SendBroadCastMsgExt(sMsg: string; MsgType: TMsgType);
    procedure sub_4AE514(GoldChangeInfo: pTGoldChangeInfo);
    procedure ClearMonSayMsg();
    procedure SendQuestMsg(sQuestName: string);
    procedure DemoRun();
    procedure ClearMerchantData();
    property MonsterCount: Integer read nMonsterCount;
    property OnlinePlayObject: Integer read GetOnlineHumCount;
    property PlayObjectCount: Integer read GetUserCount;
    property LoadPlayCount: Integer read GetLoadPlayCount;
  end;
var
  g_dwEngineTick                        : LongWord;
  g_dwEngineRunTime                     : LongWord;

implementation

uses IdSrvClient, Guild, ObjMon, M2Share, EDcode, ObjGuard, ObjAxeMon,
  ObjMon2, Event, InterMsgClient, InterServerMsg, ObjRobot, HUtil32, svMain,
  Castle;
var
  nEngRemoteRun                         : Integer = -1;

  tt                                    : Integer;
  { TUserEngine }

constructor TUserEngine.Create();
begin
  InitializeCriticalSection(m_LoadPlaySection);
  m_LoadPlayList := TStringList.Create;
  m_PlayObjectList := TStringList.Create;
  m_StringList_0C := TStringList.Create;
  m_PlayObjectFreeList := TMyList.create;
  m_ChangeHumanDBGoldList := TMyList.create;
  dwShowOnlineTick := GetTickCount;
  dwSendOnlineHumTime := GetTickCount;
  dwProcessMapDoorTick := GetTickCount;
  dwProcessMissionsTime := GetTickCount;
  dwProcessMonstersTick := GetTickCount;
  dwRegenMonstersTick := GetTickCount;
  m_dwProcessLoadPlayTick := GetTickCount;

  m_nCurrMonGen := 0;
  m_nMonGenListPosition := 0;
  m_nMonGenCertListPosition := 0;
  m_nProcHumIDx := 0;
  nProcessHumanLoopTime := 0;
  nMerchantPosition := 0;
  nNpcPosition := 0;
  StdItemList := TMyList.create;                              //List_54
  MonsterList := TMyList.create;
  m_MonGenList := TMyList.create;
  m_MonFreeList := TMyList.create;
  m_MagicList := TMyList.create;
  m_AdminList := TGList.Create;
  m_MerchantList := TGList.Create;
  QuestNPCList := TMyList.create;
  //List_70 := TMyList.create;
  m_ChangeServerList := TMyList.create;
  m_MagicEventList := TMyList.create;
  boItemEvent := False;
  n90 := 1800000;
  dwProcessMerchantTimeMin := 0;
  dwProcessMerchantTimeMax := 0;
  dwProcessNpcTimeMin := 0;
  dwProcessNpcTimeMax := 0;
  m_NewHumanList := TMyList.create;
  m_ListOfGateIdx := TMyList.create;
  m_ListOfSocket := TMyList.create;
  OldMagicList := TMyList.create;
end;

destructor TUserEngine.Destroy;
var
  i                                     : Integer;
  ii                                    : Integer;
  MonInfo                               : pTMonInfo;
  MonGenInfo                            : pTMonGenInfo;
  MagicEvent                            : pTMagicEvent;
  TmpList                               : TMyList;
begin
  for i := 0 to m_LoadPlayList.Count - 1 do
  begin
    DisPose(pTUserOpenInfo(m_LoadPlayList.Objects[i]));
  end;
  m_LoadPlayList.Free;
  for i := 0 to m_PlayObjectList.Count - 1 do
  begin
    TPlayObject(m_PlayObjectList.Objects[i]).Free;
  end;
  m_PlayObjectList.Free;
  m_StringList_0C.Free;

  for i := 0 to m_PlayObjectFreeList.Count - 1 do
  begin
    TPlayObject(m_PlayObjectFreeList.Items[i]).Free;
  end;
  m_PlayObjectFreeList.Free;

  for i := 0 to m_ChangeHumanDBGoldList.Count - 1 do
  begin
    DisPose(pTGoldChangeInfo(m_ChangeHumanDBGoldList.Items[i]));
  end;
  m_ChangeHumanDBGoldList.Free;

  for i := 0 to StdItemList.Count - 1 do
  begin
    DisPose(pTStdItem(StdItemList.Items[i]));
  end;
  StdItemList.Free;

  for i := 0 to MonsterList.Count - 1 do
  begin
    MonInfo := MonsterList.Items[i];
    if MonInfo.ItemList <> nil then
    begin
      for ii := 0 to MonInfo.ItemList.Count - 1 do
      begin
        DisPose(pTMonItemInfo(MonInfo.ItemList.Items[ii]));
      end;
      MonInfo.ItemList.Free;
    end;
    DisPose(MonInfo);
  end;
  MonsterList.Free;

  for i := 0 to m_MonGenList.Count - 1 do
  begin
    MonGenInfo := m_MonGenList.Items[i];
    for ii := 0 to MonGenInfo.CertList.Count - 1 do
    begin
      TBaseObject(MonGenInfo.CertList.Items[ii]).Free;
    end;
    DisPose(pTMonGenInfo(m_MonGenList.Items[i]));
  end;
  m_MonGenList.Free;

  for i := 0 to m_MonFreeList.Count - 1 do
  begin
    TBaseObject(m_MonFreeList.Items[i]).Free;
  end;
  m_MonFreeList.Free;

  for i := 0 to m_MagicList.Count - 1 do
  begin
    DisPose(pTMagic(m_MagicList.Items[i]));
  end;
  m_MagicList.Free;
  m_AdminList.Free;
  for i := 0 to m_MerchantList.Count - 1 do
  begin
    TMerchant(m_MerchantList.Items[i]).Free;
  end;
  m_MerchantList.Free;
  for i := 0 to QuestNPCList.Count - 1 do
  begin
    TNormNpc(QuestNPCList.Items[i]).Free;
  end;
  QuestNPCList.Free;
  //List_70.Free;
  for i := 0 to m_ChangeServerList.Count - 1 do
  begin
    DisPose(pTSwitchDataInfo(m_ChangeServerList.Items[i]));
  end;
  m_ChangeServerList.Free;
  for i := 0 to m_MagicEventList.Count - 1 do
  begin
    MagicEvent := m_MagicEventList.Items[i];
    if MagicEvent.BaseObjectList <> nil then
      MagicEvent.BaseObjectList.Free;

    DisPose(MagicEvent);
  end;
  m_MagicEventList.Free;
  m_NewHumanList.Free;
  m_ListOfGateIdx.Free;
  m_ListOfSocket.Free;
  for i := 0 to OldMagicList.Count - 1 do
  begin
    TmpList := TMyList(OldMagicList.Items[i]);
    for ii := 0 to TmpList.Count - 1 do
    begin
      DisPose(pTMagic(TmpList.Items[ii]));
    end;
    TmpList.Free;
  end;
  OldMagicList.Free;
  DeleteCriticalSection(m_LoadPlaySection);
  inherited;
end;

procedure TUserEngine.Initialize;                           //004B200C
var
  i                                     : Integer;
  MonGen                                : pTMonGenInfo;
begin
  MerchantInitialize();
  NPCinitialize();
  for i := 0 to m_MonGenList.Count - 1 do
  begin
    MonGen := m_MonGenList.Items[i];
    if MonGen <> nil then
    begin
      MonGen.nRace := GetMonRace(MonGen.sMonName);

⌨️ 快捷键说明

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