📄 basicobj.pas
字号:
case Msg of
FM_HIT :
begin
if isHitedArea (SenderInfo.dir, SenderInfo.x, SenderInfo.y, aSubData.HitData.HitFunction, percent) then begin
Dec (CurDurability, 5*100);
end;
end;
end;
end;
procedure TStaticItem.Initial (aItemData: TItemData; aOwnerId, ax, ay: integer);
var
str : string;
begin
str := StrPas (@aItemData.rName);
if aItemData.rCount > 1 then str := str + ':' + IntToStr (aItemData.rCount);
inherited Initial (str, str);
CurDurability := 10 * 60 * 100; // 10盒悼救 绝绢瘤瘤 救澜.
OwnerId := aOwnerId;
SelfItemdata := aItemData;
BasicData.id := GetNewStaticItemId;
BasicData.x := ax;
BasicData.y := ay;
BasicData.ClassKind := CLASS_STATICITEM;
BasicData.Feature.rrace := RACE_STATICITEM;
BasicData.Feature.rImageNumber := aItemData.rShape;
BasicData.Feature.rImageColorIndex := aItemData.rcolor;
end;
procedure TStaticItem.StartProcess;
var SubData : TSubData;
begin
inherited StartProcess;
Phone.RegisterUser (BasicData.id, FieldProc, BasicData.X, BasicData.Y);
Phone.SendMessage (0, FM_CREATE, BasicData, SubData);
if SelfItemData.rSoundDrop.rWavNumber <> 0 then begin
SetWordString (SubData.SayString, IntToStr (SelfItemData.rSoundDrop.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
end;
procedure TStaticItem.EndProcess;
var SubData : TSubData;
begin
if FboRegisted = FALSE then exit;
Phone.SendMessage (0, FM_DESTROY, BasicData, SubData);
Phone.UnRegisterUser (BasicData.id, BasicData.x, BasicData.y);
inherited EndProcess;
end;
procedure TStaticItem.Update (CurTick: integer);
begin
if CreateTick + CurDurability < CurTick then FboAllowDelete := TRUE;
end;
////////////////////////////////////////////////////
//
// === StaticItemList ===
//
////////////////////////////////////////////////////
constructor TStaticItemList.Create (cnt: integer; aManager: TManager);
begin
Manager := aManager;
DataList := TList.Create;
end;
destructor TStaticItemList.Destroy;
begin
Clear;
DataList.Free;
inherited destroy;
end;
procedure TStaticItemList.Clear;
var
i : Integer;
ItemObject : TStaticItem;
begin
for i := 0 to DataList.Count - 1 do begin
ItemObject := DataList.Items [i];
ItemObject.EndProcess;
ItemObject.Free;
end;
DataList.Clear;
end;
function TStaticItemList.GetCount: integer;
begin
Result := DataList.Count;
end;
{
function TStaticItemList.AllocFunction: pointer;
begin
Result := TStaticItem.Create;
end;
procedure TStaticItemList.FreeFunction (item: pointer);
begin
TStaticItem (item).Free;
end;
}
function TStaticItemList.AddStaticItemObject (aItemData: TItemData; aOwnerId, ax, ay: integer): integer;
var
ItemObject : TStaticItem;
begin
Result := PROC_FALSE;
if DataList.count > 3000 then exit;
if aItemData.rCount <> 1 then exit;
if not TMaper(Manager.Maper).isMoveable (ax, ay) then exit;
ItemObject := TStaticItem.Create;
ItemObject.SetManagerClass (Manager);
ItemObject.Initial (aItemData, aOwnerId, ax, ay);
ItemObject.StartProcess;
DataList.Add (ItemObject);
Result := PROC_TRUE;
end;
procedure TStaticItemList.Update (CurTick: integer);
var
i : integer;
StaticItem : TStaticItem;
begin
for i := DataList.Count - 1 downto 0 do begin
StaticItem := DataList.Items [i];
if StaticItem.boAllowDelete then begin
StaticItem.EndProcess;
StaticItem.Free;
DataList.Delete (i);
end;
end;
for i := 0 to DataList.Count - 1 do begin
StaticItem := DataList.Items [i];
StaticItem.UpDate (CurTick);
end;
end;
////////////////////////////////////////////////////
//
// === DynamicItemObject ===
//
////////////////////////////////////////////////////
constructor TDynamicObject.Create;
begin
inherited Create;
EventItemCount := 0;
ObjectStatus := dos_Closed;
MemberList := nil;
DragDropEvent := nil;
end;
destructor TDynamicObject.Destroy;
var
i : Integer;
AttackSkill : TAttackSkill;
BO : TBasicObject;
begin
if DragDropEvent <> nil then DragDropEvent.Free;
if MemberList <> nil then begin
for i := MemberList.Count - 1 downto 0 do begin
BO := MemberList[i];
if BO <> nil then begin
AttackSkill := nil;
if BO.BasicData.Feature.rRace = RACE_MONSTER then begin
AttackSkill := TMonster (BO).GetAttackSkill;
end else if BO.BasicData.Feature.rRace = RACE_NPC then begin
AttackSkill := TNpc (BO).GetAttackSkill;
end;
if AttackSkill <> nil then begin
AttackSkill.SetObjectBoss (nil);
end;
end;
end;
MemberList.Clear;
MemberList.Free;
end;
inherited destroy;
end;
procedure TDynamicObject.MemberDie (aBasicObject : TBasicObject);
var
i, j : Integer;
begin
if MemberList = nil then exit;
for i := 0 to MemberList.Count - 1 do begin
if aBasicObject = MemberList[i] then begin
if aBasicObject.BasicData.Feature.rfeaturestate <> wfs_die then begin
CurLife := SelfData.rBasicData.rLife;
end else begin
for j := 0 to 5 - 1 do begin
if StrPas (@aBasicObject.BasicData.Name) = SelfData.rDropMop [j].rName then begin
SelfData.rDropMop[j].rName := '';
break;
end;
if StrPas (@aBasicObject.BasicData.Name) = SelfData.rCallNpc [j].rName then begin
SelfData.rCallNpc[j].rName := '';
break;
end;
end;
end;
MemberList.Delete (i);
break;
end;
end;
end;
function TDynamicObject.FieldProc (hfu: Longint; Msg: word; var SenderInfo: TBasicData; var aSubData: TSubData): Integer;
var
i, j, xx, yy : Integer;
Sayer, SayStr, Str, dummy1, dummy2 : String;
percent : Integer;
SubData : TSubData;
ItemData : TItemData;
CurTick, SkillLevel : Integer;
BO, BO2 : TBasicObject;
Monster : TMonster;
Npc : TNpc;
boFlag : boolean;
AttackSkill : TAttackSkill;
begin
Result := PROC_FALSE;
if isRangeMessage ( hfu, Msg, SenderInfo) = FALSE then exit;
Result := inherited FieldProc (hfu, Msg, Senderinfo, aSubData);
if Result = PROC_TRUE then exit;
CurTick := mmAnsTick;
case Msg of
FM_HEAL :
begin
if ObjectStatus <> dos_Closed then exit;
CurLife := CurLife + aSubData.HitData.ToHit;
if CurLife > SelfData.rBasicData.rLife then CurLife := SelfData.rBasicData.rLife;
if CurLife > 0 then begin
SubData.Percent := CurLife * 100 div SelfData.rBasicData.rLife;
SendLocalMessage (NOTARGETPHONE, FM_LIFEPERCENT, BasicData, SubData);
end;
end;
FM_SAY :
begin
if ObjectStatus <> dos_Closed then exit;
if (SelfData.rBasicData.rKind and DYNOBJ_EVENT_SAY) = DYNOBJ_EVENT_SAY then begin
if SelfData.rBasicData.rEventSay = '' then exit;
Str := GetWordString (aSubData.SayString);
if ReverseFormat (Str, '%s: ' + SelfData.rBasicData.rEventSay, Sayer, dummy1, dummy2, 1) then begin
if SelfData.rBasicData.rSoundSpecial.rWavNumber > 0 then begin
SetWordString (SubData.SayString, IntToStr (SelfData.rBasicData.rSoundSpecial.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
SetWordString (SubData.SayString, StrPas (@BasicData.Name) + ': ' + SelfData.rBasicData.rEventAnswer);
SendLocalMessage (NOTARGETPHONE, FM_SAY, BasicData, SubData);
end;
exit;
end;
end;
FM_ADDITEM :
begin
if ObjectStatus <> dos_Closed then exit;
if (SelfData.rBasicData.rKind and DYNOBJ_EVENT_ADDITEM) = DYNOBJ_EVENT_ADDITEM then begin
if DragDropEvent.EventAddItem (StrPas (@aSubData.ItemData.rName), SenderInfo) = true then exit;
if StrPas (@aSubData.ItemData.rName) <> SelfData.rBasicData.rEventItem.rName then exit;
Inc (EventItemCount);
if EventItemCount >= SelfData.rBasicData.rEventItem.rCount then begin
if SelfData.rBasicData.rEventDropItem.rName = '' then begin
if SelfData.rBasicData.rSoundEvent.rWavNumber > 0 then begin
SetWordString (SubData.SayString, IntToStr (SelfData.rBasicData.rSoundSpecial.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
ObjectStatus := dos_Openning;
BasicData.Feature.rHitMotion := 0;
BasicData.nx := SelfData.rBasicData.rSStep[byte(dos_Openning)];
BasicData.ny := SelfData.rBasicData.rEStep[byte(dos_Openning)];
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
ObjectStatus := dos_Openned;
BasicData.Feature.rHitMotion := 1;
BasicData.nx := SelfData.rBasicData.rSStep[byte(dos_Openned)];
BasicData.ny := SelfData.rBasicData.rEStep[byte(dos_Openned)];
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
OpenedTick := CurTick;
OpenedPosX := SenderInfo.X;
OpenedPosY := SenderInfo.Y;
end else begin
BasicData.nX := BasicData.X;
BasicData.nY := BasicData.Y;
if SelfData.rBasicData.rSoundSpecial.rWavNumber > 0 then begin
SetWordString (SubData.SayString, IntToStr (SelfData.rBasicData.rSoundSpecial.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
if ItemClass.GetCheckItemData (StrPas (@BasicData.Name), SelfData.rBasicData.rEventDropItem, ItemData) = true then begin
CurLife := CurLife + 1000;
ItemData.rCount := SelfData.rBasicData.rEventDropItem.rCount;
ItemData.rOwnerName[0] := 0;
SubData.ItemData := ItemData;
SubData.ServerId := ServerId;
Phone.SendMessage (MANAGERPHONE, FM_ADDITEM, BasicData, SubData);
end;
end;
EventItemCount := 0;
end;
Move (aSubData.ItemData, SubData.ItemData, SizeOf (TItemData));
SendLocalMessage (SenderInfo.ID, FM_DELITEM, BasicData, SubData);
end;
end;
FM_HIT :
begin
if ObjectStatus <> dos_Closed then exit;
if (SelfData.rBasicData.rKind and DYNOBJ_EVENT_HIT) = DYNOBJ_EVENT_HIT then begin
if isHitedArea (SenderInfo.dir, SenderInfo.x, SenderInfo.y, aSubData.HitData.HitFunction, percent) then begin
BO := GetViewObjectByID (SenderInfo.ID);
if BO = nil then exit;
if BO.BasicData.Feature.rRace <> RACE_HUMAN then exit;
if SelfData.rBasicData.rLife = CurLife then begin
for i := 0 to 5 - 1 do begin
if SelfData.rDropMop[i].rName = '' then continue;
for j := 0 to SelfData.rDropMop[i].rCount - 1 do begin
xx := BasicData.x;
yy := BasicData.y;
if (SelfData.rDropX <> 0) and (SelfData.rDropY <> 0) then begin
xx := SelfData.rDropX;
yy := SelfData.rDropY;
end else begin
Maper.GetMoveableXY (xx, yy, 10);
end;
if Maper.isMoveable (xx, yy) then begin
Monster := TMonsterList (Manager.MonsterList).CallMonster (SelfData.rDropMop[i].rName, xx, yy, 4, StrPas (@SenderInfo.Name));
if Monster <> nil then begin
AttackSkill := Monster.GetAttackSkill;
if AttackSkill <> nil then begin
AttackSkill.SetObjectBoss (Self);
end;
if MemberList = nil then begin
MemberList := TList.Create;
end;
MemberList.Add (Monster);
end;
end;
end;
end;
for i := 0 to 5 - 1 do begin
if SelfData.rCallNpc[i].rName = '' then continue;
for j := 0 to SelfData.rCallNpc[i].rCount - 1 do begin
xx := BasicData.x;
yy := BasicData.y;
if (SelfData.rDropX <> 0) and (SelfData.rDropY <> 0) then begin
xx := SelfData.rDropX;
yy := SelfData.rDropY;
end else begin
Maper.GetMoveableXY (xx, yy, 10);
end;
if Maper.isMoveable (xx, yy) then begin
Npc := TNpcList (Manager.NpcList).CallNpc (SelfData.rCallNpc[i].rName, xx, yy, 4, StrPas(@SenderInfo.Name));
if Npc <> nil then begin
AttackSkill := Npc.GetAttackSkill;
if AttackSkill <> nil then begin
AttackSkill.SetObjectBoss (Self);
end;
if MemberList = nil then begin
MemberList := TList.Create;
end;
MemberList.Add (Npc);
end;
end;
end;
end;
end else begin
if MemberList <> nil then begin
for i := 0 to MemberList.Count - 1 do begin
BO2 := MemberList[i];
if BO2 <> nil then begin
if BO2.BasicData.Feature.rRace = RACE_NPC then begin
AttackSkill := TNpc (BO2).GetAttackSkill;
end else begin
AttackSkill := TMonster (BO2).GetAttackSkill;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -