📄 usrengn.pas
字号:
unit UsrEngn;
interface
uses
Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, ObjNpc, Envir, Grobal2, SDK;
type
TMonGenInfo = record
sMapName: string[14];
nRace: Integer;
nRange: Integer;
nMissionGenRate: Integer;
dwStartTick: LongWord;
nX: Integer;
nY: Integer;
sMonName: string[14];
nAreaX: Integer;
nAreaY: Integer;
nCount: Integer;
dwZenTime: LongWord;
dwStartTime: LongWord;
CertList: TList;
Envir: TEnvirnoment;
TList_3C: TList;
end;
pTMonGenInfo = ^TMonGenInfo;
TMapMonGenCount = record
sMapName: string[14];
nMonGenCount: Integer;
dwNotHumTimeTick: LongWord;
nClearCount: Integer;
boNotHum: Boolean;
dwMakeMonGenTimeTick: LongWord;
nMonGenRate: Integer; //刷怪倍数 10
dwRegenMonstersTime: LongWord; //刷怪速度 200
end;
pTMapMonGenCount = ^TMapMonGenCount;
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_MapMonGenCountList: 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;
m_nLimitUserCount: Integer; //限制用户数
m_nLimitNumber: Integer; //限制使用天数或次数
m_boStartLoadMagic: Boolean;
dwSaveDataTick: LongWord;
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;
function AddPlayObject(PlayObject: TPlayObject; nX, nY: 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(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();
procedure Execute;
function RegenMonsterByName(sMAP: string; nX, nY: Integer; sMonName: string): TBaseObject;
function RegenPlayByName(PlayObject: TPlayObject; 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 InsMonstersList(MonGen: pTMonGenInfo; Monster: TAnimalObject): Boolean;
function GetPlayObject(sName: string): TPlayObject;
function GetPlayObjectEx(sAccount, sName: string): TPlayObject;
function GetPlayObjectExOfAutoGetExp(sAccount: string): TPlayObject;
function InPlayObjectList(PlayObject: TPlayObject): Boolean;
procedure KickPlayObjectEx(sAccount, sName: string);
function FindMerchant(Merchant: TObject): TMerchant;
function FindNPC(GuildOfficial: TObject): TGuildOfficial;
function InMerchantList(Merchant: TMerchant): Boolean;
function InQuestNPCList(NPC: TNormNpc): Boolean;
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;
function AddMagic(Magic: pTMagic): Boolean;
function DelMagic(wMagicId: Word): Boolean;
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 ClearMerchantData();
function GetMapMonGenCount(sMapName: string): pTMapMonGenCount;
function AddMapMonGenCount(sMapName: string; nMonGenCount: Integer): Integer;
function ClearMonsters(sMapName: string): Boolean;
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, EDcode, ObjGuard, ObjAxeMon, M2Share,
ObjMon2, ObjPlayMon, Event, InterMsgClient, InterServerMsg, ObjRobot, HUtil32, svMain,
Castle, PlugOfEngine;
{ 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;
dwSaveDataTick := GetTickCount;
dwTime_34 := GetTickCount;
m_nCurrMonGen := 0;
m_nMonGenListPosition := 0;
m_nMonGenCertListPosition := 0;
m_nProcHumIDx := 0;
nProcessHumanLoopTime := 0;
nMerchantPosition := 0;
nNpcPosition := 0;
m_nLimitNumber := 0;
m_nLimitUserCount := 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;
m_MapMonGenCountList := 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;
m_boStartLoadMagic := False;
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;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -