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

📄 uskills.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 5 页
字号:
         TLIfeObject(BasicObject).CommandSay(pd^.rSayString);
         SpeechTick := CurTick;
         if CurSpeechIndex < SpeechList.Count - 1 then Inc(CurSpeechIndex)
         else CurSpeechIndex := 0;
      end;
   end;
end;

constructor TDeallerSkill.Create (aBasicObject : TBasicObject);
begin
   BasicObject := aBasicObject;
   DataList := TList.Create;
end;

destructor TDeallerSkill.Destroy;
begin
   if DataList <> nil then begin
      Clear;
      DataList.Free;
   end;
   inherited Destroy;
end;

procedure TDeallerSkill.Clear;
var
   i : Integer;
begin
   for i := 0 to DataList.Count - 1 do dispose (DataList[i]);
   DataList.Clear;
end;

function TDeallerSkill.LoadFromFile (aFileName : String) : Boolean;
var
   i, j, iCount : integer;
   DeallerDB : TUserStringDB;
   iname : String;
   pd : PTDeallerData;
   str, mName, mCount : String;
begin
   Result := false;

   if aFileName = '' then exit;
   if FileExists(aFileName) = FALSE then exit;

   Clear;

   DeallerDB := TUserStringDb.Create;
   DeallerDB.LoadFromFile (aFileName);

   for i := 0 to DeallerDB.Count -1 do begin
      iname := DeallerDB.GetIndexName (i);
      if DeallerDB.GetFieldValueBoolean(iname, 'boSelfSay') <> TRUE then begin
         new (pd);
         FillChar (pd^, sizeof(TDeallerData), 0);
         pd^.rHearString := DeallerDB.GetFieldValueString (iname, 'HearString');
         pd^.rSayString := DeallerDB.GetFieldValueString (iname, 'SayString');
         str := DeallerDB.GetFieldValueString (iname, 'NeedItem');
         for j := 0 to 5 - 1 do begin
            if str = '' then break;
            str := GetValidStr3 (str, mName, ':');
            if mName = '' then break;
            str := GetValidStr3 (str, mCount, ':');
            if mCount = '' then break;
            iCount := _StrToInt (mCount);
            if iCount <= 0 then iCount := 1;
            pd^.rNeedItem[j].rName := mName;
            pd^.rNeedItem[j].rCount := iCount;
         end;
         str := DeallerDB.GetFieldValueString (iname, 'GiveItem');
         for j := 0 to 5 - 1 do begin
            if str = '' then break;
            str := GetValidStr3 (str, mName, ':');
            if mName = '' then break;
            str := GetValidStr3 (str, mCount, ':');
            if mCount = '' then break;
            iCount := _StrToInt (mCount);
            if iCount <= 0 then iCount := 1;
            pd^.rGiveItem[j].rName := mName;
            pd^.rGiveItem[j].rCount := iCount;
         end;
         DataList.Add(pd);
      end;
   end;
   DeallerDB.Free;
   Result := true;
end;

function TDeallerSkill.ProcessMessage (aStr : String; SenderInfo : TBasicData) : Boolean;
var
   i, j, k : Integer;
   sayer, dummy1, dummy2 : String;
   pd : PTDeallerData;
   BO : TBasicObject;
   SubData : TSubData;
   ItemData : TItemData;
