📄 magic.pas
字号:
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 + -