?? objhero.pas
字號(hào):
{------------------------------------------------------------------------------}
{ 單元名稱: ObjHero.pas }
{ }
{ 單元作者: Mars }
{ 創(chuàng)建日期: 2007-02-12 20:30:00 }
{ }
{ 功能介紹: }
{ 實(shí)現(xiàn)英雄功能單元 }
{ }
{ 使用說明: }
{ }
{ }
{ 更新歷史: }
{ }
{ 尚存問題: }
{ }
{ }
{------------------------------------------------------------------------------}
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; //狀態(tài)
m_boProtectStatus: Boolean; //是否是守護(hù)狀態(tài)
m_boTarget: Boolean; //是否鎖定目標(biāo)
m_nProtectTargetX, m_nProtectTargetY: Integer; //守護(hù)坐標(biāo)
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; //自動(dòng)吃藥
function WarrAttackTarget(wHitMode: Word): Boolean; {物理攻擊}
function WarrorAttackTarget(): Boolean; {戰(zhàn)士攻擊}
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; //自動(dòng)躲避
function SearchIsPickUpItem(): Boolean;
function IsPickUpItem(StdItem: pTStdItem): Boolean;
function IsNeedAvoid(): Boolean; //是否需要躲避
function IsNeedGotoXY(): Boolean; //是否走向目標(biāo)
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; //狀態(tài)
m_boProtectStatus := False; //是否是守護(hù)狀態(tài)
m_boTarget := False; //是否鎖定目標(biāo)
m_nProtectTargetX := -1; //守護(hù)坐標(biāo)
m_nProtectTargetY := -1; //守護(hù)坐標(biāo)
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);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -