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

📄 magic.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                    GetRPow(PlayObject.m_WAbil.SC) * 2;
                  BaseObject.SendDelayMsg(PlayObject, RM_POISON, POISON_DECHEALTH
                    {中毒类型 - 绿毒}, nPower, Integer(PlayObject),
                    ROUND(UserMagic.btLevel / 3 * (nPower /
                    g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '', 1000);
                end;
              2:
                begin
                  nPower := GetPower13(30, UserMagic) +
                    GetRPow(PlayObject.m_WAbil.SC) * 2;
                  BaseObject.SendDelayMsg(PlayObject, RM_POISON,
                    POISON_DAMAGEARMOR {中毒类型 - 红毒}, nPower,
                    Integer(PlayObject), ROUND(UserMagic.btLevel / 3 * (nPower /
                    g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '', 1000);
                end;
            end;
            if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) or
              (BaseObject.m_btRaceServer >= RC_ANIMAL) then
              Result := True;
            BaseObject.SetLastHiter(PlayObject);
            PlayObject.SetTargetCreat(BaseObject);
          end;
        end;
      end;
    end;
  end;
  BaseObjectList.Free;
end;


function TMagicManager.MagGroupDeDing(PlayObject: TPlayObject;
  UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
  TargeTBaseObject: TBaseObject): Boolean;
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  BaseObject                            : TBaseObject;
  nPower                                : Integer;
begin
  Result := False;
  BaseObjectList := TMyList.create;
  PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1,
    UserMagic.btLevel), BaseObjectList);
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    BaseObject := TBaseObject(BaseObjectList.Items[i]);
    if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject =
      BaseObject) then
      Continue;
    if PlayObject.IsProperTarget(BaseObject) then
    begin
      nPower := PlayObject.GetAttackPower(LoWord(PlayObject.m_WAbil.DC),
        SmallInt((HiWord(PlayObject.m_WAbil.DC) -
        LoWord(PlayObject.m_WAbil.DC))));
      if (Random(BaseObject.m_btSpeedPoint) >= PlayObject.m_btHitPoint) then
      begin
        nPower := 0;
      end;
      if nPower > 0 then
      begin
        nPower := BaseObject.GetHitStruckDamage(PlayObject, nPower);
      end;
      if nPower > 0 then
      begin                                                 //004C21FC
        BaseObject.StruckDamage(nPower);
        PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
          MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 1,
          Integer(BaseObject), '', 200);
      end;
      if BaseObject.m_btRaceServer >= RC_ANIMAL then
        Result := True;
    end;
    PlayObject.SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX, BaseObject.m_nCurrY,
      1, '');
  end;
  BaseObjectList.Free;
end;

function TMagicManager.MagGroupLightening(PlayObject: TPlayObject;
  UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
  TargeTBaseObject: TBaseObject; var boSpellFire: Boolean): Boolean;
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  BaseObject                            : TBaseObject;
  nPower                                : Integer;
begin
  Result := False;
  boSpellFire := False;
  BaseObjectList := TMyList.create;
  PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1,
    UserMagic.btLevel), BaseObjectList);
  PlayObject.SendRefMsg(RM_MAGICFIRE, 0,
    MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
    MakeLong(nTargetX, nTargetY),
    Integer(TargeTBaseObject),
    '');
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    BaseObject := TBaseObject(BaseObjectList.Items[i]);
    if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject =
      BaseObject) then
      Continue;
    if PlayObject.IsProperTarget(BaseObject) then
    begin
      if (Random(10) >= BaseObject.m_nAntiMagic) then
      begin
        nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic), UserMagic)
          + LoWord(PlayObject.m_WAbil.MC),
          SmallInt(HiWord(PlayObject.m_WAbil.MC) - LoWord(PlayObject.m_WAbil.MC))
          + 1);
        if BaseObject.m_btLifeAttrib = LA_UNDEAD then
          nPower := ROUND(nPower * 1.5);

        PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
          MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 2,
          Integer(BaseObject), '', 600);
        if BaseObject.m_btRaceServer >= RC_ANIMAL then
          Result := True;
      end;
      if (BaseObject.m_nCurrX <> nTargetX) or (BaseObject.m_nCurrY <> nTargetY)
        then
        PlayObject.SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX,
          BaseObject.m_nCurrY, 4 {type}, '');
    end;
  end;
  BaseObjectList.Free;