begin
   Result := false;

   if DataList.Count <= 0 then exit;

   for i := 0 to DataList.Count - 1 do begin
      pd := DataList[i];
      if ReverseFormat (astr, '%s: ' + pd^.rHearString, sayer, dummy1, dummy2, 1) then begin
         BO := TLifeObject (BasicObject).GetViewObjectByID (SenderInfo.id);
         if BO = nil then exit;
         if SenderInfo.Feature.rRace <> RACE_HUMAN then exit;
         for j := 0 to 5 - 1 do begin
            if pd^.rNeedItem[j].rName = '' then break;
            ItemClass.GetItemData (pd^.rNeedItem[j].rName, ItemData);
            if ItemData.rName[0] <> 0 then begin
               ItemData.rCount := pd^.rNeedItem[j].rCount;
               if TUser (BO).FindItem (@ItemData) = false then begin
                  TUser (BO).SendClass.SendChatMessage (format ('%s 酒捞袍 %d俺啊 鞘夸钦聪促', [StrPas (@ItemData.rName), ItemData.rCount]), SAY_COLOR_SYSTEM);
                  exit;
               end;
            end;
         end;

         BasicObject.BasicData.nx := SenderInfo.x;
         BasicObject.BasicData.ny := SenderInfo.y;
         for j := 0 to 5 - 1 do begin
            if pd^.rGiveItem[j].rName = '' then break;
            ItemClass.GetItemData (pd^.rGiveItem[j].rName, ItemData);
            ItemData.rCount := pd^.rGiveItem[j].rCount;
            ItemData.rOwnerName[0] := 0;

            SubData.ItemData := ItemData;
            SubData.ServerId := BasicObject.ServerId;
            if TFieldPhone (BasicObject.Manager.Phone).SendMessage (SenderInfo.id, FM_ENOUGHSPACE, BasicObject.BasicData, SubData) = PROC_FALSE then begin
               for k := 0 to j - 1 do begin
                  if pd^.rGiveItem[j].rName = '' then break;
                  ItemClass.GetItemData (pd^.rGiveItem[j].rName, ItemData);
                  ItemData.rCount := pd^.rGiveItem[j].rCount;
                  ItemData.rOwnerName[0] := 0;
                  TUser (BO).DeleteItem (@ItemData);
               end;
               TLIfeObject (BasicObject).CommandSay('酒捞袍 芒狼 傍埃捞 何练钦聪促');
               exit;
               // TFieldPhone (BasicObject.Phone).SendMessage (MANAGERPHONE, FM_ADDITEM, BasicObject.BasicData, SubData);
            end else begin
               TFieldPhone(BasicObject.Manager.Phone).SendMessage (SenderInfo.id, FM_ADDITEM, BasicObject.BasicData, SubData);
            end;
         end;

         for j := 0 to 5 - 1 do begin
            if pd^.rNeedItem[j].rName = '' then break;
            ItemClass.GetItemData (pd^.rNeedItem[j].rName, ItemData);
            if ItemData.rName[0] <> 0 then begin
               ItemData.rCount := pd^.rNeedItem[j].rCount;
               TUser (BO).DeleteItem (@ItemData);
            end;
         end;
         TLIfeObject (BasicObject).CommandSay(pd^.rSayString);

         Result := true;
         exit;
      end;
   end;
end;


constructor TAttackSkill.Create (aBasicObject : TBasicObject);
begin
   BasicObject := aBasicObject;

   if Pointer (BasicObject) = Pointer ($150) then begin
      BasicObject := nil;
   end;

   Boss := nil;
   ObjectBoss := nil;

   DeadAttackName := '';
   TargetID := 0;
   EscapeID := 0;
   EscapeLife := 0;

   boGroup := false;
   boBoss := false;

   TargetPosTick := 0;
   CurNearViewHumanId := 0;
   HateHumanId := 0;

   boGroupSkill := false;
   GroupSkill := nil;

   boSelfTarget := true;

   BowCount := 5;
   boBowAvail := true;
   BowAvailTick := 0;
   BowAvailInterval := 500;
end;

destructor TAttackSkill.Destroy;
begin
   NoticeDie;
   if ObjectBoss <> nil then begin
      ObjectBoss.MemberDie (BasicObject);
   end;
   if GroupSkill <> nil then begin
      GroupSkill.BossDie;
      GroupSkill.Free;
      GroupSkill := nil;
      boGroupSkill := false;
   end;
   inherited Destroy;
end;

procedure TAttackSkill.HelpMe (aMeID, aTargetID, aX, aY : Integer);
begin
   if aTargetID <> 0 then begin
      if TargetID <> aTargetID then begin
         SetHelpTargetIDandPos (aTargetID, aX, aY);
      end;
      if GroupSkill <> nil then begin
         GroupSkill.MoveAttack (aTargetID, aX, aY);
      end else begin
         GroupSkill := nil;
      end;
   end;
end;

procedure TAttackSkill.CancelHelp (aTargetID : Integer);
begin
   if aTargetID <> 0 then begin
      if GroupSkill <> nil then begin
         GroupSkill.CancelTarget (aTargetID);
      end else begin
         GroupSkill := nil;
      end;
   end;
end;

procedure TAttackSkill.SetSelf (aSelf : TBasicObject);
begin
   BasicObject := aSelf;
end;

procedure TAttackSkill.SetBoss (aBoss : TBasicObject);
begin
   Boss := aBoss;
end;

procedure TAttackSkill.SetObjectBoss (aBoss : TDynamicObject);
begin
   ObjectBoss := aBoss;
end;

function TAttackSkill.GetObjectBoss : TDynamicObject;
begin
   Result := ObjectBoss;
end;

procedure TAttackSkill.SetDeadAttackName (aName : String);
begin
   if TLifeObject (BAsicObject).LifeObjectState = los_die then exit;
   
   DeadAttackName := aName;
   if aName <> '' then begin
      TLifeObject (BasicObject).LifeObjectState := los_deadattack;
   end;
end;

