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

📄 magic.~pas

📁 继续更新AFT源代码 现在解决了无法登陆游戏的问题 用0504的dbserver就可以登陆了 去掉了绿字广告 降低内存占用HOO 去掉了大量的验证问题
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
var
   i, nDir, levelgap, push: integer;
   BaseObject: TBaseObject;
begin
   Result := 0;
   for i:=0 to PlayObject.m_VisibleActors.Count-1 do begin
      BaseObject:= TBaseObject (pTVisibleBaseObject(PlayObject.m_VisibleActors[i]).BaseObject);
      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) and (not BaseObject.m_boStickMode) 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 nLevel=0 then playobject.m_btSpeedPoint:=
 //  nType:=2;
 
 IF (nType=0)  then  begin            //and (not(PlayObject.m_boAbilMagPowerDefence))   护身蒸气
  // if PlayObject.m_wStatusTimeArr[STATE_14]>1 then  exit;
    PlayObject.m_wStatusTimeArr[STATE_14]:=100;         // :TStatusTime;   //0x60         //人物状态属性值,一般是持续多少秒
    PlayObject.m_dwStatusArrTick[STATE_14]:=GetTickCount +24 *60 * 60 * 1000;
    PlayObject.m_nCharStatus:=PlayObject.GetCharStatus();
    PlayObject.StatusChanged();
//   PlayObject.m_wStatusArrValue[6]:=100;
//   PlayObject.m_dwStatusArrTimeOutTick[6]:=GetTickCount +24 *60 * 60 * 1000;
    PlayObject.SendRefMsg(RM_29,0,100,100,154,'');
    PlayObject.m_boAbilMagzqDefence   :=true;     //护身
    PlayObject.m_btMagzqDefencelevel  :=nLevel;        // 级别

    Result := true;
   end;

 IF (nType=1 )   then  begin     //  and (not(PlayObject.m_boAbilMagzqDefence))     // 金刚护体  
   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; //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_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;//0049214C
begin

end;

destructor TMagicManager.Destroy;
begin

  inherited;
end;

function TMagicManager.IsWarrSkill(wMagIdx: Integer): Boolean; //492190
begin
  Result:=False;
  if wMagIdx in [3,7,12,25,26,27] then 
  //[SKILL_ONESWORD{3},SKILL_ILKWANG{4},SKILL_YEDO{7},SKILL_ERGUM{12},SKILL_BANWOL{25},SKILL_FIRESWORD{26},SKILL_MOOTEBO{27}] then
    Result:=True;
end;

function TMagicManager.DoSpell(PlayObject: TPlayObject;
  UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
  TargeTBaseObject: TBaseObject):Boolean; //0049350C
var
  boTrain     :Boolean;
  boSpellFail :Boolean;
  boSpellFire :Boolean;
  n14         :Integer;
  n18         :Integer;
  n1C         :Integer;
  nPower      :Integer;
  StdItem     :pTStdItem;
  nAmuletIdx  :Integer;
  i:integer;
  hum:Tplayobject;
//  SpyFly:TSpyFly;
  function MPow(UserMagic:pTUserMagic):Integer; //004921C8
  begin
    Result:=UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
  end;
  function GetPower(nPower:Integer):Integer; //00493314
  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; //0049338C
  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 //0049350C
  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;
 //   MainOutMessage('check 5 end:');
  end;
   // 人物发魔法的动作视觉效果
//   MainOutMessage('开始使用魔法3:');

  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:=nil;
        // hum:=UserEngine.GetPlayObjectEx(PlayObject.sYsname);
        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;
 {
  if boSpellFire then begin
    PlayObject.SendRefMsg(RM_MAGICFIRE,0,                  //发魔法打中的效果
                        MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
                        MakeLong(nTargetX,nTargetY),
                        Integer(TargeTBaseObject),
                        '');
  end;  }

//  if (PlayObject.m_nSoftVersionDateEx = 0) and (PlayObject.m_dwClientTick = 0) and (UserMagic.MagicInfo.wMagicId > 40) then exit;
  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);
                 //pwr := GetPower (MPow(UserMagic)) + (Lobyte(WAbil.MC) + Random(Hibyte(WAbil.MC)-Lobyte(WAbil.MC) + 1));
                 //鸥百 嘎澜, 饶俊 瓤苞唱鸥巢
                 //target.SendDelayMsg (user, RM_MAGSTRUCK, 0, pwr, 0, 0, '', 1200 + _MAX(Abs(CX-xx),Abs(CY-yy)) * 50 );
            end;
          //rm-delaymagic俊辑 selecttarget阑 贸府茄促.
            PlayObject.SendDelayMsg (PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, integer(TargeTBaseObject), '', 600);
            if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then boTrain:=True;
          end else

⌨️ 快捷键说明

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