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

📄 objhero.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{------------------------------------------------------------------------------}
{ 单元名称: ObjHero.pas                                                        }
{                                                                              }
{ 单元作者: Mars                                                               }
{ 创建日期: 2007-02-12 20:30:00                                                }
{                                                                              }
{ 功能介绍:                                                                    }
{   实现英雄功能单元                                                           }
{                                                                              }
{ 使用说明:                                                                    }
{                                                                              }
{                                                                              }
{ 更新历史:                                                                    }
{                                                                              }
{ 尚存问题:                                                                    }
{                                                                              }
{                                                                              }
{------------------------------------------------------------------------------}
unit ObjHero;

interface
uses
  Windows, SysUtils, StrUtils, Classes, Grobal2, ObjBase, IniFiles, Castle;
type
  THeroObject = class(TBaseObject)
    n54C: Integer;
    m_dwThinkTick: LongWord;
    bo554: Boolean;
    m_boDupMode: Boolean;
    m_nNotProcessCount: Integer;
    m_nTargetX: Integer;
    m_nTargetY: Integer;
    m_boRunAwayMode: Boolean;
    m_dwRunAwayStart: LongWord;
    m_dwRunAwayTime: LongWord;
    m_boCanPickUpItem: Boolean;
    m_boSlavePickUpItem: Boolean;
    m_dwPickUpItemTick: LongWord;
    m_boIsPickUpItem: Boolean;
    m_nPickUpItemMakeIndex: Integer;
    m_SelMapItem: PTMapItem;

    m_wHitMode: Word;

    m_btOldDir: Byte;
    m_dwActionTick: LongWord;
    m_wOldIdent: Word;

    m_dwTurnIntervalTime: LongWord;
    m_dwMagicHitIntervalTime: LongWord;
    m_dwHitIntervalTime: LongWord;
    m_dwRunIntervalTime: LongWord;
    m_dwWalkIntervalTime: LongWord;

    m_dwActionIntervalTime: LongWord;
    m_dwRunLongHitIntervalTime: LongWord;
    m_dwWalkHitIntervalTime: LongWord;
    m_dwRunHitIntervalTime: LongWord;
    m_dwRunMagicIntervalTime: LongWord;

    m_nDieDropUseItemRate: Integer; //死亡掉装备几率
    m_SkillUseTick: array[0..60 - 1] of LongWord; //魔法使用间隔
    m_nItemBagCount: Integer;
    m_btStatus: Byte; //状态
    m_boProtectStatus: Boolean; //是否是守护状态
    m_boTarget: Boolean; //是否锁定目标
    m_nProtectTargetX, m_nProtectTargetY: Integer; //守护坐标
    m_dwAutoAvoidTick: LongWord;
    m_boIsNeedAvoid: Boolean;

    m_dwEatItemTick: LongWord;
    m_dwSearchIsPickUpItemTick: LongWord;
    m_dwSearchIsPickUpItemTime: LongWord;
    m_boCanDrop: Boolean;
    m_boCanUseItem: Boolean; //是否允许使用物品
    m_boCanWalk: Boolean;
    m_boCanRun: Boolean;
    m_boCanHit: Boolean;
    m_boCanSpell: Boolean;
    m_boCanSendMsg: Boolean;
    m_btReLevel: Byte;
    m_btCreditPoint: Byte;
    m_nMemberType: Integer;
    m_nMemberLevel: Integer;
    m_nKillMonExpMultiple: Integer;
    m_nKillMonExpRate: Integer;

    m_dwMagicAttackInterval: LongWord;
    m_dwMagicAttackTick: LongWord;
    m_dwSearchMagic: LongWord;
    m_nSelectMagic: Integer;
    m_boIsUseMagic: Boolean;
    m_boIsUseAttackMagic: Boolean;
    m_btLastDirection: Byte;
    m_wLastHP: Word;
    m_nPickUpItemPosition: Integer;
    m_nFirDragonPoint: Integer;
    m_dwAddFirDragonTick: LongWord;
    m_boStartUseSpell: Boolean;
    m_nStartUseSpell: Integer;
    m_dwStartUseSpellTick: LongWord;
    m_boNewHuman: Boolean;
  private
    function Think: Boolean;
    function GetSpellPoint(UserMagic: pTUserMagic): Integer;

    function SearchPickUpItem(nPickUpTime: Integer): Boolean;
    procedure EatMedicine();
    function AutoEatUseItems(btItemType: Byte): Boolean; //自动吃药
    function WarrAttackTarget(wHitMode: Word): Boolean; {物理攻击}
    function WarrorAttackTarget(): Boolean; {战士攻击}
    function WizardAttackTarget(): Boolean; {法师攻击}
    function TaoistAttackTarget(): Boolean; {道士攻击}
    function CompareHP(BaseObject1, BaseObject2: TBaseObject): Boolean;
    function CompareLevel(BaseObject1, BaseObject2: TBaseObject): Boolean;
    function CompareXY(BaseObject1, BaseObject2: TBaseObject): Boolean;
    function EatUseItems(nShape: Integer): Boolean;
    function AutoAvoid(): Boolean; //自动躲避

    function SearchIsPickUpItem(): Boolean;
    function IsPickUpItem(StdItem: pTStdItem): Boolean;

    function IsNeedAvoid(): Boolean; //是否需要躲避
    function IsNeedGotoXY(): Boolean; //是否走向目标

    function CheckUserMagic(wMagIdx: Word): pTUserMagic;
    function CheckTargetXYCount(nX, nY, nRange: Integer): Integer;

    function GotoTargetXYRange(): Boolean;
    function GetUserItemList(nItemType: Integer): Integer;
    function UseItem(nItemType, nIndex: Integer): Boolean;
    function CheckUserItemType(nItemType: Integer): Boolean;
    function CheckItemType(nItemType: Integer; StdItem: pTStdItem): Boolean;
    function FindMagic(wMagIdx: Word): pTUserMagic;
    function CheckTargetXYCountOfDirection(nX, nY, nDir, nRange: Integer): Integer;
    procedure SearchMagic();
    function SelectMagic(): Integer; //选择魔法
    function IsUseMagic(): Boolean;
    function IsUseAttackMagic(): Boolean;
    function IsSearchTarget: Boolean;
    function CheckActionStatus(wIdent: Word; var dwDelayTime: LongWord): Boolean;
    function DoMotaebo(nDir: Byte; nMagicLevel: Integer): Boolean;
    procedure RepairAllItem();
    function GetTogetherUseSpell: Integer;

  public
    constructor Create(); override;
    destructor Destroy; override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override;
    function AttackTarget(): Boolean;
    function CheckTakeOnItems(nWhere: Integer; var StdItem: TStdItem): Boolean;
    function IsEnoughBag(): Boolean;
    procedure RecalcAbilitys; override;
    procedure Run; override;
    procedure Die; override;
    function GetShowName(): string; override;
    procedure ItemDamageRevivalRing();
    procedure DoDamageWeapon(nWeaponDamage: Integer);
    procedure StruckDamage(nDamage: Integer);
    function IsAllowUseMagic(wMagIdx: Word): Boolean;
    procedure SearchTarget();
    procedure DelTargetCreat(); override;
    procedure SetTargetXY(nX, nY: Integer); virtual;
    function WalkToTargetXY2(nTargetX, nTargetY: Integer): Boolean;
    function WalkToTargetXY(nTargetX, nTargetY: Integer): Boolean;
    function RunToTargetXY(nTargetX, nTargetY: Integer): Boolean;
    function GotoTargetXY(nTargetX, nTargetY: Integer): Boolean;

    procedure Wondering(); virtual;
    procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer); virtual;
    procedure Struck(hiter: TBaseObject); virtual;

    procedure ClientQueryBagItems();

    procedure RefMyStatus();
    function AddItemToBag(UserItem: pTUserItem): Boolean;
    procedure WeightChanged;
    function ReadBook(StdItem: pTStdItem): Boolean;
    function EatItems(StdItem: pTStdItem): Boolean;
    procedure SysMsg(sMsg: string; MsgColor: TMsgColor; MsgType: TMsgType);
    procedure SendSocket(DefMsg: pTDefaultMessage; sMsg: string);
    procedure SendDefMessage(wIdent: Word; nRecog: Integer; nParam, nTag, nSeries: Word; sMsg: string);
    procedure SendMsg(BaseObject: TBaseObject; wIdent, wParam: Word; nParam1, nParam2, nParam3: Integer; sMsg: string);
    procedure SendUpdateMsg(BaseObject: TBaseObject; wIdent, wParam: Word; lParam1, lParam2, lParam3: Integer; sMsg: string);
    procedure SendDelayMsg(BaseObject: TBaseObject; wIdent, wParam: Word; lParam1, lParam2, lParam3: Integer; sMsg: string; dwDelay: LongWord);
    procedure SendUpdateDelayMsg(BaseObject: TBaseObject; wIdent, wParam: Word; lParam1, lParam2, lParam3: Integer; sMsg: string; dwDelay: LongWord);
    procedure SendChangeItems(nWhere1, nWhere2: Integer; UserItem1, UserItem2: pTUserItem);
    procedure SendUseitems();
    procedure SendUseMagic();
    procedure SendDelMagic(UserMagic: pTUserMagic);
    procedure SendAddMagic(UserMagic: pTUserMagic);
    procedure SendAddItem(UserItem: pTUserItem);
    procedure SendDelItemList(ItemList: TStringList);
    procedure SendDelItems(UserItem: pTUserItem);
    procedure SendUpdateItem(UserItem: pTUserItem);
    procedure ClientHeroUseItems(nItemIdx: Integer; sItemName: string); //英雄吃药
    procedure GetBagItemCount;
    procedure MakeWeaponUnlock;
    function WeaptonMakeLuck: Boolean;
    function RepairWeapon: Boolean;
    function SuperRepairWeapon: Boolean;
    procedure GetExp(dwExp: LongWord);
    procedure WinExp(dwExp: LongWord);
    procedure GainExp(dwExp: LongWord);
    function AbilityUp(UserMagic: pTUserMagic): Boolean;
    function ClientSpellXY(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
      TargeTBaseObject: TBaseObject): Boolean;
    function ClientDropItem(sItemName: string; nItemIdx: Integer): Boolean;
    function DoSpell(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; BaseObject: TBaseObject): Boolean;
    function FindTogetherMagic: pTUserMagic;
    function WearFirDragon: Boolean;
    procedure RepairFirDragon(btType: Byte; nItemIdx: Integer; sItemName: string);

    procedure MakeSaveRcd(var HumanRcd: THumDataInfo);
    procedure Login();
  end;