end;

function TMagicManager.MagHbFireBall(PlayObject: TPlayObject;
  UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
  var TargeTBaseObject: TBaseObject): Boolean;
var
  nPower                                : Integer;
  nDir                                  : Integer;
  levelgap                              : Integer;
  push                                  : Integer;
begin
  Result := False;
  if not PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
    TargeTBaseObject) then
  begin
    TargeTBaseObject := nil;
    exit;
  end;
  if not PlayObject.IsProperTarget(TargeTBaseObject) then
  begin
    TargeTBaseObject := nil;
    exit;
  end;
  if (TargeTBaseObject.m_nAntiMagic > Random(10)) or
    (abs(TargeTBaseObject.m_nCurrX - nTargetX) > 1) or
    (abs(TargeTBaseObject.m_nCurrY - nTargetY) > 1) then
  begin
    TargeTBaseObject := nil;
    exit;
  end;
  with PlayObject do
  begin
    nPower := GetAttackPower(GetPower(MPow(UserMagic), 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
    Result := True;

  if (PlayObject.m_Abil.Level > TargeTBaseObject.m_Abil.Level) and (not
    TargeTBaseObject.m_boStickMode) then
  begin
    levelgap := PlayObject.m_Abil.Level - TargeTBaseObject.m_Abil.Level;
    if (Random(20) < 6 + UserMagic.btLevel * 3 + levelgap) then
    begin
      push := Random(UserMagic.btLevel) - 1;
      if push > 0 then
      begin
        nDir := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
          TargeTBaseObject.m_nCurrX, TargeTBaseObject.m_nCurrY);
        PlayObject.SendDelayMsg(PlayObject, RM_DELAYPUSHED, nDir,
          MakeLong(nTargetX, nTargetY), push, Integer(TargeTBaseObject), '',
          600);
      end;
    end;
  end;
end;

//火墙

function TMagicManager.MagMakeFireCross(PlayObject: TPlayObject; nDamage,
  nHTime, nX, nY: Integer): Integer;                        //00492C9C
var
  FireBurnEvent                         : TFireBurnEvent;
resourcestring
  sDisableInSafeZoneFireCross           = '安全区不允许使用...';
begin
  Result := 0;
  if g_Config.boDisableInSafeZoneFireCross and
    PlayObject.InSafeZone(PlayObject.m_PEnvir, nX, nY) then
  begin
    PlayObject.SysMsg(sDisableInSafeZoneFireCross, c_Red, t_Notice);
    exit;
  end;
  if PlayObject.m_PEnvir.GetEvent(nX, nY - 1) = nil then
  begin
    FireBurnEvent := TFireBurnEvent.Create(PlayObject, nX, nY - 1, ET_FIRE,
      nHTime * 1000, nDamage);
    g_EventManager.AddEvent(FireBurnEvent);
  end;                                                      //0492CFC   x
  if PlayObject.m_PEnvir.GetEvent(nX - 1, nY) = nil then
  begin
    FireBurnEvent := TFireBurnEvent.Create(PlayObject, nX - 1, nY, ET_FIRE,
      nHTime * 1000, nDamage);
    g_EventManager.AddEvent(FireBurnEvent);
  end;                                                      //0492D4D
  if PlayObject.m_PEnvir.GetEvent(nX, nY) = nil then
  begin
    FireBurnEvent := TFireBurnEvent.Create(PlayObject, nX, nY, ET_FIRE, nHTime *
      1000, nDamage);
    g_EventManager.AddEvent(FireBurnEvent);
  end;                                                      //00492D9C
  if PlayObject.m_PEnvir.GetEvent(nX + 1, nY) = nil then
  begin
    FireBurnEvent := TFireBurnEvent.Create(PlayObject, nX + 1, nY, ET_FIRE,
      nHTime * 1000, nDamage);
    g_EventManager.AddEvent(FireBurnEvent);
  end;                                                      //00492DED
  if PlayObject.m_PEnvir.GetEvent(nX, nY + 1) = nil then
  begin
    FireBurnEvent := TFireBurnEvent.Create(PlayObject, nX, nY + 1, ET_FIRE,
      nHTime * 1000, nDamage);
    g_EventManager.AddEvent(FireBurnEvent);
  end;                                                      //00492E3E
  Result := 1;
end;

function TMagicManager.MagBigExplosion(BaseObject: TBaseObject; nPower, nX,
  nY: Integer; nRage: Integer): Boolean;                    //00492F4C
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  TargeTBaseObject                      : TBaseObject;
begin
  Result := False;
  BaseObjectList := TMyList.create;
  // nRage:=Max(2,nRage);
  // nRage:=Min(4,nRage);
  BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir, nX, nY, nRage,
    BaseObjectList);
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
    if BaseObject.IsProperTarget(TargeTBaseObject) then
    begin
      BaseObject.SetTargetCreat(TargeTBaseObject);
      TargeTBaseObject.SendMsg(BaseObject, RM_MAGSTRUCK, 0, nPower, 0, 0, '');
      Result := True;
    end;
  end;
  BaseObjectList.Free;
