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

📄 magic.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    if (abs(PlayObject.m_nCurrX-BaseObject.m_nCurrX) <= 1) and (abs(PlayObject.m_nCurrY-BaseObject.m_nCurrY) <= 1) then
    begin
      if (not BaseObject.m_boDeath) and (BaseObject <> PlayObject) then
      begin
        if ((PlayObject.m_Abil.Level > BaseObject.m_Abil.Level) or
         ((PlayObject.m_Abil.Level = BaseObject.m_Abil.Level) and
         (PlayObject.m_nfenghaolevel>BaseObject.m_nfenghaolevel))) and
         (not BaseObject.m_boStickMode) then
        begin
          levelgap := PlayObject.m_Abil.Level - BaseObject.m_Abil.Level;
          if (Random(20) < 6 + nPushLevel * 3 + levelgap) then
          begin
            if PlayObject.IsProperTarget(BaseObject) then
            begin
              push := 1 + _MAX(0,nPushLevel - 1) + Random(2);
              nDir:= GetNextDirection (PlayObject.m_nCurrX, PlayObject.m_nCurrY, BaseObject.m_nCurrX, BaseObject.m_nCurrY);
              BaseObject.CharPushed (nDir, push);
              Inc (Result);
            end;
          end;
        end;
      end;
    end;
  end;
end;

function  TMagicManager.MagADDABILITY (PlayObject:TBaseObject;nLevel: integer;nType:integer): BOOLEAN;
var
  BaseObject: TBaseObject;
begin
  Result := false;

  if (nType=0)  then    //   护身真气
  begin
    PlayObject.m_wStatusTimeArr[STATE_14]:=100;    //人物状态属性值,一般是持续多少秒
    PlayObject.m_dwStatusArrTick[STATE_14]:=GetTickCount +24 *60 * 60 * 1000;
    PlayObject.m_nCharStatus:=PlayObject.GetCharStatus();
    PlayObject.StatusChanged();
    PlayObject.SendRefMsg(RM_29,0,100,100,154,'');
    PlayObject.m_boAbilMagzqDefence   :=true;     //护身
    PlayObject.m_btMagzqDefencelevel  :=nLevel;        // 级别
    Result := true;
  end;

  if (nType=1) then       // 金刚护体
  begin
    if PlayObject.m_wStatusArrValue[6]>1 then exit;
    PlayObject.m_wStatusArrValue[6]:=100;
    PlayObject.m_dwStatusArrTimeOutTick[6]:=GetTickCount +24 *60 * 60 * 1000;
    PlayObject.SendRefMsg(RM_MAGADDABILTY,0,0, 0,0,'');     //nType(cmd,wParam,w1, w2,w3,'')
    PlayObject.SendRefMsg(RM_29,0,100,100,154,'');
    PlayObject.m_boAbilMagPowerDefence:=true;     //金刚护体
    PlayObject.m_btMagPowerDefencelevel:=nLevel ;
    Result := true;
  end;

  if nType=2 then             //  表示开风隐盾
  begin
    if PlayObject.m_wStatusArrValue[7]>1 then  exit;
    PlayObject.m_wStatusArrValue[7]:=makeword(2+nLevel, 1); //防御点  魔法躲避点        //持续时间  秒
    PlayObject.m_dwStatusArrTimeOutTick[7]:=GetTickCount + (80+nLevel *25)  *1000;   //80秒
    PlayObject.SendRefMsg(RM_MAGADDABILTY,0,0, 0,0,'');     //nType(cmd,wParam,w1, w2,w3,'') w1=2 表示开风隐盾
    PlayObject.m_boAbilMagfyDefence  :=true;    //0x35C  //fy盾
    PlayObject.m_btMagfyDefenceLevel :=nLevel;       //0x35D
    Result := true;
  end;

  if Result then
  begin
    PlayObject.RecalcAbilitys();
    PlayObject.SendMsg(PlayObject,RM_ABILITY,0,0,0,0,'');
    PlayObject.SendMsg(PlayObject,RM_SUBABILITY,0,0,0,0,'');
  end;
