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

📄 basicobj.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 5 页
字号:

   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 + -