📄 magic.pas
字号:
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:=TList.Create;
MagicEvent.dwStartTick:=GetTickCount();
MagicEvent.dwTime:=nPower * 1000;
end;
MagicEvent.BaseObjectList.Add(TargeTBaseObject);
Inc(Result);
end else begin //00492A02
Result:=0;
end;
end;
BaseObjectList.Free;
if (Result > 0) and (MagicEvent <> nil) then begin
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX - 1,nY - 2,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[0]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX + 1,nY - 2,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[1]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX - 2,nY - 1,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[2]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX + 2,nY - 1,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[3]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX - 2,nY + 1,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[4]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX + 2,nY + 1,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[5]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX - 1,nY + 2,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[6]:=HolyCurtainEvent;
HolyCurtainEvent:=THolyCurtainEvent.Create(BaseObject.m_PEnvir,nX + 1,nY + 2,ET_HOLYCURTAIN,nPower * 1000);
g_EventManager.AddEvent(HolyCurtainEvent);
MagicEvent.Events[7]:=HolyCurtainEvent;
UserEngine.m_MagicEventList.Add(MagicEvent);
end else begin
if MagicEvent <> nil then begin
MagicEvent.BaseObjectList.Free;
Dispose(MagicEvent);
end;
end;
end;
end;
function TMagicManager.MagMakeGroupTransparent(BaseObject: TBaseObject; nX, nY,
nHTime: Integer): Boolean; //0049320C
var
I: Integer;
BaseObjectList:TList;
TargeTBaseObject:TBaseObject;
begin
Result:=False;
BaseObjectList:=TList.Create;
BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir,nX,nY,1,BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
TargeTBaseObject:=TBaseObject(BaseObjectList.Items[i]);
if BaseObject.IsProperFriend(TargeTBaseObject) then begin
if TargeTBaseObject.m_wStatusTimeArr[STATE_TRANSPARENT{0x70}] = 0 then begin //00493287
TargeTBaseObject.SendDelayMsg(TargeTBaseObject,RM_TRANSPARENT,0,nHTime,0,0,'',800);
Result:=True;
end;
end
end;
BaseObjectList.Free;
end;
//=====================================================================================
//名称:
//功能:
//参数:
// BaseObject 魔法发起人
// TargeTBaseObject 受攻击角色
// nPower 魔法力大小
// nLevel 技能修炼等级
// nTargetX 目标座标X
// nTargetY 目标座标Y
//返回值:
//=====================================================================================
function TMagicManager.MabMabe(BaseObject, TargeTBaseObject: TBaseObject; nPower,nLevel,
nTargetX, nTargetY: Integer): Boolean;
var
nLv:Integer;
begin
Result:=False;
if BaseObject.MagCanHitTarget(BaseObject.m_nCurrX, BaseObject.m_nCurrY, TargeTBaseObject) then begin
if BaseObject.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
BaseObject.SendDelayMsg (BaseObject, RM_DELAYMAGIC, nPower div 3, MakeLong(nTargetX, nTargetY), 2, integer(TargeTBaseObject), '', 600);
if (Random(2) + (BaseObject.m_Abil.Level - 1)) > TargeTBaseObject.m_Abil.Level then begin
nLv:=BaseObject.m_Abil.Level - TargeTBaseObject.m_Abil.Level;
if (Random(g_Config.nMabMabeHitRandRate{100}) < _MAX(g_Config.nMabMabeHitMinLvLimit,(nLevel * 8) - nLevel + 15 + nLv)) {or (Random(abs(nLv))} then begin
// if (Random(100) < ((nLevel shl 3) - nLevel + 15 + nLv)) {or (Random(abs(nLv))} then begin
if (Random(g_Config.nMabMabeHitSucessRate{21}) < nLevel * 2 + 4) then begin
if TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT then begin
BaseObject.SetPKFlag(BaseObject);
BaseObject.SetTargetCreat(TargeTBaseObject);
end;
TargeTBaseObject.SetLastHiter(BaseObject);
nPower:=TargeTBaseObject.GetMagStruckDamage(BaseObject,nPower);
BaseObject.SendDelayMsg (BaseObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, integer(TargeTBaseObject), '', 600);
if not TargeTBaseObject.m_boUnParalysis then
TargeTBaseObject.SendDelayMsg(BaseObject,RM_POISON,POISON_STONE{中毒类型 - 麻痹},nPower div g_Config.nMabMabeHitMabeTimeRate{20} + Random(nLevel),Integer(BaseObject),nLevel,'',650);
Result:=True;
end;
end;
end;
end;
end;
end;
end;
function TMagicManager.MagMakeSinSuSlave(PlayObject: TPlayObject;
UserMagic: pTUserMagic): Boolean;
var
I: Integer;
sMonName:String;
nMakelevel,nExpLevel:Integer;
nCount:Integer;
dwRoyaltySec:LongWord;
begin
Result:=False;
if not PlayObject.sub_4DD704 then begin
sMonName:=g_Config.sDragon;
nMakelevel:=UserMagic.btLevel;
nExpLevel:=UserMagic.btLevel;
nCount:=g_Config.nDragonCount;
dwRoyaltySec:=10 * 24 * 60 * 60;
for I := Low(g_Config.DragonArray) to High(g_Config.DragonArray) do begin
if g_Config.DragonArray[I].nHumLevel = 0 then break;
if PlayObject.m_Abil.Level >= g_Config.DragonArray[I].nHumLevel then begin
sMonName:=g_Config.DragonArray[I].sMonName;
nExpLevel:=g_Config.DragonArray[I].nLevel;
nCount:=g_Config.DragonArray[I].nCount;
end;
end;
if PlayObject.MakeSlave(sMonName,nMakelevel,nExpLevel,nCount,dwRoyaltySec) <> nil then
Result:=True
else
PlayObject.RecallSlave(sMonName);
end;
// if PlayObject.MakeSlave(g_Config.sDogz,UserMagic.btLevel,1,10 * 24 * 60 * 60) <> nil then
// boTrain:=True;
end;
function TMagicManager.MagMakeSlave(PlayObject: TPlayObject;UserMagic:pTUserMagic):Boolean;
var
I: Integer;
sMonName:String;
nMakeLevel,nExpLevel:Integer;
nCount:Integer;
dwRoyaltySec:LongWord;
begin
Result:=False;
if not PlayObject.sub_4DD704 then begin
sMonName:=g_Config.sSkeleton;
nMakeLevel:=UserMagic.btLevel;
nExpLevel:=UserMagic.btLevel;
nCount:=g_Config.nSkeletonCount;
dwRoyaltySec:=10 * 24 * 60 * 60;
for I := Low(g_Config.SkeletonArray) to High(g_Config.SkeletonArray) do begin
if g_Config.SkeletonArray[I].nHumLevel = 0 then break;
if PlayObject.m_Abil.Level >= g_Config.SkeletonArray[I].nHumLevel then begin
sMonName:=g_Config.SkeletonArray[I].sMonName;
nExpLevel:=g_Config.SkeletonArray[I].nLevel;
nCount:=g_Config.SkeletonArray[I].nCount;
end;
end;
if PlayObject.MakeSlave(sMonName,nMakeLevel,nExpLevel,nCount,dwRoyaltySec) <> nil then
Result:=True;
end;
end;
function TMagicManager.MagMakeClone(PlayObject: TPlayObject;UserMagic:pTUserMagic):Boolean;
var
{I: Integer;
sMonName:String;
nMakeLevel,nExpLevel:Integer;
nCount:Integer;
dwRoyaltySec:LongWord;}
PlayClone:TPlayCloneObject;
begin
Result:=False;
{if not PlayObject.sub_4DD704 then begin
sMonName:=g_Config.sSkeleton;
nMakeLevel:=UserMagic.btLevel;
nExpLevel:=UserMagic.btLevel;
nCount:=g_Config.nSkeletonCount;
dwRoyaltySec:=10 * 24 * 60 * 60;
for I := Low(g_Config.SkeletonArray) to High(g_Config.SkeletonArray) do begin
if g_Config.SkeletonArray[I].nHumLevel = 0 then break;
if PlayObject.m_Abil.Level >= g_Config.SkeletonArray[I].nHumLevel then begin
sMonName:=g_Config.SkeletonArray[I].sMonName;
nExpLevel:=g_Config.SkeletonArray[I].nLevel;
nCount:=g_Config.SkeletonArray[I].nCount;
end;
end;}
PlayClone := TPlayCloneObject.Create(PlayObject);
Result:=True;
end;
function TMagicManager.MagMakeAngelSlave(PlayObject: TPlayObject;UserMagic:pTUserMagic):Boolean;
var
I: Integer;
sMonName:String;
nMakeLevel,nExpLevel:Integer;
dwRoyaltySec:LongWord;
begin
Result:=False;
if not PlayObject.sub_4DD704 then begin
sMonName:=g_Config.sAngel;
nMakeLevel:=UserMagic.btLevel;
nExpLevel:=UserMagic.btLevel;
//nCount:=g_Config.nSkeletonCount;
dwRoyaltySec:=10 * 24 * 60 * 60;
if PlayObject.MakeSlave(sMonName,nMakeLevel,nExpLevel,1,dwRoyaltySec) <> nil then
Result:=True;
end;
end;
function TMagicManager.MagGroupMb(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
I :Integer;
BaseObjectList :TList;
BaseObject :TBaseObject;
nPower :Integer;
StdItem :pTStdItem;
nTime :Integer;
begin
Result:=False;
BaseObjectList:=TList.Create;
nTime:= 5 * UserMagic.btLevel + 1;
PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir,PlayObject.m_nCurrX,PlayObject.m_nCurrY,UserMagic.btLevel + 2,BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
BaseObject:=TBaseObject(BaseObjectList.Items[I]);
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) and (not g_Config.boGroupMbAttackPlayObject) then Continue;
if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject = BaseObject) then Continue;
if PlayObject.IsProperTarget (BaseObject) then begin
if not BaseObject.m_boUnParalysis and (Random(BaseObject.m_btAntiPoison) = 0) then begin
if (BaseObject.m_Abil.Level < PlayObject.m_Abil.Level) or (Random(PlayObject.m_Abil.Level - BaseObject.m_Abil.Level) = 0) then begin
BaseObject.MakePosion(POISON_STONE,nTime,0);
BaseObject.m_boFastParalysis:=True;
end;
end;
end;
if (BaseObject.m_btRaceServer >= RC_ANIMAL) then
Result:=True;
end;
BaseObjectList.Free;
end;
function TMagicManager.KnockBack (PlayObject:TBaseObject;nPushLevel: integer): integer; //00492204
var
i, nDir, levelgap, push: integer;
BaseObject: TBaseObject;
UserMagic:pTUsermagic;
begin
Result := 0;
for i:=0 to PlayObject.m_VisibleActors.Count-1 do begin
BaseObject:= TBaseOb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -