📄 usrengn.pas
字号:
unit UsrEngn;
interface
uses
Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, MudUtil, ObjNpc, Envir,
ItmUnit, Grobal2, SDK;
type
TUserEngine = class
m_LoadPlaySection: TRTLCriticalSection;
m_LoadPlayList: TStringList; //从DB读取人物数据
m_PlayObjectList: TStringList; //0x8
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_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 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 SaveHumanRcd(PlayObject: TPlayObject);
procedure AddToHumanFreeList(PlayObject: TPlayObject);
procedure GetHumData(PlayObject: TPlayObject; var HumanRcd: THumDataInfo);
function GetHomeInfo(nJob: Integer; 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 Run();
procedure PrcocessData();
function RegenMonsterByName(sMap: string; nX, nY: Integer; sMonName: string): TBaseObject;
function GetStdItem(nItemIdx: Integer): TItem; overload;
function GetStdItem(sItemName: string): TItem; 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);
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);
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 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, ObjMon3, 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_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;
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;
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;
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 := 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; //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);
end;
end;
end;
function TUserEngine.GetMonRace(sMonName: string): Integer; //004ACDD8
var
i: Integer;
MonInfo: pTMonInfo;
begin
Result := -1;
for i := 0 to MonsterList.Count - 1 do
begin
MonInfo := MonsterList.Items[i];
if CompareText(MonInfo.sName, sMonName) = 0 then
begin
Result := MonInfo.btRace;
Break;
end;
end;
end;
procedure TUserEngine.MerchantInitialize; //004AC96C
var
i: Integer;
Merchant: TMerchant;
sCaption: string;
begin
sCaption := FrmMain.Caption;
m_MerchantList.Lock;
try
for i := m_MerchantList.Count - 1 downto 0 do
begin
Merchant := TMerchant(m_MerchantList.Items[i]);
Merchant.m_PEnvir := g_MapManager.FindMap(Merchant.m_sMapName);
if Merchant.m_PEnvir <> nil then
begin
Merchant.Initialize; //FFFE
if Merchant.m_boAddtoMapSuccess and (not Merchant.m_boIsHide) then
begin
MainOutMessage('Merchant Initalize fail...' + Merchant.m_sCharName + ' ' + Merchant.m_sMapName + '(' + IntToStr(Merchant.m_nCurrX) + ':' + IntToStr(Merchant.m_nCurrY) + ')');
m_MerchantList.Delete(i);
Merchant.Free;
end else
begin
Merchant.LoadNpcScript();
Merchant.LoadNPCData();
end;
end else
begin
MainOutMessage(Merchant.m_sCharName + ' - Merchant Initalize fail... (m.PEnvir=nil)');
m_MerchantList.Delete(i);
Merchant.Free;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -