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

📄 usrengn.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit UsrEngn;

interface

uses
  Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, ObjNpc, Envir ,Grobal2,SDK,Magic;

type
  TUserEngine = class
    m_LoadPlaySection         :TRTLCriticalSection;
    m_LoadPlayList            :TStringList;       //从DB读取人物数据
    m_PlayObjectList          :TStringList;       //0x8
    m_StringList_0C           :TStringList;
    m_PlayObjectFreeList      :TList;      //0x10
    m_ChangeHumanDBGoldList   :TList;      //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               :TList;     //List_54
    MonsterList               :TList;     //List_58
    m_MonGenList              :TList;     //List_5C
    m_MonFreeList             :TList;
    m_MagicList               :TList;     //List_60
    m_TimerList               :Tlist;
    m_AdminList               :TGList;     //List_64
    m_MerchantList            :TGList;     //List_68
    QuestNPCList              :TList;     //0x6C
    List_70                   :TList;
    m_ChangeServerList        :TList;
    m_MagicEventList          :TList;    //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            :TList;
    m_ListOfGateIdx           :TList;
    m_ListOfSocket            :TList;
    OldMagicList              :TList;
  private
    procedure ProcessMerchants();
    procedure ProcessNpcs();
    procedure ProcessMissions();
    procedure ProcessTimer();
    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;
    function  makenewplay(s_name :string;human:Tplayobject):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 CopyHumData(var PlayObject: TBASEOBJECT;HumData: TPlayObject);
    procedure SaveHumanRcd(PlayObject:TPlayObject);
    procedure NewHumanYS(PlayObject:TPlayObject;sAccount,sChrName:String;bHair,bJob,bSex:byte;sYsnameMaster:String;nSessionID:Integer);

    procedure Run();
    procedure PrcocessData();
    procedure Execute;
    procedure ProcessHumans();
    procedure ProcessMonsters();
    
    function RegenMonsterByName(sMap:String;nX,nY:Integer;sMonName:String):TBaseObject;
    function RegenMonsterysByName(sMonName: String;human:Tplayobject):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 GetPlayObjectEx(sName:String):TPlayObject;
    procedure KickPlayObjectEx(sName:String);
    procedure endofflineUser(sAccount,sCharName:String;var boys:boolean);

    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 sIPaddr: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:TList):Integer;
    function  GetNpcList(Envir:TEnvirnoment;nX,nY,nRange:Integer;TmpList:TList):Integer;
    procedure ReloadMerchantList();
    procedure ReloadNpcList();
    procedure HumanExpire(sAccount:String);
    function GetMapMonster(Envir:TEnvirnoment;List:TList):Integer;
    function GetMapMonsterx(Envir:TEnvirnoment;List:TList):Integer;

    function GetAllMonstercount():Integer;

    function GetMapRangeMonster(Envir:TEnvirnoment;nX,nY,nRange:Integer;List:TList):Integer;
    function GetMapHuman(sMapName:String):Integer;
    function GetMapRageHuman(Envir:TEnvirnoment;nRageX,nRageY,nRage:Integer;List:TList):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,Objys,Objmonty, Event, InterMsgClient, InterServerMsg, ObjRobot, HUtil32, svMain,
  Castle;

var
  nEngRemoteRun:Integer= -1;

{ TUserEngine }
constructor TUserEngine.Create();
begin
  InitializeCriticalSection(m_LoadPlaySection);
  m_LoadPlayList            := TStringList.Create;
  m_PlayObjectList          := TStringList.Create;
  m_StringList_0C           := TStringList.Create;
  m_PlayObjectFreeList      := TList.Create;
  m_ChangeHumanDBGoldList   := TList.Create;
  dwShowOnlineTick          := GetTickCount;
  dwSendOnlineHumTime       := GetTickCount;
  dwProcessMapDoorTick      := GetTickCount;
  dwProcessMissionsTime     := GetTickCount;
  dwProcessMonstersTick     := GetTickCount;
  dwRegenMonstersTick       := GetTickCount;
  m_dwProcessLoadPlayTick   := GetTickCount;
  dwTime_34                 := GetTickCount;
  m_nCurrMonGen             := 0;
  m_nMonGenListPosition     := 0;
  m_nMonGenCertListPosition := 0;
  m_nProcHumIDx             := 0;
  nProcessHumanLoopTime     := 0;
  nMerchantPosition         := 0;
  nNpcPosition              := 0;
  StdItemList               := TList.Create;     //List_54
  MonsterList               := TList.Create;
  m_MonGenList              := TList.Create;
  m_MonFreeList             := TList.Create;
  m_MagicList               := TList.Create;
  m_AdminList               := TGList.Create;
  m_MerchantList            := TGList.Create;
  QuestNPCList              := TList.Create;
  m_TimerList               := TList.Create;  //hint
  List_70                   := TList.Create;
  m_ChangeServerList        := TList.Create;
  m_MagicEventList          := TList.Create;
  boItemEvent               := False;
  n90                       := 1800000;
  dwProcessMerchantTimeMin  := 0;
  dwProcessMerchantTimeMax  := 0;
  dwProcessNpcTimeMin       := 0;
  dwProcessNpcTimeMax       := 0;
  m_NewHumanList            := TList.Create;
  m_ListOfGateIdx           := TList.Create;
  m_ListOfSocket            := TList.Create;
  OldMagicList              := TList.Create;
end;

destructor TUserEngine.Destroy;
var
  I          :Integer;
  II         :Integer;
  MonInfo    :pTMonInfo;
  MonGenInfo :pTMonGenInfo;
  MagicEvent :pTMagicEvent;
  tmpList    :TList;
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(pTMonItem(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;
    MonGenInfo.CertList.free;      //hint 释放
    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;
  
  for i:= 0 to m_AdminList.count -1 do begin      //hint 释放
    Dispose(pTAdminInfo(m_AdminList.Items[i]));
  end;
  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 m_TimerList.Count - 1 do begin    //定时器指针表
    Dispose(pTtimergoto(m_TimerList.Items[i]));
  end;
  m_TimerList.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:=TList(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;
var
  i:Integer;
  MonGen:pTMonGenInfo;
begin
  MerchantInitialize();
  NPCinitialize();

⌨️ 快捷键说明

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