end;

function TMagicManager.MagElecBlizzard(BaseObject: TBaseObject;
  nPower: Integer): Boolean;                                //00493010
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  TargeTBaseObject                      : TBaseObject;
  nPowerPoint                           : Integer;
begin
  Result := False;
  BaseObjectList := TMyList.create;
  BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir, BaseObject.m_nCurrX,
    BaseObject.m_nCurrY, g_Config.nElecBlizzardRange {2}, BaseObjectList);
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
    if (TargeTBaseObject.m_btLifeAttrib = 0) then
    begin
      nPowerPoint := nPower div 10;
    end
    else
      nPowerPoint := nPower;

    if BaseObject.IsProperTarget(TargeTBaseObject) then
    begin
      BaseObject.SetTargetCreat(TargeTBaseObject);
      TargeTBaseObject.SendMsg(BaseObject, RM_MAGSTRUCK, 0, nPowerPoint, 0, 0,
        '');
      Result := True;
    end;
  end;
  BaseObjectList.Free;
end;

function TMagicManager.MagMakeHolyCurtain(BaseObject: TBaseObject; nPower:
  Integer; nX, nY: Integer): Integer;                       //004928C0
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  TargeTBaseObject                      : TBaseObject;
  MagicEvent                            : pTMagicEvent;
  HolyCurtainEvent                      : THolyCurtainEvent;
begin
  Result := 0;
  if BaseObject.m_PEnvir.CanWalk(nX, nY, True) then
  begin
    BaseObjectList := TMyList.create;
    MagicEvent := nil;
    BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir, nX, nY, 1,
      BaseObjectList);
    for i := 0 to BaseObjectList.Count - 1 do
    begin
      TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
      if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) and
        ((Random(4) + (BaseObject.m_Abil.Level - 1)) >
        TargeTBaseObject.m_Abil.Level) and
        {(TargeTBaseObject.m_Abil.Level < 50) and}
      (TargeTBaseObject.m_Master = nil) then
      begin
        TargeTBaseObject.OpenHolySeizeMode(nPower * 1000);
        if MagicEvent = nil then
        begin
          New(MagicEvent);
          FillChar(MagicEvent^, SizeOf(TMagicEvent), #0);
          MagicEvent.BaseObjectList := TMyList.create;
          MagicEvent.dwStartTick := GetTickCount();
    

⌨️ 快捷键说明

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