Page 1 of 1

проблема с журналом

Posted: 11.10.2011 11:15
by Tiger89

Code: Select all

Function CarveTarget(CorpseID: Cardinal): Boolean;
  Var
    sTime: TDateTime;
  Begin
     sTime := Now;
     Repeat
       Wait(100);
       UseType($0EC3, $FFFF);
       TargetObject(CorpseID);echo(i2s(LineCount));
       While (InJournalBetweenTimes('You carve away some meat.|You carve the corpse but find nothing usefull.', sTime, Now) = -1) And (Now < sTime + (5/86400)) Do Wait(100);
    Until (LineCount > 0) Or (Now > sTime + (15/86400));
    If (LineCount > 0) Then
      Begin
        Echo('Труп порезан');
        Loot(CorpseID);
        Inc(KilledTargets);//Увеличиваем счетчик убитых птиц 
      End
    Else Echo('Труп недоступен');
    Result:= True;
  End;
причем сообщение в журнале появляется программа из цикла выходит

Re: проблема с журналом

Posted: 11.10.2011 12:05
by Fenix
А теперь вопрос... Собственно где вопрос? Или ты просто информацией поделился?

Учимся писать красиво:

Code: Select all

function CarveTarget(CorpseID: Cardinal): Boolean;
var
  Counter: Cardinal;
  STime: TDateTime;
  Knife: Cardinal;
begin
  Knife := FindType(Backpack, $0EC3);
  if Knife > 0 then begin
    Counter := 0;
    STime := Now;
    while Counter > 3 do begin//Число попыток
      Inc(Counter);
      Wait(100);
      if TargetPresent() then CancelTarget();
      UseObject(Knife);
      CheckLag(15000);
      WaitForTarger(3000);
      if TargetPresent() then begin
        TargetToObject(CorpseID);
        CheckLag(15000);
        repeat
          if InJournalBetweenTimes('You carve away some meat.|You carve the corpse but find nothing usefull.', sTime, Now) >= 0 then begin
            AddToSystemJournal("Порезали труп");
            Result := True;
            Exit;
          end else begin
            Wait(100);
          end;
        until Now > sTime + Counter * 5/86400 do begin// sTime + Counter * 5/86400 - Учитываем число попыток для ожидания
      end;
      AddToSystemJournal("Превышено время ожидания. Переходим к следующей попытке.");
    end;
    AddToSystemJournal("Превышено число попыток.");
  end else begin
    AddToSystemJournal("Инструмент для разделки не найден.");
  end;
  Result := False;
end;
Единственное замечание - данный код не учитывает продолжительность сейвов, лагов и дисконектов.
Соответсвенно убран инкремент порезаных тушек и вызов метода лута из трупа. На мой взгляд, эти методы следует вызывать из другого места, следом за успешным вызовом CarveTarget (хотя это уже на вкус программиста).

Re: проблема с журналом

Posted: 11.10.2011 17:34
by Tiger89
Дело в том что он иногда не лутает труп, вроде режет но не лутает.
LineCount

возвращает ноль но почему то до этого
While (InJournalBetweenTimes('You carve away some meat.|You carve the corpse but find nothing usefull.', sTime, Now) = -1) And (Now < sTime + (5/86400)) Do Wait(100);

из цикла выходит как раз после этого сообщения

Re: проблема с журналом

Posted: 11.10.2011 17:35
by Tiger89
удалено

Re: проблема с журналом

Posted: 11.10.2011 17:54
by Fenix
Возможно, что LineCount и не используется. Попробуй ограничиться использованием InJournalBetweenTimes.

Re: проблема с журналом

Posted: 11.10.2011 17:56
by Tiger89
ну в моем скрипте надо было так, просто у нас на шарде когда живка дохнет, то падает на землю 2 трупа, 1 из них исчезает быстро и поэтому выходят конфликты