procedure TAttackSkill.SetSaveIDandPos (aTargetID : Integer; aTargetX, aTargetY : Word; aNextState : TLifeObjectState);
begin
   TargetStartTick := mmAnsTick;
   
   SaveID := aTargetID;
   TargetX := aTargetX;
   TargetY := aTargetY;

   SaveNextState := aNextState;
end;

procedure TAttackSkill.SetTargetID (aTargetID : Integer; boCaller : Boolean);
var
   SubData : TSubData;
   tmpAttackSkill : TAttackSkill;
   tmpTargetID : Integer;
   BO : TBasicObject;
begin
   if (TLifeObject (BasicObject).LifeObjectState = los_die)
      or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;

   if TLifeObject (BasicObject).LifeObjectState = los_deadattack then exit;

   if aTargetID = BasicObject.BasicData.id then exit;
   if (aTargetID = 0) and (TargetID <> 0) then begin
      tmpTargetID := TargetID;
      TargetId := aTargetID;
      if (Boss <> nil) and (boSelfTarget = true) then begin
         if Boss.BasicData.Feature.rrace = RACE_NPC then
            // tmpAttackSkill := TNpc(Boss).GetAttackSkill;
            tmpAttackSkill := nil
         else
            tmpAttackSkill := TMonster(Boss).GetAttackSkill;
         if tmpAttackSkill <> nil then begin
            tmpAttackSkill.CancelHelp (tmpTargetID);
         end;
      end;
   end;

   if aTargetID = 0 then begin
      TargetId := aTargetID;
      TLifeObject (BasicObject).LifeObjectState := los_none;
      exit;
   end;

   boSelfTarget := true;
      
   TargetId := aTargetID;
   TLifeObject (BasicObject).LifeObjectState := los_attack;
   if GroupSkill <> nil then begin
      BO := TLifeObject (BasicObject).GetViewObjectByID (TargetID);
      if BO <> nil then begin
         GroupSkill.MoveAttack (TargetID, BO.BasicData.X, BO.BasicData.Y);
      end;
   end else if Boss <> nil then begin
      if Boss.BasicData.Feature.rRace = RACE_NPC then
         tmpAttackSkill := TNpc(Boss).GetAttackSkill
      else
         tmpAttackSkill := TMonster(Boss).GetAttackSkill;

      if tmpAttackSkill <> nil then begin
         if tmpAttackSkill.GetTargetID <> TargetID then begin
            BO := TLifeObject (BasicObject).GetViewObjectByID (TargetID);
            if BO <> nil then begin
               if BO.BasicData.Feature.rFeatureState = wfs_die then begin
                  BO := nil;
                  exit;
               end;
               if tmpAttackSkill.GroupSkill <> nil then begin
                  tmpAttackSkill.HelpMe (BasicObject.BasicData.id, TargetID, BO.BasicData.x, BO.BasicData.y);
               end else begin
                  BO := nil;
               end;
            end;
         end;
      end;
   end else begin
      if (boCaller = true) and (boVassal = true) then begin
         SubData.TargetId := TargetID;
         SubData.VassalCount := VassalCount;
         TLifeObject (BasicObject).SendLocalMessage (NOTARGETPHONE, FM_GATHERVASSAL, BasicObject.BasicData, SubData);
      end;
   end;
end;

procedure TAttackSkill.SetHelpTargetID (aTargetID : Integer);
var
   tmpAttackSkill : TAttackSkill;
begin
   if (TLifeObject (BasicObject).LifeObjectState = los_die)
      or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;

   if aTargetID = BasicObject.BasicData.id then exit;
   if aTargetID = 0 then begin
      if Boss <> nil then begin
         if Boss.BasicData.Feature.rrace = RACE_NPC then
            // tmpAttackSkill := TNpc(Boss).GetAttackSkill;
            tmpAttackSkill := nil
         else
            tmpAttackSkill := TMonster(Boss).GetAttackSkill;
         if tmpAttackSkill <> nil then begin
            if tmpAttackSkill.GetTargetID <> TargetID then begin
               tmpAttackSkill.CancelHelp (TargetID);
            end;
         end;
      end;
      TargetId := aTargetID;
      TLifeObject (BasicObject).LifeObjectState := los_none;
      exit;
   end;

   boSelfTarget := false;

   TargetId := aTargetID;
   TLifeObject (BasicObject).LifeObjectState := los_attack;
   if GroupSkill <> nil then begin
      GroupSkill.Attack (TargetID);
   end;
end;

procedure TAttackSkill.SetHelpTargetIDandPos (aTargetID, aX, aY : Integer);
begin
   if (TLifeObject (BasicObject).LifeObjectState = los_die)
      or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;

   if aTargetID = BasicObject.BasicData.id then exit;
   if (aTargetID = 0) or (aTargetID = TargetID) then exit;

⌨️ 快捷键说明

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