implementation
uses UsrEngn, M2Share, Event, Envir, Magic, HUtil32, PlugIn, Common, EDcode;

{ THeroObject }

constructor THeroObject.Create;
begin
  inherited;
  m_btRaceServer := RC_HEROOBJECT;
  m_boDupMode := False;
  bo554 := False;
  m_dwThinkTick := GetTickCount();
  m_nViewRange := 12;
  m_nRunTime := 250;
  m_dwSearchTick := GetTickCount();
  m_nCopyHumanLevel := 3;
  m_nNotProcessCount := 0;
  m_nTargetX := -1;
  dwTick3F0 := Random(4) * 500 + 1000;
  dwTick3F4 := GetTickCount();
  m_btNameColor := 6;
  m_boFixedHideMode := True;
  m_dwHitIntervalTime := g_Config.dwHitIntervalTime; //攻击间隔
  m_dwMagicHitIntervalTime := g_Config.dwMagicHitIntervalTime; //魔法间隔
  m_dwRunIntervalTime := g_Config.dwRunIntervalTime; //走路间隔
  m_dwWalkIntervalTime := g_Config.dwWalkIntervalTime; //走路间隔
  m_dwTurnIntervalTime := g_Config.dwTurnIntervalTime; //换方向间隔
  m_dwActionIntervalTime := g_Config.dwActionIntervalTime; //组合操作间隔
  m_dwRunLongHitIntervalTime := g_Config.dwRunLongHitIntervalTime; //组合操作间隔
  m_dwRunHitIntervalTime := g_Config.dwRunHitIntervalTime; //组合操作间隔
  m_dwWalkHitIntervalTime := g_Config.dwWalkHitIntervalTime; //组合操作间隔
  m_dwRunMagicIntervalTime := g_Config.dwRunMagicIntervalTime; //跑位魔法间隔

  m_dwHitTick := GetTickCount - LongWord(Random(3000));
  m_dwWalkTick := GetTickCount - LongWord(Random(3000));
  m_nWalkSpeed := 300;
  m_nWalkStep := 10;
  m_dwWalkWait := 0;
  m_dwSearchEnemyTick := GetTickCount();
  m_boRunAwayMode := False;
  m_dwRunAwayStart := GetTickCount();
  m_dwRunAwayTime := 0;
  m_boCanPickUpItem := True;
  m_boSlavePickUpItem := False;
  m_dwPickUpItemTick := GetTickCount();
  m_dwAutoAvoidTick := GetTickCount();
  m_dwEatItemTick := GetTickCount();
  m_boIsNeedAvoid := False;
  m_SelMapItem := nil;
  m_boIsPickUpItem := False;
  m_nNextHitTime := 300;
  m_nDieDropUseItemRate := 100;
  m_nItemBagCount := 10;
  m_btStatus := 0; //状态
  m_boProtectStatus := False; //是否是守护状态
  m_boTarget := False; //是否锁定目标

  m_nProtectTargetX := -1; //守护坐标
  m_nProtectTargetY := -1; //守护坐标

  m_boCanDrop := True; //是否允许扔物品
  m_boCanUseItem := True; //是否允许使用物品
  m_boCanWalk := True;
  m_boCanRun := True;
  m_boCanHit := True;
  m_boCanSpell := True;
  m_boCanSendMsg := True;
  m_btReLevel := 0;
  m_btCreditPoint := 0;
  m_nMemberType := 0;
  m_nMemberLevel := 0;
  m_nKillMonExpMultiple := 1;
  m_nKillMonExpRate := 100;
  m_boIsUseMagic := False;
  m_boIsUseAttackMagic := False;
  m_nSelectMagic := 0;
  m_nPickUpItemPosition := 0;
  m_nFirDragonPoint := 0;
  m_dwAddFirDragonTick := GetTickCount();
  m_btLastDirection := m_btDirection;
  m_wLastHP := 0;
  m_nStartUseSpell := 0;
  m_boStartUseSpell := False;
  m_dwSearchMagic := GetTickCount();
  FillChar(m_SkillUseTick, SizeOf(m_SkillUseTick), 0);
  m_boNewHuman := False;
end;

destructor THeroObject.Destroy;
begin
  inherited;
end;

procedure THeroObject.SysMsg(sMsg: string; MsgColor: TMsgColor; MsgType: TMsgType);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  m_Master.SysMsg('(英雄)' + sMsg, MsgColor, MsgType);
end;

procedure THeroObject.SendSocket(DefMsg: pTDefaultMessage; sMsg: string);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  TPlayObject(m_Master).SendSocket(DefMsg, sMsg);
end;

procedure THeroObject.SendDefMessage(wIdent: Word; nRecog: Integer; nParam, nTag, nSeries: Word; sMsg: string);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  TPlayObject(m_Master).SendDefMessage(wIdent, nRecog, nParam, nTag, nSeries, sMsg);
end;

procedure THeroObject.SendMsg(BaseObject: TBaseObject; wIdent, wParam: Word; nParam1, nParam2, nParam3: Integer; sMsg: string);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  m_Master.SendMsg(BaseObject, wIdent, wParam, nParam1, nParam2, nParam3, sMsg);
end;

procedure THeroObject.SendUpdateMsg(BaseObject: TBaseObject; wIdent, wParam: Word;
  lParam1, lParam2, lParam3: Integer; sMsg: string);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  m_Master.SendUpdateMsg(BaseObject, wIdent, wParam, lParam1, lParam2, lParam3, sMsg);
end;

procedure THeroObject.SendDelayMsg(BaseObject: TBaseObject; wIdent, wParam: Word; lParam1, lParam2, lParam3: Integer; sMsg: string; dwDelay: LongWord);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  m_Master.SendDelayMsg(BaseObject, wIdent, wParam, lParam1, lParam2, lParam3, sMsg, dwDelay);
end;

procedure THeroObject.SendUpdateDelayMsg(BaseObject: TBaseObject; wIdent, wParam: Word; lParam1, lParam2, lParam3: Integer; sMsg: string; dwDelay: LongWord);
begin
  if m_Master = nil then Exit;
  if (m_Master <> nil) and TPlayObject(m_Master).m_boNotOnlineAddExp then Exit;
  m_Master.SendUpdateDelayMsg(BaseObject, wIdent, wParam, lParam1, lParam2, lParam3, sMsg, dwDelay);

⌨️ 快捷键说明

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