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

📄 magic.~pas

📁 继续更新AFT源代码 现在解决了无法登陆游戏的问题 用0504的dbserver就可以登陆了 去掉了绿字广告 降低内存占用HOO 去掉了大量的验证问题
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
unit Magic;

interface
uses
  Windows,Classes,Grobal2,ObjBase,SDK,Event;
type
  TMagicManager = class
  private
    function  MagBigHealing(PlayObject:TBaseObject;nPower,nX,nY:integer): Boolean;
    function  MagGroupjd(PlayObject:TBaseObject;nX,nY:integer): Boolean;
    function  MagGroupsg(PlayObject:TBaseObject;nX,nY:integer): Boolean;
    function  MagPushArround(PlayObject:TBaseObject; nPushLevel: integer): integer;
    function  MagADDABILITY (PlayObject:TBaseObject;nLevel: integer;nType:integer): BOOLEAN;
    function  MagTurnUndead(BaseObject,TargeTBaseObject:TBaseObject;nTargetX,nTargetY:Integer;nLevel:Integer):Boolean;
    function  MagMakeHolyCurtain(BaseObject:TBaseObject;nPower:Integer;nX,nY:Integer):Integer;
    function  MagMakeGroupTransparent(BaseObject:TBaseObject;nX,nY:Integer;nHTime:Integer):Boolean;
    function  MagTamming(BaseObject,TargeTBaseObject:TBaseObject;nTargetX,nTargetY:Integer;nMagicLevel:Integer):Boolean;
    function  MagSaceMove(BaseObject:TBaseObject;nLevel:integer):Boolean;
    function  MagSpyMove(playObject: TplayObject;nTargetX,nTargetY: integer;btLevel:integer;ntype:integer): Boolean;

    function  MagYSzhskill78(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
    function  MagYSzhskill79(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
    function  MagYSzhskill80(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
    function  MagYSzhskill81(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
    function  MagYSzhskill83(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
    function  MagYSzhskill85(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel : integer): Boolean;


    function  MagMonMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
    function  MagbaobaoMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;

    function  MagMakeFireCross(PlayObject:TPlayObject;nDamage,nHTime,nX,nY:Integer):Integer;
    function  MagBigExplosion(BaseObject:TBaseObject;nPower,nHTime,nX,nY:Integer;nRage:Integer;ntype:Integer):Boolean;
    function  MagElecBlizzard(BaseObject:TBaseObject;nPower:integer):Boolean;
    function  MabMabe(BaseObject,TargeTBaseObject: TBaseObject;nPower,nLevel, nTargetX, nTargetY: Integer):Boolean;
    function  MagMakeSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
    function  MagMakeshiling(PlayObject: TPlayObject;tx,ty:integer;TargeTBaseObject:Tbaseobject;UserMagic:pTUserMagic):Boolean;
    function  Maglinghunqiang(PlayObject: TPlayObject;tx,ty:integer;TargeTBaseObject:Tbaseobject;UserMagic:pTUserMagic):Boolean;
    function  MagMaketishen(PlayObject: TPlayObject;tx,ty:integer;UserMagic:pTUserMagic):Boolean;
    function  MagMakeSinSuSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
    function  MagMakePowerSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
    function  MagWindTebo(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
    function  MagGroupLightening(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject; var boSpellFire:Boolean):Boolean;
    function  MagGroupwind(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject; var boSpellFire:Boolean):Boolean;

    function  MagGroupAmyounsul(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
    function  MagGroupDeDing(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
    function  MagGroupMb(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;

    function  MagHbFireBall(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;var TargeTBaseObject:TBaseObject):Boolean;
  public
    constructor Create();
    destructor Destroy; override;
    function  MagMakePrivateTransparent(BaseObject:TBaseObject;nHTime:Integer):Boolean;
    function IsWarrSkill(wMagIdx:Integer):Boolean;
    function DoSpell(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;


  end;
  

    THolyCurtainEventarr=array[0..7]of     THolyCurtainEvent ;
   TMagicEvent=record
       BaseObjectList: TList ;
        dwStartTick:LongWord;
        dwTime:LongWord;
        Events:THolyCurtainEventarr;
   end;
  pTMagicEvent=^TMagicEvent ;

  function MPow(UserMagic:pTUserMagic):Integer;
  function GetPower(nPower:Integer;UserMagic:pTUserMagic):Integer;
  function GetPower13(nInt:Integer;UserMagic:pTUserMagic):Integer;
  function GetRPow(wInt:Integer):Word;
  function CheckAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer):Boolean;
  procedure UseAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer);

implementation

uses HUtil32, M2Share,  Envir;

function MPow(UserMagic:pTUserMagic):Integer;
begin
  Result:=UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
end;
function GetPower(nPower:Integer;UserMagic:pTUserMagic):Integer;
begin
  Result:=ROUND(nPower / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower));
end;

function GetPower13(nInt:Integer;UserMagic:pTUserMagic):Integer;
var
  d10:Double;
  d18:Double;
begin
  d10:=nInt / 3.0;
  d18:=nInt - d10;
  Result:=ROUND(d18 / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1) + d10 +(UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower)));
end;
function GetRPow(wInt:Integer):Word;
begin
  if HiWord(wInt) > LoWord(wInt) then begin
    Result:=Random(HiWord(wInt) - LoWord(wInt) + 1) + LoWord(wInt);
  end else Result:=LoWord(wInt);
end;
//nType 为指定类型 1 为护身符 2 为毒药   3 稻草人
function CheckAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer):Boolean;
var
  AmuletStdItem:pTStdItem;
  nACrate:Integer;
begin
  Result:=False;
  Idx:=0;
  nACrate:=100;
  if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin
    AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
    if  AmuletStdItem.AC=1 then  nACrate:=1;
    if ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25)) or ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 34)) then begin
      case nType of
        1: begin
          if (AmuletStdItem.Shape = 5) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
            Idx:=U_ARMRINGL;
            Result:=True;
            exit;
          end;
        end;
        2: begin
          if (AmuletStdItem.Shape <= 2) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
            Idx:=U_ARMRINGL;
            Result:=True;
            exit;
          end;
        end;

         3: begin   // 稻草人
          if (AmuletStdItem.Shape in[1,2]) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
            Idx:=U_ARMRINGL;
            Result:=True;
            exit;
          end;
        end;

      end;
    end;
  end;
  nACrate:=100;
  if PlayObject.m_UseItems[U_BUJUK].wIndex > 0 then begin
    AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BUJUK].wIndex);
    if  AmuletStdItem.AC=1 then  nACrate:=1;
    if ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25)) or ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 34)) then begin
      case nType of    //
        1: begin
          if (AmuletStdItem.Shape = 5) and (ROUND(PlayObject.m_UseItems[U_BUJUK].Dura / nACrate) >= nCount) then begin
            Idx:=U_BUJUK;
            Result:=True;
            exit;
          end;
        end;
        2: begin
          if (AmuletStdItem.Shape <= 2) and (ROUND(PlayObject.m_UseItems[U_BUJUK].Dura / nACrate) >= nCount) then begin
            Idx:=U_BUJUK;
            Result:=True;
            exit;
          end;
        end;
        3: begin   // 稻草人
          if (AmuletStdItem.Shape in [1,2]) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
            Idx:=U_BUJUK;
            Result:=True;
            exit;
          end;
        end;


      end;
    end;
  end;

end;

function Checktianxuan(PlayObject:TPlayObject):Boolean;
var
  StdItem:pTStdItem;
   res:integer;
  toukui:boolean;
  xianglian:boolean;
  shouzuo:boolean;
  jiezhi:boolean;
begin
  Result:=False;
  //res:=0;
  toukui:=false;
  xianglian:=false;
  shouzuo:=false;
  jiezhi:=false;
 { if PlayObject.m_UseItems[U_DRESSNAME].wIndex > 0 then begin      //衣服
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_DRESSNAME].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 746) or  (StdItem.looks = 747) then inc(res);
      end;
  end;}

  if PlayObject.m_UseItems[U_HELMET].wIndex > 0 then begin      //头盔
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_HELMET].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 602) then toukui:=true;
      end;
  end;

  if PlayObject.m_UseItems[U_NECKLACE].wIndex > 0 then begin      //    = '项链'
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_NECKLACE].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 605) then  xianglian:=true;
      end;
  end;
  res:=0;
  if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin      //      U_ARMRINGLNAME    = '左手镯';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 608) then inc(res);
      end;
  end;

   if PlayObject.m_UseItems[U_ARMRINGR].wIndex > 0 then begin      //         U_ARMRINGRNAME    = '右手镯';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGR].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 608) then inc(res);
      end;
  end;
  if res>0 then    shouzuo:=true;

  res:=0;
  if PlayObject.m_UseItems[U_RINGL].wIndex > 0 then begin      //        U_RINGLNAME       = '左戒指';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_RINGL].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 611) then inc(res);
      end;
  end;
  if PlayObject.m_UseItems[U_RINGR].wIndex > 0 then begin      //      U_RINGRNAME       = '右戒指';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_RINGR].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 611) then inc(res);
      end;
  end;
    if res>0 then    jiezhi:=true;
{  if PlayObject.m_UseItems[U_BELTNAME].wIndex > 0 then begin      //              = '腰带';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BELTNAME].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 689) then inc(res);
      end;
  end;
  if PlayObject.m_UseItems[U_BOOTSNAME].wIndex > 0 then begin      //                     = '鞋子';
     StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BOOTSNAME].wIndex);
      if   (stdItem<>nil) then begin
        if   (StdItem.looks = 676) then inc(res);
      end;
  end;  }

  if   toukui and  xianglian and shouzuo and jiezhi then result:=true;

end;  //




//nType 为指定类型 1 为护身符 2 为毒药
procedure UseAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer);
var AmuletStdItem:pTStdItem;
   nACrate:Integer;
begin
  nACrate:=100;
  AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[Idx].wIndex);
  if (AmuletStdItem<>nil) and (AmuletStdItem.AC=1) then   begin
     nACrate:=1;
  end;

  if PlayObject.m_UseItems[Idx].Dura > nCount * nACrate then begin
    Dec(PlayObject.m_UseItems[Idx].Dura,nCount * nACrate);
    PlayObject.SendMsg(PlayObject,RM_DURACHANGE,Idx,PlayObject.m_UseItems[Idx].Dura,PlayObject.m_UseItems[Idx].DuraMax,0,'');
  end else begin
    PlayObject.m_UseItems[Idx].Dura:=0;
    PlayObject.SendDelItems(@PlayObject.m_UseItems[Idx]);
    PlayObject.m_UseItems[Idx].wIndex:=0;
  end;
end;
function  TMagicManager.MagPushArround (PlayObject:TBaseObject;nPushLevel: integer): integer; //00492204

⌨️ 快捷键说明

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