end;

function  TMagicManager.MagGroupjd(PlayObject:TBaseObject;nX,nY:integer): Boolean; //00492E50
var
  i: integer;
  BaseObjectList:TList;
  BaseObject:TBaseObject;
begin
  Result:=False;
  BaseObjectList:= TList.Create;
  PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
  for i:=0 to BaseObjectList.Count-1 do
  begin
    BaseObject:= TBaseObject (BaseObjectList[i]);
    if BaseObject=nil then continue;
    if PlayObject.IsProperFriend (BaseObject) then
    begin
      if BaseObject.m_wStatusTimeArr[POISON_DECHEALTH] <> 0 then
      begin
        BaseObject.m_wStatusTimeArr[POISON_DECHEALTH]:=1;
      end;
      if BaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR] <> 0 then
      begin
        BaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR]:=1;
      end;
    end;
  end;
  BaseObjectList.Free;
end;

function  TMagicManager.MagGroupsg(PlayObject:TBaseObject;nX,nY:integer): Boolean; //00492E50
var
  i: integer;
  BaseObjectList:TList;
  BaseObject:TBaseObject;
begin
  Result:=False;
  BaseObjectList:= TList.Create;
  PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
  for i:=0 to BaseObjectList.Count-1 do
  begin
    BaseObject:= TBaseObject (BaseObjectList[i]);
    if BaseObject=nil then continue;
    if PlayObject.IsProperFriend (BaseObject) then
    begin
      if  BaseObject.m_wStatusTimeArr[POISON_DAOCAO1] <> 0 then
      begin
        BaseObject.m_wStatusTimeArr[POISON_DAOCAO1]:=1;
      end;
      if  BaseObject.m_wStatusTimeArr[POISON_DAOCAO2] <> 0 then
      begin
        BaseObject.m_wStatusTimeArr[POISON_DAOCAO2]:=1;
      end;
      if  BaseObject.m_wStatusTimeArr[POISON_STONE] <> 0 then
      begin
        BaseObject.m_wStatusTimeArr[POISON_STONE]:=1;
      end;
    end;
  end;
  BaseObjectList.Free;
end;

function TMagicManager.MagBigHealing (PlayObject:TBaseObject;nPower,nX,nY:integer): Boolean;
var
  i: integer;
  BaseObjectList:TList;
  BaseObject:TBaseObject;
begin
  Result:=False;
  BaseObjectList:= TList.Create;
  PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
  for i:=0 to BaseObjectList.Count-1 do
  begin
    BaseObject:= TBaseObject (BaseObjectList[i]);
    if BaseObject=nil then continue;
    if PlayObject.IsProperFriend (BaseObject) then
    begin
      if BaseObject.m_WAbil.HP < BaseObject.m_WAbil.MaxHP then
      begin
        BaseObject.SendDelayMsg (PlayObject,RM_MAGHEALING, 0, nPower, 0, 0, '', 800);
        Result:=True;
      end;
      if PlayObject.m_boAbilSeeHealGauge then
      begin
        PlayObject.SendMsg (BaseObject,RM_10414, 0, 0, 0, 0, '');  //?? RM_INSTANCEHEALGUAGE
      end;
    end;
  end;
  BaseObjectList.Free;
end;

constructor TMagicManager.Create;
begin

end;

destructor TMagicManager.Destroy;
begin
  inherited;
end;

function TMagicManager.IsWarrSkill(wMagIdx: Integer): Boolean;
begin
  Result:=False;
  if wMagIdx in [3,7,12,25,26,27] then 
    Result:=True;
end;

function TMagicManager.DoSpell(PlayObject: TPlayObject; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject):Boolean;
var
  boTrain     :Boolean;
  boSpellFail :Boolean;
  boSpellFire :Boolean;
  n14         :Integer;
  n18         :Integer;
  n1C         :Integer;
  nPower      :Integer;
  StdItem     :pTStdItem;
  nAmuletIdx  :Integer;
  i:integer;
  hum:Tplayobject;

  function MPow(UserMagic:pTUserMagic):Integer;
  begin
    Result:=UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
  end;

  function GetPower(nPower:Integer):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):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;

  procedure sub_4934B4(PlayObject:TPlayObject);
  begin
    if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then
    begin
      PlayObject.m_UseItems[U_ARMRINGL].Dura:=0;
      PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
      PlayObject.m_UseItems[U_ARMRINGL].wIndex:=0;
    end;      
  end;

begin
  Result:=False;
  if IsWarrSkill(UserMagic.wMagIdx) then exit;

  if (abs(PlayObject.m_nCurrX - nTargetX) > g_Config.nMagicAttackRage) or (abs(PlayObject.m_nCurrY - nTargetY) > g_Config.nMagicAttackRage) then
  begin
    exit;
  end;
  // 人物发魔法的动作视觉效果

  if UserMagic.MagicInfo.wMagicId in [78,79,80,81,83,85] then
  begin
    if (PlayObject.Ysplayer<>nil) and(PlayObject.Ysplayer.nyuanqi<100) then exit;
    hum:=PlayObject.Ysplayer;
    if hum<>nil then
    begin
      hum.SendRefMsg(RM_SPELL,UserMagic.MagicInfo.btEffect,nTargetX,nTargetY,UserMagic.MagicInfo.wMagicId,'');
    end;
  end;
  if not (UserMagic.MagicInfo.wMagicId in [75,35,77]) then
    PlayObject.SendRefMsg(RM_SPELL,UserMagic.MagicInfo.btEffect,nTargetX,nTargetY,UserMagic.MagicInfo.wMagicId,'');

  if (TargeTBaseObject <> nil) and ((TargeTBaseObject.m_boDeath)and (UserMagic.MagicInfo.wMagicId<>46 )) then TargeTBaseObject:=nil;
  boTrain:=False;
  boSpellFail:=False;
  boSpellFire:=True;
  nPower:=0;
  case UserMagic.MagicInfo.wMagicId of
    SKILL_FIREBALL{1},
    SKILL_FIREBALL2{5}: begin //火球术 大火球
      if PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargeTBaseObject) then
      begin
        if PlayObject.IsProperTarget (TargeTBaseObject) then
        begin
          if (TargeTBaseObject.m_nAntiMagic <= Random(10)) and (abs(TargeTBaseObject.m_nCurrX-nTargetX) <= 1) and (abs(TargeTBaseObject.m_nCurrY-nTargetY) <= 1) then begin
            with PlayObject do
            begin
                nPower:= GetAttackPower (GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC)-LoWord(m_WAbil.MC)) + 1);
            end;
            PlayObject.SendDelayMsg (PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, integer(TargeTBaseObject), '', 600);
            if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then boTrain:=True;
          end
          else
            TargeTBaseObject := nil;
        end
        else
          TargeTBaseObject := nil;
      end
      else
        TargeTBaseObject := nil;
    end;
    SKILL_HEALLING{2}: begin                     //加血
      if TargeTBaseObject = nil then
      begin
        TargeTBaseObject:=PlayObject;
        nTargetX:=PlayObject.m_nCurrX;
        nTargetY:=PlayObject.m_nCurrY;
      end;
      if PlayObject.IsProperFriend{0FFF3}(TargeTBaseObject) then
      begin
        nPower:= PlayObject.GetAttackPower (GetPower(MPow(UserMagic)) + LoWord(PlayObject.m_WAbil.SC) * 2, SmallInt(HiWord(PlayObject.m_WAbil.SC)-LoWord(PlayObject.m_WAbil.SC)) * 2 + 1);
        if TargeTBaseObject.m_WAbil.HP < TargeTBaseObject.m_WAbil.MaxHP then
        begin
          TargeTBaseObject.SendDelayMsg(PlayObject,RM_MAGHEALING,0,nPower,0,0,'',800);

⌨️ 快捷键说明

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